Documente Academic
Documente Profesional
Documente Cultură
FCIM
Catedra Informatica Aplicativ
RAPORT
la lucrarea de laborator nr. 4
la Programarea Calculatoarelor
Tema: Tehnicile prelucrrii tablourilor bidimensionale
Varianta 16
A efectuat:
A verificat:
Marin tefan
Chiinu 2015
Consideratii teoretice:
Noiune:
Un tablou bidimensional reprezint o matrice, format din rnduri i coloane, n care fiecare
element are adresa sa n baza a dou coordonate. Aceasta are urmtoare form de declarare:
tip_tablou nume_tablou [dimensiune_tablou] [dimensiune_tablou];
n comparaie cu tablourile unidemensionale, unde un element este identificat in forma a[i]
in tabloruile bidiminsionale aceasta de indentifica a[i][j], unde i este numarul rndului, iar j numarul
coloanei.Numrul total al elementelor unei matrici este egal cu produsul numrului de rnduri cu
numarul de coloane.
Exemplu de declarare a unei matrici bidimensionale:
int a[10][10] - aceasta reprezint o matrice patratic unde numarul rindurilor este egal cu
numrul de coloane. Valorile atribuite elementelor tabloului trebuie s fie de acelai tip(n cazul
dat integer). Nu tot timpu matricile sunt ptratice, exist i unele n care numarul de rinduri i
coloane sunt diferite, exemplu: double b[15][40].
Organizarea unui tablou bidimensional n memorie este de reprezentat n figura de mai jos:
Ex.
Introducerea unui tablou de 6 linii i 8 coloane (6 x 8) avnd elemente ntregi este de
forma:
int x[6][8];
X
[0 ]
[0 ]
23
[1 ]
[2 ]
[3 ]
[4 ]
[5 ]
[6 ]
[7 ]
67
[1 ]
[2 ]
[3 ]
[4 ]
[5 ]
Presupunnd ca fiecare pointeaza cate 10 elemente din tablou, atunci vom obtine 100 celule
de memorie rezervate, plus cele 10 celule pentru pointeri. Astfel tabloul de pointeri utilizeaza
sensibil mai mult spatiu si poate cere un procedeu explicit de initializare.
Avantaje pentru utilizarea pointerilor (dezavantaje pentru vectori):
- accesarea unui element se face indirect prin intermediul unui pointer, in loc sa se faca prin
inmultire si adunare;
- liniile tabloului pot fi de lungimi diferite. Aceasta inseamna ca nu orice element al lui b este
constrins sa pointeze pe un vector de 10 elemente, unii pot pointa pe cate 2 elemente, altii pe
cate 20 si altii pe niciunul.
Un identificator de tablou este, n acelai timp, un pointer a crui valoare este adresa primului
element al tabloului. Prin aceast regul, tablourile sunt identificate cu adresele primelor lor
elemente. De exemplu, identificatorul a de mai sus (definit ca int a[2][5]) este de tip pointer la un
tablou cu cinci elemente ntregi, adic int (*)[5], iar a[0] i a[1] sunt adrese de ntregi, adic int*.
Mai exact, expresia a[0] este adresa primei linii din matrice (a primului tablou de cinci elemente) i
este echivalent cu *(a+0), iar expresia a[1] este adresa celei de-a doua linii din matrice (a celui deal doilea tablou de cinci elemente), adic *(a+1). n final, deducem c a[1][2] este echivalent
cu *(*(a+1)+2), ceea ce ilustreaz echivalena operatorului de indexare i a celui de indirectare.
Citirea tablourilor bidimensionale
Citirea elementelor unui tablou nu este posibil dect prin citirea fiecrui element. De aceea, la
fel ca i n cazul vectorilor operaia de citire a matricilor impune folosirea a dou secvene ciclice
suprapuse. Acestea corespund indicelor liniei (i), respectiv coloanei (j).
Schema-bloc:
Secven:
1
Exemplu:
i=0;
int tab[5][5];
int i,j;
printf(\n Introduceti dimensiunea matricei
patratice =) );
scanf(%d &n);
for(i=0; i<n; i++)
for(j=0; j<n; j++)
{
printf(\n tab[%d][%d] = : ,i,j);
//se va afisa tab[i][j]= i se ateapt
scanf(%d,&tab[i][j]);
//introducerea valorii care se atribuie
}
//variabilei tab[i][j]
j=0;
Read a[i][j];
j++;
j<n
NU
i++;
DA i<n
NU
DA
Afiarea matricei:
1
i=0;
j=0;
Exemplu:
int tab[5][5];
int i,j;
printf(\n Introduceti dimensiunea matricei
patratice n= );
scanf(%d &n);
for(i=0; i<n; i++)
for(j=0; j<n; j++)
printf(\n %d, tab[i][j]);
tab[i][j];
j++;
j<n
NU
i++;
DA i<n
NU
2
DA
Un identificator de tablou, este un pointer a carui valoare este adresa primului element din
tablou.
2. Care este condiia ca o matrice s fie triunghiular?
O matrice este triunghiular, atunci cnd doar elementele situate de-o parte a diagonalei
principale sunt efectiv utilizate.
3. Ce se ntmpl atunci cnd liniile unei matrici nu au acelai numr de elemente?
Dac liniile unei matrici nu au acelai numr de elemente, atunci:
n tablourile predefinite, fiecare linie este de lungime maxim.
n tablourile bazate pe clas tablou<T>, fiecare linie poate fi dimensionat
corespunztor numrului efectiv de elemente.
4. Fie programul urmtor :
void main()
{ int i,j,m,n,p,a[10][10],b[6]; m=2; n=3; p=6; i=0;
while(i<p) b[i++]=i;
for(i=0;i<m;i++)
for(j=0;j<n;j++) a[i][j]=b[3*i+j]; } n urma execuiei sunt posibile urmtoarele situaii:
a) programul nu funcioneaz din cauz c declaraia matricei este eronat
b) valorile vectorului b sunt 0,1,2,3,4,5
c) valorile vectorului b sunt 1,2,3,4,5,6 Rspuns
d) a[1][0] are valoarea 3
e) a[0][2] are valoarea 2
5. Se consider o matrice a cu n linii*n coloane i un vector v cu n elemente. Precizai care
vor fi elementele vectorului v, dup execuia secvenei urmtoare:
int nr, n, i, j, x, b[20]; int a[3][3]={{7,1,7},{-7,7,0}, {2,4,11}}; n=3; x=7;
for(i=0;i<n;i++) { nr=0;
for(j=0;j<n;j++) if(a[i][j]==x) nr++; b[i]=nr; }
a) nedefinite
b) b=(0,0,0)- Rspuns
c) b=(1,2,3)
d) b=(2,0,1)
e) b=(2,1,0)
6.
p=1;
for(i=0;i<n;i++) p=p*m[i][i]-2; atunci aceasta realizeaz :
a) produsul elementelor din matrice
b) produsul elementelor de pe diagonala principal a matricii m
c) o prelucrare a elementelor de pe diagonala principal a matricii m- Rspuns
d) se cicleaz la infinit
13. Care este valoarea elementului tab[2][3] dup execuia secvenei de cod :
int i,j; int ctr=0; int tab[4][4];
for(i=0;i<4;i++)
for(j=0;j<4;j++) { tab[i][j]:=ctr; ++ctr; }
a) 7 b) 9 c) 11- Rspuns d) 14
Varianta 16
Conditia problemei: Sa se calculeze suma elementelor din triunghiul superior diagonalei principale
Listingul programului:
# include <stdio.h>
# define N 4
typedef int matrice[N][N];
void citire(matrice a)
{
int i,j;
printf("\telementele matricei:\n");
for(i=0;i<N;i++)
for(j=0;j<N;j++)
{
printf("\t[%d][%d]= ",i,j);
scanf("%d",&a[i][j]);
}
}
void afisare(matrice a)
{
printf("\n");
for( int i=0; i<N; i++)
{
for(int j=0; j<N; j++)
printf("%3d", a[i][j]);
printf("\n");
}
}
int triunghiul_superior ( matrice a)
{
int s=0,i,j;
for(i=0;i<N-1;i++)
for(j=i+1;j<N;j++)
s+=a[i][j];
return s;
}
void main()
{
matrice b;
int a;
citire(b);
afisare(b);
printf("suma elementelor deasupra diagonalei principale:%d",a=triunghiul_superior(b));
}
Start
citire
i=0
Schema logica:
j= 0
start
Citimcitire
a[i][j]
j++
afisare
triunghiul_su
j<N
perior
i++
stop
i<N
stoppppp
da
nu
da
Start
afisare
i=0
j= 0
Afisam a[i][j]
j++
j<N
i++
DA
i<N
NU
stoppppp
DA
NU
----------------------------------------------------------------------------------------------------------------------start
-
s=0
i=0
j= i+1
s+=a[i][j]
j++
j<N
da
nu
i++
da
i<N-1
nu
stoppp
pp
Concluzie:n