Differences

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

Link to this comparison view

programare-cc:laboratoare:04 [2020/11/22 16:28]
bogdan.nutu
programare-cc:laboratoare:04 [2025/10/27 09:58] (current)
carmen.odubasteanu
Line 1: Line 1:
 ===== Laboratorul 04 - Tablouri ===== ===== Laboratorul 04 - Tablouri =====
  
 +==== Breviar ====
 +
 +**În acest laborator veţi învăţa să:**
 +  * Să folosiţi corect tablouri unidimensionare şi bidimensionale în C.
 +
 +
 +=== Declararea vectorilor ===
 +
 +Vectorii (numiţi mai corect, array-uri) se declară ca orice altă variabilă, după tiparul ​
 +
 +<code c>
 +tip-dată nume-variabila;​
 +</​code>​
 +
 +cu menţiunea că după numele variabilei, vom specifica între paranteze pătrate numărul de elemente.
 +
 +Array-urile în două dimensiuni se numesc în mod uzual //​**matrice**//,​ şi se declară în mod similar, cu menţiunea că vom avea în ordine câte un număr de elemente înconjurat de paranteze pătrate pentru fiecare dimensiune în parte.
 +
 +În definirea tablourilor,​ numărul de dimensiuni nu este limitat decât de raţiuni practice.
 +
 +De exemplu, vom declara un vector de numere intregi, o matrice patratică de numere reale, şi un cub de caractere astfel:
 +
 +<code c>
 +int integer_vector[100];​
 +float floating_point_matrix[100][100];​
 +char character_cube[100][100][100];​
 +</​code>​
 +
 +Putem folosi constante simbolice pentru dimensiunea vectorului:
 +<code c>
 +#define N 100
 +...
 +int integer_vector[N];​
 +</​code>​
 +
 +=== Dimensiunile tablourilor ===
 +
 +<note warning> În standardul ANSI C, nu putem specifica dimensiunile vectorilor decât prin constante. Nu putem declara, de exemplu:
 +<code c>
 +int n = 100;
 +int integer_variable_vector[n];​ /* GRESIT! */
 +</​code>​
 +</​note>​
 +
 +<note important>​Elementele array-urilor sunt numerotate în mod obligatoriu începând de la 0.
 +Constanta de la declararea array-ul reprezinta numarul maxim de elemente care pot fi stocate in array, pentru numarul efectiv de elemente folosite se vor folosi varaiabile (de obicei, o variabila notata cu n pentru vectori)!</​note>​
 +
 +<note important>​ATENŢIE! Numărul dintre paranteze pătrate din cadrul declaraţiei reprezintă numărul maxim de elemente din vector, NU indicele maxim. Din cauză că elementele sunt numerotate începând de la 0, elementul cu indicele maxim din vector este mereu cu 1 mai mic decât dimensiunea vectorului!</​note>​
 +
 +<note warning>​Dacă veţi încerca să accesaţi elemente din vector cu indici negativi sau mai mari sau egali cu dimensiunea vectorului, programul vostru se va comporta imprevizibil!</​note>​
 +
 +<note tip>​Accesarea elementelor dintr-un tablou se face prin intermediul parantezelor pătrate. De exemplu:
 +<code c>
 +v[0]; /* Primul element din array. */
 +a[5][6]; /* Elementul din matrice aflat pe linia 5 şi coloana 6 (numerotarea începe de la 0) */
 +c[1][0][1]; /* Elementul din cub aflat la coordonatele (1, 0, 1) */
 +</​code>​
 +</​note>​
 +
 +=== Iterarea tablourilor ===
 +
 +Una dintre cele mai frecvente operaţii cu tablouri o reprezintă iterarea elementelor din acestea. În mod uzual, iterarea elementelor din tablouri se face în C cu ajutorul unei bucle de tip **//for//** (dar se poate folosi, evident, oricare dintre instrucţiunile repetitive). De exemplu:
 +
 +<code c>
 +int i, j, v[1000], n; // n este numarul efectiv de elemente din vector
 +float a[10][10], nl, nc; //nl, nc numarul efectiv de linii si respectiv, de coloane
 +
 +/* Parcurgem elementele vectorului v şi le inversăm semnul */
 +for (i = 0; i < n; i++) {
 +v[i] = -v[i];
 +}
 + 
 +/* Umplem matricea a cu 0-uri */
 +for (i = 0; i < nl; i++) {
 +for (j = 0; j < nc; j++) {
 +a[i][j] = 0;
 +}
 +}
 +</​code>​
 +
 +<note important>​O altă observaţie importantă este că valorile folosite pe post de indici într-un tablou nu pot fi decât valori (sau variabile) întregi. Nu este permisă indexarea unui tablou folosind variabile de tip float sau double!</​note>​
 +
 +=== Iniţializarea tablourilor ===
 +
 +Tablourile pot fi iniţializate în momentul declarării. Specificarea valorilor din tablouri se face listând în ordine, valorile elementelor,​ începând cu elementul de pe poziţia **0**. De exemplu:
 +
 +<code c>
 +int bancnote[6] = { 1, 5, 10, 50, 100, 200 };
 +float coeficienţi[10] = { 1.0, 2.0 }; // Restul valorilor se vor completa automat cu zerouri.
 +int v[1000] = { 0 }; // Iniţializăm vectorul cu 0 în momentul declarării.
 +// Ultimele 999 de zerouri se pun automat.
 +</​code>​
 +
 +Atunci când în lista de valori sunt specificate mai puţine valori decât dimensiunea vectorului, vectorul se completează cu zerouri! O metoda convenabilă de a iniţializa un vector local unei funcţii cu valoarea 0 poate fi iniţializarea cu o singură valoare de 0, restul completându-se automat.
 +
 +Iniţializarea se poate face şi atunci când este vorba de tablouri în mai multe dimensiuni. Trebuie de ţinut în acest caz minte că o matrice este un vector de vectori, un cub este un vector de vectori de vectori, s.a.m.d.
 +
 +În cazul iniţializării unei matrice, vom iniţializa de fapt câte un vector pentru fiecare linie. Este recomandabil să facem asta respectând următorul coding style:
 +
 +<code c>
 +int produs_linie_coloana[5][5] = {
 +{  0  },
 +{  0,  1,  2,  3,  4  },
 +{  0,  2,  4,  6,  8  },
 +{  0,  3,  6,  9, 12  },
 +{  0,  4,  8, 12, 16  }
 +};
 +</​code>​
 +
 +<note tip>​Observaţi că orice linie incompletă din matrice se va completa automat cu 0. Putem scrie un cod similar şi pentru iniţializarea matrice cu din ce în ce mai multe dimensiuni.</​note>​
  
 ==== Probleme ==== ==== Probleme ====
