Sunteți pe pagina 1din 19

Ministerul Educaiei al Republicii Moldova

Universitatea Tehnic a Moldovei

Catedra Automatica si informatica

RAPORT
Lucrarea de laborator nr.5
la Programarea Calculatoarelor

A efectuat:
st. gr. AI-161 P.Trofim

A verificat:
dr., conf.univ. M. Kulev

Chiinu 2016
Lucrarea de laborator nr.5

Tema: Prelucrarea tablourilor bidimensionale utiliznd funcii i alocare dinamic

Scopul lucrrii: Obinerea deprinderilor practice de lucru cu funcii i alocare dinamic.

Condiia problemei (sarcina de lucru)(Varianta 11) :


De prelucrat tabloul n conformitate cu sarcina primit.De afiat tabloul introdus i cel
prelucrat n form corespunztoare.

1.Fie tabloul D cu dimensiunile N*N.S se formeze vectorul C,elementele cruia vor fi


elementele situate mai sus de diagonala principal a tabloului D.

2.De calculat media aritmetic a elementelor minimal i maximal al matricei.

3.De calculat suma elementelor din rndurile pare a matricei.


Mersul lucrrii:

Noiuni principale din teorie i metode folosite:


O funcie este o colecie de instruciuni care execut o anumit sarcin.
Cea mai important i obligatorie funcie n cadrul unui program este funcia main.Cu ea
ncepe execuia oricrui program.
Forma general a funciilor este:[1]
tip nume_funcie(list_de_parametri i tipul lor){
corpul funciei
[return valoare];
}
unde:
tip-specific tipul valorii returnat de funcie.
nume_funcie-reprezint numele funciei.
list_de_parametri si tipul lor -reprezint parametrile de intrare n funcie,asupra
crora funcia i execut instruciunile.
return value-reprezint valoarea returnat de funcie.

Din punct de vedere al definirii funciilor,ele se mpart n:


stardard-funcii prestabilite.
definite de utilizator-funcii create de utilizator
Dup apelul funciei difereniem dou tipuri de funcii:
care apeleaz
care sunt apelate.

Funciile sunt caracterizate de urmtoarele lucruri:[3]


Prototipul funciei-se utilizeaz ca programatorul s neleag ce face funcia i
pentru ca compilatorul s vad funcia atunci cnd funcia main se afl naintea
celorlalte funcii in cadrul programului.
Forma general a prototipului unei funcii este:
tip nume(lista parametri i tipul lor);
1
exemplu: void swap(int a.int b):
Codul funciei-are 2 pri:
1.Antet,care seamn cu prototipul funciei.
2.Corpul funciei-reprezint totalitatea instruciunilor efectuate de
funcie.
Apelul funciei-reprezint utilizarea funciei.
Apelul funciei poate fi de 2 tipuri:
1.Apel al funciei ca valoare,exemplu: y=pow(a,b)/2
Funciile de tip void nu pot fi folosite ca valoare.
2.Apel al funciei ca instruciune,exemplu: void interschimb(int a,int b);
Alocarea memoriei n C[2] presupune utilizarea memoriei calculatorului pentru rularea
programului elaborat.Ea poate fi de 2 tipuri:
Alocare static a memoriei-atunci cnd compilatorul aloc memorie n mod
automat nainte de rularea programului,n momentul compilrii.Aceast
memorie nu poate fi eliberat.
Alocarea dinamic a memoriei presupune alocarea memoriei de ctre
utilizator,dup necesitatea acestuia.Aceast alocare are loc n momentul rulrii
programului i alocarea/realocarea i eliberarea memoriei poate avea loc la
dorina programatorului.
Alocarea dinamic a memoriei permite gestionarea mai eficient a memoriei i este uor
vizibil atunci cnd programele sunt masive i opereaz cu multe parametri.
Alocarea dinamic poate fi efectuat utiliznd urmtoarele funcii din biblioteca stdlib.h:
malloc()-aloc memorie de dimensiunea size octei.
prototipul funciei: void *malloc(int size);
exemplu:A=(float *)malloc(n*sizeof(float));
calloc()-aloc memorie pentru n elemente de dimensiune size i iniializeaz zona
alocat cu zerouri.
prototipul funciei:void *calloc(int n,int size);
exemplu:A=(float *)calloc(n*sizeof(float));
realloc()-realocarea memoriei care crete(sau scade) fa de dimensiunea estimat
anterior,care primete ca parametri adresa veche i dimensiunea nou i ntoarce
adresa nou
prototipul funciei: void *realloc(void * adresaveche,tip size);
exemplu:A=realloc(A,(n+1)*sizeof(*A));
Eliberarea memoriei se efectueaz cu ajutorul funciei free();
care are prototipul: void free(void *p);
unde void *p reprezint adresa memoriei care trebuie eliberat.
exemplu: free(A);

