Andra şi Ştefan, doi studenţi la ACS, s-au hotărât să se joace faimosul joc de strategie, Avioanele. Fiind foarte competitivi din fire, aceştia au decis să complice puţin regulile jocului. Astfel, fiecare dintre ei o să deseneze nr_avioane avioane şi nr_obstacole obstacole, într-o matrice de dimensiune N * N.
Avioanele pot fi de 2 tipuri:
Ele pot avea capul îndreptat în 4 direcţii.
Ca lucrurile să fie şi mai complicate, fiecare avion o să aibă o anumită viteză v. Astfel, la un moment de timp T, un avion o să se deplaseze cu v * T unități în direcţia deja stabilită.
Obstacolele sunt de dimensiune 1 x 1 şi sunt alese pentru a încurca adversarul.
După ce fiecare dintre ei îşi desenează pe foaie avioanele, aceştia realizează că nu mai au timp să şi înceapă jocul. Ştiind că are o strategie bună, Ştefan doreşte să îşi păstrează informaţiile despre avioanele lui. Astfel, el stochează datele într-un vector generic void *info, păstrând pentru fiecare avion, în ordine, următoarele informaţii:
Din păcate pentru el, Andra reușește să obţină acest vector, dar are nevoie de ajutorul vostru pentru a extrage informaţiile necesare.
void SolveTask1(void *info, int nr_avioane)
Funcţia primeşte ca parametri vectorul descris anterior, numărul de avioane și afișează pe ecran informațiile despre fiecare avion în ordinea următoare:
Între 2 avioane consecutive se va lăsa un rând gol.
Input: 1 // numărul task-ului 2 // numărul de avioane din vector 0 2 N // linia, coloana şi direcţia primului avion 1BUC // codul primului avion 1 // viteza primului avion 6 4 W 2AMS 2
Output: (0, 2) N 1BUC 1 (6, 4) W 2AMS 2
void SolveTask2(void *info, int nr_avioane, int N, char **mat)
Funcţia primeşte ca parametri vectorul descris anterior, numărul de avioane, dimensiunea matricii de caractere mat care trebuie completată cu ‘*’ sau ‘.’ astfel: dacă la linia i şi coloana j se găseşte un avion, atunci mat[i][j] = ‘*’, în caz contrar mat[i][j] = ‘.’.
Input: 2 2 0 2 N 1BUC 1 6 4 W 2AMS 3 10 //valoarea lui N
Output: ..*....... *****..... ..*....... .***..*... ......*.*. .....**.*. ....*****. .....**.*. ......*.*. ......*...
void SolveTask3(void *info, int nr_avioane)
Funcţia primeşte ca parametri vectorul descris anterior, numărul de avioane şi sortează avioanele astfel:
După ce au fost sortate, informaţiile despre avioane o să fie afişate la fel ca la Task-ul 1.
Input: 3 6 0 2 N 1BUC 1 6 4 W 2AMS 3 12 20 N 1CDB 5 13 25 S 1PRC 10 20 4 W 2BUC 7 45 54 E 1BUC 4
Output: (13, 25) S 1PRC 10 (12, 20) N 1CDB 5 (0, 2) N 1BUC 1 (45, 54) E 1BUC 4 (20, 4) W 2BUC 7 (6, 4) W 2AMS 3
void SolveTask4(void *info, int nr_avioane, int nr_obstacole, int *x, int *y, int N)
Funcţia primeşte ca parametri vectorul descris anterior, numărul de avioane, numărul de obstacole puse de Andra, 2 vectori x și y care păstrează linia, respectiv coloana unde se găsesc obstacolele şi dimensiunea matricii. Funcţia afişează numărul de avioane care ar putea să se deplaseze până la ieşirea de pe hartă în siguranţă (pe tot traseul nu au lovit niciun obstacol)
Input: 4 2 0 2 N 1BUC 1 6 4 W 2AMS 3 4 // numărul de obstacole 1 8 // linia şi coloana primului obstacol 5 1 7 7 9 3 10
Output: 1
@ - locul unde se găsesc obstacolele
void SolveTask5(void *info, int nr_avioane, int T, int nr_pct_coord, int *X, int *Y, int N)
Funcţia primeşte ca parametri vectorul descris anterior, numărul de avioane, un timp T, nr_pct_coord coordonate care sunt păstrate în vectorii X şi Y (X[0] şi Y[0] reprezintă linia, respectiv coloana primul obstacol) şi dimensiunea matricii. Funcţia afişează pentru fiecare moment de timp de la 0 la T câte avioane se află în punctele păstrate în cei 2 vectori descrişi anterior.
Input: 5 2 0 2 N 1OTP 1 6 4 W 2LTN 3 2 // T 5 // nr_pct_coord 1 4 5 1 7 7 6 4 9 6 10
Output: 0: 2 1: 1 2: 0
Pentru T = 1 poziţia avioanelor o să fie:
Pentru T = 2 poziţia avioanelor o să fie:
Rezolvările voastre o să fie făcute în cadrul fişierelor task1.c, task2.c, task3.c, task4.c, task5.c în interiorul funcţiilor existente deja.
Tema va fi trimisă folosind vmchecker, cursul Programarea Calculatoarelor (CB & CD).
Toate temele sunt testate în mod automat pe VMChecker. Autentificarea se face folosind numele de utilizator și parola de pe moodle / Teams.
Din meniul drop-down selectați cursul corespunzător; în cazul de față: Programarea Calculatoarelor (CB & CD). În meniul didebar, din partea stângă a paginii, selectați tema pentru care veți face submisia.
Arhiva temei se va încărca pe checker folosind formularul de submisie din tabul Trimitere solutii.
Rezultatele vor fi disponibile în tabul Rezultate.
Citiți cu atenție informațiile afișate în Rezultate pentru a vă asigura că tema a fost rulată cu succes; o eroare comună este dată de faptul că conținutul arhivei nu respectă structura dorită (ex. fișierele sunt într-un alt director).
Punctajul final al temei este afișat la finalul informațiilor afișate în Rezultate.
Conținutul arhivei va fi următorul:
make zip
Lista nu este exhaustivă.
Dacă aveți nelămuriri, puteți să ne contactați pe forum tema 2 sau pe canalul Tema 2. La orice întrebare vom răspunde în maxim 24 de ore. Nu se acceptă întrebări în ultimele 24 de ore înainte de deadline.