Differences

This shows you the differences between two versions of the page.

Link to this comparison view

programare:teme_2020:tema4_2020_cbd [2020/11/28 17:47]
vlad_matei.draghici
programare:teme_2020:tema4_2020_cbd [2020/11/30 14:11] (current)
vlad_matei.draghici
Line 1: Line 1:
 ====== Tema 4 – Pregătire Examen ====== ====== Tema 4 – Pregătire Examen ======
 ====== Responsabili ====== ====== Responsabili ======
-  * [[vintila.mariusm@gmail.com|Marius Vintila]] +  * [[draghici.vlad18@gmail.com|Vlad Draghici]] 
-  * [[i.marius99@gmail.com|Marius Iftimie]] +  * [[circeanu.bogdan@gmail.com|Circeanu Bogdan]] 
-  * [[murarugeorgec@gmail.com|George Muraru]]+  * [[edi.scaueru@gmail.com|Scaueru Eduard]] 
 +  * [[anicagabriel1@gmail.com|Anica Alexandru-Gabriel]]
  
-  * Data publicare: **Noiembrie ​2019, ora 22:20** +  * Data publicare: **30 Noiembrie ​2020** 
-  * Deadline: **Ianuarie ​2020, ora 23:55**+  * Deadline: **22 Ianuarie ​2021, ora 23:​55** ​Soft + Hard
  
 ==Întrebări== ==Întrebări==
