Differences

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

Link to this comparison view

sd-ca:laboratoare:lab-01 [2022/03/02 18:05]
andrei.vasiliu2211 [Laborator 1 - Recapitulare PC. Vectori și matrice. Alocare dinamică]
sd-ca:laboratoare:lab-01 [2023/03/01 22:04] (current)
iulia.corici [Exerciții]
Line 55: Line 55:
  
 ===== Void pointer (void*) ===== ===== Void pointer (void*) =====
-Un pointer de tipul ''​void*''​ este un pointer care nu este asociat cu niciun tip de date, ceea ce îi permite să pointeze la adrese de memorie de orice tip. De asemenea, el poate fi castat ​la orice tip de date.+Un pointer de tipul ''​void*''​ este un pointer care nu este asociat cu niciun tip de date, ceea ce îi permite să pointeze la adrese de memorie de orice tip. De asemenea, el poate fi specializat (cast) ​la orice tip de date.
  
 ==== Exemplu de folosire în contextul genericității ==== ==== Exemplu de folosire în contextul genericității ====
Line 98: Line 98:
 Declarare vector static: Declarare vector static:
 <code c> <code c>
-int a[100]; // declarare statică: dimensiunea acestui vector trebuie să fie o constantă la compilare şi nu poate fi modificată în cursul +int a[100]; // declarare statică: dimensiunea acestui vector trebuie să fie o constantă ​ 
-            // execuţiei programului.+            // la compilare şi nu poate fi modificată în cursul execuţiei programului.
  
 </​code>​ </​code>​
Line 163: Line 163:
 </​code>​ </​code>​
 <note important>​ <note important>​
-În acest caz, toată matricea va fi alocată într-o zonă continuă de memorie. Pentru a explicita codul de mai sus, trebuie să ințelegem de ce ''​sizeof(*mat) == 40''​. Acest lucru este datorat faptului că ''​mat''​ desemnează un array de vectori de câte 10 ''​int''​-uri,​ adică 40 de octeți. Va sa zica, pentru oricare ''​i'',​ ''​mat[i]''​ este un vector de 10 ''​int''​-uri. ​Astfel, in memorie, ''​mat''​ arată astfel: +În acest caz, toată matricea va fi alocată într-o zonă continuă de memorie. Pentru a explicita codul de mai sus, trebuie să ințelegem de ce ''​sizeof(*mat) == 40''​. Acest lucru este datorat faptului că ''​mat''​ desemnează un array de vectori de câte 10 ''​int''​-uri,​ adică 40 de octeți. Va sa zica, pentru oricare ''​i'',​ ''​mat[i]''​ este un vector de 10 ''​int''​-uri. ​
- +
-TODO+
 </​note>​ </​note>​
  
Line 252: Line 250:
 </​code>​ </​code>​
  
-Putem defini constante ce vor fi înlocuite peste tot în program în etapa de procesare. Este recomandat să folosim aceasta optiune în defavoarea scrierii efective a constantei deoarece suntem mai predispuși la buguri putând uita sa modificăm constanta în unele părți ale programului.+Putem defini constante ce vor fi înlocuite peste tot în program în etapa de preprocesare. Este recomandat să folosim aceasta optiune în defavoarea scrierii efective a constantei deoarece suntem mai predispuși la buguri putând uita sa modificăm constanta în unele părți ale programului.
  
  
Line 333: Line 331:
  
 ===== Exerciții ===== ===== Exerciții =====
 +{{:​sd-ca:​laboratoare:​lab01_recap_pc_skel.zip|Scheletul de laborator}}
  
-La laboratoarele de Structuri de Date vom folosi compilatorul ''​clang'',​ pe care va trebui să-l instalați rulând comanda ''​sudo apt-get install clang''​. +1) Se citesc de la tastatura N cercuri definite prin coordonatele centrului si raza (toate, numere întregi).
- +
-<​note>​ +
-Fiecare laborator va avea unul sau doua exerciții publice și un pool de subiecte ascunse, din care asistentul poate alege cum se formează celelalte puncte ale laboratorului. +
-</​note>​ +
- +
-{{:​sd-ca:​laboratoare:​01_recap_pc.zip|Scheletul de laborator}} +
- +
-[**4p**] ​Se citesc de la tastatura N cercuri definite prin coordonatele centrului si raza (toate, numere întregi).+
 Sa se numere cate perechi de cercuri se intersectează. Se consideră că două cercuri se intersectează și dacă acestea sunt doar tangente. Sa se numere cate perechi de cercuri se intersectează. Se consideră că două cercuri se intersectează și dacă acestea sunt doar tangente.
  
