Sunteți pe pagina 1din 13

Universitatea Tehnic a Moldovei

FCIM
Catedra Informatica Aplicativ

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

A efectuat:

st. gr. AI 141 Oprea Eugeniu

A verificat:

Marin tefan

Chiinu 2014-2015

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


structurilor complexe n TP i C.
Obiectivele temei:
1. 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
2. Studierea principiilor prelucrrii (descrierii, declarrii, formrii, etc.) tablourilor bidimensionale .
3. nsuirea tehnicilor moderne de elaborare a programelor complexe n C n baza problemelor din
anex.
4. Elaborarea algoritmilor, programelor i testelor de depanare a programului prin diverse moduri n
mediul integrat C.

Expunerea prii teoretice


Tablouri bidimensionale n C.
Tabloul bidimensional reprezint o structur format din rnduri i coloane. Fiecare element al
unui tablou bidimensional are 2 coordonate: numarul rndului i numrul coloanei. Deci matricile
sunt tablouri bidimensionale i pot fi asemanate cu o secvena de mai multe iruri. n C dac un
element al unui ir se identific cu elem[i] unde i reprezint poziia acelui element n cadrul irului,
la matrici un element se identifica prin elem[i][j], unde i reprezint poziia pe coloan (vertical) a
acelui element, iar j reprezint poziia pe linie (orizontal) a acelui element. Dac facem analogia cu
irurile, i reprezint numrul irului n care se afl elementul, iar j reprezint poziia elementului n
cadrul irului i.
O matrice va avea ca i numr de elemente produsul dintre numrul de coloane i numrul de
linii. Dac notm aceste valori cu m (vertical) respectiv cu n (orizontal) atunci o matrice Amn m n
elemente. n exemplul dat mai sus, m = 3 i n = 4. Ca i n cazul irurilor cei doi indici, i i j vor lua
valori ntre 0 i m-1 respectiv n-1.
Dac trebuie declarat un tablou de valori(tablou) de un anumit tip se va indica ntre paranteze
drepte numrul de elemente din tablou. Exemple: int a, b[100], c=0;
double
p[30],
q[20][30];
Pentru tabloul b compilatorul va rezerva 100 de celule consecutive pentru 100 de valori ntregi.
Indicele folosit la selectarea unei valori oarecare poate varia ntre 0 si 99.
Variabila q corespunde unei matrici bidimensionale avnd 20 de linii si 30 de coloane. Indicii se
scriu separat, ntre paranteze drepte si pot varia de la 0 la 19 respectiv de la 0 la 29. Se poate omite
indicele al doilea, q[i] desemnnd linia i.
Exista mai mult5e tipuri de tablouri:
int a[100];
<- tablou de dimensiune 1
int b[2][7]; <- tablou de dimensiune 2
int c[5][3][2]; <- tablou de dimensiune 3
Pornind de la adresa de baza, toate elementele tabloului sunt memorate continuu in memorie.
Prin definiie un tablou bidimensional este de fapt un tablou unidimensional ale carei elemente sunt
fiecare in parte cte un tablou. Prin urmare, indicii se scriu astfel a[i][j] in loc de a[i, j] ca in
majoritatea limbajelor. In plus un tablou bidimensional poate fi tratat in mai multe moduri dect in
alte limbaje. Elementele sunt memorate pe linii, ceea ce inseamna ca indicele din dreapta variaza
primul in aa fel incit elementele sunt accesate in ordinea memoriei.
Vectori 2-dimensionali
Presupunem ca avem un vector 2-dimensional cu elemente intregi.
int a[3][5];
Incepand cu adresa de baza, compilatorul va aloca spatiu contiguu pentru 15 intregi. Atunci
putem gndi acest vector ca o matrice, astfel:
a[0][0] a[0][1] a[0][2] a[0][3] a[0][4]
a[1][0] a[1][1] a[1][2] a[1][3] a[1][4]
a[2][0] a[2][1] a[2][2] a[2][3] a[2][4]
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.
Presupunind 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 de-al 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.
n privina echivalenei identificatorilor de tablouri i a pointerilor, nu mai putem fi att de
categorici. S pornim de la urmatoarele dou definiii:
int a[ 2 ][ 5 ];
int *b[ 2 ] = {
a[ 0 ] // adica b[ 0 ] = &a[ 0 ][ 0 ]
a[ 1 ] // adica b[ 1 ] = &a[ 1 ][ 0 ]
};
unde a este un tablou de 2 * 5 elemente ntregi, iar b este un tablou de dou adrese de ntregi.
Evalund expresia b[1][2], obinem *(*(b+1)+2), adic elementul a[1][2], element adresat i prin
expresia echivalent *(*(a+1)+2). Se observ c valoarea pointerului *(b+1) este memorat n al
doilea element din b (de adresa b+1), n timp ce valoarea *(a+1), tot de tip pointer la int, nu este
memorat, fiind substituit direct cu adresa celei de-a doua linii din a.
Tratarea diferit a expresiilor echivalente *(b+1) i *(a+1) se datoreaz faptului c identificatorii de
tablouri nu sunt de tip pointer, ci de tip pointer constant. Valoarea lor nu poate fi modificat,
deoarece este o constant rezultat n urma compilrii programului
Initializarea tablourilor
Exista mai multe moduri de a initializa un vector multidimensional.
Exemplu: matrix[4][7 ] - se acceseaz elementul de pe rndul 4 i coloana 7 a tabloului matrix.
y[0][0]
se acceseaz primul element al tabloului, adic rndul 0, coloana 0.
n cazul cnd tabloul este de tip simplu, atribuirea valorii unui element al tabloului se face ca i n
cazul atribuirii valorii unei variabile simple. Exemple:
x[0]=7.125;
vector[19]+=1;
matrix[1][1]=5.5;
fraza[3]=b;
Iniializarea tabloului bidimensional:
I nt a[3][3]
{ {1,4,2},
{7,5,3},
{8,6,9} };
Iniializarea tabloului bidimensional se efectueaz pe rnduri. Elementele acestui tablou au
urmtoarele valori:

a[0][0]=1; a[0][1]=4; a[0][2]=2;


a[1][0]=7; a[1][1]=5; a[1][2]=3;
a[2][0]=8; a[2][1]=6; a[2][2]=9;
La iniializarea tabloului dat fiecare rnd se include n acolade . Dac n rndurile indicate de noi
nu vor ajunge elemente pentru completarea rndurilor, n acest caz n locul elementelor pentru care
n-au ajuns valori vor aprea zerouri.
Exemplu: Urmatoarele declaratii sunt echivalente:
int a[2][3] = {1, 2, 3, 4, 5, 6};
int a[2][3] = {{1, 2, 3}, {4, 5, 6}};
int a[][3] = {{1, 2, 3}, {4, 5, 6}};
Iata un mod simplu de a initializa toate valorile unui vector cu 0:
int a[2][2][3] = {0};
Identificarea elementelor specifice unei matrici ptratice n cazul matricilor ptratice se identific
urmtoarele elemente specifice: diagonala principal (DP), diagonala secundar (DS), jumtatea
superioar (JS) i jumtatea inferioar (JI). Diagonalele corespund (geometric) diagonalelor unui
ptrat.
Diagonala principal cuprinde elementele din colul stnga sus pn n colul dreapta jos, adic
mulimea:
DP={aij| i=j, i=0,..n-1}={a00, a11, a22, .,an-1n-1} unde n este dimensiunea
real a matricii.
Diagonala secundar cuprinde elementele din colul dreapta sus pn n colul stnga jos, adic
mulimea:
DS={aij|i=0,1,n-1 , j=n-1,n-2,0, i+j=n-1}={a0n-1, a1n-2,..,an-10}
Jumtatea superioar cuprinde elementele de deasupra diagonalei principale (fr cele de pe DP),
adic mulimea:
JS={aij | i=0,1,n-2 , j=i+1,,n-1}
Jumtatea inferioar cuprinde elementele de sub diagonala principal (fr elementele de pe DP),
adic mulimea:
JI={aij | i=1,2,.n-1 , j=0,1,i-1}
Metoda de inlocuire tutuloor elementelor din JS cu simetricele lor din JI:
for(i=0; i<n-1; i++)
for(j=i+1; j<n; j++)
{
aux=a[i][j];
a[i][j]=a[j][i];
a[j][i]=aux;
}

ntrebri rspuns:
ntrebri rspuns pe baza teoriei prezentate:
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. 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) v=(0,0,0)
c) v=(1,2,3)
d) v=(2,0,1)
e) v=(2,1,0)
4. 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
d) toate elementele de sub diagonala principal sunt 0
e) sub diagonala principal exist cel puin un element diferit de 0
5.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
c) valarea maxim din ntreaga matrice
d) alt valoare decat cele indicate
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
b) valoarea cea mai mare de pe diagonala principal
c) valoarea cea mai mare de pe diagonala secundar
d) alt valoare decat cele indicate
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
b) produsul valorilor de pe diagonala secundar
c) produsul valorilor din ntreaga matrice
d) alt valoare dect cele indicate

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
d) numr elementele matricii care sunt mai mari ca m

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
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

1.

Problema 42
Condiia problemei: 42. Se considera un labirint cu n la puterea 2 celule. Fiecare celula are cel putin
o usa si cel mult trei. Sa se determine drumurile care pot fi parcurse de la celula C11 pana la celula Cnn ,
astfel incit printr-o usa sa se treaca o singura data

START

Citim i,j,n,k,count,a[100][100]
Rez[100]

Citire n

count=0

i=0

j=0

Citim valoarea lui a[i][j]

i=++

i<n

DA

NU
j++

j<n

NU

i=o

j=0

DA

DA
Afisam elementul

j++

j<n

NU

i++

i<n

k=0

NU

k<n

i=0

DA

i<n

NU

DA

Rez[count++]=a[k][i]

I++

K++

k<n

DA
j=n-1

j<n

Rez[count++]=a[k] [j]

j--

i=0

j<coun
t

I++

Afis. suma si produsl


count

STOP

Listing-ul programului in C:
#include <stdio.h>
#include <conio.h>
void main()
{
int a[100][100], rez[100];
int i, j, k, n;
int count = 0;
printf("Introdu dimensiunea matricei: n="); scanf("%d",&n);
printf("Introdu %d de elementele:\n",n*n);
for(i=0;i<n;i++){
for(j=0;j<n;j++)
scanf("%d",&a[i][j]);
}
printf("Matricea A:\n");
for(i=0;i<n;i++)
{ printf("\n");
for(j=0;j<n;j++)
printf("%d ",a[i][j]);
}
printf("\n\n\n\n");
k = 0;

for(;k<n;k++){
for(i=0;i<n;i++)
rez[count++] = a[k][i];
k++;
if(k<n){
for(j=n-1;j>=0;j--)
rez[count++] = a[k][j];
}
}
printf("Rezultatul este:");
for(i=0;i<count;i++)
printf("%d ", rez[i]);
getch();
}Concluzii:

n aa mod calculm suma i produsul numerelor de de deagonala principal si


sub deagonala secundara.
PrintScreen

Rezultatul:
Biografie:
1.Lucrarea de Laborator nr4(Tehnicile prelucrrii tablourilor bidimensionale).

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