Post on 30-May-2018
8/14/2019 program calcCap 5
1/26
Tablouri.
CAPITOLUL 5
TABLOURI
Tablouri unidimensionale
Tipurile structurate de date sunt combinaii de alte tipuri definite prin descriereatipurilor componentelor i prin indicarea unor metode de structurare. Datele structurate seutilizeaz n cadrul aplicaiilor care lucreaz cu mai multe date i pentru care declararea unorvariabile simple nu mai este suficient.
Un tip structurat de date este tabloul, definit ca o structur care cuprinde un numr decomponente de acelai tip. Tipul componentelor se numete tipul de baz al tabloului.Accesarea unei componente din cadrul tabloului se realizeaz prin intermediul unui indice.Valorile indicilor identific n mod unic componentele.
Observaie: datorit acestei proprieti, o variabil de tip tablou poate fi privit ca ofuncie definit pe mulimea valorilor tipului indicelui cu valori n mulimea valorilor tipuluide baz al tabloului.
n cazul n care componentele unui tablou sunt structurate dup valorile unui singurindice tabloul se numete unidimensional, iar dac ele sunt structurate dup valorile maimultor indici tabloul se numete multidimensional, fiecare indice definind o dimensiune.
Pentru a folosi o variabil de tip tablou unidimensional acesta trebuie declarat naintede a fi utilizat.
Declaraia unui tablou unidimensional este urmtoarea: tip_baz nume_tablou[lim];
unde: tip_baz - este unul din tipurile de dat admise de C; nume_tablou - este numele tabloului unidimensional;
lim - specific numrul de elemente ale tabloului unidimensional(dimensiunea).Exemplu: int a[15];
float b[20];Tabloul a este format din 15 componente numere ntregi; iar tabloul b este format din
20 de componente numere reale. Referirea la elementul unui tablou unidimensional se realizeaz astfel:- se precizeaz numele tabloului;- n interiorul parantezelor drepte se precizeaz indicele corespunztor elementului.
Exemplu: a[5] reprezint elementul de pe poziia 6 din tabloul a;b[0] reprezint primul element din tabloul b;b[19] reprezint ultimul element din tabloul b.
Observaie: numele unui tablou are ca valoare adresa primului su element.Componentele tabloului sunt pstrate n memorie una dup alta, n zone continue, n ordineacresctoare a valorilor indicelui.
Tablourile se pot iniializa atunci cnd se declar. Un tabel unidimensional se poateiniializa cu urmtorul format:
tip_baz nume_tablou[n] = {e1,e2,,en};unde: e1, e2, , en sunt expresii constante. Valorile expresiilor constante trebuie
cunoscute n momentul iniializrii tabloului unidimensional.Observatie: - numrul expresiilor de iniializat poate fi mai mic dect numrul
elementelor tabloului.
73
8/14/2019 program calcCap 5
2/26
8/14/2019 program calcCap 5
3/26
Tablouri.
printf (b=) ; scanf (%d, &b);j = 0;for (i=0; i
8/14/2019 program calcCap 5
4/26
Tablouri.
scrie irul inversat este: pentru i0, n-1 execut
srie a[i]sfrit pentru
sfrit algoritm.Programul corespunztor algoritmului este:
#include #include void main( ){int n,i,aux,a[20];clrscr ( ) ;printf(Dimensiunea sirului=) ;scanf(%d,&n) ;for (i=0 ;i
8/14/2019 program calcCap 5
5/26
Tablouri.
a[1]=4a[2]=7a[3]=4a[4]=9a[5]=3a[6]=11
a[7]=4Sirul elementelor distincte:3 4 7 9 11
Algoritmul problemei:Algoritm distinctecitete npentru i0, n-1 execut
citete a[i]sfrit pentrum0b[0]a[0]
pentru i1, n-1 executj0cod1repet
dac b[j]=a[i] atunci cod0altfel jj+1
sfrit dacpn cnd (j>m sau cod=0) ; sfrit repetdac cod=1 atunci mm+1
b[m]a[i]sfrit dac
sfrit pentrumm+1pentru i0, m-1 execut
Scrie b[i]sfrit pentru
sfarit algoritm.Programul corespunztor algoritmului este:
# include # include void main ( ){
int n, m,i,j,cod;int a[30],b[30];clrscr( );printf(Dimensiunea sirului=);scanf(%, &n);
for (i=0;i
8/14/2019 program calcCap 5
6/26
Tablouri.
for (i=1;i
8/14/2019 program calcCap 5
7/26
Tablouri.
k=3Noul sir este:3 -4 7 7 1 0
Algoritmul problemei:Algoritm adugare
citete n
s0pentru i0, n-1 execut
citete a[i]ss+ a[i]
sfrit pentrucitete kpentru in-1,k-1,-1 execut
a[i+1]a[i]sfrit pentrua[k-1]snn+1
scrie Noul sir este : pentru i0, n-1 execut
scrie a[i]sfrit pentru
sfrit algoritm.Programul corespunztor algoritmului este:
#include #include void main( ){ int n,i,k,a[30];
clrscr( );
printf(n =); scanf(%d, &n);s=0;for (i=0 ;i=k-1;i--) a[i+1] = a[i];a[k-1]=s;n++;
printf(\n Noul sir este: \n );for(i=0 ;i
8/14/2019 program calcCap 5
8/26
Tablouri.
Dup citirea valorilor datelor de intrare se iniializeaz variabila s cu valoarea zero.Se parcurge ntreg irul, adaugnd valoarea fiecarui element din ir n variabila s. ncepnd dela ultimul element din ir pn la cel de pe poziia k-1 se decaleaz componentele irului cu opoziie spre dreapta
Elementului de pe pozitia k-1 i se atribuie valoarea variabilei s i se modificdimensiunea irului.
n final se afieaz elementele irului.
Aplicaia 5:S se ordoneze cresctor un ir de numere reale de dimensiune dat.
Specificarea problemei: Date de intrare: n - dimensiunea irului;
a[0], a[1], , a[n-1] - elementele irului. Date de iesire: a[0], a[1], a[n-1].
Date de test: Dimensiunea sirului = 6a[0]=40a[1]=60
a[2]=21a[3]=34a[4]=70a[5]=55Sirul ordonat este:21 34 40 55 60 70
Algoritmul problemei:Algoritm ordonarecitete npentru i0, n-1 execut
citete a[i]
sfrsit pentrupentru i0, n-2 execut
min a[i]k ipentru ji+1,n-1 execut
dac (a[j]i) atunci a[k]a[i]
a[i]min
sfrit dacsfrit pentruscrie "Sirul ordonat este:"pentru i0, n-1 execut
scrie a[i]sfrit pentru
sfrit algoritm.Programul corespunztor algoritmului este:
#include #include void main ( )
80
8/14/2019 program calcCap 5
9/26
Tablouri.
{ int n,i,j,k;
float min,a[30];clrscr( );printf( Dimensiunea sirului: );scanf(%d, &n);for (i=0 ;i
8/14/2019 program calcCap 5
10/26
8/14/2019 program calcCap 5
11/26
Tablouri.
sfrit ct timp
ct timp (i
8/14/2019 program calcCap 5
12/26
Tablouri.
getch ( ); }
Analiza problemei:n corpul funciei principale se declar variabile cu urmtoarea semnificaie:n, m, p - dimensiunile celor 3 iruri;i, j, k - reprezint indici folosii pentru accesarea elementelor din iruri;a, b, c - reprezint iruri de numere ntregi.
Dup declararea variabilelor se citesc dimensiunile i elementele celor dou iruri.Se urmrete construirea irului c obinut prin interclasarea celor doua iruri a i b. Seiniializeaz cele 3 variabile folosite pentru accesarea elementelor irurilor cu valoarea zero.Ct timp mai exist elemente n ambele iruri se compara cele 2 elemente i se adaugelementul cel mai mic n irul c. n irul din care face parte valoarea mai mic se trece laelementul urmtor. Se modific i valoarea variabilei kpentru a putea aduga un alt elementn irul c.
Dac n primul ir mai exist elemente dar n irul al doilea nu mai exist elementeatunci se vor aduga n irul c elementele rmase din primul ir.
Dac n primul ir nu mai exist elemente dar n irul al doilea mai exist elementeatunci se vor aduga n irul c elementele rmase n irul al doilea.
La final se afieaz cele p elemente ale irului obinut prin interclasare.n cazul datelor de test interclasarea elementelor din cele dou iruri se realizeaz
astfel , unde a={-2, 0, 3, 7, 11, 18} i b={1, 3, 8, 13}:
i a[i] j b[j] k c[k] c
0 -2 0 1 0 -2 -21 0 0 1 1 0 -2 02 3 0 1 2 1 -2 0 12 3 1 3 3 3 -2 0 1 32 3 2 8 4 3 -2 0 1 3 33 7 2 8 5 7 -2 0 1 3 3 74 11 2 8 6 8 -2 0 1 3 3 7 84 11 3 13 7 11 -2 0 1 3 3 7 8 115 18 3 13 8 13 -2 0 1 3 3 7 8 11 135 18 4 - 9 18 -2 0 1 3 3 7 8 11 13 18
Tablouri bidimensionale
Dac componentele unui tablou sunt structurate dup valorile a doi indici atuncitabloul se numete bidimensional, fiecare indice definind o dimensiune.
Pentru a folosi o variabil de tip tablou bidimensional acesta trebuie declarat naintede a fi utilizat.
Declaraia unui tablou bidimensional este urmtoarea: tip_baz nume_tablou [lim1][lim2];
unde: tip_baz - este unul din tipurile de dat admise de C; nume_tablou - este numele tabloului bidimensional; lim1, lim2 - specific numrul de elemente ale tabloului bidimensional (dimensiunea).Exemplu: int a[10][20];
float b[20][35];Tabloul a este format din 10 linii i 20 de coloane, avnd 200 de componente
numere ntregi. Tabloul b este format din 20 de linii i 35 de coloane, avnd 700 decomponente numere reale.
84
8/14/2019 program calcCap 5
13/26
8/14/2019 program calcCap 5
14/26
Tablouri.
pentru j 0,n-1 execut
dac i+j=n-1 atunci m[i][j]j+1altfel dac i+j
8/14/2019 program calcCap 5
15/26
Tablouri.
Aplicaia 2:Se cunosc elementele numere reale ale unei matrici ptrate. S se determine:
- produsul elementelor de pe diagonala principal;- suma elementelor de pe diagonala secundar;- valoarea maxim situat deasupra diagonalei principale;
- valoarea minim situat sub diagonala secundar.Specificarea problemei:
Date de intrare: n - ordinul matricei;m[i][j]; i,j{0,1,,n-1}.
Date de ieire: p - produsul elementelor de pe diagonala principal;s - suma elementelor de pe diagonala secundar;max - valoarea maxim situat deasupra diagonalei principale;min - valoarea minim situat sub diagonala secundar.
Date de test: n=3m[0][0]=1m[0][1]=2
m[0][2]=3m[1][0]=2m[1][1]=4m[1][2]=6m[2][0]=1m[2][1]=3m[2][2]=5Matricea este:1.0 2.0 3.02.0 4.0 6.01.0 3.0 5.0
Produsul elementelor de pe diagonala principala : 20.000Suma elementelor de pe diagonala secundara : 8.000Valoarea maxim aflata deasupra diagonalei principale: 2.000Valoarea minim aflata sub diagonala secundara: 3.000
Algoritmul problemei:Algoritm matricecitete npentru i 0,n-1 execut
pentru j 0,n-1 executcitete m[i][j]
sfrit pentru
sfrit pentruscrie "Matricea este:"pentru i 0,n-1 execut
pentru j 0,n-1 executscrie m[i][j]
sfrit pentrusfrit pentrup 1;s 0pentru i 0,n-1 execut
pp*m[i][i]s s+m[i][n-1-i]
87
8/14/2019 program calcCap 5
16/26
Tablouri.
sfrit pentruscrie "Produsul elementelor de pe diagonala principala : ",pscrie "Suma elementelor de pe diagonala secundara : ",smaxm[0][1]pentru i 0,n-2 execut
pentru j i+1,n-1 executdac (m[i][j]>max) atunci maxm[i][j]sfrit dac
sfrit pentrusfrit pentruscrie "Valoarea maxima aflat deasupra diagonalei principale:",maxminm[1][n-1]pentru i 2,n-1 execut
pentru j n-i,n-1 executdac (m[i][j]
8/14/2019 program calcCap 5
17/26
Tablouri.
for (i=2;i
8/14/2019 program calcCap 5
18/26
Tablouri.
Aplicaia 3: S se verifice dac o matrice ptrat este simetric.Specificarea problemei:
Date de intrare: n - ordinul matricei;m[i][j]; i,j {0,1,,n-1}.
Date de ieire: simetric.Date de test: n=3
m[0][0]=1m[0][1]=2m[0][2]=4m[1][0]=2m[1][1]=3m[1][2]=5m[2][0]=4m[2][1]=5m[2][2]=6
Matricea este:1 2 42 3 54 5 6Matricea este simetric
Algoritmul problemei:Algoritm matrice_simetric
citete npentru i 0,n-1 execut
pentru j 0,n-1 executcitete m[i][j]
sfrit pentrusfrit pentruscrie "Matricea este: "pentru i 0,n-1 execut
pentru j 0,n-1 executscrie m[i][j]
sfrit pentrusfrit pentrusimetric 1i 1ct timp ((i
8/14/2019 program calcCap 5
19/26
Tablouri.
sfrit algoritmProgramul corespunztor algoritmului este: #include
#include void main(){ float m[20][20];
unsigned n,i,j;int simetric;printf("\nn=");scanf("%u",&n);for (i=0;i
8/14/2019 program calcCap 5
20/26
Tablouri.
n final se verific valoarea variabilei simetric. Dac valoarea este 1 atunci seafieaz mesajul: Matricea este simetric; dac valoarea este 0 atunci se afieaz mesajul:Matricea nu este simetric.
Aplicaia 4:S se determine matricea transpus.
Specificarea problemei:Date de intrare: n - numrul liniilor matricei;
m - numrul coloanelor tabloului;a[i][j]; i {0,1,,n-1}, j{0,1,,m-1}.
Date de ieire: t[i][j]; i {0,1,,m-1}, j {0,1,,n-1}.Date de test: Nr. linii=3
Nr. coloane=2a[0][0]=1a[0][1]=2a[1][0]=2a[1][1]=3
a[2][0]=4a[2][1]=7Matricea este:1.0 2.02.0 3.04.0 7.0Matricea transpus este:1.0 2.0 4.02.0 3.0 7.0
Algoritmul problemei:Algoritm matrice_transpus
citete n, mpentru i 0, n-1 execut
pentru j 0, m-1 executcitete a[i][j]t[j][i] a[i][j]
sfrit pentrusfrit pentruscrie "Matricea este: "pentru i 0,n-1 executpentru j 0,m-1 execut
scrie a[i][j]
sfrit pentrusfrit pentruscrie "Matricea transpus este: "pentru i 0,m-1 execut
pentru j 0,n-1 executscrie t[i][j]
sfrit pentrusfrit pentru
sfrit algoritm
92
8/14/2019 program calcCap 5
21/26
Tablouri.
Programul corespunztor algoritmului este: #include
#include void main(){ float a[20][20], t[20][20];
unsigned n,m,i,j;
printf("\nNr. linii=");scanf("%u",&n);printf("\nNr. coloane=");scanf("%u",&m);for (i=0;i
8/14/2019 program calcCap 5
22/26
Tablouri.
Date de test: Prima matrice:Nr. linii=3Nr. coloane=2a[0][0]=1a[0][1]=2a[1][0]=0
a[1][1]=3a[2][0]=4a[2][1]=1A doua matrice:Nr. linii=2Nr. coloane=4b[0][0]=1b[0][1]=0b[0][2]=2b[0][3]=0b[1][0]=3
b[1][1]=1b[1][2]=-1b[1][3]=0Matricea produs este:7.0 2.0 0.0 0.09.0 3.0 -3.0 0.07.0 1.0 7.0 0.0
Algoritmul problemei:Algoritmul matrice_produs
citete m,npentru i 0,m-1 execut
pentru j 0,n-1 executcitete a[i][j]
sfrit pentrusfrit pentrucitete ppentru i 0,n-1 execut
pentru j 0,p-1 executcitete b[i][j]
sfrit pentrusfrit pentruscrie "Matricea produs este"
pentru i 0,m-1 executpentru j 0,p-1 execut
c[i][j] 0pentru k 0,n-1 execut c[i][j] c[i][j]+a[i][k]*b[k][j]sfrit pentruscrie c[i][j]
sfrit pentrusfrit pentru
sfrit algoritm
94
8/14/2019 program calcCap 5
23/26
Tablouri.
Programul corespunztor algoritmului este:#include #include void main(){ float a[20][20], b[20][20];
float c[20][20];
unsigned m,n,p,i,j,k;printf("\nPrima matrice:");printf("\nNr. linii=");scanf("%u",&m);printf("\nNr. coloane=");scanf("%u",&n);for (i=0;i
8/14/2019 program calcCap 5
24/26
Tablouri.
- elementul de pe linia i i coloana j din matricea produs se iniializeaz cu valoareazero;
- la aceast valoare se va aduga produsul dintre elementul din prima matrice de pelinia i i coloana k i elementul din a doua matrice de pe linia k i coloana j, unde variabila kprimete pe rnd toate valorile mulimii { }1,...,1,0 n .
n final, n cadrul a dou instruciuni repetitive se afieaz elementele matriceiprodus.
Aplicaia 6:Fie m, n dou numere naturale i o matrice A cu m linii i n coloane, avnd
elemente numere reale. S se interschimbe liniile matricei astfel nct suma elementelor dinlinia i s fie mai mic dect suma elementelor din linia j, pentru 0
8/14/2019 program calcCap 5
25/26
Tablouri.
pentru j 0,n-1 executs[i] s[i]+a[i][j]
sfrit pentrusfrit pentrupentru i 0,m-2 execut
pentru j i+1,m-1 executdac s[i]>s[j] atunci pentru k 0,n-1 execut
aux a[i][k]a[i][k] a[j][k]a[j][k] aux
sfrit pentruaux s[i]s[i] s[j]s[j] aux
sfrit dacsfrit pentru
sfrit pentruscrie "Matricea modificat este"
pentru i 0,m-1 executpentru j 0,n-1 execut
scrie a[i][j]sfrit pentru
sfrit pentrusfrit algoritm.
Programul corespunztor algoritmului este:#include #include void main(){ float a[20][20];
unsigned m,n,i,j,k;float s[20],aux;printf("\nNr. linii=");scanf("%u",&m);printf("\nNr. coloane=");scanf("%u",&n);for (i=0;i
8/14/2019 program calcCap 5
26/26
Tablouri.
a[i][k]=a[j][k]a[j][k]=aux
}aux=s[i]s[i]=s[j]s[j]=aux
}
printf("\nMatricea modificata este:\n");for (i=0;i