Line 7: Line 117:
 ---- ----
  
-Program care citeşte un număr ​şi note (între 1 şi 10) şi afişează procentul notelor sub 5.+Program care citeşte un număr ​şi note (între 1 şi 10) şi afişează procentul notelor sub 5.
  
 == Date de intrare == == Date de intrare ==
 ---- ----
  
-Pe prima linie se va afla numărul natural ​ce reprezintă numărul de note. +Pe prima linie se va afla numărul natural ​ce reprezintă numărul de note. 
-Pe a doua linie, ​numere naturale ce reprezintă notele.+Pe a doua linie, ​numere naturale ce reprezintă notele.
  
 == Date de ieşire == == Date de ieşire ==
Line 23: Line 133:
 ---- ----
  
-  * 0 < ≤ 100+  * 0 < ≤ 100
   * Notele au valori cuprinse între **1** şi **10**.   * Notele au valori cuprinse între **1** şi **10**.
  
Line 31: Line 141:
 Să incepem prin identificarea paşilor ce îi avem de parcurs pentru a rezolva problemei: Să incepem prin identificarea paşilor ce îi avem de parcurs pentru a rezolva problemei:
  
-  - citrea numărului **N** şi a vectorului de note şi stocarea lor+  - citrea numărului **n** şi a vectorului de note şi stocarea lor
   - a calcula procentul de note sub 5, va trebui să cunoaştem numărul de note sub 5   - a calcula procentul de note sub 5, va trebui să cunoaştem numărul de note sub 5
   - afişarea rezultatului calculat   - afişarea rezultatului calculat
  
