This is an old revision of the document!
În acest laborator veţi învăţa să:
Vectorii (numiţi mai corect, array-uri) se declară ca orice altă variabilă, după tiparul
tip-dată nume-variabila;
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:
int integer_vector[100]; float floating_point_matrix[100][100]; char character_cube[100][100][100];
int n = 100; int integer_variable_vector[n]; /* GRESIT! */
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) */
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:
int i, j, v[1000]; float a[10][10]; /* Parcurgem elementele vectorului v şi le inversăm semnul */ for (i = 0; i < 1000; i++) { v[i] = -v[i]; } /* Umplem matricea a cu 0-uri */ for (i = 0; i < 10; i++) { for (j = 0; j < 10; j++) { a[i][j] = 0; } }
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:
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.
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:
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 } };
Program care citeşte un număr N şi N note (între 1 şi 10) şi afişează procentul notelor sub 5.
Pe prima linie se va afla numărul natural N ce reprezintă numărul de note. Pe a doua linie, N numere naturale ce reprezintă notele.
Se va afişa un număr real, cu trei zecimale exacte, ce reprezintă procentul notelor sub 5.
Să incepem prin identificarea paşilor ce îi avem de parcurs pentru a rezolva problemei:
Fie V vectorul în care sunt stocate notele. Pseudocodul care calculează procentul de note sub 5 va fi:
n5 = 0 pentru i de la 1 la N cu pasul 1 daca (V[i] < 5) atunci n5 = n5 + 1 procent = n5 * 100 / N afișează procent
Programul C care implementează algoritmul descris mai sus va fi:
#include <stdio.h> int main() { int N, v[100], i, n5; float procent; /* Citim numarul de note ce vor fi introduse de la tastatura */ scanf("%d", &N); for (i = 0; i < N; i++) { /* Citim a i-a nota */ scanf("%d", &v[i]); } /* In n5 vom numara cate note mai mici ca 5 au fost citite. Initial sunt 0*/ n5 = 0; /* Parcurgem vectorul de note... */ for (i = 0; i < N; i++) { /* ... si daca gasim o nota mai mica decat 5 ... */ if (v[i] < 5) { /* ... vom incrementa n5. */ n5++; } } /* Aplicam formula de calculare a procentului: cum n5, 100 si N sunt de tip * int, daca nu am converti una dintre ele la float, s-ar face impartire * intreaga. */ procent = (float)n5 * 100 / N; printf("%.3f", procent); return 0; }
Să se scrie un program care citeşte un şir de numere (pozitive şi negative) şi afişează numărul de numere negative şi numărul de numere pozitive din şirul citit.
Pe prima linie se va afla un număr natural N, care reprezintă dimensiunea şirului de numere. Pe a doua linie, şirul de numere pozitive şi negative.
Se vor afişa, pe aceeaşi linie, cu un spaţiu între ele, cele 2 numere naturale reprezentând numărul numerelor negative şi pozitive din şirul citit.
Intrare | Ieşire |
---|---|
5 -2 3 5 -7 11 | 2 3 |
5 2 3 4 4 5 | 0 5 |
Să se scrie un program care determină valoarea minimă dintre toate valorile maxime pe liniile unei matrice de numere intregi (punct in “şa”).
Pe prima linie se vor afla două numere naturale, N şi M, ce reprezintă dimensiunile matricei (numărul de linii şi numărul de coloane). Începând cu a doua linie, vor fi câte N linii, fiecare a câte M numere întregi.
Se va afişa numărul întreg ce reprezintă punctul “şa”.
Intrare | Ieşire |
---|---|
4 4 2 17 1 4 9 2 11 3 1 8 5 6 8 9 3 4 | 8 |
Se citesc 2 matrice A (m x n) şi B (p x q) de la tastatură. Afişaţi matricea C = A * B sau mesajul imposibil. C(i, j) = ∑ A(i, k) * B(k, j), 1 ≤ i ≤ m, 1 ≤ k ≤ n = p, 1 ≤ j ≤ q
Pe prima linie se vor afla două numere naturale, m şi n, ce reprezintă dimensiunile matricei A. Urmează m linii a câte n numere întregi, ce reprezintă elementele matricei A. Pe o nouă linie vor fi alte două numere naturale, p şi q, ce reprezintă dimensiunile matricei B. Urmează p linii a câte q numere întregi, ce reprezintă elementele matricei B.
Pe prima linie se vor afişa două numere naturale reprezentând dimensiunile matricei C, separate printr-un spaţiu. Urmează afişarea elementelor matricei C. În cazul în care nu se poate efectua A * B, se va afişa o singură linie cu mesajul imposibil.
Intrare | Ieşire |
---|---|
2 1 1 2 1 3 1 2 3 | 2 3 1 2 3 2 4 6 |
2 2 1 0 0 1 1 2 5 5 | imposibil |