2
Analiza parametrilor i a funciilor:

1.Funcia ADM2D:
a) parametri de intrare:
n-de tip ntreg,reprezint numrul de elemente pe linie n matrice.
m-de tip ntreg,reprezint numrul de elemente pe coloan n matrice.

b)parametri intermediare:
i-de tip ntreg,reprezint indicele elementului curent n tablou.

c)parametri de ieire:
D-pointer la pointer de tip float,stocheaz adresa vectorului de pointeri care la
rndul lor sunt pointeri de tip float care reprezint adresele fiecrei linii a
tabloului.

2.Funcia ADM1D:
a)parametri de intrare:
n-de tip ntreg,reprezint numrul de elemente pe linie n matrice.
m-de tip ntreg,reprezint numrul de elemente pe coloan n matrice.

b)parametri intermediare nu se conin n funcie.

c)parametri de ieire:
A- pointer de tip float care reprezint adresa vectorului n care sunt stocate
elementele mai sus de diagonala principal.

3.Funcia citireMatrice:
a)parametri de intrare:
n-de tip ntreg,reprezint numrul de elemente pe linie n matrice.
m-de tip ntreg,reprezint numrul de elemente pe coloan n matrice.
D-pointer la pointer de tip float,stocheaz adresa vectorului de pointeri care la
rndul lor sunt pointeri de tip float care reprezint adresele fiecrei linii a
tabloului.

b)parametri intermediare:
i-de tip ntreg,reprezint indicele elementului curent pe linie n matrice.
j-de tip ntreg,reprezint indicele elementului curent pe coloan n matrice.

c)parametri de ieire nu se conin n funcie.

4.Funcia afisareMatrice:
a)parametri de intrare:
n-de tip ntreg,reprezint numrul de elemente pe linie n matrice.
m-de tip ntreg,reprezint numrul de elemente pe coloan n matrice.
D-pointer la pointer de tip float,stocheaz adresa vectorului de pointeri care la
rndul lor sunt pointeri de tip float care reprezint adresele fiecrei linii a
tabloului.
3
b)parametri intermediare:
i-de tip ntreg,reprezint indicele elementului curent pe linie n matrice.
j-de tip ntreg,reprezint indicele elementului curent pe coloan n matrice.

c)parametri de ieire nu se conin n funcie.

5.Funcia aboveDiag:
a)parametri de intrare:
D-pointer la pointer de tip float,stocheaz adresa vectorului de pointeri care la
rndul lor sunt pointeri de tip float care reprezint adresele fiecrei linii a
tabloului.
A- pointer de tip float care reprezint adresa vectorului n care sunt stocate
elementele mai sus de diagonala principal.
n-de tip ntreg,reprezint numrul de elemente pe linie n matrice.
m-de tip ntreg,reprezint numrul de elemente pe coloan n matrice.

b)parametri intermediare:
i-de tip ntreg,reprezint indicele elementului curent pe linie n matrice.
j-de tip ntreg,reprezint indicele elementului curent pe coloan n matrice.

c)parametri de ieire nu se conin n funcie.

