Sunteți pe pagina 1din 14

Programare C/C++

LABORATOR

4-5 Matrice

Structura de date matrice


Transmiterea unei matrice unei functii
Introducerea datelor într-o matrice tridimensională
Aplicaţii
Probleme propuse

Structura de date 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.

A ® A[0] A[1] A[2] ....... A[n-1]

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

Limbajul C nu ne permite să declarăm o variabilă de tip tablou cu un număr variabil de


componente. De multe ori nu ştim câte componente vor fi necesare pentru o anumită rulare a
programului. Orice problemă în care se lucrează cu variabile de tip tablou şi în care se cere
prelucrarea unui număr (care nu se cunoaşte de la început) de componente, constituie un
exemplu în acest sens. Ideea este atunci, de a rezerva un număr maxim de compomemte – atât
cât este necesar pentru rulare atunci când dimensiunea cerută (n) este maximă. La fiecare
rulare a programului se cere numărul de componente. De cele mai multe ori o parte dintre ele
rămân neutilizate.
Observaţie: Nu sunt permise atribuiri de forma b=a (unde a şi b sunt tablouri). În acest caz
atribuirea se face pe componente, adică:
for(i=0;i<dimensiune;i++) b[i]=a[i];

Transmiterea unei matrice unei funcţii


O matrice este o variabilă care poate păstra mai multe variabile de acelaşi tip. Precum
orice variabilă,programele pot transmite o matrice unei funcţii. Atunci când se declară o
funcţie care are ca parametru o matrice, trebuie informat compilatorul despre acest
lucru.Atunci când funcţia primeşte o matrice ca parametru, programul nu trebuie să specifice

36
Programare C/C++

dimensiunea ei în declararea parametrului.Însă, după numele matricei, din cadrul parametrilor,


trebuie trecute două paranteze drepte, informându-se astfel compilatorul că parametrul este o
matrice. Dacă nu ştie că parametrul este o matrice, compilatorul nu se îngrijeşte de
dimensiunea matricei pe care programul o transmite funcţiei.

Atunci când se lucrează cu matrice bidimensionale, nu este nevoie să se specifice


numărul de linii (rînduri) ale matricei, dar trebuie specificat numărul de coloane.

Introducerea datelor într-o matrice tridimensională


Pentru a declara o matrice trdimensională se procedează în urmărorul mod:
tip mat_tri[linie][coloana][tabel(pagina)];
Introducerea datelor într-o astfel de matrice se face:
for (linie=0;linie<n;linie++)
for(coloana=0;coloana<m;coloana++)
for(tabel=0;tabel<k;tabel++)
scanf(“%d”,mat_tri[linie][coloana][tabel]);

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

void citire(vector x,int* n) //mergea si int x[] in loc de vector x


{
int i;
printf("Dati nr. de elemente: ");
scanf("%d",n);

printf("Introduceti elementele vectorului:\n");


for(i=0;i<*n;i++)
{
printf("x[%d]= ",i+1);
scanf("%d",&x[i]);
}
}

void afisare(vector x,int n)


{
int i;
printf("\nElementele vectorului sunt:\n");

37
Programare C/C++

for(i=0;i<n-1;i++)
{
printf("%d, ",x[i]);
}
printf("%d.\n",x[n-1]);
}

void min_max(vector x,int n)


{
int i;
int min=x[0];
int max=x[0];
for(i=1;i<n;i++)
if (x[i]<min)
{
min=x[i];
}
else if (x[i]>max)
{
max=x[i];
}

printf("Valoarea minima este: %d ",min);


printf("\nValoarea maxima este: %d\n",max);
}

int suma(vector x,int n)


{
int s=0,i;
for(i=0;i<n;i++)
s+=x[i];
return s;
}

int produs(vector x,int n)


{
int p=1,i;
for(i=0;i<n;i++)
p*=x[i];
return p;
}

//Nr. de elemente de indice impar <0


int numar(vector x,int n)
{
int nr=0,i;
for(i=0;i<n;i++)
if((i+1)%2 && x[i]<0)
nr++;
return nr;
}

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

printf("Memoria ocupata de vector este: %d octeti.\n",memorie());


}

Ex.2: Să se realizeze un program care realizează principalele oparaţii pe o mulţime – vector


cu elemente diferite (apartenenţa unui element la aceasta, intersecţia, reuniunea şi produsul
cartezian cu o altă mulţime).

#include<stdio.h>
#include<string.h>

typedef int multime[20];

void citeste(multime x,int n,char c)


{
int i;
printf("Introduceti elementele multimii %s:\n",strupr(sir));
for(i=0;i<n;i++)
{
printf("%c[%d]=",c,i+1);
scanf("%d",&x[i]);
}
}

