Responsabili:
Data publicării: 10.05.2024
Deadline: 26.05.2024, ora 23:59
Echipa tema 3 SD: id.moodle1 id.moodle2
Unde id.moodle este id-ul vostru de pe Teams/Moodle, de exemplu andrei.popescu. Dacă doriți să faceți tema singuri, lucru care nu este recomandat, puteți să scrieți un singur nume.
În urma realizării acestei teme veți:
Cum Marcel (din tema trecută) a avut un succes incredibil cu serviciile sale de stocare în cloud, a început să se gândească cum poate extinde serviciile sale pentru a putea concura cu giganții din industrie, vrând astfel să se lanseze pe piață globală. După câteva zile bune de brainstorming, el a realizat că ar fi foarte util dacă nu ar mai avea toate nevoile sale așa separate. În loc să aibă cloud storage pe “Gogu Drive”, rețeaua de socializare pe “InstaBook” și aplicația lui favorită de împărtășit opinii “Z”, ar fi mult mai simplu să le aibă pe toate în același loc.
Având deja implementată partea de cloud storage din proiectul anterior, e timpul că el să își creeze rețelele sale de socializare favorite, și cum sesiunea se apropie, are nevoie de ajutorul vostru. Astfel, el v-a oferit funcționalitățile pe care le dorește să le aibă în versiunea Alpha a platformei sale, și este datoria voastră să implementați cerințele lui. El și-a separat cerințele în 3 etape astfel încât să coresupundă efectiv cu fiecare parte a aplicației (Prima etapă pentru partea de rețea de prietenie, a două etapă pentru partea de postări, și a treia etapă pentru a combină totul într-un feed de social media ). El v-a oferit un schelet de cod pentru viziunea să de ansamblu, și v-a promis un loc stabil de muncă și o parte din profitul platformei dacă reușiți să îl ajutați în timp util!
Tema aceasta este împărțită în 3 etape, primele 2 etape pot fi făcute în paralel, neavând o dependința una față de cealaltă. Scheletul temei ar trebui să va poată lasă să lucrați la această tema fără să fie nevoie să vă folosiți de cod din task 1 sau din task 2.
Fiecare input va fi mereu valid, deci nu trebuie să vă faceți griji cu privire la tratarea cazurilor de parametri lipsă sau invalizi.
Vă recomandăm să lucrați individual la primele două etape, dar nu este obligatoriu.
Această temă este concepută astfel încât să vă permită să lucrați la ea fără a fi nevoie să utilizați cod din etapele anterioare, dar vă recomandăm să folosiți platforme precum GitHub pentru o colaborare mai ușoară între voi.
add <nume-1> <nume-2>
Creează o legătură între doi utilizatori. Aceasta este o legătură bidirecțională, adică ambele persoane se vor trece unul pe altul ca prieteni.
Exemplu:
> add Mihai Andrei < Added connection Mihai - Andrei
remove <nume-1> <nume-2>
Elimină legătura dintre doi utilizatori.
Exemplu:
> add Mihai Andrei > remove Mihai Andrei < Removed connection Mihai - Andrei
distance <nume-1> <nume-2>
Calculează distanța între 2 persoane de pe platformă. Distanța se consideră 1 pentru fiecare prietenie.
Exemplu:
> add Mihai Andrei > add Andrei Alex > add Alex Mihnea > distance Mihai Mihnea < The distance between Mihai - Mihnea is 3
suggestions <nume>
Găsește și afișează toți prietenii prietenilor, care nu sunt deja prieteni cu tine. Prietenii vor fi afișați crescător după id-ul utilizatorului.
Exemplu:
> add Alex Andrei > add Andrei Maria > add Andrei Mihai > add Andrei Vlad > suggestions Alex < Suggestions for Alex: < Maria < Mihai < Vlad
!Info Dacă nu există sugestii pentru un utilizator, se va afișa “There are no suggestions for <nume>”
common <nume-1> <nume-2>
Trebuie să găsiți prietenii comuni ai doi utilizatori. Un prieten comun este o persoană care îl are ca prieten și pe <nume-1>
și pe <nume-2>
. Veți afișa lista de prieteni, sortată crescător după id-ul utilizatorului.
Exemplu:
> common Alex Ana < The common friends between Alex and Ana are: < Andrei < Maria < Ioana
friends <nume>
> friends Andrei < Andrei has 5 friends
Trebuie să afișați numărul de conexiuni al unei persoane.
popular <nume>
Trebuie să afișați utilizatorul cu cele mai multe conexiuni dintre <nume>
și prietenii lui.
Exemplu (se presupune că Andrei - Mihai - Ana sunt toți prieteni):
> friends Andrei < 10 > friends Mihai < 15 > friends Ana < 9 > popular Ana < Mihai is the most popular friend of Ana > popular Mihai < Mihai is the most popular
Pentru această etapă, vom lucra cu o structură de date arborescentă, care va fi folosită pentru a stoca postările și reposturile. Fiecare postare va avea un id unic și va putea avea mai multe reposturi. Un repost va fi o postare în sine, care va avea un id unic și va fi legată de postarea originală. Vom folosi un arbore pentru a stoca aceste postări și reposturi, unde fiecare nod va avea un câmp events
, care va fi un arbore de postări și reposturi.
struct { id: number, titlu: string, user_id: number, events: tree }
create <nume> <titlu>
Utilizatorul <nume>
va crea o postare cu titlul <titlu>
. Fiecare postare va avea un id unic, care va fi incrementat la fiecare postare nouă.
Exemplu:
> create Mihai "Titlu postare" < Created "Titlu postare" for Mihai
repost <nume> <post-id> [repost-id]
Creează un repost la o postare existentă. Dacă comanda repost
are un repost id, atunci se consideră că este un repost la un repost.
Exemplu:
> repost Alex 1 2 < Created Repost #10 for Alex
events
al postării originale, în funcție de momentul în care a fost făcut repost-ul (poate fi fiul unui alt repost sau al postării originale).events
al unui repost va fi gol (setat pe NULL).
common-repost <post> <repost-id-1> <repost-id-2>
Găsește primul repost comun al două reposturi.
Exemplu:
> common-repost 1 4 7 < The first common repost of 4 and 7 is 2.
like <nume> <post-id> [repost-id]
Adaugă un like la o postare sau repostare. Dacă se dă repost id, atunci se va adăuga like-ul la repostare.
Exemplu:
> create Mihai "Titlu postare" < Created "Titlu postare" for Mihai > like Alex 1 < Alex liked "Titlu postare" > like Alex 1 < Alex unliked "Titlu postare"
ratio <post-id>
În jargonul internetului, ratio înseamnă că un răspuns la o postare are mai multe like-uri decât postarea originală (ceea ce implică că opinia răspunsului este mai acceptată decât cea a postării originale).
Astfel, în situația noastră, vom implementa ratio-ul asemănător, dar pentru reposturi, astfel încât dacă un repost are mai multe like-uri decât postarea originală, spunem că această i-a dat ratio.
Exemplu:
> create Mihai "Opinie nepopulară" > repost Alex 1 > like Alex 1 2 > like Ana 1 2 > ratio 1 < Post 1 got ratio'd by repost 2
The original post is the highest rated
delete <post-id> [repost-id]
Șterge o postare sau un repost. Odată ce o postare sau un repost a fost șters, toate reposturile care depind de aceasta vor fi șterse.
Exemplu:
> delete 1 < Deleted "Titlu postare"
get-likes <post-id> [repost-id]
Afișează numărul de like-uri pentru o postare sau repostare.
Exemplu:
> get-likes 1 2 < Repost #2 has 5 likes > get-likes 1 < Post "Titlu postare" has 0 likes
get-reposts <post> [repost-id]
Afișează toată ierarhia de reposturi pentru un post/repost.
Se vor afișa reposturile în ordinea în care au fost făcute, alături de numele utilizatorului care a făcut repostul. Spre exemplu, vom considera următorul arbore de events pentru postarea cu id-ul 1:
Vom considera că titlul primei postări este Cat video
, iar toate repost-urile au fost făcute de același utilizator - Alex
.
> get-reposts 1 < "Cat video" - Post #1 by Alex < Repost #2 by Alex < Repost #4 by Alex < Repost #5 by Alex < Repost #7 by Alex < Repost #3 by Alex < Repost #6 by Alex
feed <nume> <feed-size>
Afișează cele mai recente <feed-size>
postări ale unui utilizator și ale prietenilor lui.
Exemplu:
> create Andrei "Prima mea postare" > create Mihai "Al doilea" > create Mihnea "Vand Golf 4" > create Alex "Buna TPU, merita sa dau la Poli?" > create Ana "Ati auzit ultima melodie a lui Kanye?" > create Luca "Nu-mi vine sa cred cine a castigat Grand Prix-ul de la Miami" > feed Andrei 5 < Luca: "Nu-mi vine sa cred cine a castigat Grand Prix-ul de la Miami" < Ana: "Ati auzit ultima melodie a lui Kanye?" < Alex: "Buna TPU, merita sa dau la Poli?" < Mihnea: "Vand Golf 4" < Mihai: "Al doilea"
view-profile <nume>
Afișează toate postările și repostările unui utilizator.
Exemplu:
> create Andrei "Prima mea postare" > create Mihai "Al doilea" > create Alex "Shaorma e veatza mea" > repost Andrei 2 > view-profile Andrei < Posted: "Prima mea postare" < Reposted: "Shaorma e veatza mea"
friends-repost <nume> <post-id>
Afișează toți prietenii unui utilizator care au dat repost la postarea cu <post-id>
-ul primit.
Exemplu:
... > repost Mihai 5 > repost Alex 5 > repost Ana 5 > friends-repost Andrei 5 < Friends that reposted: < Mihai < Alex < Ana
common-group <nume>
Găsiți și afișați cel mai mare grup de prieteni care îl conține pe un anumit utilizator.
Un grup de prieteni se definește ca toți oamenii dintr-un grup care sunt prieteni unii cu alții. Lista de nume afișată va fi afișată crescător după id-ul utilizatorului.
Exemplu:
> common-group Alex < The closest friend group of Alex is: < Alex < Ana < Ioana < Mihai > common-group Luca < The closest friend group of Luca is: < Alex < Mihai < Luca
Din graful acesta, se poate vedea cum Ana - Alex - Ioana - Mihai alcătuiesc un grup complet, iar Luca nu face parte din acest grup, fiindcă are doar 2 prieteni comuni.
Pentru a putea lucra mai ușor, avem câteva tips-uri pentru voi.
Tema trebuie incarcata pe moodle, si arhiva va contine:
Q: Putem implementa tema în C++?
A: Nu.
Q: Putem folosi variabile globale?
A: Nu.
Q: Putem modifica scheletul / adăuga funcţii?
A: Da.
Q: Putem face singur tema?
A: Da, dar punctajul nu se scaleaza, iar tu vei avea mai mult de lucru.
Link-ul de la checker se poate gasi aici.
v
si va aparea chenarul rosu.
Puteți instala checkerul rulând comanda ./install.sh
. Dacă apar orice fel de erori când rulați comanda, încercați și urmați următorii pași:
curl https://sh.rustup.rs -sSf | sh -s -- -y
. Dacă apar erori la următorii pași, încercați să adăugați cargo (package managerul de rust) la PATH, rulând următoarea comandă source "$HOME/.cargo/env"
.
$ cargo install hw_checker
După instalare, puteți rula direct checkerul folosind comanda hw_checker
din root-ul temei, sau puteți face un symbolic link la folderul curent.
Pentru o listă completă de comenzi pentru checker, puteți citi README-ul din README-checker.md
. Dacă aveți probleme cu interfața grafică, puteți rula checkerul fără interfața grafică, folosind comanda hw_checker --legacy