6.Funcia showAboveDiag:
a)parametri de intrare:
A- pointer de tip float care reprezint adresa vectorului n care sunt stocate
elementele mai sus de diagonala principal.
n-de tip ntreg,reprezint numrul de elemente pe linie n matrice.
m-de tip ntreg,reprezint numrul de elemente pe coloan n matrice.

b)parametri intermediare:
i-de tip ntreg,reprezint indicele elementului n tablou.

c)parametri de ieire nu se conin n funcie.

7.Funcia medAritm:
a)parametri de intrare:
D-pointer la pointer de tip float,stocheaz adresa vectorului de pointeri care la
rndul lor sunt pointeri de tip float care reprezint adresele fiecrei linii a
tabloului.
n-de tip ntreg,reprezint numrul de elemente pe linie n matrice.
m-de tip ntreg,reprezint numrul de elemente pe coloan n matrice.

4
b)parametri intermediare:
i-de tip ntreg,reprezint indicele elementului curent pe linie n matrice.
j-de tip ntreg,reprezint indicele elementului curent pe coloan n matrice.
max-de tip float,n care este stocat valoarea elementului maxim din matrice
min- de tip float,n care este stocat valoarea elementului minim din matrice
med- de tip float,n care este stocat valoarea mediei aritmetice a elementului
minim si maxim din matrice

c)parametri de ieire:
medP-pointer de tip float care reprezint adresa unde este stocat
media aritmetic a elementului minim i maxim din matrice.

8.Funcia sumPare:
a)parametri de intrare:
D-pointer la pointer de tip float,stocheaz adresa vectorului de pointeri care la
rndul lor sunt pointeri de tip float care reprezint adresele fiecrei linii a
tabloului.
n-de tip ntreg,reprezint numrul de elemente pe linie n matrice.
m-de tip ntreg,reprezint numrul de elemente pe coloan n matrice.

b)parametri intermediare:
i-de tip ntreg,reprezint indicele elementului curent pe linie n matrice.
j-de tip ntreg,reprezint indicele elementului curent pe coloan n matrice.
sum-variabil de tip float,n care este stocat suma elementelor de pe rndurile
pare din matrice

c)parametri de ieire:
sumP- pointer de tip float care reprezint adresa unde este stocat suma
elementelor de pe rndurile pare din matrice.

9.Funcia freeADM2D:
a)parametri de intrare:
D-pointer la pointer de tip float,stocheaz adresa vectorului de pointeri care la
rndul lor sunt pointeri de tip float care reprezint adresele fiecrei linii a
tabloului.
n-de tip ntreg,reprezint numrul de elemente pe linie n matrice.

b)parametri intermediare:
i-de tip ntreg,reprezint indicele elementului curent pe linie n matrice.

c)parametri de ieire nu se conin n funcie.

5
10.Funcia main:
a)parametri de intrare:
n-variabil de tip ntreg,reprezint numrul de elemente pe linie n matrice.
m-variabil de tip ntreg,reprezint numrul de elemente pe coloan n matrice.

b)parametri intermediare:
D-pointer la pointer de tip float,stocheaz adresa vectorului de pointeri care la
rndul lor sunt pointeri de tip float care reprezint adresele fiecrei linii a
tabloului.
C-pointer de tip float care reprezint adresa vectorului n care sunt stocate
elementele mai sus de diagonala principal.

c)parametri de ieire nu se conin n funcie.

6
Schema logic a algoritmului:
1.Schema logic a funciei care aloc memorie dinamic pentru un tablou bidimensional
cu n linii i m coloane:
Funcia are prototipul: float **ADM2D(int n,int m);

2.Schema logic a funciei care aloc memorie dinamic pentru elementele mai sus de
diagonala principal a tabloului
Funcia are prototipul: float *ADM1D(int n,int m);

7
3.Schema logic a funciei care citete de la tastatur elementele tabloului bidimensional:
Funcia are prototipul: void citireMatrice(float **D,int n,int m);

4.Schema logic a funciei care afieaz la ecran tabloul bidimensional introdus:


Funcia are prototipul: void afisareMatrice(float **D,int n,int m);

5.Schema logic a funciei care stabilete elementele mai sus de diagonala principal a
tabloului bidimensional.
Funcia are prototipul: void aboveDiag(float **D,float *A,int n,int m);

8
6.Schema logic a funciei care afieaz la ecran elementele de mai sus de diagonala
principal
Funcia are prototipul: void showAboveDiag(float *A,int n,int m);

7.Schema logic a funciei care determin media aritmetic a elementelor minimale i


maximale din tablou
Funcia are prototipul float *medAritm(float **D,int n,int m);

9
8.Schema logic a funciei care determin suma elementelor din rndurile pare ale tabloului.
Funcia are prototipul: float *sumPare(float **D,int n,int m);

9.Schema logic a funciei care elibereaz memoria pentru tabloul dimensional introdus.
Funcia are prototipul: void freeADM2D(float **D,int n);

10
10.Schema logic a funciei main:
Funcia are prototipul: int main();

11
Codul (textul) programului in limbajul C:
#include<conio.h>
#include<stdio.h>
#include<stdlib.h>

float **ADM2D(int n,int m){


float **D;
int i;
D=(float**)malloc(n*sizeof(float*));
if(!D){
puts("Memoria nu a fost alocata");
}
for(i=0;i<n;i++){
D[i]=(float *)malloc(m*sizeof(float));
if(!D[i]){
return NULL;
}
}
return D;
}

float *ADM1D(int n,int m){


float *A;
if(n>=m){
A=(float*)malloc((m-1)*sizeof(float));
if(!A){
puts("Memoria nu a fost alocata");
exit(1);
}
}
else{
A=(float*)malloc((n-1)*sizeof(float));
if(!A){
puts("Memoria nu a fost alocata");
exit(1);
}
}
return A;
}

void citireMatrice(float **D,int n,int m){


int i,j;
for(i=0;i<n;i++){
for(j=0;j<m;j++){
printf("\nDati elementul D[%i][%i]:",i,j);
scanf("%f",&D[i][j]);
}
}
}

void afisareMatrice(float **D,int n,int m){


int i,j;
for(i=0;i<n;i++){
for(j=0;j<m;j++){
printf("%.2f\t",D[i][j]);
}
printf("\n");
}
}

void aboveDiag(float **D,float *A,int n,int m){


int i,j;
if(n>=m){
for(i=0;i<m-1;i++){

12
for(j=1;j<m;j++){
if(i==j-1){
A[i]=D[i][j];
}
}
}
}
else{
for(i=0;i<n-1;i++){
for(j=1;j<n;j++){
if(i==j-1){
A[i]=D[i][j];
}
}
}
}
}

