Sunteți pe pagina 1din 10

Universitatea Tehnic a Moldovei

FCIM
Catedra Informatica Aplicativ

RAPORT
la lucrarea de laborator nr. 4
la Programarea Calculatoarelor
Tema: Tehnicile prelucrrii tablourilor bidimensionale
Varianta 16

A efectuat:

st. gr. TI-

A verificat:

Marin tefan

Chiinu 2015

Scopul lucrrii: nsuirea tehnicilor de algoritmizare i programare cu subprograme n


prelucrarea structurilor complexe n TP i C.
Obiectivele temei:
1. Aprofundarea cunotinelor n limbajul i mediul TurboC i perfecionarea tehnicii de
programare n prelucrarea structurilor complexe, analiznd soluiile stereotipe i cele eficiente
de introducere, afiare i rearanjri ale tablourilor bidimensionale etc.
2. nsuirea tehnicilor eficiente de parcurgere, cutare, schimbare i ordonare a matricilor i
calculul conform cunotinelor obinute din matematic i n baza ciclurilor ncorporate ntr-un
program complex.

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 ]

Exemplu de instruciune de atribuire


x[0][0] = 23;
x[0][5] = 67;
Pentru x[i][j] avem expresiile, utiliznd pointeri, de exemplu, echivalente:
*(x[i] + j)
(*(x + i))[j]
*((*(x + i)) + j)
*(&x[0][0] + 5*i + j)
In antetul functiei, urmatoarele declaratii sunt echivalente:
int a[][5]
int (*a)[5] int a[3][5]
Avantaje pentru utilizarea vectorilor (dezavantaje pentru pointeri):
- "a" este un tablou in toata regula: toate cele 100 celule de memorie trebuie alocate, iar pentru
gasirea fiecarui element se face calculul obisnuit al indicelui;
- pentru "b", oricum prin declararea sa se aloca 10 pointeri; fiecare trebuie facut sa pointeze
un tablou de intregi.

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

Prelucrri asupra matricelor


Exemplu:
Presupunem ca sunt date elementele vectorului "a". Functia de mai jos se poate folosi pentru suma
elementelor unui tablou. Atentie ! Trebuie specificat numaidect numarul de coloane!
int suma(int a[][5])
{
int i, j, suma = 0;
for (i = 0; i < 3; ++i)
for (j = 0; j < 5; ++j)
suma += a[i][j];
return suma;

Rspunsuri la punctele principale din ndrumar


1.

Ce reprezinta un identificator de tablou?

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.

Se consider secvena de program urmtoare, n care a este o matrice cu n linii*n coloane


i elemente numere ntregi, iar x este o variabil de tip ntreg.
x=1;
for(i=1;i<=n-1;i++)
for(j=0;j<=i-1;j++) if(a[i][j]!=0) x=0;
n urma execuiei secvenei, valoarea variabilei x va fi 1 dac:
a) deasupra diagonalei principale exist cel puin un element egal cu 0
b) toate elementele de deasupra diagonalei principale sunt 0
c) toate elementele de sub diagonala principal sunt diferite de 0- Rspuns
d) toate elementele de sub diagonala principal sunt 0
e) sub diagonala principal exist cel puin un element diferit de 0
7. Se consider matricea ptratic A(mxm) . Fie secvena de program :
x=a[0][m-1];
for(i=0;i<m;i++) if x<a[i][m-i] x=a[i][m-i];
Variabila x calculat exprim :
a) valoarea maxim de pe diagonala principal
b) valoarea maxim de pe diagonala secundar- Rspuns
c) valarea maxim din ntreaga matrice
d) alt valoare decat cele indicate
8. Fie matricea ptratic A(mxm) i secvena de program :
x=a[0][0];
for(i=0;i<m;i++) { if(x<a[i][i]) x=a[i][i]; if(x<a[i][m-i-1]) x=a[i][m-i-1]; }
Variabila x calculat reflect :
a) valoarea cea mai mare de pe diagonale- Rspuns
b) valoarea cea mai mare de pe diagonala principal
c) valoarea cea mai mare de pe diagonala secundar
d) alt valoare decat cele indicate
9. Fie matricea A(mxm) i secvena de program:
s=1;
for(i=0;i<m;i++) for(j=0;j<i;j++) s*=a[i][j];
Valoarea calculat s reflect :
a) produsul valorilor de sub diagonala principal- Rspuns
b) produsul valorilor de pe diagonala secundar
c) produsul valorilor din ntreaga matrice
d) alt valoare dect cele indicate
10 Fie o matrice A(nxn) citit de la tastatur . Atunci secvena de cod :
i=0; m=a[0][0];
while(i<n) { for(j=0;j<n;j++) if(m<a[i][j]) m=a[i][j]; i++; }
a) calculeaz elementul maxim m dintre elementele matricii
b) calculeaz elementul minim m dintre elementele matricii
c) se cicleaz la infinit- Rspuns
d) numr elementele matricii care sunt mai mari ca m
11. Fie secvena de cod de mai jos. Dac considerm ca date de intrare tabloul V1 de
dimensiune n, atunci tabloul V0 va conine :
for(i=0;i<n;i++) v0[n-i-1]=v1[i];
a) elementele lui V1 n ordine invers- Rspuns
b) o parte din elementele lui V1
c) numai elem. impare ale lui V1
d) algoritmul depune elementele lui V1 n ordine invers numai dac n este impar
12. Fie urmtoarea secven de cod care primete o matrice M ptratic de dimensiune n la
intrare :

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

lucrarea de laborator nr. 4 la programarea


calculatoarelor am studiat principiile
prelucrrii
(descrierii,
declarrii, formrii, etc.) tablourilor bidimensionale .
Am insusit tehnicile moderne de elaborare a programelor complexe n C
n baza problemelor din anex.
Am elaborat algoritmi, programe i teste de depanare a programului prin
diverse moduri n mediul integrat C.

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