This shows you the differences between two versions of the page.
|
programare:teme_2020:tema4_2020_cbd [2020/11/28 19:23] 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 154: | Line 156: | ||
| <note warning> Dupa vector **NU** trebuie să existe un **\n**! </note> | <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> | ||