Line 356: Line 347:
 Output: 4 (se intersectează perechile de cercuri: (1, 2), (1, 3), (2, 3), (4, 5)) Output: 4 (se intersectează perechile de cercuri: (1, 2), (1, 3), (2, 3), (4, 5))
  
-**312CAb** +2) Se citește o matrice de dimensiune n x m. Fiecare linie va forma un număr. Exemplu: linia [3, 0, 2] va forma numărul 302. Afișați suma liniilor. 
-2) [**6p**] Se citește o matrice de dimensiune n x m. Să se rețină în memorie și să se afișeze transpusa ei. +  * Alocați dinamic matricea. 
-  * [**2p**] Alocați dinamic matricea +  * Implementați logica problemei. 
-  * [**2p**] Implementați logica problemei +  * Verificați cu Valgrind că nu aveți memory leaks.
-  * [**2p**] Verificați cu Valgrind că nu aveți memory leaks +
- +
-**314CAb** +
-2) [**6p**] Se citește o matrice de dimensiune n x m. Se va popula cu caracterele ‘B’ -> bomb, ‘E’ -> enemy si ‘X’ -> zona neutră. +
-Fiecare bombă va exploda și va afecta întreaga linie și întreaga coloană din care face parte, transformând-o în zonă neutră. Întoarceți true dacă mai există inamici pe hartă și false în caz contrar. (Afisati "​TRUE"​ / "​FALSE"​) +
-  * [**2p**] Alocați dinamic matricea +
-  * [**2p**] Implementați logica problemei +
-  * [**2p**] Verificați cu Valgrind că nu aveți memory leaks +
-  +
-Exemplu: +
-Matrice inițială:​ +
-[ [X, X, E, X], +
-[X, B, X, X], +
-[X, E, X, X], +
-[X, X, B, X]] +
- +
-După explozia bombelor: +
-[ [X, X, X, X], +
-[X, X, X, X], +
-[X, X, X, X], +
-[X, X, X, X]] -> false +
- +
- +
-**311CAa** +
-2) [**6p**] Un robot pleacă de la coordonatele (0, 0) ale unei matrice de dimensiune n x m. El primește dimensiunile matricei și o serie de comenzi codificate astfel ‘U’ -> up (merge o căsuță în sus), ‘D’ -> down (merge o casuță în jos), ‘R’ -> right (merge o casuță la dreapta), ‘L’ -> left (merge o căsuță la stânga). Robotul primește comenzile ca un șir de caractere (ex: “DDURLLR”). Întoarceți true dacă robotul ajunge înapoi în bază după aceste comenzi (coordonatele (0, 0)) sau false în caz contrar. Afișați false imediat in cazul in care robotul paraseste zona matricei. (Afisati "​TRUE"​ / "​FALSE"​) +
-  * [**2p**] Alocați dinamic matricea +
-  * [**2p**] Implementați logica problemei +
-  * [**2p**] Verificați cu Valgrind că nu aveți memory leaks +
- +
-**313CAb** +
-2) [**6p**] Se citește o matrice de dimensiune n x m, compusa din 0 si 1. Afisati lista numerelor rezultate din conversia in binar a fiecarei linii. +
-Ex: +
-      n = 3 +
-      m = 3 +
-      [[0, 0, 0], [1, 0, 1], [0, 0, 1]] +
-     +
-      Lista: 0 5 1 +
- +
-  * [**2p**] Alocați dinamic matricea +
-  * [**2p**] Implementați logica problemei +
-  * [**2p**] Verificați cu Valgrind că nu aveți memory leaks +
- +
- +
-**312CAa** +
-2) [**6p**] Se citește o matrice de dimensiune n x m cu proprietatea că fiecare linie și coloană este sortată crescător. Să se caute elementul cerut în matrice. Se va întoarce true dacă a fost găsit și false dacă nu a fost găsit. (Afisati "​TRUE"​ / "​FALSE"​) +
-  * [**2p**] Alocați dinamic matricea +
-  * [**2p**] Implementați logica problemei +
-  * [**2p**] Verificați cu Valgrind că nu aveți memory leaks +
- +
- +
-**314CAa** +
-2) [**6p**] ​Se citește o matrice de dimensiune n x m. Fiecare linie va forma un număr. Exemplu: linia [3, 0, 2] va forma numărul 302. Afișați suma liniilor. +
-  * [**2p**] ​Alocați dinamic matricea +
-  * [**2p**] Implementați logica problemei +
-  * [**2p**] Verificați cu Valgrind că nu aveți memory leaks +
- +
- +
-**311CAb** +
-2) [**6p**] Se citește o matrice de dimensiune n x m. Se primesc alte două dimensiuni n’ si m’. Se va face conversia de la matricea de n x m la matricea n’ x m’ și se va afișa noua matrice (dacă este posibil). În caz contrar se va afișa vechea matrice. Conversia este considerata posibila daca numarul de elemente al noi matrici este egal cu numarul de elemente al matricei originale+
-  * [**2p**] Alocați dinamic matricea +
-  * [**2p**] ​Implementați logica problemei +
-  * [**2p**] Verificați cu Valgrind că nu aveți memory leaks +
- +
-Ex: +
-      n = 2 +
-      m = 2 +
-      [[1, 2], [3, 4]] +
-     +
-      n’ = 1 +
-      m’ = 4 +
-      [1, 2, 3, 4] +
- +
-**313CAa** +
-2) [**6p**] Se citește o matrice de dimensiune n x m cu toate elementele 0 și un șir de operații formate din perechi de câte două numere a și b. La fiecare operație, se incrementeaza toate elementele matricei aflate în dreptunghiul cu colțul stânga-sus în [0,0] și dreapta-jos în [a,b]+
-  * [**2p**] Alocați dinamic matricea +
-  * [**2p**] Implementați logica problemei +
-  * [**2p**] ​Verificați cu Valgrind că nu aveți memory leaks +
- +
-Exemplu: +
- +
-m = 3 +
-n = 3 +
- +
-Operații: [1, 1], [2, 2] +
- +
-Inițial, M va fi +
- +
-0 0 0 +
- +
-0 0 0 +
- +
-0 0 0 +
- +
-După [1, 1], M va fi +
- +
-1 1 0 +
- +
-1 1 0 +
- +
-0 0 0 +
- +
-După [2, 2], M va fi +
- +
-2 2 1 +
- +
-2 2 1 +
- +
-1 1 1 +
-                  +
-Afișați matricea finală. +
- +
-**315CAa** +
-2) [**6p**] Se citește o matrice de dimensiune n x m. Verificați daca matricea conține doar numere consecutive. (Afisati "​TRUE"​ / "​FALSE"​) +
-  * [**2p**] Alocați dinamic matricea +
-  * [**2p**] Implementați logica problemei +
-  * [**2p**] Verificați cu Valgrind că nu aveți memory leaks+
  
-Ex: N = 2, M = 4  
-         1 2 3 4  
-         5 6 7 8 
  
-**315CAb** 
-2) [**6**] Se citește o matrice de dimensiune n x m sortată crescător pe linii. Elementele ei vor fi doar 0 și 1. Să se afișeze indexul liniei cu cei mai mulți de 1. Daca mai multe linii au acelasi numar de 1, se va afisa linia cu indexul cel mai mic. 
-  * [**2p**] Alocați dinamic matricea 
-  * [**2p**] Implementați logica problemei 
-  * [**2p**] Verificați cu Valgrind că nu aveți memory leaks 
 ===== Interviu ===== ===== Interviu =====
  
sd-ca/laboratoare/lab-01.1646237129.txt.gz · Last modified: 2022/03/02 18:05 by andrei.vasiliu2211
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