Differences

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

Link to this comparison view

programare:laboratoare:lab09 [2018/11/13 12:12]
george.muraru [Alocarea dinamică a memoriei. Aplicaţii folosind tablouri şi matrice.]
programare:laboratoare:lab09 [2023/12/15 15:53] (current)
oana.balan [Bonus]
Line 1: Line 1:
 ===== Alocarea dinamică a memoriei. Aplicaţii folosind tablouri şi matrice. ===== ===== Alocarea dinamică a memoriei. Aplicaţii folosind tablouri şi matrice. =====
  
-**Responsabil:** [[laura.vasilescu@cti.pub.ro|Laura Vasilescu]] +**Responsabili:*
-                 ​[[murarugeorgec@gmail.com|George Muraru]] +  * [[neatudarius@gmail.com|Darius Neațu (CA 2019-2020)]] 
 +  * [[ion_dorinel.filip@cti.pub.ro|Dorinel Filip (CA 2019-2020)]] 
 +  ​* [[laura.vasilescu@cti.pub.ro|Laura Vasilescu]] 
 +  ​* ​[[murarugeorgec@gmail.com|George Muraru]]
  
  
Line 43: Line 45:
 <code c> <code c>
 int i; int i;
-int *a = malloc(n * sizeof(int);​+int *a = malloc(n * sizeof(int));
 for (i = 0; i < n; i++) { for (i = 0; i < n; i++) {
     a[i] = 0;     a[i] = 0;
Line 181: Line 183:
   a = malloc(nl * sizeof(int *));   // Alocare pentru vector de pointeri   a = malloc(nl * sizeof(int *));   // Alocare pentru vector de pointeri
  
-  for (i = 0; i < n; i++) {+  for (i = 0; i < nl; i++) {
     a[i] = calloc(nc, sizeof(int));​ // Alocare pentru o linie si initializare la zero     a[i] = calloc(nc, sizeof(int));​ // Alocare pentru o linie si initializare la zero
   }   }
Line 253: Line 255:
 <code c>  <code c> 
 // Alocare memorie si copiere sir // Alocare memorie si copiere sir
-char *mystrdup(char *adr) {+char *mystrdup(char *adr) 
 +{
   int len = strlen(adr);​   int len = strlen(adr);​
   char *rez = malloc(len + 1); // len+1, deoarece avem si un '​\0'​ la final   char *rez = malloc(len + 1); // len+1, deoarece avem si un '​\0'​ la final
Line 268: Line 271:
  
 <code c> <code c>
-// Utilizare "​mystrdup"​ 
 #include <​stdio.h>​ #include <​stdio.h>​
 #include <​string.h>​ #include <​string.h>​
 #include <​stdlib.h>​ #include <​stdlib.h>​
  
 +// Utilizare "​mystrdup"​
 int main(void) int main(void)
 { {
Line 278: Line 281:
  
   do {   do {
-    if (fgets(s, 80, stdin) == 0) {+    if (fgets(s, 80, stdin) == NULL) {
       break;       break;
     }     }
Line 296: Line 299:
 } }
 </​code>​ </​code>​
-Puteti testa codul [[http://​tpcg.io/​6x440f|aici]].+Puteti testa codul [[http://​tpcg.io/​eaSDUd|aici]].
  
 In exemplele urmatoare consideram ca toate alocarile de memorie nu vor esua. In exemplele urmatoare consideram ca toate alocarile de memorie nu vor esua.
Line 332: Line 335:
     printf("​%.2f ", v[i]);     printf("​%.2f ", v[i]);
   }   }
 +  printf("​\n"​);​
   ​   ​
   free(v);   free(v);
Line 393: Line 397:
  
 // Afisare siruri reunite in vector de pointeri // Afisare siruri reunite in vector de pointeri
-void printstr(char *vp[], int n) {+void printstr(char *vp[], int n) 
 +{
   int i;   int i;
  
Line 402: Line 407:
  
 // Ordonare vector de pointeri la siruri // Ordonare vector de pointeri la siruri
-void sort(char *vp[], int n) {+void sort(char *vp[], int n) 
 +{
   int i, j;   int i, j;
   char *tmp;   char *tmp;
Line 418: Line 424:
  
 // Citire siruri si creare vector de pointeri // Citire siruri si creare vector de pointeri
-int readstr (char * vp[]) {+int readstr (char * vp[]) 
 +{
   int n = 0;   int n = 0;
   char *p, sir[80];   char *p, sir[80];
Line 455: Line 462:
   * Nu uitaţi să eliberaţi memoria alocată dinamic, folosind funcţia ''​free()''​. Memoria rămasă neeliberată încetineşte performanţele sistemului şi poate conduce la erori (bug-uri) greu de depistat.   * Nu uitaţi să eliberaţi memoria alocată dinamic, folosind funcţia ''​free()''​. Memoria rămasă neeliberată încetineşte performanţele sistemului şi poate conduce la erori (bug-uri) greu de depistat.
  
-===== Anexă: Clase de stocare ​=====+===== Studiu ​de caz =====
  
 +<spoiler Clase de stocare>
 <​note>​Această secţiune este opţională şi nu este necesară pentru rezolvarea exerciţiilor de laborator, însă ajută la înţelegerea aprofundată a modului în care limbajul C lucrează cu variabilele.</​note>​ <​note>​Această secţiune este opţională şi nu este necesară pentru rezolvarea exerciţiilor de laborator, însă ajută la înţelegerea aprofundată a modului în care limbajul C lucrează cu variabilele.</​note>​
  
Line 469: Line 477:
  
 
Memoria neocupată de datele statice şi de instrucţiunile unui program este împărţită între stivă şi heap. Consumul de memorie pe stivă este mai mare în programele cu funcţii recursive şi număr mare de apeluri recursive, iar consumul de memorie heap este mare în programele cu vectori şi matrice alocate (şi realocate) dinamic. 
Memoria neocupată de datele statice şi de instrucţiunile unui program este împărţită între stivă şi heap. Consumul de memorie pe stivă este mai mare în programele cu funcţii recursive şi număr mare de apeluri recursive, iar consumul de memorie heap este mare în programele cu vectori şi matrice alocate (şi realocate) dinamic.
 +</​spoiler>​
 ===== Exercitii laborator CB/CD ===== ===== Exercitii laborator CB/CD =====
 Codul sursa se gaseste [[http://​swarm.cs.pub.ro/​~gmuraru/​PC/​ex.c|aici]] Codul sursa se gaseste [[http://​swarm.cs.pub.ro/​~gmuraru/​PC/​ex.c|aici]]
Line 482: Line 490:
  
 **Următoarele două probleme vă vor fi date de asistent în cadrul laboratorului.** **Următoarele două probleme vă vor fi date de asistent în cadrul laboratorului.**
 +
 +[[https://​drive.google.com/​drive/​folders/​1qB6EZLGVubKbuTXMtMue06egH_8fo25M|Checker laborator 9]]
 +
 <​hidden>​ <​hidden>​
 Link direct către lista completă de probleme: [[https://​docs.google.com/​document/​d/​15IBKbSiFYEJ_9zeuMksWYnFt2WkKgC1EaigCpyFAi6E/​edit|aici]] Link direct către lista completă de probleme: [[https://​docs.google.com/​document/​d/​15IBKbSiFYEJ_9zeuMksWYnFt2WkKgC1EaigCpyFAi6E/​edit|aici]]
Line 502: Line 513:
       * **[1p]** b) Scrieţi un program care calculează factorialul numerelor de la 1 la 50, afişând câte un număr pe fiecare linie.       * **[1p]** b) Scrieţi un program care calculează factorialul numerelor de la 1 la 50, afişând câte un număr pe fiecare linie.
   - **[2p]** Se consideră un paralelipiped tridimensional cu dimensiunile citite de la tastatură, pentru care va trebui să alocaţi memorie. De asemenea, se citeşte apoi un număr pozitiv N, ce reprezintă un număr de bombe care vor fi plasate în paralelipiped. Apoi se citesc N triplete ce reprezintă coordonatele bombelor. Valorile citite vor trebui validate astfel încât să nu depăşească dimensiunile paralelipipedului. Pentru fiecare cub liber se va calcula numărul de bombe din cei maxim 26 de vecini ai săi, şi aceste numere vor fi afişate pe ecran, alături de coordonatele corespunzătoare. La sfârşitul execuţiei programului,​ memoria alocată va trebui eliberată.   - **[2p]** Se consideră un paralelipiped tridimensional cu dimensiunile citite de la tastatură, pentru care va trebui să alocaţi memorie. De asemenea, se citeşte apoi un număr pozitiv N, ce reprezintă un număr de bombe care vor fi plasate în paralelipiped. Apoi se citesc N triplete ce reprezintă coordonatele bombelor. Valorile citite vor trebui validate astfel încât să nu depăşească dimensiunile paralelipipedului. Pentru fiecare cub liber se va calcula numărul de bombe din cei maxim 26 de vecini ai săi, şi aceste numere vor fi afişate pe ecran, alături de coordonatele corespunzătoare. La sfârşitul execuţiei programului,​ memoria alocată va trebui eliberată.
 +
 +
programare/laboratoare/lab09.1542103949.txt.gz · Last modified: 2018/11/13 12:12 by george.muraru
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