Documente Academic
Documente Profesional
Documente Cultură
4
Tema: Tehnicile prelucrrii tablourilor bidimensionale
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.
Subiectele temei i ordinea executrii
1. Studierea principiilor prelucrrii (descrierii, declarrii, formrii, etc.) tablourilor bidimensionale .
2. nsuirea tehnicilor moderne de elaborare a programelor complexe n C n baza problemelor din anex.
3. Elaborarea algoritmilor, programelor i testelor de depanare a programului prin diverse moduri n mediul
integrat C.
Coninutul raportului (vezi lucr. de laborator nr.1-3) i suplimentar: Analiza erorilor admise pe
parcursul efecturii lucrrii i eficiena algoritmilor elaborai.
1.2. 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 asemuite 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.
j
e00
i e10
e 20
e01
e11
e 21
e02
e12
e22
e03
e13
e 23
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 A mn 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 n1.
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.
Limbajul C permite Tablouri de orice tip, inclusiv Tablouri de Tablouri. Putem obtine Tablouri de dimensiune
2, 3, ... . Exemple:
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 contiguu 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:
col1 col2 col3 col4 col5
lin1 a[0][0] a[0][1] a[0][2] a[0][3] a[0][4]
lin2 a[1][0] a[1][1] a[1][2] a[1][3] a[1][4]
lin3 a[2][0] a[2][1] a[2][2] a[2][3] a[2][4]
Pentru a[i][j] avem expresiile, utiliznd pointeri, de exemplu, echivalente:
*(a[i] + j)
(*(a + i))[j]
*((*(a + i)) + j)
*(&a[0][0] + 5*i + j)
Putem gndi "a[i]" ca a "i"-a coloana a lui "a" (numarand de la 0), si "a[i][j]" ca elementul din linia "i",
coloana "j" a tabloului (numarand de la 0). Numele tabloului ("a") este tot una cu "&a[0]"; acesta este un pointer
catre un tablo de 5 intregi. Adresa de baza este "&a[0][0]", si nu "a". Ultimul exemplu de mai sus reflecta
functia de corespondenta in memorie dintre valoarea pointerului si indicele tabloului.
Cnd un vector multidimensional este un parametru formal in definitia unei functii, toate dimensiunile,
exceptand prima trebuie specificate.
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;
}
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
Vectori 3-dimensionali
Vectorii de dimensiune mai mare decat 3 lucreaza intr-un mod similar. Daca avem declaratia
int a[7][9][2];
atunci compilatorul va aloca spatiu pentru 7*9*2 intregi. Adresa de baza a tabloului este "&a[0][0][0]", iar
functia de corespondenta in memorie este specificata de
a[i][j][k] care este echivalent cu *(&a[0][0][0] + 9*2*i + 2*j + k)
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;
n cazurile cnd tabloul este de tip structurat, atribuirea valorii i accesul laun element al tabloului se face
conform regulilor de atribuire i accesare pentru variabile structurate. Un element al tabloului poate aprea n
orice expresie, unde e admisibilprezena unei variabile de tip compatibil cu tipul valorii elementului.
S examinm iniializarea tabloului bidimensional:
Int 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}};
Indexarea se face dupa linii. Daca nu sunt suficiente elemente care sa initializeze vectorul, atunci restul
elementelor sunt initializate cu 0. Daca prima componenta lipseste, atunci compilatorul extrage lungimea din
numarul de perechi de acolade interioare.
Exemplu: Consideram initializarea:
int a[2][2][3] = {
{{1, 1, 0}, {2, 0, 0}},
Exemple model:
Scopul lucrarii : Prelucrarea matricei pe coloane: calculul sumei valorilor elementelor pe coloane:
#include <stdio.h>
#define ROW 2
#define COL 3
void main() {
int a[ROW][COL], b[ROW]; int i,j;
for(i = 0; i < ROW; i++) {
printf("\n %d\n", i + 1);
for(j = 0; j < COL; i++) scanf("%d",&a[i][j]); }
/* */
for(j = 0; j < COL; i++) {
b[j] = 0;
Scopul lucrarii : Este dat matricea A={ai,j}, i=1,..,n; j=1,..,n. Extragei vectorul B dup schema micrii
reprezentat n Fig.5 (schema micrii
reprezint spirala i punctul iniial de pornire este ai,j
spre elementul din centrul matricei A Apoi elementele
lui B de rearnjat n cretere.
Fig.5.
#include<stdio.h>
#include<conio.h>
void main()
{
clrscr();
int i,n,n1,p,q,aux,r,j,t,b[100],a[100][100];
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]);
clrscr();
printf("Matricea A:\n");
for(i=0;i<n;i++)
{ printf("\n");
for(j=0;j<n;j++)
printf("%d ",a[i][j]);
}
if(n%2!=0) n1=n/2+1;
else n1=n/2;
p=0;
for(i=0;i<n1;i++)
{
for(j=i;j<n-i;j++)
{ b[p]=a[j][i];p++; }
for(q=i+1;q<n-i;q++)
{ b[p]=a[n-i-1][q];p++; }
for(r=n-i-2;r>=i;r--)
{ b[p]=a[r][n-i-1];p++; }
for(t=n-i-2;t>i;t--)
{ b[p]=a[i][t];p++; }
}
printf("\nVectorul B:\n");
for(i=0;i<p;i++) printf("%d ",b[i]);
for(i=0;i<p-1;i++)
for(j=0;j<p-1;j++)
{ if(b[j+1]<b[j])
{ aux=b[j];
b[j]=b[j+1];
b[j+1]=aux;
}
}
printf("\nVectorul B ordonat crescator:\n");
for(i=0;i<p;i++)
printf("%d ",b[i]);
getch();
}
xn
x1 x2 xn
0
Apoi de comparat valorile elementelor ambelori tablouri obinute i dac numrul elementelor mai mari din
primul tablou este mai mare, atunci n ambele matrici elementele coloanelor impare de schimbat cu locurile
celor pare .
Fig.3
24. Este dat matricea
A={ai,j}; i=1,,n; j=1,,n.
Construii matricea B={bi,j}, elementele creia se determin conform urmtoarei
scheme: n matricea A (Fig.3) prin ai,j se traseaz elementele diagonalelor
paralele cu diagonala principal, iar matricea B cu elementele bi,j ,
obinute din ai,j, ns n B aranjate paralel cu diagonala secundar (vezi Fig.4.).
De asemenea determinai pentru ambele matrice coordonatele elementelor
minimale i maximale.
25. Sunt date 2 matrice A={ ai,j}, B={bi,j}, delimitate n 4 sectoare (vezi Fig.2.). . Calculai pentru ambele
matrice urmtoarele:
valoarea minim a sectorului 1; -- valoarea maxim a sectorului 2;
produsul elementelor a sectorului 3;. suma elementelor sectorului 4.
26. Pentru matricea dat A={ai,j }, i=1,..,n; j=1,,n;
obinei vectorul B care reprezint valoarile minime i
maxime a elementelor diagonalelor paralele cu
ai,j - ak,j-ai,m /aj,i, unde k -- numrul liniei care conine elementul maximal al coloanei m;
m -- numrul coloanei care conine elementul minimal al liniei. Linia k i coloana m se transmit din
A n B neschimbate.
28. Pentru matricea dat WA={ wai,j}, i=1,..,n; j=1,..,n;
extragei vectorul WW dup schema micrii
reprezentate n Fig.6, ncepnd de la elementul wa1,n
spre wa2,n , apoi paralel cu diagonala principal se
mic spre linia nti, parcurgnd dou elemente, i
dinnou paralel cu diagonala paralel ajunge la ultima
coloan .a.m.d. pn la sfrit la elementul wan,1 .
Fig.6.
29. Elaborai algoritmul i programul pentru prelucrarea unui tablou patratic i se obine ca rezultat una din
valorile urmtoare: 0 - dac tabloul este simetric fata de diagonala principala; 1 - dac tabloul este superior
triunghiular (toate elementele de sub diagonala principal sunt nule) i 2 - dac tabloul este inferior
triunghiular; 3 - dac tabloul este unitar i 4 - n restul cazurilor.
30. Se definete c dou coloane a matricei date D={ di,j}, i=1,n; j=1,n; sunt asmntoare dac coincid seturi
de valori ale acestor coloane. De calculat pentru D numrul de coloane cu setul maximal i numrul de
coloane neasmntoare.
K
Este dat matricea Q={qi,j}, i=1,n; j=1,n; delimitat n 5
sectoare dup schema reprezentat n
fig.7 (pentru n impar valoarea lui k=n/2+1). Calculai:
valoarea minim a sectorului 1;
valoarea maxim a sectorului 2; -- produsul elementelor al
sectorului 4; suma elementelor a sectorului 3.
31. Din elementele sectorului 5, rombul din centru, creai tabloul B={ bl}.
Fig.7.
Pentru matricea dat Y={ Yi,j}, i=1,n; j=1,n; efectuai transpunerea fa de diagonala secundar i obinei
matricea B, apoi calculai E=Y*B3*YT Verificai dac matricea E este singular sau nu.
32. Pentru matricea dat A={ ai,j}, i=1,n; j=1,n; calculai complementele algebrice la elementele diagonalei
principale i obinei n matrici B de rangul n=1. Matricea B se obine din A prin excluderea liniei i coloanei cu
numrul i. Afiai matriciile obinute i elementele lor minime.
33. Sunt date matricile A={ ai,j} i B={bi,j}, i=1,n; j=1,n. Ordonai elementele liniilor acestor matrici n
ordinea cresctoare. Interclasai A i B i obinei C={ ci,j}, i=1,,n; j=1,,2n. Elementele liniilor matricii C
s fie ordonate n ordinea cresctoare. Apoi calculai S=C-A*B* BT
Se consider date dou matrice patratice A si B de ordinul n (n=>20) cu numere ntregi. S se elaboreze
algoritmul i programul pentru efectuarea . calculului elementelor matricei C n baza elementelor matricelor A
i B, definite astfel: deasupra diagonalei principale:
c[i,j]=a[i,j]+b[i,j], dac cei doi termeni au aceiai paritate;
c[i,j]=abs(a[i,j]-b[i,j]), dac cei doi termeni au pariti diferite;
34. diagonala principal: semisuma elementelor corespunzatoare din A i B;
sub diagonala principal:
c[i,j]=a[i,j]+b[i,j], dac cei doi termeni au pariti diferite;
c[i,j]=abs(a[i,j]-b[i,j]), dac cei doi termeni au aceleai pariti.
35. Se consider date dou matrice patratice F si G de ordinul n (n=>20) cu numere ntregi. S se elaboreze
algoritmul i programul pentru efectuarea calculul elementelor matricei H= FT*G-F*GT i de verificat toate
matricele prin relaia de similitudine definit prin urmatoarele trei condiii:
reflexivitatea elementelor diagonalei principale egale cu 1; simetria lor;
36. tranzitivitatea: orce i,j(1<=i,j<=N) c(i,j)>=max{min(c(i,k),c(k,j)), dac 1<=k<=n.
37. Se consider date trei matrice patratice P, R i S de ordinul n (n=>50) cu numere reale. S se elaboreze
algoritmul i programul pentru prelucrarea matricelor dup urmtoarele:
se schimb cu locurile elementele rndului al doilea cu penultimul;
se schimb cu locurile elementele coloanei a doua cu penultima;
se schimb cu locurile elementele coloanelor impare cu valori nule cu respectivele elemente ale rndurilor
impare, adic pji =>pi,j.nmulii matricele ntre ele.
38..Sunt date numerele reale 1,,8. De obinut matricele patratice de ordinul 8 A={ai,j} i B={bi,j},
(n=8) i de nmulit ntre ele de 3 ori, iar din matricea obinut de determinat valoarea maxim a elementelor
situate n sectorul haurat n Fig.8.
x1 x2 ... x8
1 1 ... 1
x x ... x
1 2 8
A=
8 8
1 2
8
8
x x ... x
B=
7 7
1 2
7
8
x x ... x
Fig.8
39. Se consider un ptrat cu nxn csue. Fiecare csu conine un numr ntre 1 i 2n. Fiecare numr natural,
diferit de 0, apare aleatoriu o singur dat n cadrul ptratului. De gsit calea, ncepnd din orice linie i
terminnd cu oriice coloan, prin suma minim a numerelor parcurse.
Traseul de fixat prin nlocuirea numerelor cu 0, tiind c numrul poate fi schimbat n 0 numai cu cel impar pe
poziile impare. Dac traseul nu poate fi creat, atunci se caut alt cale. Afiai configuraiile tablourilor iniial
i final cu traseul obinut.
40. Calculati valoarea unui determinant asociat unei matrice patratice. In cazul in care determinantul este
nenul, calculati inversa matricei.
41. Calculati inversa unei permutari cu un numar constant de variabile suplimentare.
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.
43. Vom genera siruri de margele formate din mar-gele de diferite dimensuni si de patru culori.
Sa
se
genereze toate sirurile de margele de lungime data in care margelele sunt aranjate in ordine descrescatoare , iar
orice doua margele vecine sunt de culori diferite.
Bibliografie
1. D. Lucanu: Bazele proiectarii programelor si algoritmilor, Universitatea A.I.Cuza Iasi, 1996
2. L. Livovschi, H. Georgescu: Sinteza si analiza algoritmilor, Ed. Stiintifica si enciclopedica, 1986
3. O. Catrina, I. Cojocaru, Turbo C++, ed. Teora 1993
4. V. Petrovici, Florin Goicea, Programarea in limbajul C. Eed. Teora 1999
5. Liviu Negrescu, ,,Limbajul C ,volumul I_partea I-a si partea II-a. Editura MicroInformatica, Cluj-napoca
2001
6. ., .. . -, 2001,,, Brian Kernighan, Dennis
Ritchie The C Programming Language este n l. romn format electronic
7. Indrumar de lucrri de laborator: Informatica. /A.Popescu, . Marin / Chisinau.
UTM,2003.
8. Vlad Caprariu Ghid de utilizare Turbo C Cluj - Napoca 1993.
9. Cristea Valentin. Tehnici de programare. Ed.: Bucur., Teora, 1993. /681.3; T29/
10. Odagescu Ioan, Copos Cristina s.a. Metode si Tehnici de programare./enunturi, solutii, probleme propuse/
Ed.:Bucur.: INTACT, 1994 /681.3; O23/
11. Tudor Blnescu. Corectudinea agoritmilor.Bucur.:Ed. Tehn.1995