Documente Academic
Documente Profesional
Documente Cultură
LABORATOR
4-5 Matrice
O matrice este o colecţie de variabile de acelaşi tip, apelate cu acelaşi nume. Accesul la
un element al matricei se face cu ajutorul unui indice.
Matricea este cea mai simplã structurã de datã dupã tipurile elementare de date. Ea poate fi
definitã ca o mulţime de locaţii consecutive de memorie. Aceastã definiţie se referã însã la
implementarea ei (reprezentarea în memorie). Trebuie fãcutã distincţia între aceastã
reprezentare şi structura de datã respectivã. Intuitiv, matricea este o mulţime de perechi
(indice, valoare) şi aici ne referim la matricea unidimensionalã. Puţine limbaje de programare
au implementat suport pentru matrici multidimensionale. C-ul este unul dintre acestea.
Numim matricea unidimensională - vector, iar matricea bidimensională - tablou. În memorie,
o matrice este stocatã sub forma unor locaţii consecutive, adresabile printr-o valoare întreagã
numitã index sau indice.
35
Programare C/C++
În C, o matrice este o adresă în memorie şi anume adresa primului său element. În C, limita
inferioarã a unei matrici este întotdeauna 0 (indicele primului element). Descriem mai jos
modalitãţile de declarare şi adresare ale unei matrici uni şi bidimensionale în C:
/* declarare */
tip a[nr_elem]; //matrice unudimensionata
tip b[nr_elem1][nr_elem2]; //matrice bidimensionata
/* declarare cu tip */
typedef tip vector[nr_elem];
typedef tip matrice[nr_elem1][nr_elem2];
vector a;
matrice b;
/* adresare */
var1 = vect[k];
var2 = tablou[i][j];
36
Programare C/C++
Aplicaţii
Ex.1: Se citeste un vector cu n componente întregi. Se cere sa se afiseze cel mai mare si cel
mai mic numar întreg gasit, suma, produsul, numarul de componente negative de indice impar
si memoria ocupata de vectorul respectiv.
#include<stdio.h>
typedef int vector[20];
37
Programare C/C++
for(i=0;i<n-1;i++)
{
printf("%d, ",x[i]);
}
printf("%d.\n",x[n-1]);
}
int memorie()
{
vector x;
int m=sizeof(x);
return m;
}
38
Programare C/C++
void main()
{
int n,s,p,nr;
vector x;
citire(x,&n);
afisare(x,n);
min_max(x,n);
s=suma(x,n);
printf("Suma este: %d\n",s);
p=produs(x,n);
printf("Produsul este: %d\n",p);
nr=numar(x,n);
printf("Numarul de elemente cu indice impar <0 este: %d\n",nr);
#include<stdio.h>
#include<string.h>
39
Programare C/C++
//diferenta
/*se cer elementele care sunt în multimea A, dar nu sunt în B.
Elementele vor fi înregistrate într-o multime C. Astfel, fiecare element al
lui A va face testul de apartenenta la multimea B. În caz de neapartenenta,
acesta este adaugat în C, initial vida. O variabila k (cu valoarea initiala
0) retine indicele componentei din C care va memora urmatorul element ce se
adauga multimii diferenta.*/
for(i=0;i<n;i++)
{
gasit=0;
for(j=0;j<m && !gasit;j++)
if (a[i]==b[j]) gasit=1;
if (!gasit) c[k++]=a[i]; //sau {c[k]=a[i];k++;}
}
printf("\nA - B : ");
for(i=0;i<k;i++) //afisarea multimii C
printf("%d ",c[i]);
}
for(i=0;i<n;i++)
{
gasit=0;
for(j=0;j<m && !gasit;j++)
if (a[i]==b[j]) gasit=1;
if (gasit) c[k++]=a[i];
}
printf("\nA intersectat B : ");
for(i=0;i<k;i++) //afisarea multimii C
printf("%d ",c[i]);
}
40
Programare C/C++
for(i=0;i<n;i++)
{
gasit=0;
for(j=0;j<m && !gasit;j++)
if (a[i]==b[j]) gasit=1;
if (!gasit) c[k++]=a[i]; //sau {c[k]=a[i];k++;}
}
printf("\nA reunit B : ");
for(i=0;i<k;i++) //afisarea multimii C
printf("%d ",c[i]);
for(i=0;i<m;i++)
printf("%d ",b[i]);
//produs cartezian
void produs_cartezian(multime a,int n,multime b,int m)
{
int i,j;
printf("\nA X B : ");
for(i=0;i<n;i++)
for(j=0;j<m;j++)
printf("(%d,%d) ",a[i],b[j]);
}
void main()
{
multime a,b;
multime c;
int n,m; //n - nr de elem. ptr. A si m - nr. de elem. ptr. B
int e;
afiseaza(a,n,’A’);
afiseaza(b,m,’B’);
diferenta(a,n,b,m,c);
intersectie(a,n,b,m,c);
reuniune(a,n,b,m,c);
produs_cartezian(a,n,b,m);
}
41
Programare C/C++
Ex.3: Să se realizeze un program care interclasează doi vectori într-un al treilea vector. Primii
doi vor fi iniţial sortaţi.
#include<stdio.h>
main()
{
int a[10],b[10],c[20],aux,m,n,i,j,k,gasit;
//m ptr. vectorul a si n ptr. vectorul b
printf("m=");
scanf("%d",&m);
for(i=0;i<m;i++)
{
printf("a[%d]=",i+1);
scanf("%d",&a[i]);
}
printf("n=");
scanf("%d",&n);
for(i=0;i<n;i++)
{
printf("b[%d]=",i+1);
scanf("%d",&b[i]);
}
//al doilea vector va fi sortat prin metoda sortarii selective (selectiei directe)
for(i=0;i<n-1;i++)
for(j=i+1;j<n;j++)
if(b[i]>b[j])
{
aux=b[i];
b[i]=b[j];
b[j]=aux;
}
//interschimbarea propriu-zisa
2 9 11 12 15 17 3 4 7 12 20 21
2 3 4 7 9 11 12 12 15 17 20 21
Interclasarea (merge) a doi vectori
42
Programare C/C++
/*se parcurg cei doi vectori începând cu primul element al fiecăruia. În momentul în care se gaseşte o
valoare mai mică într-unul din cei doi se va copia acea valoare în al treilea, iar în vectorul din care s-a copiat
se trece la elementul imediat următor. În momentul în care s-a parcurs un vector şi deci nu mai avem ce
compara, elementele rămase într-unul din cei doi se vor copia în cel de-al treilea, adică cel rezultat*/
i=j=k=0;
for(i=j;i<n;i++)
c[k++]=b[i];
Ex.4: Să se realizeze un program care calculează valoarea unui polinom într-un punct.
#define max 10
#include<stdio.h>
void main()
{
float a[max],x,x_la_i,P;
int i,n;
printf("Dati gradul polinomului: ");
scanf("%d",&n);
puts("Dati coeficientii polinomului:");
for(i=n;i>=0;i--)
{
printf("a[%d]=",i);
scanf("%f",&a[i]);
}
P=0;
x_la_i=1;
for(i=0;i<=n;i++)
{
P=P+ a[i]*x_la_i;
x_la_i=x_la_i * x;
}
43
Programare C/C++
Ex.: P(x)=x3+1
X=2
P(2)=a323+ a222+ a121+ a020 unde, a3=1, a2=0, a1=0, a0=1
- vom calcula recursiv puterile lui 2
- vom initializa P(2)=0
- apoi: P(2)=P(2)+ai*x_la_i unde i va fi de la 0 la 3
si x_la_i =x_la_i*x adica, 21=20*2, 22=21*2, 23=22*2
void atribuire1(matrice a)
{
int k=1,i,j;
for(i=0;i<lin;i++)
for(j=0;j<col;j++)
{
a[i][j]=k;
k++;
}
}
void atribuire2(matrice a)
{
int i,j;
for(i=0;i<lin;i++)
for(j=0;j<col;j++)
a[i][j]=(i*col)+j+1;
}
void afis_p_u(matrice a)
{
printf("\nPrimul element este: %d",a[0][0]);
printf("\nPrimul element este: %d\n",a[lin-1][col-1]);
}
44
Programare C/C++
printf("\n");
}
}
void interschimbare(matrice a)
{
int x,y,j,aux;
printf("\nDati linia care se doreste a se interschimba : ");
scanf("%d",&x);
printf("Dati linia cu care se doreste interschimbarea : ");
scanf("%d",&y);
for(j=0;j<col;j++)
{
aux=a[x-1][j];
a[x-1][j]=a[y-1][j];
a[y-1][j]=aux;
}
}
void main()
{
matrice a;
int b[][col]={{1,2,3,4},
{5,6,7,8},
{9,10,11,12}};
atribuire1(a);
//atribuire2(a);
afis_p_u(a);
afisare(a,'A');
afisare(b,'B');
interschimbare(a);
afisare(a,'A');
}
//citirea matricei
for(i=0;i<*n;i++)
for(j=0;j<*n;j++)
{
printf("%c[%d][%d]= ",c,i+1,j+1);
scanf("%d",&a[i][j]);
}
}
45
Programare C/C++
46
Programare C/C++
{
int s=0,i;
for(i=n-1;i>=0;i--)
s+=a[i][n-i-1];
printf("\n\nSuma elementelor de [pe] diagonala secundara este: %d",s);
}
void main()
{
matrice a,b,c;
int n,l;
citire(a,&n,'A');
afisare(a,n,'A');
suma1(a,n);
suma2(a,n);
suma3(a,n);
47
Programare C/C++
suma4(a,n);
suma5(a,n);
suma6(a,n);
suma7(a,n);
clrscr();
citire(b,&n,'B');
suma9(a,b,c,n);
printf("Suma matricelor A si B este:\n");
afisare(c,n,'C');
}
Probleme propuse
1. Să se refacă problemele 3 şi 4 astfel încât să se folosească subprograme (funcţii)
definite.
3. Fie declaraţiile:
Int a[20]; int n; float e;
Să se determine valoarea expresiei e în fiecare din cazurile:
a) e = x1+x2+x3+…+xn;
b) e = x1*x2*x3*…*xn;
c) e = media aritmetica a componentelor din vector;
d) e = suma patratelor componentelor din vector;
e) e = suma cuburilor componentelor negative din vector;
f) e = x1-x2+x3-x4+…±xn .
48