Sunteți pe pagina 1din 10

Programarea Calculatoarelor și Limbaje de Programare II - Laborator

Laborator 9

Tablouri în limbajul C

Scopul Lucrării de Laborator

Scopul acestei lucrări de laborator este familiarizarea studenților cu tipurile de date tablou și utilizarea
acestora în limbajul de programare C. Se vor prezenta sumar noțiuni teoretice și se vor rezolva aplicații
folosind mediul de programare CodeBlocks.

Noțiuni teoretice

Un tablou este colecție de variabile de același tip care sunt apelate folosind același nume (al tabloului).
În limbajul C, tablourile se regăsesc în locații de memorie adiacente, unde primul element corespunde
adresei de memorie cea mai mică (din blocul de memorie alocat) și ultimul element corespunde
adresei de memorie cea mai mare. Tablourile pot avea mai multe dimensiuni. Uzual putem denumi
tablourile unidimensionale, șiruri, iar tablourile bidimensionale matrice.

Ca și un exemplu putem considera un șir (tablou unidimensional) a de numere întregi cu 9 elemente.


Adresele de memorie pentru elementele șirului pot fi asociate astfel:

element a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8]
adresă 1000 1001 1002 1003 1004 1005 1006 1007 1008
valoare 1 3 2 1 1 1 0 2 5

Indexarea într-un tablou în limbajul C se referă la referă la apelul elementelor din tablou. În C
indexarea începe de la 0 (pentru primul element) și merge până la n-1 (unde n reprezintă numărul de
elemente din tablou). Limbajul C nu are posibilitatea de verificare a depășirii limitelor pentru tablouri.
Programatorul are datoria de a asigura verificarea depășirii limitelor acolo unde este nevoie.

Notă: există o strânsă legătură între tablouri și pointeri (operatorii & și *) lucru care va fi punctat
sumar în acest laborator printr-un exemplu și în laboratorul viitor în detaliu.

Tablouri unidimensionale

Formă:

tip nume_variabila[dimensiune]

unde tip reprezintă tipul de date ale tabloului (int, float, etc.) nume_variabila reprezintă numele
tabloului și dimensiune reprezintă numărul de elemente din tablou. Observăm că se folosesc
parantezele drepte „ [] ” pentru declararea tabloului. Folosirea parantezelor drepte este necesară
și pentru referirea la un termen din interiorului tabloului.

1
Programarea Calculatoarelor și Limbaje de Programare II - Laborator

Aplicații rezolvate

Aplicația 1. Să se scrie un program în care se declară un șir a cu dimensiunea 100 (definită cu directiva
define) și se introduc valori pare (de la 0 la 2n) pentru elementele șirului. Ulterior, se va afișa șirul.

Aplicația 2. Să se scrie un program în care se citesc de la tastatură elementele unui sir a[n] (n citit de
la tastatură) și se afișează șirul.

2
Programarea Calculatoarelor și Limbaje de Programare II - Laborator

Observații:

1. În Aplicația 1 se observă că dimensiunea tabloului a fost predefinită în codul sursă. Astfel


compilatorul prealocă memorie necesară pentru dimensiunea șirului. Această manieră de
programare este conformă cu standardul C89;
2. În Aplicația 2 dimensiunea tabloului a fost citită de la tastatură (după compilare). Folosirea
tablourilor de dimensiune variabilă a fost introdusă în standardul C99. Compilatoarele C89 nu
suportă această alocare.

Tablouri bidimensionale

Forma:

tip nume_variabila[dimensiune_1] [dimensiune_2]

unde tip reprezintă tipul de date ale tabloului (int, float, etc.) nume_variabila reprezintă numele
tabloului și dimensiune_1 respectiv dimensiune_2 reprezintă numărul de linii respectiv coloane din
tablou.

Aplicații rezolvate

Aplicația 3. Să se scrie un program în care se citește de la tastatură o matrice pătratică A3x3 cu numere
întregi, după care se înlocuiește elementul A[1][1] cu 0 și se afișează matricea.

3
Programarea Calculatoarelor și Limbaje de Programare II - Laborator

Matrice pătratice

O serie de aplicații inginerești au strânsă legătură cu matricele pătratice. Dacă discutăm de o matrice
pătratică, atunci știm că aceasta are două diagonale, una principală (de la elementul A[0][0] până la
elementul A[n-1][n-1]) și una secundară (de la elementul A[n-1][0] până la elementul A[0][n-1]). În
tabelul următor sunt prezentare relațiile matematice care descriu poziția relativă dintre elementelor
matricei pătratice și diagonalele acesteia.

Poziția elementelor în matrice Relații


Elemente situate pe diagonala principală i=j
Elemente situate strict deasupra diagonalei principale i<j
Elemente situate deasupra şi pe diagonala principală ij
Elemente situate strict sub diagonala principală i>j
Elemente situate sub şi pe diagonala principală ij
Elemente situate pe diagonala secundară i+j = n-1
Elemente situate strict deasupra diagonalei secundare i+j < n-1
Elemente situate deasupra şi pe diagonala secundară i+j  n-1
Elemente situate strict sub diagonala secundară i+j > n-1
Elemente situate sub şi pe diagonala secundară i+j  n-1

Mai mult, se pot folosi relațiile din tabelul anterior pentru a determina limitele (inferioară și
superioară) și regulile de parcurgere a matricelor pătratice în zonele de interese (față de diagonale).
Aceste reguli sunt prezentate în tabelul următor.

Poziţia elementelor în matrice Relaţii Element


