This shows you the differences between two versions of the page.
programare:teme_2020:tema4_2020_cbd [2020/11/28 19:49] 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: **5 Noiembrie 2019, ora 22:20** | + | * Data publicare: **30 Noiembrie 2020** |
- | * Deadline: **6 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 85: | Line 86: | ||
*Output-ul este un șir de caractere căruia îi este făcut cast la ** void * ** | *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) ** | 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ță ====== | ====== Cerință ====== | ||
Line 164: | Line 166: | ||
==== Task 5 (10p) ==== | ==== Task 5 (10p) ==== | ||
- | <note> Trebuie să se completeze funcțiile **readPlayer** si **readGame** din **tema4.c**. </note> | + | <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. | 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. | ||
Line 223: | Line 225: | ||
Impostor | Impostor | ||
</code> | </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> |