void showAboveDiag(float *A,int n,int m){


int i;
if(n>=m){
for(i=0;i<m-1;i++){
printf("%.2f\t",A[i]);
}
}
else{
for(i=0;i<n-1;i++){
printf("%.2f\t",A[i]);
}
}

float *medAritm(float **D,int n,int m){


float max,min,med;
int i,j;
float *medP;
max=D[0][0];
min=D[0][0];
for(i=0;i<n;i++){
for(j=0;j<m;j++){
if(D[i][j]<min){
min=D[i][j];
}
if(D[i][j]>max){
max=D[i][j];
}
}
}
med=(min+max)/2;
medP=&med;
return medP;
}

float *sumPare(float **D,int n,int m){


float sum=0;
float *sumP;
int i,j;
for(i=1;i<n;i+=2){
for(j=0;j<m;j++){
sum+=D[i][j];
}
}
sumP=&sum;
return sumP;
13
}

void freeADM2D(float **D,int n){


int i;
for(i=0;i<n;i++){
free(D[i]);
}
free(D);
}

int main(){

/***********Variabile*********/
float **D;
float *C;
int n,m;

/***********Citire N**********/
puts("Dati N: ");
scanf("%i",&n);
puts("Dati M: ");
scanf("%i",&m);
if(n<1 || m<1){
puts("Numarul de linii si coloane trebuie sa fie mai mare decit 1");
}else{
/***********Alocare dinamica 2D**********/
D=ADM2D(n,m);
/***********Alocare dinamica 1D**********/
C=ADM1D(n,m);
/***********Citire si afisare matrice bidimensionala**********/
citireMatrice(D,n,m);
printf("\n************* Rezultatele obtinute: *************");
printf("\n\nMatricea introdusa:\n");
afisareMatrice(D,n,m);

/***********Elementele mai sus de diagonala principala**********/


if(n>1 && m>1){
aboveDiag(D,C,n,m);
printf("\nElementele mai sus de diagonala principala sunt:\n");
showAboveDiag(C,n,m);
}else{
printf("\nNu se poate de calculat elementele mai sus de diagonala
principala");
}
/***********Media aritmetica a elementului minim si maxim**********/
printf("\n\nMedia aritmetica a elementului minim si maxim este :");
printf("%.2f",*(medAritm(D,n,m)));

/***********Suma elementelor din rindurile pare**********/


if(n>1){
printf("\n\nSuma elementelor din rindurile pare este :");
printf("%.2f\n",*(sumPare(D,n,m)));
}else{
printf("\n\nNu se poate de calculat suma elementelor din rindurile
pare\n");
}
/***********Eliberarea memoriei**********/
freeADM2D(D,n);
D=NULL;
free(C);
C=NULL;
}
getch();
return 0;
}
14
Rezultatele obtinute:
Pentru testarea i verificarea programului am introdus diferite valori ale lui n i m,spre
exemplu atunci cnd n<1 sau m<1 obtinem:

Atunci cnd este introdus o matrice unde numrul de linii sau numrul de coloane sunt mai
mici dect 2 obinem rezultatul precum c nu se poate de calculat elementele mai sus de
diagonala principal deoarece matricea introdus nu are o diagonal principal:

De asemenea atunci cnd matricea are doar un rnd de elemente obinem mesajul c nu se
poate de calculat suma elementelor din rindurile pare deoarece matricea nu conine rnduri
pare:

15
Pentru n>1 i m>1 obinem:

16
Analiza rezultatelor si concluzii:

1)n urma elaborrii lucrrii de laborator ne-am format deprinderi de lucru cu funcii i
putem observa cu uurin utilitatea acestora atunci cnd avem nevoie de a efectua anumite
instruciuni in mod repetat.
2)Tot odat utiliznd funciile obinem o claritate mai bun a codului i putem apela o
funcie de cte ori dorim i putem s o utilizm i pentru parametri diferite.
3)De asemenea ne-am format deprinderi de lucru n ceea ce privete alocarea dinamic a
memoriei i a pointerilor.
4)Alocnd dinamic memorie putem gestiona mai eficient memoria calculatorului i acest
fapt este uor de observat atunci cnd calculatorul are puin memorie la dispoziie sau
programele sunt voluminoase i necesit cantiti mari de memorie.
5)Programul a fost optimizat pentru cazurile precum:
Introducerea unor numere negative sau egale cu 0 pentru n i m.
Alocarea dinamic corect pentru tabloul unidimensional n dependen de numrul de
elemente de deasupra diagonalei principale.
Afiarea unui aviz n cazul cnd matricea introdus nu are diagonal principal i este
imposibil calcularea elementelor de deasupra diagonalei principale.
Afiarea unui aviz n cazul cnd matricea introdus are doar un rnd de elemente,astfel
nu se poate de calculat suma elementelor din rndurile pare.

17
Bibliografie:

1. Conspectul prelegerilor cursului Programarea Calculatoarelor pentru studenii gr. AI-


161[1]

2. TOTUL DESPRE C SI C++ (MANUALUL FUNDAMENTAL DE PROGRAMARE IN


C SI C++)[RO]-Kris Jamsa,Lars Kland[2]

3.PROGRAMARE-Iniializare n limbajele C i C++ -Sergiu G.Istrati[3]

18

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