-Dacă aveți nelămuriri,​ puteți să ne contactați pe forumul dedicat [[https://acs.curs.pub.ro/2019/​mod/​forum/​view.php?​id=6890|temei de casă nr. 4]].\\+Dacă aveți nelămuriri,​ puteți să ne contactați pe forumul dedicat [[https://​curs.upb.ro/​mod/​forum/​view.php?​id=129505|temei de casă nr. 4]].\\
 La orice întrebare vom răspunde în maxim 24 de ore.\\ La orice întrebare vom răspunde în maxim 24 de ore.\\
 Nu se acceptă întrebări în ultimele 24 de ore înainte de deadline. Nu se acceptă întrebări în ultimele 24 de ore înainte de deadline.
Line 20: Line 21:
 ====== Introducere ====== ====== Introducere ======
 Topicul temei este jocul “Among us”. Pentru această temă se cere o implementare simplificată a unui model asemănător cu jocul cunoscut. Topicul temei este jocul “Among us”. Pentru această temă se cere o implementare simplificată a unui model asemănător cu jocul cunoscut.
-====== ​Cerința ​======+====== ​Organizarea temei ======
 <note warning>​**TOATE** modificările de cod se vor realiza **DOAR** in fișierul **tema4.c**. Modificarea oricărui alt fișier nu va fi luata in considerare. <note warning>​**TOATE** modificările de cod se vor realiza **DOAR** in fișierul **tema4.c**. Modificarea oricărui alt fișier nu va fi luata in considerare.
  
Line 73: Line 74:
    ​*fiecare coleg de echipaj își face task-ul, apelând câmpul **ability**,​ care este o referința la o funcție, apoi își afișează rezultatul task-ului său    ​*fiecare coleg de echipaj își face task-ul, apelând câmpul **ability**,​ care este o referința la o funcție, apoi își afișează rezultatul task-ului său
    ​*urmează rândul impostorului să se miște la următoarea sa locație și să își facă task-ul adică să încerce să omoare un jucător    ​*urmează rândul impostorului să se miște la următoarea sa locație și să își facă task-ul adică să încerce să omoare un jucător
 +
 +<note warning>​Dacă un coleg de echipaj este mort atunci el nu mai face nicio acțiune, ci doar se afișează la output că acesta este mort.</​note>​
 +
 +Tema este organizată în următorul fel:
 +   *3 task-uri care reprezintă task-urile colegilor de echipaj
 +   *5 task-uri care asigură inițializarea și desfășurarea jocului
 +   *1 task care reprezintă task-ul impostorului
 +
 +Pentru primele 3 task-uri se impune următoarea structura:
 +   ​*Input-ul este un singur parametru de forma ** void * ** care urmează sa îi fie făcut cast la tipul de date specificat de fiecare task în parte
 +   ​*Output-ul este un șir de caractere căruia îi este făcut cast la ** void * **
 +Prin urmare, antetele primelor 3 task-uri sunt de forma: ** void * task(void *input) **
 +<​note>​ sprintf: http://​www.cplusplus.com/​reference/​cstdio/​sprintf/​ </​note>​
 +
 +====== Cerință ======
 +
 +==== Task 1 (10p) ====
 +
 +<​note>​ Trebuie să se completeze funcția **RotateMatrix** din **tema4.c**. </​note>​
 +
 +Funcția primește un void * care este un pointer la un int (n). Să se creeze o matrice n*n cu elementele de forma ij cu i, j indicii elementului curent (i și j pornesc de la 1) și apoi să se rotească matricea la dreapta. Output-ul este un șir de caractere care reprezintă afișarea matricei de sus in jos, de la stânga la dreapta.
 +
 +<​note>​Între liniile matricei trebuie sa existe cate un **\n**.</​note>​
 +
 +<note warning> După ultima linie **NU** trebuie să existe un **\n**!. </​note>​
 +
 +Input
 +<​code>​
 +3
 +</​code>​
 +Output
 +<​code>​
 +31 21 11
 +32 22 12
 +33 23 13
 +</​code>​
 +
 +==== Task 2 (10p) ====
 +
 +<​note>​ Trebuie să se completeze funcția **DecodeString** din **tema4.c**. </​note>​
 +
 +Funcția primește un ** void * ** care este un șir de caractere. Șirul este de forma **a1_a2_a3_..._an**,​ unde **ai** este un întreg. Să se calculeze suma elementelor **ai**. Output-ul este un șir de caractere care reprezintă suma calculată.
 +
 +Input
 +<​code>​
 +4_3_7_15_1_5
 +</​code>​
 +Output
 +<​code>​
 +35
 +</​code>​
 +
 +<note warning> Dupa numărul reprezentat de suma calculată **NU** trebuie să existe un **\n**! </​note>​
 +
 +==== Task 3 (10p) ====
 +
 +<​note>​ Trebuie să se completeze funcția **InvertArray** din **tema4.c**. </​note>​
 +
 +Funcția primește un ** void * ** care reprezintă un vector. Primul element al vectorului este numărul de elemente rămase în vector. Dacă lungimea vectorului rămas este număr par să se interschimbe elementele de pe pozițiile **2k + 1** cu  elementele de pe pozițiile **2k + 2**. Dacă lungimea vectorului rămas este număr impar să se inverseze vectorul. Output-ul este vectorul fără primul element sub formă de sir de caractere.
 +
 +==Cazul 1==
 +Input
 +<​code>​
 +4 1 2 3 4
 +</​code>​
 +Output
 +<​code>​
 +2 1 4 3
 +</​code>​
 +
 +==Cazul 2==
 +Input
 +<​code>​
 +3 1 2 3
 +</​code>​
 +Output
 +<​code>​
 +3 2 1
 +</​code>​
 +
 +<note warning> Dupa vector **NU** trebuie să existe un **\n**! </​note>​
 +
 +==== Task 4 (10p) ====
 +
 +<​note>​ Trebuie să se completeze funcțiile **allocPlayer** si **allocGame** din **tema4.c**. </​note>​
 +
 +Se dorește alocarea structurilor **Player** și **Game** și a câmpurilor lor. Pentru **Player** trebuie să se aloce câmpurile **name**, **color** și **hat** și să ii se atribuie valoarea 1 pentru **alive**. Pentru **Game** trebuie să se aloce câmpul **name**. Toate șirurile de caractere sunt alocate cu lungimea **MAX_LEN_STR_ATR**.
 +
 +<​note>​ Funcțiile nu primesc niciun parametru și returnează referința la structura pe care o aloca. </​note>​
 +
 +==== Task 5 (10p) ====
 +
 +<​note>​ Trebuie să se completeze funcțiile **ReadPlayer** si **ReadGame** din **tema4.c**. </​note>​
 +
 +Se dorește citirea câmpurilor structurilor **Player** și **Game**. Funcțiile primesc la input fișierul(text) de intrare și returnează referința la structura pe care o aloca si o citesc.
 +
 +Funcția de **ReadGame** trebuie să apeleze funcția de **ReadPlayer** pentru fiecare jucător din joc, inclusiv pentru impostor.
 +
 +La citirea unui jucător, când se citește rolul unui jucător trebuie ca variabilei de tip enum **playerRole** să i se atribuie valoarea corespunzătoare. În fișierul **tema4.c** există un vector de referințe **Abilities** la funcțiile **RotateMatrix**,​ **DecodeString**,​ **InvertArray** și **KillPlayer** care corespund ca abilitate/​task jucătorilor care au rolurile **Rotator**,​ **Decoder**,​ **Invertor** respectiv **Impostor**. Tot la citire trebuie să ii se atribuie pentru fiecare jucător referința **ability** la una dintre valorile din vectorul de referințe **Abilities** în funcție de enum-ul **PlayerRole**.
 +
 +Input-ul este de forma următoare:
 +<​code>​
 +[nume_joc]
 +[killRange]
 +[numar_crewmates]
 +[crewmate_1]
 +
 +[crewmate_n]
 +[impostor]
 +</​code>​
 +
 +Unde [crewmate_1],​ …, [crewmate_n] si [impostor] au următoarea structura:
 +<​code>​
 +[nume_jucator]
 +[culoare]
 +[palarie]
 +[numar_locatii]
 +([x_1],​[y_1])[spatiu]([x_2],​[y_2])[spatiu]…
 +[rol_jucator]
 +</​code>​
 +
 +Exemplu de input:
 +<​code>​
 +Game_1
 +5
 +3
 +John
 +Blue
 +Witch_Hat
 +2
 +(2,1) (2,0)
 +Decoder
 +Adam
 +Pink
 +Top_Hat
 +3
 +(5,5) (7,7) (2,2)
 +Rotator
 +Michel
 +Green
 +Yes_Hat
 +2
 +(6,6) (5,3)
 +Invertor
 +Mark
 +Red
 +No_Hat
 +1
 +(1,1)
 +Impostor
 +</​code>​
 +
 +==== Task 6 (10p) ====
 +
 +<​note>​ Trebuie să se completeze funcțiile **WritePlayer** si **WriteGame** din **tema4.c**. </​note>​
 +
 +Se dorește afișarea structurilor **Player** și **Game**. Trebuie să se completeze funcțiile **WritePlayer** și **WriteGame**. Funcțiile primesc ca parametrii structura pe care trebuie să o afișeze și fișierul(text) de output.
 +
 +Funcția de **WriteGame** trebuie să apeleze funcția de **WritePlayer** pentru fiecare jucător din joc, inclusiv pentru impostor.
 +
 +La finalul apelării funcției de **WriteGame** în fișierul de output trebuie să existe următoarea informație:​
 +
 +<​code>​
 +Game [nume_joc] ​ has just started!
 +[TAB]Game options:
 +Kill Range: [killRange]
 +Number of crewmates: [numberOfCrewmates]
 +[LINIE_GOALA]
 +[TAB]Crewmates:​
 +Player [player_name] with color [player_color],​ hat [player_hat] and role [player_role] has entered the game.
 +Player'​s locations: ([x1],​[y1])[spatiu]…
 +
 +[LINIE_GOALA]
 +[TAB]Impostor:​
 +Player [impostor_name] with color [impostor_color],​ hat [impostor_hat] and role Impostor has entered the game.
 +Player'​s locations: ([x1],​[y1])[spatiu]…
 +</​code>​
 +
 +Exemplu de output:
 +
 +<​code>​
 +Game Football_Game has just started!
 + Game options:
 +Kill Range: 4
 +Number of players: 2
 +
 + Crewmates:
 +Player Cristiano with color White, hat Cool_Hat and type Rotator has entered the game.
 +Player'​s locations: (1,1) (0,0) (7,7) 
 +Player Messi with color Red_Blue, hat Nice_Hat and type Decoder has entered the game.
 +Player'​s locations: (0,0) (1,1) (10,​10) ​
 +
 + Impostor:
 +Player Mutu with color Blue, hat Caviar_Hat and type Impostor has entered the game.
 +Player'​s locations: (3,4) (0,7) (0,10)
 +</​code>​
 +
 +==== Task 7 (10p) ====
 +
 +<​note>​ Trebuie să se completeze funcția **KillPlayer** din **tema4.c**. </​note>​
 +
 +Se dorește implementarea abilitații/​task-ului impostorului. Input-ul funcției este un ** void * ** care este o referință la o structura de tip **Game**. Abilitatea impostorului este de a ucide cel mai apropriat coleg de echipaj dacă acesta este la o distanță mai mică sau egală ca **killRange**. Distanța dintre 2 puncte se calculează ca **Distanta Manhattan**.
 +
 +<​note>​ Distanța Manhattan: https://​en.wikipedia.org/​wiki/​Taxicab_geometry </​note>​
 +<​note>​ Distanța calculată este de tip întreg. </​note>​
 +
 +Dacă impostorul reușește să omoare un coleg de echipaj, atunci câmpul **alive** al acelui coleg de echipaj devine 0 (moare). Dacă există mai mulți colegi de echipaj la aceeași distanță fată de impostor este omorât colegul de echipaj cu indicele cel mai mare. Output-ul funcției este un șir de caractere castat la **void * **.
 +
 +Dacă impostorul reușește să omoare pe cineva output-ul o să fie de forma:
 +
 +<​code>​Impostor [nume_impostor] has just killed crewmate [nume_crewmate] from distance [distanta].</​code>​
 +
 +Daca impostorul nu reușește să omoare pe nimeni output-ul o să fie de forma:
 +
 +<​code>​Impostor [nume_impostor] couldn'​t kill anybody.</​code>​
 +
 +<note warning> La finalul șirului de caractere **NU** trebuie să existe un **\n**! </​note>​
 +
 +==== Task 8 (10p) ====
 +
 +<​note>​ Trebuie să se completeze funcția **CalcuateNextCycleOfGame** din **tema4.c**. </​note>​
 +
 +Se dorește implementarea unui ciclu de joc. Funcția primește ca parametrii o referință la o structura de tipul **Game**, un fișier de output și un ** void%%**%% ** care este un vector de input-uri de tip ** void * **.
 +
 +Pentru fiecare coleg de echipaj funcția trebuie să îi calculeze următoarea poziție și să afișeze acest lucru în următorul format:
 +<​code>​Player [nume_jucator] went to location ([x],​[y]).[\n]</​code>​
 +
 +Apoi funcția trebuie să apeleze pentru fiecare coleg de echipaj abilitatea/​task-ul lui apelând referința la funcție **ability** cu input-ul **void * ** luat din vectorul de input-uri dat ca parametru funcției **CalculateNextCycleOfGame**. Indicele colegului de echipaj în vectorul de **crewmates** dă indicele din vectorul de input-uri.
 +
 +Output-ul fiecărui task al jucătorilor trebuie afișat sub forma:
 +<​code>​
 +Player [nume_jucator]'​s output:[\n]
 +[Output]
 +</​code>​
 +
 +Asemănător trebuie să se facă și pentru impostor.
 +
 +Dacă un coleg de echipaj este mort atunci el nu se va mișca niciunde și nu își va mai face task-ul. În schimb va afișa:
 +<​code>​Player [nume_jucator] is dead.[\n]</​code>​
 +
 +Exemplu:
 +
 +<​code>​
 +Crewmate John is dead.
 +Crewmate Adam went to location (2,2).
 +Crewmate Adam's output:
 +61 51 41 31 21 11
 +62 52 42 32 22 12
 +63 53 43 33 23 13
 +64 54 44 34 24 14
 +65 55 45 35 25 15
 +66 56 46 36 26 16
 +Crewmate Michel went to location (6,6).
 +Crewmate Michel'​s output:
 +7 6 5 4 3 2 1
 +Impostor Mark went to location (1,1).
 +Impostor Mark's output:
 +Impostor Mark has just killed crewmate Adam from distance 2.
 +</​code>​
 +
 +==== Task 9 (10p) ====
 +
 +<​note>​ Trebuie să se completeze funcțiile **FreePlayer** si **FreeGame** din **tema4.c**. </​note>​
 +
 +Se dorește eliberarea structurilor de tip **Player** și **Game**. Trebuie să se elibereze toată memoria prezenta în aceste structuri, inclusiv cea care nu a fost alocată în funcțiile **alloc**.
 +
 +<note warning> Pentru a primi punctaj pe acest task trebuie să nu existe pierderi de memorie la restul task-urilor. </​note>​
 +
 +====== Punctaj ======
 +  * **[90p]** Teste
 +  * **[5p]** Fișier README în care să se descrie implementarea
 +  * **[5p]** [[programare:​coding-style|Coding Style]].
 +
 +TOTAL: **100p**
 +
 +====== Listă depunctări ======
 +  * o temă care nu compilează și nu a rulat pe **[[https://​v2.vmchecker.cs.pub.ro|v2.vmchecker]]** nu va fi luată în considerare
 +  * o temă care nu rezolvă cerința și trece testele prin alte mijloace nu va fi luată în considerare
 +  * [-1.0]: warning-uri la compilare (este obligatorie folosirea în fișierul **Makefile** a flag-ului de compilare **-Wall** pentru regula **build**)
 +  * [-1.0]: linii mai lungi de 80 de caractere
 +  * [-1.0]: funcții mai lungi de 100 de linii
 +  * [-0.5]: folosirea de [[https://​en.wikipedia.org/​wiki/​Magic_number_(programming)|magic numbers]]
 +  * [-0.5]: numele variabilelor nu sunt sugestive
 +  * [-0.5]: cod comentat
 +  * [-0.5]: trailing whitespaces
 +    * în cadrul cursului de programare nu avem ca obiectiv rezolvarea în cel mai eficient mod posibil a programelor;​ totuși, ne dorim ca abordarea să nu fie una ineficientă,​ de genul să nu folosiți instrucțiuni repetitive acolo unde clar era cazul, etc.
 +
 +====== Trimitere temă ======
 +Tema va fi trimisă folosind [[https://​v2.vmchecker.cs.pub.ro/​homepage/​|V2.vmchecker]],​ cursul **Programarea Calculatoarelor (CB & CD)**. \\
 +
 +Găsiți arhiva cu checker-ul si scheletul temei {{:​programare:​teme_2020:​pc_arhiva_tema4.zip|aici}}.
 +
 +Formatul arhivei care va fi încărcata pe platforma de testare a temelor va fi următorul:
 + - fișierul ''​tema4.c''​.
 + - Un fișier [[https://​en.wikipedia.org/​wiki/​README|README]] în care vă descrieți rezolvarea fiecărui task.
 +
 +<note warning>
 +  - Arhiva trebuie să fie de tipul **ZIP** si sa conțină toate fișierele menționate **IN RADACINA ARHIVEI**.
 +</​note>​
programare/teme_2020/tema4_2020_cbd.1606578473.txt.gz · Last modified: 2020/11/28 17:47 by vlad_matei.draghici
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0