Elemente situate pe diagonala principală i=0,n-1, pas=1 a ii

4
Programarea Calculatoarelor și Limbaje de Programare II - Laborator

i=0,n-2, pas=1; j=i+1,n-1, a ij


Elemente situate strict deasupra diagonalei principale
pas=1
i=0,n-1, pas=1; a ij
Elemente situate deasupra şi pe diagonala principală
j=i,n-1, pas=1
i=1,n-1, pas=1; j=0,i-1, a ij
Elemente situate strict sub diagonala principală
pas=1
i=0,n-1, pas=1; a ij
Elemente situate sub şi pe diagonala principală
j=0,i, pas=1
Elemente situate pe diagonala secundară i=0,n-1, pas=1 a i,n −1−i
i=0,n-2, pas=1; a ij
Elemente situate strict deasupra diagonalei secundare
j=0,n-i-2, pas=1
i=0,n-1, pas=1; a ij
Elemente situate deasupra şi pe diagonala secundară
j=0,n-i-1, pas=1
i=1,n-1, pas=1; a ij
Elemente situate strict sub diagonala secundară
j=n-i,n-1 pas=1
i=0,n-1, pas=1; a ij
Elemente situate sub şi pe diagonala secundară
j=n-i-1,n-1, pas=1

Tablouri multidimensionale

Forma:

tip nume_variabila[dimensiune_1] [dimensiune_2]...[dimensiune_n]

unde tip reprezintă tipul de date ale tabloului (int, float, etc.) nume_variabila reprezintă numele
tabloului și dimensiune_1, dimensiune_2, etc. reprezintă dimensiunile tabloului.

Inițializarea unui tablou

Limbajul C oferă posibilitatea inițializării unui tablou în momentul declarării acestuia. Forma generală
de inițializare a tablourilor este similară cu cea a inițializării unor variabile, dar se folosesc parantezele
acoladă „ {} ”.

Forma:

tip nume_variabila[dimensiune_1] [dimensiune_2]...[dimensiune_n] = {lista_valori}

unde tip reprezintă tipul de date ale tabloului (int, float, etc.) nume_variabila reprezintă numele
tabloului și dimensiune_1, dimensiune_2, etc. reprezintă dimensiunile tabloului și listă_valori
reprezintă valorile folosite în inițializarea tabloului. Dacă lista_valori nu conține suficiente valori
pentru a acoperi toate elementele tabloului, elementele neacoperite vor fi inițializate cu 0.

5
Programarea Calculatoarelor și Limbaje de Programare II - Laborator

Exemple:

int i[10]={1,2,3,4,5,6,7,8,9,10};
int matrice[4][5] = {
1,2,3,6,7,
5,9,7,6,1,
3,2,4,1,8,
9,8,2,6,5
};
Șiruri de caractere

Șirurile de caracter în C reprezintă tablouri unidimensionale care conțin caractere și este terminat în
caracterul null (\0). Așadar pentru a folosi un șir de 11 caractere este necesară declararea tabloului cu
dimensiunea 12, pentru a permite adăugarea caracterului null.

Exemple:

char sir[12]=”Imi place C”;

Notă: compilatorul C poate determina dimensiunea unui șir de caractere fără declararea aceste
dimensiuni (intre []) dacă șirul este inițializat. Astfel exemplul de mai sus poate deveni char sir[]=”Imi
place C”; iar compilatorul va aloca memorie pentru 12 caractere (este considerat și caracterul null).

Aplicații rezolvate

Aplicația 4. Să se scrie un program în care se citește un șir de numere întregi de la tastatură și se


calculează media aritmetică a elementelor șirului. Șirul nu are voie să aibă o dimensiune mai mare ca
MAX = 20.

6
Programarea Calculatoarelor și Limbaje de Programare II - Laborator

Aplicația 5. Să se scrie un program care înmulțește două matrice oarecare Amxn și Bnxl rezultatul fiind o
matrice Pmxl. Dimensiunile matricelor se citesc de la tastatură (max 20). Elementele celor două matrice
A și B se citesc de la tastatură. Se vor afișa cele trei matrice.

7
Programarea Calculatoarelor și Limbaje de Programare II - Laborator

8
Programarea Calculatoarelor și Limbaje de Programare II - Laborator

Aplicația 6. Să se scrie un program care calculează produsul elementelor strict negative situate
deasupra celor două diagonale unei matrice pătratice Anxn având elemente numere întregi. Elementele
se citesc de la tastatură. Să se afișeze matricea și rezultatele obținute.

9
Programarea Calculatoarelor și Limbaje de Programare II - Laborator

Aplicații propuse:

1. Să se scrie un program care determină numărul elementelor pare dintr-un șir de numere
întregi.2
2. Să se scrie un program care calculează suma elementelor impare dintr-un șir de numere reale.
3. Să se scrie un program care citește doi vectori de numere întregi cu dimensiunea n și
calculează produsul lor scalar.
4. Să se scrie un program care ordonează în ordine crescătoare un șir de n numere întregi.
5. Să se scrie un program care determină transpusa unei matrice pătratice anxn.
6. Se citește de la tastatură o matrice oarecare (Amxn). Să se scrie un program care să calculeze
media aritmetică a elementelor de pe cele două diagonale.
7. Se citește de la tastatură o matrice oarecare (Amxn). Să se scrie un program care să verifice
dacă matricea este simetrică iar în cazul ȋn care nu este, să se schimbe cu 0 toate elementele
nesimetrice. (Simetria matricei se verifică fată de diagonala principală).

10

S-ar putea să vă placă și