Sunteți pe pagina 1din 12

Ministerul Educaiei al Republicii Moldova Universitatea Tehnic a Moldovei

Catedra Automatica si Tehnologii Informationale

Darea de seam
Lucrare de laborator Nr.6 la Programarea Calculatoarelor

A efectuat: A verificat:

st.gr. TI-133 Pavlov Alexandr conf. univ. dr. Ludmila Luchianov

Chiinu 2013

Varianta 10 Lucrare de Laborator Nr.6 Tema: Subprograme, Pointeri, Alocarea dinamica a memoriei Scopul lucrrii: Acumularea deprinderilor practice de elaborare i programare a
algoritmilor. Deprinderi de scriere i testare a programelor n limbajul C.

Formularea condiiilor problemei (sarcina de lucru): Snt date dou masive bidimensionale X[N+*M+ i Y*K+*L+. De calculat valoarea expresiei Z=(Sx+Sy)-(Kx*Ky), unde Sx i Kx snt respectiv suma i cantitatea elementelor pozitive de pe coloanele pare ale masivului X, iar Sy i Ky suma i cantitatea elementelor pozitive de pe coloanele pare ale masivului Y. Folosirea subprogramelor pentru: 1) Calcularea sumelor i cantitilor elementelor pozitive de pe coloane pare ale ambelor masive. 2) Pentru completare i afiarea elementelor tabloului. 3) De utilizat pointerii. 4) De utilizat alocarea dinamica a memoriei.
Mersul lucrrii: Noiuni principale din teorie i metode folosite: 1) include<time.h> - acesta biblioteca, ne permite s lucram cu funcii de timp i dat.

2) Cilcul for numarul de repetari ale ciclului este cunoscut de la nceputul executarii lui;
conducerea ciclului este efectuata cu ajutorul unei variabile de tip int, numit parametrul ciclului, care, in acest proces ciclic primete primeste valori consecutive de la valoarea iniiala dat pna la valoarea final dat. Sintaxa instruciunei este urmatoarea: for(expresie1;expresie2;expresie3) instruciune ; unde expresie1-este expresie de inializare a parametrului ciclui, expresie2- expresie de control, expresie3- expresie de ncrementare/decrementare a parametrului ciclic. 3) Alocarea dinamic a memoriei: blocuri de memorie de orice dimensiune pot fi alocate ntr-o zon de memorie numit heap prin intermediul funciilor malloc(), calloc() i realloc(). Aceste blocuri de memorie pot fi reutilizate dup ce zona de memorie a fost eliberat prin apelul funciei free(). 4) Pointerii: n limbajul C, orice variabil are o adres: o valoare numeric; indic locul din memorie unde e memorat valoarea variabilei. tip * nume var; nume var e pointer la (adres pt.) o valoare de tip pointer = o variabil care conine adresa altei variabile.

Schema Bloc de rezolvarea a problemei

ntroducerea datelor n tabel

Afiarea tabloului

nceput

nceput

**A,n,m

**A,n,m

i=0;i<n;i++

i=0;i<n;i++

j=0;j<m;j++

j=0;j<m;j++

A[i][j]=-30+rand()%60

A[i][j]

Sfrit

Sfrit

Suma elementelor pozitive de pe coloane pare

Cantitatea elementelor pozitive de pe coloane pare

nceput

nceput

**A,n,m

**A,n,m

j=0;j<m;j++

j=0;j<m;j++

nu

j%2==0
da

nu

j%2==0
da

i=0;i<n;i++

i=0;i<n;i++

nu

A[i][j]>0
da

nu

A[i][j]>0
da

suma+=A[i][j]

cant++

return suma

cant++

Listingul Programului
#include<stdio.h> #include<conio.h> #include<stdlib.h> #include<time.h> int **alocare_dinamica_a_tabloului(int n, int m) /*Functie ce returneaza un pointer la pointer (tabel bidimensional) da tocinee adresa in memorie unde se alfa A[0][0]*/ { int **A; /*se declara un pointer la pointer (tabel bidimensional)*/ int i; A=malloc(n*sizeof((*A)));/*Pointerului A se aloca memorie cu n pointeri la int(numarul de rinduri )*/ if(A==NULL) /*daca n=0,tabelul are 0 rinduri,rezulta ca lui A nu o sa i se aloce memorie sh nu se
returneaza nimic*/