-Fie **//V//** vectorul în care sunt stocate notele. Pseudocodul care calculează procentul de note sub 5 va fi:+Fie **//v//** vectorul în care sunt stocate notele. Pseudocodul care calculează procentul de note sub 5 va fi:
  
 <code c> <code c>
 n5 = 0 n5 = 0
  
-pentru i de la 1 la cu pasul 1 +pentru i de la 1 la cu pasul 1 
-    daca (V[i] < 5) atunci+    daca (v[i] < 5) atunci
         n5 = n5 + 1         n5 = n5 + 1
         ​         ​
Line 54: Line 164:
  
 int main() { int main() {
-    int N, v[100], i, n5;+    int n, v[100], i, n5;
     float procent;     float procent;
     ​     ​
     /* Citim numarul de note ce vor fi introduse de la tastatura */     /* Citim numarul de note ce vor fi introduse de la tastatura */
-    scanf("​%d",​ &N); +    scanf("​%d",​ &n); 
-    for (i = 0; i < N; i++) {+    for (i = 0; i < n; i++) {
         /* Citim a i-a nota */         /* Citim a i-a nota */
         scanf("​%d",​ &v[i]);         scanf("​%d",​ &v[i]);
Line 68: Line 178:
     ​     ​
     /* Parcurgem vectorul de note... */     /* Parcurgem vectorul de note... */
-    for (i = 0; i < N; i++) {+    for (i = 0; i < n; i++) {
         /* ... si daca gasim o nota mai mica decat 5 ... */         /* ... si daca gasim o nota mai mica decat 5 ... */
         if (v[i] < 5) {         if (v[i] < 5) {
Line 80: Line 190:
      * intreaga.      * intreaga.
      */      */
-    procent = (float)n5 * 100 / N;+    procent = (float)n5 * 100 / n;
     ​     ​
     printf("​%.3f",​ procent);     printf("​%.3f",​ procent);
Line 96: Line 206:
 ---- ----
  
-Pe prima linie se va afla un număr natural ​N, care reprezintă ​dimensiunea şirului ​de numere.+Pe prima linie se va afla un număr natural ​n, care reprezintă ​numarul efectiv ​de elemente din vector.
 Pe a doua linie, şirul de numere pozitive şi negative. Pe a doua linie, şirul de numere pozitive şi negative.
  
Line 107: Line 217:
 ---- ----
  
-  * 0 ≤ ≤ 100+  * 0 ≤ ≤ 100
   * Numarul 0 se consideră pozitiv.   * Numarul 0 se consideră pozitiv.
  
Line 127: Line 237:
 ---- ----
  
-Pe prima linie se vor afla două numere naturale, ​şi M, ce reprezintă dimensiunile matricei (numărul de linii şi numărul de coloane). +Pe prima linie se vor citi două numere naturale, ​şi n, ce reprezintă dimensiunile matricei (numărul de linii şi numărul de coloane). 
-Începând cu a doua linie, vor fi câte linii, fiecare a câte numere întregi.+Începând cu a doua linie, vor fi câte linii, fiecare a câte numere întregi.
  
 == Date de ieşire == == Date de ieşire ==
Line 140: Line 250:
 ---- ----
  
-  * 0 < N≤ 100+  * 0 < n≤ 100
  
 == Exemplu == == Exemplu ==
Line 194: Line 304:
 ---- ----
  
-Pe prima linie se va afla un număr natural **N1** ce reprezintă ​dimensiunea primului vector.+Pe prima linie se va afla un număr natural **n1** ce reprezintă ​numarul efectiv de elemente din vectorul 1
 Pe a doua linie se vor afla numere întregi ce reprezintă elementele primului vector. Pe a doua linie se vor afla numere întregi ce reprezintă elementele primului vector.
-Pe a treia linie se va afla un număr natural **N2** ce reprezintă ​dimensiunea celui de-al doilea vector.+Pe a treia linie se va afla un număr natural **n2** ce reprezintă ​numarul efectiv ​de elemente din vectorul 2
 Pe a patra linie se vor afla numere întregi ce reprezintă elementele celui de-al doilea vector. Pe a patra linie se vor afla numere întregi ce reprezintă elementele celui de-al doilea vector.
  
Line 206: Line 316:
 == Restrictii == == Restrictii ==
  
-  * 0 < N1N2 ≤ 1000+  * 0 < n1n2 ≤ 1000
  
 == Exemplu == == Exemplu ==
Line 221: Line 331:
 ---- ----
  
-Pe prima linie se va afla un număr natural, ​N, ce reprezintă numărul de linii si numărul de coloane ale matricei. +Pe prima linie se va afla un număr natural, ​n, ce reprezintă numărul de linii si numărul de coloane ale matricei. 
-Urmează ​linii a câte numere întregi, ce reprezintă elementele matricei.+Urmează ​linii a câte numere întregi, ce reprezintă elementele matricei.
  
  
Line 233: Line 343:
 ---- ----
  
-  * 0 < ≤ 100+  * 0 < ≤ 100
  
 == Exemplu == == Exemplu ==
Line 249: Line 359:
 ---- ----
  
-Pe prima linie se va afla un număr natural, ​N, ce reprezintă ​dimensiunea vectorului. +Pe prima linie se va afla un număr natural, ​n, ce reprezintă ​numarul efectiv de elemente din vector 
-Pe a doua linie se vor afla numere întregi ce reprezintă elementele vectorului.+Pe a doua linie se vor afla numere întregi ce reprezintă elementele vectorului.
  
 == Date de ieşire == == Date de ieşire ==
Line 261: Line 371:
 ---- ----
  
-  * 0 < ≤ 100+  * 0 < ≤ 100
   * Dacă există mai multe secvente crescătoare de lungime maximală, se va afişa cea care începe de la poziţia cea mai din stânga   * Dacă există mai multe secvente crescătoare de lungime maximală, se va afişa cea care începe de la poziţia cea mai din stânga
   * O secvenţă de numere (i,j) este crescătoare dacă şi numai dacă s(k) ≤ s(k+1), oricare ar fi i ≤ k ≤ j-1.   * O secvenţă de numere (i,j) este crescătoare dacă şi numai dacă s(k) ≤ s(k+1), oricare ar fi i ≤ k ≤ j-1.
Line 279: Line 389:
 ---- ----
  
-Pe prima linie se va afla un număr natural, ​N, ce reprezintă ​dimensiunea vectorului. +Pe prima linie se va afla un număr natural, ​n, ce reprezintă ​numarul efectiv de elemente din vector 
-Pe a doua linie se vor afla numere întregi ce reprezintă elementele vectorului.+Pe a doua linie se vor afla numere întregi ce reprezintă elementele vectorului.
  
 == Date de ieşire == == Date de ieşire ==
Line 290: Line 400:
 ---- ----
  
-  * 0 < ≤ 100+  * 0 < ≤ 100
   * Elementele vectorului au valori cuprinde între -10.000 şi 10.000   * Elementele vectorului au valori cuprinde între -10.000 şi 10.000
   * Dacă există mai multe secvente de elemente de sumă maximă, se va afisa cea care începe pe o poziţie cât mai din stânga.   * Dacă există mai multe secvente de elemente de sumă maximă, se va afisa cea care începe pe o poziţie cât mai din stânga.
Line 315: Line 425:
 ---- ----
  
-Pe prima linie se va afla un număr natural, ​N, ce reprezintă ​dimensiunea vectorului. +Pe prima linie se va afla un număr natural, ​n, ce reprezintă ​numarul efectiv de elemente din vector 
-Pe a doua linie se vor afla numere întregi ce reprezintă elementele matricei.+Pe a doua linie se vor afla numere întregi ce reprezintă elementele matricei.
  
  
Line 327: Line 437:
 ---- ----
  
-  * 0 < ≤ 100+  * 0 < ≤ 100
  
 == Exemplu == == Exemplu ==
Line 340: Line 450:
 ---- ----
  
-Scrieţi un program care citeşte n numere reale //X// şi //m + 1// numere întregi //A// şi afişează numărul de valori din //X// situat în fiecare din cele //m// intervale deschise delimitate de valorile din //A//.+Scrieţi un program care citeşte n numere reale //x// şi //m + 1// numere întregi //a// şi afişează numărul de valori din //x// situat în fiecare din cele //m// intervale deschise delimitate de valorile din //a//.
  
 == Date de intrare == == Date de intrare ==
Line 353: Line 463:
 ---- ----
  
-Se va afişa numărul de valori din //X// situat în fiecare din cele //m - 1// intervale deschise delimitate de valorile din //A// sau mesajul //Error// dacă valorile din şirul //A// nu sunt sorte în ordine scrict crescătoare.+Se va afişa numărul de valori din //x// situat în fiecare din cele //m - 1// intervale deschise delimitate de valorile din //a// sau mesajul //Error// dacă valorile din şirul //a// nu sunt sorte în ordine scrict crescătoare.
  
 == Restricţii == == Restricţii ==
Line 417: Line 527:
 ---- ----
  
-Fie un vector de numere întregi (iniţial toate având valoarea 0) de lungime ​N. Se citesc de la tastatură un set de tripleţi de forma B E V fiecare având urmatoarea semnificaţie : toate elementele din vector ale căror poziţii (indexate de la 0) sunt cuprinse între B şi E inclusiv vor fi modificate prin adunare cu V.+Fie un vector de numere întregi (iniţial toate având valoarea 0) de lungime ​n. Se citesc de la tastatură un set de tripleţi de forma B E V fiecare având urmatoarea semnificaţie : toate elementele din vector ale căror poziţii (indexate de la 0) sunt cuprinse între B şi E inclusiv vor fi modificate prin adunare cu V.
  
-Afişati vectorul obţinut în urma aplicării celor operaţii.+Afişati vectorul obţinut în urma aplicării celor operaţii.
  
 == Date de intrare == == Date de intrare ==
 ---- ----
  
-Pe prima linie se vor afla două numere naturale: ​N, ce reprezintă lungimea vectorului şi M, ce reprezintă numărul de tripleţi ce vor fi citiţi de la tastatură. +Pe prima linie se vor afla două numere naturale: ​n, ce reprezintă lungimea vectorului şi m, ce reprezintă numărul de tripleţi ce vor fi citiţi de la tastatură. 
-Pe următoarele ​linii, câte trei numere naturale, B, E şi V, separate prin câte un spaţiu.+Pe următoarele ​linii, câte trei numere naturale, B, E şi V, separate prin câte un spaţiu.
  
  
Line 436: Line 546:
 ---- ----
  
-  * 0 < B(i) ≤ E(i) ≤ ≤ 1.000.000 +  * 0 < B(i) ≤ E(i) ≤ ≤ 1.000.000 
-  * 0 < ≤ 100.000+  * 0 < ≤ 100.000
   * -10.000 ≤ V(i) ≤ 10.000   * -10.000 ≤ V(i) ≤ 10.000
  
programare-cc/laboratoare/04.1606055297.txt.gz · Last modified: 2020/11/22 16:28 by bogdan.nutu
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