Programarea calculatoarelor

Mărimea: px
Porniți afișarea la pagina:

Download "Programarea calculatoarelor"

Transcriere

1 Universitatea Constantin Brâncuşi din Târgu-Jiu Facultatea de Inginerie Departamentul de Automatică, Energie şi Mediu Programarea calculatoarelor Lect. dr. Adrian Runceanu

2 Curs Programarea calculatoarelor 2

3 Capitolul 7. Tablouri 7.1. Generalități. Clasificare 7.2. Tablouri unidimensionale (vectori) 7.3. Tablouri bidimensionale (matrici) 7.4. Tablouri multidimensionale Programarea calculatoarelor 3

4 7.1. Generalitati. Clasificare Numim tablou o colecţie de date de acelaşi tip, în care elementele sunt ordonate, iar accesul la fiecare element are loc prin indice. În funcţie de numărul indicilor avem mai multe tipuri de tablouri: 1. Tablouri unidimensionale (cu un singur indice) 2. Tablouri bidimensionale (cu doi indici) 3. Tablouri multidimensionale (cu mai mulţi indici) Programarea calculatoarelor 4

5 Capitolul 7. Tablouri 7.1. Generalități. Clasificare 7.2. Tablouri unidimensionale (vectori) 7.3. Tablouri bidimensionale (matrici) 7.4. Tablouri multidimensionale Programarea calculatoarelor 5

6 7.2. Tablouri unidimensionale (vectori) Tablourile unidimensionale funcţionează ca un vector şi se pot declara astfel: tip nume_tablou[dimensiune_maximă]; Se observă că este obligatorie folosirea parantezelor drepte care să încadreze dimensiunea maximă pe care o alege utilizatorul pentru acel tablou unidimensional Programarea calculatoarelor 6

7 7.2. Tablouri unidimensionale (vectori) Exemplu: Declarări de tablouri unidimensionale: int a[25]; // declararea unui tablou unidimensional cu maxim 25 de // elemente, fiecare de tip întreg float x[30]; // declararea unui tablou unidimensional cu maxim 30 de // elemente, fiecare de tip real simplă precizie char s[40]; // declararea unui tablou unidimensional cu maxim 40 de // elemente, fiecare de tip caracter Programarea calculatoarelor 7

8 7.2. Tablouri unidimensionale (vectori) Compilatorul C++ alocă un spaţiu de memorie egal cu numărul maxim de elemente ale tabloului, rezervând bineînţeles octeţi în funcţie de tipul de bază al fiecărui tablou. Accesul la fiecare element al tabloului se face prin numele acestuia urmat între paranteze, de indicele său (adică poziţia pe care o ocupă în tablou). În limbajul C++, indicii tablourilor încep numărătoarea de la valoarea Programarea calculatoarelor 8

9 7.2. Tablouri unidimensionale (vectori) Exemplu: Modalităţi de acces la elementele ce pot fi memorate în tablourile unidimensionale declarate anterior: a[0] reprezintă elementul aflat pe prima poziţie în tablou a[24] - reprezintă elementul aflat pe ultima poziţie în tablou x[i] - reprezintă elementul aflat pe poziţia i în tablou, unde i poate avea valori între 0 şi Programarea calculatoarelor 9