void afiseaza(multime x,int n,char c)


{
int i;
printf("Elementele multimii %c sunt: ",c);
for(i=0;i<n-1;i++)
{
printf("%d, ",x[i]);
}
printf("%d.\n",x[n-1]);
}

//apartenenta unui element la o multime

39
Programare C/C++

/*Se citeste o multime A de nr. întregi. Se citeste un numar întreg e.


Sa se decida daca e apartine A. Ptr. rezolvare folosim o variabila gasit
va retine, initial, valoarea 0. Apoi se testeaza fiecare element al
multimii A daca este sau nu egal cu numarul retinut de e. În caz de
egaliatate variabila va retine 1.
La sfârsit, se va da raspunsul în funtie de continutul variabilei
gasit.*/

void cautare(multime x,int n,int e)


{
int gasit=0,i;
for(i=0;i<n && !gasit;i++)
if(x[i]==e) gasit=1;
if (gasit) printf("Elementul apartine multimii A fiind pe pozitia
%d\n",i);
else printf("Elementul nu apartine multimii A.\n");
}

//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.*/

void diferenta(multime a,int n,multime b,int m,multime c)


{
int k=0,i,j,gasit;

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]);
}

//intersectia - opusul diferentei


void intersectie(multime a,int n,multime b,int m,multime c)
{
int k=0,i,j,gasit;

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

// reuniunea - se aplica regula A reunit B este A-B reunit B


void reuniune(multime a,int n,multime b,int m,multime c)
{
int k=0,i,j,gasit;

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;

printf("Introduceti numarul de elemente din multimea A: ");


scanf("%d",&n);
citeste(a,n,’A’);

printf("Introduceti numarul de elemente din multimea B: ");


scanf("%d",&m);
citeste(b,m,’B’);

afiseaza(a,n,’A’);
afiseaza(b,m,’B’);

printf("Dati elementul care se doreste a fi cautat in multimea A: ");


scanf("%d",&e);
cautare(a,n,e);

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]);
}

//primul vector il sortam prin metoda interschimbarii (a bulelor)


do
{
gasit=0;
for(i=0;i<m-1;i++)
if (a[i]>a[i+1])
{
aux=a[i];
a[i]=a[i+1];
a[i+1]=aux;
gasit=1;
}
} while(gasit);

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

while(i<m && j<n)


if (a[i]==b[j]) //în cazul în care avem elemente comune în cei doi vectori acestea să fie
puse o singură dată în vectorul interclasat
{
c[k++]=a[i++];
j++;
}
else
if (a[i]<b[j]) c[k++]=a[i++];
else c[k++]=b[j++]; //sau {c[k]=b[j]; k++; j++;}

if(i<m) //în caz că mai rămân elemente neanalizate în a se copiază în c


for(j=i;j<m;j++)
c[k++]=a[j];
else //în caz că mai rămân elemente neanalizate în b se copiază în c

for(i=j;i<n;i++)
c[k++]=b[i];

puts("\nVectorul sortat este:");


for(i=0;i<k;i++)
printf("%4d",c[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]);
}

printf("\nDati valoarea lui x:");


scanf("%f",&x);

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

printf("valoarea polinomului este: %.2f",P);


}

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

Ex.5: Sa se realizeze un program care numerele de la 1 la 12 într-o matrice bidimensionala si


le afiseaza rând cu rând, dupa care realizeaza interschimbari între liniile acesteia.
/*Interschimbarea dintre elementele liniei x cu y se face element cu
element prin parcurgerea pe coloana*/
#define lin 3
#define col 4
#include<stdio.h>
typedef int matrice[lin][col];

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]);
}

void afisare(matrice a, char c)