{ return A; /*se returneaza A=NULL, adica nimic*/ } for(i=0;i<n;i++) /*Amu avem un tabel de n pointeri la int*/ { A[i]=malloc(m*sizeof(int)); /*pentru fiecare din n pointeri la int se aloca memorie pentru m intregi
(coloanele), la momentu dat avem un tabel de n linii sh m coloane cu intregi*/

if(A[i]==NULL) /*in caz cind avem m=0, tabelu are n linii sh 0 coloane, atunci tabelu ii imposibil de alocat sh se returneaza NULL*/ { return NULL; } } return A; /*Se returneaza adresa A[0][0], care in program daca facem tabel=alocare_dinamica_a_tabloului(3,4) o sa-i aloce lui A din functie memorie pentru 3 rinduri si 4 coloane, si lui tabel o sa i se atribuie adresa lui A*/ } void introduce_tabel(int **A, int n, int m) { int i,j; for(i=0;i<n;i++) { for(j=0;j<m;j++) { A[i][j]=-30+rand()%60; } } } void afiseaza_tabel(int **A, int n, int m) /* A este pointer la pointer, adresa unui pointer, adresa unei adrese, da la momentu de fata A ii adresa unui tabel de pointeri, care la rindu lor is adrese la tabele de intregi*/ { int i,j; printf("\n\n"); for(i=0;i<n;i++) {

for(j=0;j<m;j++) { printf(" \t%3d ",A[i][j]); } printf("\n\n"); } printf("\n"); } int suma_elem_poz_col_par(int **A,int n,int m) { int i,j,suma=0; for(j=0;j<m;j++) { if(j%2==0) { for(i=0;i<n;i++) { if(A[i][j]>0) { suma+=A[i][j]; } } } } return suma; } int cant_elem_poz_col_par(int **A,int n,int m) { int i,j,cant=0; for(j=0;j<m;j++) { if(j%2==0) { for(i=0;i<n;i++) { if(A[i][j]>0) { cant++; } } } } return cant; } void elibereaza_memoria(int **A, int n) { int i; for(i=0;i<n;i++) {

free(A[i]); /*se elibereaza fiecare pointer din tabelul de pointeri A, si acum avem un tabel de n pointeri NULL*/ } free(A); /* Aici se elibereaza chiar pointerul A, care continea adresa pentru tabelul de pointeri si acum avem un pointer NULL*/ } void main() { system("COLOR 5F"); int **X,**Y; int n,m,k,l; int Sx,Kx,Sy,Ky,Z; srand(time(NULL)); printf("\n Introdu numarul liniilor din masivul X="); scanf("%d",&n); printf("\n Introdu numarul coloanelor din masivul X="); scanf("%d",&m); printf("\n Introdu numarul liniilor din masivul Y="); scanf("%d",&k); printf("\n Introdu numarul coloanelor din masivul Y="); scanf("%d",&l); printf("\n"); X=alocare_dinamica_a_tabloului(n,m); if(X==NULL) { puts(" Memoria nu a fost alocata "); } else { puts(" Memoria a fost alocata cu succes pentru masivul X\n"); } Y=alocare_dinamica_a_tabloului(k,l); if(Y==NULL) { puts(" Memoria nu a fost alocata "); } else { puts(" Memoria a fost alocata cu succes pentru masivul Y\n"); } introduce_tabel(X,n,m); introduce_tabel(Y,k,l); printf(" Elementele tabloului X \n"); afiseaza_tabel(X,n,m); printf(" Elementyele tabloului Y \n"); afiseaza_tabel(Y,k,l); Sx=suma_elem_poz_col_par(X,n,m); Kx=cant_elem_poz_col_par(X,n,m); Sy=suma_elem_poz_col_par(Y,k,l); Ky=cant_elem_poz_col_par(Y,k,l);

printf("\n\n Suma elementelor pozitive de pe coloane pare a masivului X=%d",Sx); printf("\n\n Cantitatea elementelor pozitive de pe coloane pare a masivului X=%d",Kx); printf("\n\n Suma elementelor pozitive de pe coloane pare a masivului Y=%d",Sy); printf("\n\n Cantitatea elementelor pozitive de pe coloane pare a masivului Y=%d",Ky); Z=(Sx+Sy)-(Kx*Ky); printf("\n\n Valoarea expresiei Z=(%d+%d)-(%d*%d)=%d",Sx,Sy,Kx,Ky,Z); elibereaza_memoria(X,n); elibereaza_memoria(Y,n); getch(); }

Rezultatele testrii programului

Concluzie:
n urma efectuarii acestei lucrri de laborator mi-am perfecionat tehnica de programare cu subprograme n prelucrarea tablourilor bidimensionale, obinnd cunotine mai vaste n limbajul i mediul C. Am nsuit preocedeele de algoritmizare i progamare prin descompunerea problemei n module autonome care, reprezentate prin module de program pentru prelucrarea tablourilor bidimensionale n C dup principii comune cu apeluri multiple, analiznd soluiile stereotipe i cele eficiente. Datorit utilizarii me moriei dinamice, putem crea tabloului cu orice dimensiune i fara restricii. Utilizarea pointerilor, ne permite sa folosim doar adresele variabilelor, ceia ce marete eficiena programului.

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