10 7.2. Tablouri unidimensionale (vectori) Iniţializarea elementelor unui tablou se poate face total sau parţial la declararea lor: int b[5] = {1, 2, 3, 4, 5; Astfel: elementul b[0] are valoarea 1 elementul b[1] are valoarea 2 elementul b[2] are valoarea 3 elementul b[3] are valoarea 4 elementul b[4] are valoarea Programarea calculatoarelor 10

11 7.2. Tablouri unidimensionale (vectori) Problema 1: Se consideră n numere reale. Se cere să se determine valoarea minimă şi valoarea maximă. Exemplu: Date de intrare: n=5 si x={10, -2, 34, -198, 4 Date de ieşire: minim=-198, maxim= Programarea calculatoarelor 11

12 7.2. Tablouri unidimensionale (vectori) #include<iostream.h> int main(void) { int i, n; float x[50], min, max; cout<<"dati numarul de elemente ale tabloului "; cin>>n; for( i = 1; i <= n; i++ ) { cout<<"x["<<i<<"]= "; cin>>x[i]; Citirea numarului de elemente ce vor fi prelucrate in vector - n Citirea elementelor si memorarea lor in vectorul x Programarea calculatoarelor 12

13 7.2. Tablouri unidimensionale (vectori) min = x[1]; max = x[1]; for( i=2; i<=n; i++ ) if( min > x[i] ) min = x[i]; else if( max < x[i] ) max = x[i]; cout<<"\nminimul este "<<min; cout<<"\nmaximul este "<<max; Determinarea minimului Determinarea maximului Programarea calculatoarelor 13

14 7.2. Tablouri unidimensionale (vectori) Executia programului pe o serie de date de test: Programarea calculatoarelor 14

15 7.2. Tablouri unidimensionale (vectori) Problema 2: Se consideră n numere întregi. Se cere să se verifice dacă ele sunt sau nu în ordine crescătoare, afișând câte un mesaj corespunzător. Exemplu: Date de intrare: n=5 si x={1, 2, 17, 25, 43 Date de ieşire: Elemente vectorului sunt in ordine crescatoare Programarea calculatoarelor 15

16 7.2. Tablouri unidimensionale (vectori) #include<iostream.h> int main(void) { int i, n, verif=1; int x[50]; cout<<"dati numarul de elemente ale tabloului X "; cin>>n; for(i=1; i<=n; i++) { cout<<"x["<<i<<"]= "; cin>>x[i]; Citirea numarului de elemente ce vor fi prelucrate in vector - n Citirea elementelor si memorarea lor in vectorul x Programarea calculatoarelor 16

17 7.2. Tablouri unidimensionale (vectori) for(i=1; i<=n-1; i++) if( x[i] > x[i+1] ) verif=0; Verificarea proprietatii cerute in enunt if( verif == 1 ) cout<<"numerele din tablou sunt in ordine CRESCATOARE"; else cout<<"numerele din tablou NU sunt in ordine CRESCATOARE"; Programarea calculatoarelor 17

18 7.2. Tablouri unidimensionale (vectori) Executia programului pe doua serii de date de test: Programarea calculatoarelor 18

19 Capitolul 7. Tablouri 7.1. Generalităţi. Clasificare 7.2. Tablouri unidimensionale (vectori) 7.3. Tablouri bidimensionale (matrici) 7.4. Tablouri multidimensionale Programarea calculatoarelor 19

20 7.3. Tablouri bidimensionale (matrici) Tablourile bidimensionale funcţionează ca o matrice şi se pot declara astfel: tip nume_tablou[dim_linie][dim_coloana]; La fel ca şi în cazul tablourilor unidimensionale, şi în cazul tablourilor bidimensionale, la declarare, se trece dimensiunea maximă a liniilor (dim_linie) şi dimensiunea maximă a coloanelor (dim_coloana) Programarea calculatoarelor 20

21 7.3. Tablouri bidimensionale (matrici) Exemplu: Declarări de tablouri bidimensionale: int a[10][10]; // declararea unui tablou bidimensional cu maxim 100 de // elemente (10*10), fiecare de tip întreg float x[5][5]; // declararea unui tablou bidimensional cu maxim 25 de // elemente(5*5), fiecare de tip real simplă precizie char s[20][10]; // declararea unui tablou bidimensional cu maxim 200 de // elemente(20*10), fiecare de tip caracter Programarea calculatoarelor 21

22 7.3. Tablouri bidimensionale (matrici) Compilatorul C++ alocă un spaţiu de memorie egal cu numărul de linii înmulţit cu numărul de coloane ale tabloului, rezervând bineînţeles octeţi în funcţie de tipul de bază al fiecărui tablou. Accesul la fiecare element al tabloului se face prin numele acestuia urmat între paranteze, de indicele liniei şi indicele coloanei (adică poziţia pe care o ocupă în tablou) Programarea calculatoarelor 22

23 7.3. Tablouri bidimensionale (matrici) Exemplu: Modalităţi de acces la elementele ce pot fi memorate în tablourile bidimensionale declarate anterior: a[0][0] reprezintă elementul aflat pe linia 0 coloana 0 a[9][9] - reprezintă elementul aflat pe linia 9 coloana 9 x[i][j] - reprezintă elementul aflat pe linia i, coloana j în matrice, unde i şi j pot avea valori între 0 şi Programarea calculatoarelor 23

24 7.3. Tablouri bidimensionale (matrici) Iniţializarea elementelor unui tablou se poate face total sau parţial la declararea lor: int b[2][3]={ {1, 2, 3, {4, 5, 6 ; Astfel: elementul b[0][0] are valoarea 1 elementul b[0][1] are valoarea 2 elementul b[0][2] are valoarea 3 elementul b[1][0] are valoarea 4 elementul b[1][1] are valoarea 5 elementul b[1][2] are valoarea Programarea calculatoarelor 24

25 7.3. Tablouri bidimensionale (matrici) Problema 1: Se consideră o matrice A cu n m numere întregi. Se cere să se obţină transpusa sa. Exemplu: Date de intrare: n=3, m=4 si matricea A: Date de ieşire: Matricea transpusa B: n=4 si m= Programarea calculatoarelor 25

26 7.3. Tablouri bidimensionale (matrici) #include<iostream.h> int main(void) { int a[10][10], b[10][10]; int n, m, i, j; cout<<"dati dimensiunile matricei A \n"; cout<<"dati numarul de linii n = "; cin>>n; cout<<"dati numarul de coloane m = "; cin>>m; for(i=1; i<=n; i++) for(j=1; j<=m; j++) { cout<<"a["<<i<<", "<<j<<"] = "; cin>>a[i][j]; Citirea numarului de linii n si de coloane - m ale matricei Citirea elementelor si memorarea lor in matricea a Programarea calculatoarelor 26

27 7.3. Tablouri bidimensionale (matrici) cout<<"elementele matricei A sunt : \n"; for(i=1; i<=n; i++) { for(j=1; j<=m; j++) cout<<a[i][j]<<" "; cout<<"\n"; Afisarea elementelor din matricea a Programarea calculatoarelor 27

28 7.3. Tablouri bidimensionale (matrici) Construirea matricei transpuse prin transformarea liniilor in coloane si invers for(i=1; i<=n; i++) for(j=1; j<=m; j++) b[j][i] = a[i][j]; cout<<"elementele matricei transpuse sunt \n"; for(i=1; i<=m; i++) { for(j=1; j<=n; j++) cout<<b[i][j]<<" "; cout<< "\n"; Programarea calculatoarelor 28

29 7.3. Tablouri bidimensionale (matrici) Executia programului pe o serie de date de test: Programarea calculatoarelor 29

30 7.3. Tablouri bidimensionale (matrici) Problema 2: Se consideră două tablouri bidimensionale (matrici) A şi B cu n m numere întregi. Se cere să se calculeze matricea suma: C = A + B Programarea calculatoarelor 30

31 #include<iostream.h> int main(void) { 7.3. Tablouri bidimensionale (matrici) int Matrice1 [10][10], Matrice2 [10][10],Matricesuma[10][10]; int i, j, n, m; cout<<"dati dimensiunile primei matrici \n"; cout<<"dati numarul de linii n = "; cin>>n; cout<<"dati numarul de coloane m = "; cin>>m; for(i=1; i<=n; i++){ Citirea numarului de linii n si de coloane - m ale matricei for(j=1; j<=m; j++){ cout<<"matrice1["<<i<<", "<<j<<"] = "; cin>>matrice1[i][j]; Citirea elementelor si memorarea lor in prima matrice Programarea calculatoarelor 31

32 7.3. Tablouri bidimensionale (matrici) cout<<"elementele primei matrici sunt : \n"; for(i=1; i<=n; i++) { for(j=1; j<=m; j++) cout<<matrice1[i][j]<<" "; cout<<"\n"; Afisarea elementelor din prima matrice Programarea calculatoarelor 32

33 7.3. Tablouri bidimensionale (matrici) for(i=1; i<=n; i++){ for(j=1; j<=m; j++){ cout<<"matrice2["<<i<<", "<<j<<"] = "; cin>>matrice2[i][j]; cout<<"elementele celei de-a doua matrice sunt : \n"; for(i=1; i<=n; i++) { for(j=1; j<=m; j++) cout<<matrice2[i][j]<<" "; cout<<"\n"; Programarea calculatoarelor 33

34 7.3. Tablouri bidimensionale (matrici) Construirea matricei suma prin adunarea for(i=1; i<=n; i++) valorilor pe linie si pe coloana for(j=1; j<=m; j++) Matricesuma[i][j]=Matrice1[i][j]+Matrice2[i][j]; cout<<"elementele matricii suma sunt : \n"; for(i=1; i<=n; i++) { for(j=1; j<=m; j++) cout<<matricesuma[i][j]<<" "; cout<<"\n"; Programarea calculatoarelor 34

35 7.3. Tablouri bidimensionale (matrici) Executia programului pe o serie de date de test: Programarea calculatoarelor 35

36 7.3. Tablouri bidimensionale (matrici) Problema 3: Se consideră două tablouri bidimensionale (matrici) A şi B cu n m, respectiv m p numere întregi. Se cere să se calculeze matricea produs: C = A * B Programarea calculatoarelor 36

37 7.3. Tablouri bidimensionale (matrici) Exemplu: Date de intrare: n=2, m=3 si matricea a: m=3, p=4 si matricea b: Date de iesire: n=2 si p=3 si matricea produs c: Programarea calculatoarelor 37

38 7.3. Tablouri bidimensionale (matrici) #include<iostream.h> int main(void) { int a[10][10], b[10][10], c[10][10]; int n, m, i, j, k, p; cout<<"dati dimensiunile matricei A \n"; cout<<"dati numarul de linii n = "; cin>>n; cout<<"dati numarul de coloane m = "; cin>>m; for(i=1; i<=n; i++) for(j=1; j<=m; j++) { cout<<"a["<<i<<", "<<j<<"] = "; cin>>a[i][j]; Citirea numarului de linii n si de coloane - m ale matricei Citirea elementelor si memorarea lor in matricea a Programarea calculatoarelor 38

39 7.3. Tablouri bidimensionale (matrici) cout<<"elementele matricei A sunt : \n"; for(i=1; i<=n; i++) { for(j=1; j<=m; j++) cout<<a[i][j]<<" "; cout<< "\n"; Afisarea elementelor din matricea a Programarea calculatoarelor 39

40 7.3. Tablouri bidimensionale (matrici) cout<<"dati dimensiunile matricei B \n"; cout<<"dati numarul de linii m = "; cin>>m; cout<<"dati numarul de coloane p = "; cin>>p; for(i=1; i<=m; i++) for(j=1; j<=p; j++) { cout<< "b["<<i<<", "<<j<<"] = "; cin>>b[i][j]; cout<<"elementele matricei B sunt : \n"; for(i=1; i<=m; i++) { for(j=1; j<=p; j++) cout<<b[i][j]<<" "; cout<<"\n"; Citirea elementelor si memorarea lor in matricea b Programarea calculatoarelor 40

41 7.3. Tablouri bidimensionale (matrici) Conditie: Numarul de coloane din prima matrice trebuie sa fie egal cu numarul de linii din a doua matrice. Prima matrice 2 x 4 A doua matrice 4 x 3 Trebuie sa fie acelasi numar Matricea rezultat Programarea calculatoarelor 41

42 7.3. Tablouri bidimensionale (matrici) for(i=1; i<=n; i++) for(j=1; j<=p; j++) { c[i][j] = 0; for(k=1; k<=m; k++) c[i][j] = c[i][j] + a[i][k] * b[k][j]; Calculul elementelor matricei produs c Programarea calculatoarelor 42

43 7.3. Tablouri bidimensionale (matrici) cout<<"elementele matricei produs C sunt : \n"; for(i=1; i<=n; i++) { for(j=1; j<=p; j++) cout<<c[i][j]<<" "; cout<<"\n"; Programarea calculatoarelor 43

44 7.3. Tablouri bidimensionale (matrici) Executia programului pe o serie de date de test: Programarea calculatoarelor 44

45 Probleme rezolvate tablouri unidimensionale Enunt: Se considera un numar natural n. Se cere sa se formeze un vector cu cifrele numarului. Exemplu: Date de intrare: Pentru valoarea: n = Date de iesire: Se obtine vectorul cu elementele: Programarea calculatoarelor 45

46 Probleme rezolvate tablouri unidimensionale #include<iostream.h> int main(void) { // declaram variabilele pe care le vom utiliza in program int x[30]; long int n, i, m; cout<<"dati numarul natural n = "; cin>>n; Programarea calculatoarelor 46

47 Probleme rezolvate tablouri unidimensionale i = 1; while(n!= 0){ x[i] = n % 10; i++; n = n / 10; m = i-1; cout<<"\nvectorul cu cifrele numarului este \n"; for(i = 1; i <= m; i++){ cout.width(3); cout<<x[i]; Programarea calculatoarelor 47

48 Probleme rezolvate tablouri unidimensionale Executia programului pe o serie de date de test: Programarea calculatoarelor 48

49 Probleme rezolvate tablouri unidimensionale Enunt: Reuniunea a doua multimi Sa se scrie un program care sa calculeze reuniunea a doua multimi de cate n, respectiv m numere intregi memorate cu ajutorul vectorilor. Exemplu: Date de intrare: n = 5 a = {1, 2, 5, 7, 12 si m = 4 b = {2, 4, 8, 12 Date de iesire: se obtine: k=7 c={1, 2, 5, 7, 12, 4, Programarea calculatoarelor 49

50 Probleme rezolvate tablouri unidimensionale #include<iostream.h> int main(void) { int a[100], b[100], c[100], n, m, i, j, k, ok; cout<<"dati cardinalul multimii A - n = "; cin>>n; cout<<"dati elementele multimii A \n"; for(i = 1; i <= n; i++){ cout<<"a["<<i<<"] = "; cin>>a[i]; Programarea calculatoarelor 50

51 Probleme rezolvate tablouri unidimensionale cout<<"dati cardinalul multimii B - m = "; cin>>m; cout<<"dati elementele multimii B \n"; for(i = 1; i <= m; i++) { cout<<"b["<<i<<"] = "; cin>>b[i]; // copiem elementele din multimea A in multimea C for(i = 1; i <= n; i++) c[i]=a[i]; k = n; Programarea calculatoarelor 51

52 Probleme rezolvate tablouri unidimensionale for(j = 1; j <= m; j++) { ok = 1; // variabila care verifica daca un element apartine sau un multimii A for(i = 1; i <=n ;i++) if(b[j] == a[i]) // daca elementul din multimea B apartine si multimii A atunci nu-l adaugam in multimea reuniune - C ok = 0; if(ok == 1) { k++; c[k] = b[j]; Programarea calculatoarelor 52

53 Probleme rezolvate tablouri unidimensionale cout<<"\nelementele multimii reuniune sunt : \n"; for(i = 1; i <= k; i++) { cout.width(9); cout<<c[i]; Programarea calculatoarelor 53

54 Probleme rezolvate tablouri unidimensionale Executia programului pe o serie de date de test: Programarea calculatoarelor 54

55 Probleme propuse spre rezolvate tablouri unidimensionale 1. Intersectia a doua multimi Sa se scrie un program care sa calculeze intersectia a doua multimi de cate n, respectiv m numere intregi memorate cu ajutorul vectorilor. Exemplu: Date de intrare: n = 5 a = {1, 2, 5, 7, 12 si m = 4 b = {2, 4, 8, 12 Date de iesire: se obtine: k = 2 d = {2, Programarea calculatoarelor 55

56 Probleme propuse spre rezolvate tablouri unidimensionale 2. Diferența a două mulțimi Sa se scrie un program care sa calculeze diferenta a doua multimi de cate n, respectiv m numere intregi memorate cu ajutorul vectorilor. Exemplu: Date de intrare: n = 5 a = {1, 2, 5, 7, 12 si m = 4 b = {2, 4, 8, 12 Date de iesire: se obtine: k = 3 e = {1, 5, Programarea calculatoarelor 56

57 Probleme propuse spre rezolvate tablouri unidimensionale 3. Se dă un şir de n numere naturale. Să se afişeze pe două randuri, pe primul rand cele pare şi pe al doilea cele impare. Exemplu: Date de intrare: Pentru n = 10 si elementele Date de iesire: Programarea calculatoarelor 57

58 Probleme propuse spre rezolvate tablouri unidimensionale 4. Sa se scrie un program care sa introducă n numere intr-un vector şi să citeasccă un număr d. Să se afişeze acele numere din şirul dat care sunt divizibile cu d. Exemplu: Date de intrare: n=5 si valorile: , d=5 Date de iesire: Programarea calculatoarelor 58

59 Probleme propuse spre rezolvate tablouri unidimensionale 5. Se introduc temperaturile măsurate in n zile. Să se scrie un program care să afişeze media temperaturilor negative şi media celor pozitive. Exemplu: Date de intrare: n = 5 si temperaturile: Date de iesire: Programarea calculatoarelor 59

60 Întrebări? Programarea calculatoarelor 60