{
int i,j;
printf("\n");
printf("\nMatricea %c este:\n",c);
for(i=0;i<lin;i++)
{
for(j=0;j<col;j++)
printf("%4d",a[i][j]);

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');
}

Ex.6: Sa se realizeze principalele adunari între elementele unei matrice.


#include<stdio.h>
#include<conio.h>
typedef int matrice[10][10];

void citire(matrice a,int *n,char c)


{
int i,j;
printf("\nIntroduceti numarul de linii/coloane ale matricei %c: ",c);
scanf("%d",n); //dimensiunea matricei

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

void afisare(matrice a,int n, char c)


{
int i,j;
printf("Matricea %c este:\n",c);
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
printf("%5d",a[i][j]);
printf("\n");
}
}

//suma tuturor elementelor matricei


void suma1(matrice a,int n)
{
int s=0,i,j;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
s+=a[i][j];
printf("\nSuma tuturor elementelor este: %d",s);
}

//suma elementelor de [pe] diagonala principala


void suma2(matrice a,int n)
{
int s=0,i;
for(i=0;i<n;i++)
s+=a[i][i];
printf("\n\nSuma elementelor de [pe] diagonala principala este: %d",s);
}

//suma elementelor de [deasupra] diagonalei principale


void suma3(matrice a,int n)
{
int s=0,i,j;
for(i=0;i<n;i++)
for(j=i+1;j<n;j++)
s+=a[i][j];
printf("\nSuma elementelor de [deasupra] diagonalei principale este:
%d",s);
}

//suma elementelor de [sub] diagonala principala


void suma4(matrice a,int n)
{
int s=0,i,j;
for(i=1;i<n;i++)
for(j=0;j<=i-1;j++)
s+=a[i][j];
printf("\nSuma elementelor de [sub] diagonala principala este: %d",s);
}

//suma elementelor de [pe] diagonala secundara


void suma5(matrice a,int n)

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);
}

//suma elementelor de [deasupra] diagonalei secundare


void suma6(matrice a,int n)
{
int s=0,i,j;
for(i=0;i<n-1;i++)
for(j=0;j<=n-2-i;j++)
s+=a[i][j];
printf("\nSuma elementelor de [deasupra] diagonalei secundare este:
%d",s);
}

//suma elemntelor de [sub] diagonala secundara


void suma7(matrice a,int n)
{
int s=0,i,j;
for(i=n-1;i>=1;i--)
for(j=n-i;j<n;j++)
s+=a[i][j];
printf("\nSuma elemntelor de [sub] diagonala secundara este: %d",s);
}

//suma elementelor de pe o anumita linie


void suma8(matrice a,int n,int l)
{
int s=0,j;
for(j=0;j<n;j++)
s+=a[l-1][j];
printf("\nSuma elemntelor de pe o anumita linie este: %d",s);
}

//suma a doua matrice


void suma9(matrice a,matrice b,matrice c,int n)
{
int i,j;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
c[i][j]=a[i][j]+b[i][j];
}

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

printf("\nDati o tasta pentru a continua.");


getch();

clrscr();

printf("\nDati linia dorita a se calcula suma: ");


scanf("%d",&l);
suma8(a,n,l);

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.

2. Să se realizeze un program care realizează adunarea, scăderea şi înmulţirea a două


polinoame.

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 .

4. Să se calculeze maximul şi minimul dintr-o matrice bidimensională. Să se afişeze


Şi poziţia acestuia în matrice (nr. liniei şi al coloanei unde se găseşte elementul respectiv).

48

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

  • S1 Id SDD
    S1 Id SDD
    Document74 pagini
    S1 Id SDD
    Bogdan Daniel
    Încă nu există evaluări
  • Tema1-5 Structuri DATE
    Tema1-5 Structuri DATE
    Document11 pagini
    Tema1-5 Structuri DATE
    Bogdan Daniel
    Încă nu există evaluări
  • Cursuri Structuri de Date
    Cursuri Structuri de Date
    Document106 pagini
    Cursuri Structuri de Date
    Bogdan Daniel
    Încă nu există evaluări
  • S2 Id SDD
    S2 Id SDD
    Document74 pagini
    S2 Id SDD
    Bogdan Daniel
    Încă nu există evaluări
  • Inecuatii 8
    Inecuatii 8
    Document1 pagină
    Inecuatii 8
    Bogdan Daniel
    Încă nu există evaluări
  • Laboratoare Sisteme de Operare
    Laboratoare Sisteme de Operare
    Document61 pagini
    Laboratoare Sisteme de Operare
    Bogdan Daniel
    Încă nu există evaluări
  • Matematica 8 PDF
    Matematica 8 PDF
    Document228 pagini
    Matematica 8 PDF
    Iama Fuji
    Încă nu există evaluări
  • Inecuatii 8
    Inecuatii 8
    Document1 pagină
    Inecuatii 8
    Bogdan Daniel
    Încă nu există evaluări
  • Lab 6
    Lab 6
    Document8 pagini
    Lab 6
    Bogdan Daniel
    Încă nu există evaluări
  • Lab 8
    Lab 8
    Document6 pagini
    Lab 8
    Bogdan Daniel
    Încă nu există evaluări
  • Lab 7
    Lab 7
    Document8 pagini
    Lab 7
    Bogdan Daniel
    Încă nu există evaluări
  • Lab 1
    Lab 1
    Document13 pagini
    Lab 1
    Bogdan Daniel
    Încă nu există evaluări