Sunteți pe pagina 1din 15

Ministerul Educaiei al Republicii Moldova

Universitatea Tehnic a Moldovei

Catedra Informatica Aplicat

RAPORT
Lucrarea de laborator nr.6
la Programarea Calculatoarelor

A efectuat:
st. gr. TI-000
A verificat:
dr., conf.univ.

M. Kulev

Chiinu -2015

Lucrarea de laborator nr.6


Tema: Prelucrarea tablourilor unidimensionale i bidimensionale cu utilizarea alocrii dinamice
a memoriei
Scopul lucrrii: [1] Acumularea deprinderilor de algoritmizare i programare a problemelor cu
folosirea funciilor, acumularea deprinderilor de scriere i apelare a funciilor, alegerea
parametrilor. Alocarea dinamic a memoriei.
Condiia problemei (sarcina de lucru)[1]: De executat programul cu ajutorul funciilor
conform variantei. De afiat tablourile n forma iniial i rezultatele primite.
Varianta 5:
S se determine produsul elementelor negative ale vectorilor A(20) i B(50). De gsit suma
elementelor mai mari ca 0 i mai mici ca 4, care se afl pe diagonala secundar a unei matrici
ptrate.
Mersul lucrrii:
Noiuni principale din teorie i metode folosite:
Mrimea exact a unui tablou este necunoscut pn la momentul compilrii. Mrimea tabloului
alocat iniial poate fi sau insuficient pentru cerinele utilizatorului, sau poate fi mai mare dect
este necesar, ceea ce implic utilizarea non-econom a memoriei. Alocarea dinamic permite
programului s obin mai mult spaiu n timp de programul se execut, sau s elibereze spa iul
ce nu mai este necesar.
malloc() aloc numrul de octei solicitatm i returneaz un pointer de tip void la primul octet
din memoria alocat. Acest pointer poate fi convertit la orice tip de date necesar. Dac spa iul
este insuficient, malloc returneaz NULL.
calloc() aloc spaiu pentru un tablou de elemente, le ini ializeaz la 0, apoi returneaz un
pointer la memorie.
free() dealocarea memoriei anterior alocate.
realloc() modificarea dimensiunii spaiului alocat anterior.
Analiza datelor:
int main():
n variabil de intrare simpl de tip integer, este utilizat de multe ori n func ia main. Are
valoarea introdus de utilizator, fiind utilizat pentru a pstra numrul de elemente a tabloului A,
B, i numrul de elemente a matricii ptratice BTable.
productA variabil simpl de tip float, fiind egal cu produsul elementelor negative din tabloul
A, este transmis ca argument funciei producnt_negative i este afiat n funcia print_result.
productB - variabil simpl de tip float, fiind egal cu produsul elementelor negative din tabloul
B, este transmis ca argument funciei producnt_negative i este afiat n funcia print_result.
neg1 variabil simpl de tip integer, valoarea acesteia exprim numrul de elemente negative
din tablourile unidimensionale. Funciei product _negative i se transmite ca argument adresa
acesteia. Este relevant pentru afiarea rezultatului n funcia print_result.
A variabil simpl de tip pointer la float. Conine adresa nceputului tabloului unidimensional.
Este determinat prin funcia allocate_uniarray.
B - variabil simpl de tip pointer la float. Reprezint adresa nceputului tabloului
unidimensional. Este determinat prin funcia allocate_uniarray.
M variabil simpl de tip integer, de intrare, valoarea acesteia fiind introdus de utilizator,
folosit pentru numrul de elemente ale tabloului unidimensional Q.
sum variabil simpl de tip float, utilizat pentru a stoca suma numerelor mai mari dect 0 i
mai mici dect 4 din tabloul bidimensional.
BTable variabil de tip pointer la pointer la float. Pointeaz spre nceputul tabloului de
pointeri.
Q variabil simpl de tip pointer la float. Conine adresa nceputului tabloului unidimensional
Q. Este determinat prin funcia allocate_uniarray.
1

float* allocate_uniarray(int elements):


Aceast funcie are scopul de a aloca spaiu pentru tabloul unidimensional, returnnd un
pointer la float. n cazul n care spaiul nu este alocat, funcia afieaz un mesaj ctre utilizator i
efectueaz ieirea din program prin funcia exit.
Parametrul elements variabil simpl de tipinteger; semnific numrul de elemente a tabloului
unidimensional.
array variabil local a funciei. Variabil simpl de tip pointer la nceputul tabelului de tip
float. Este variabila returnat funciei main.
void fill_1D(float*uni,int elements, int status):
Acest funcie este utilizat pentru ca utilizatorul s introduc valori n tabloul unidimensional
pentru care s-a alocat memorie. Funcia nu are valoare returnabil. Conine alternative pentru
tabloul A i B.
Parametrii funciei:
uni pointer la nceputul tabloului unidimensional de tip float.
elements variabil simpl de tip integer. Indic numrul de elemente a tabloului
unidimensional.
status variabil simpl de tip integer. Este utilizat de funcie pentru a decide ce mesaj de
introducere a elementelor tabloului s afieze ( aferent tabloului A sau B)
Variabile locale:
int i variabil local simpl de tip integer, se utilizeaz pentru a itera prin tabloul
unidimensional.
void show_uniarray(float * array,int elements,int status):
Aceast funcie afieaz elementele tabloului unidimensional.
Parametrii funciei:
array variabil simpl de tip pointer la nceputul tabloului unidimensional de tip float.
elements variabil simpl de tip integer, conine numrul de elemente a tabloului
unidimensional.
status variabil local simpl de tip integer, cu ajutorul acesteia, funcia decide dac s afieze
mesajul aferent tabloului A i B sau cel aferent tabloului unidimensional ce conine elementele
de pe diagonala secundar a matricii.
Variabile locale:
int i - variabil local simpl de tip integer, se utilizeaz pentru a itera prin tabloul
unidimensional.
Funcia nu are valoare returnabil.
float product_negative(float *array, int elements, int*present):
Funcia este utilizat pentru a determina produsul elementelor negative din tabloul
unidimensional. La fel aceast funcie verific prezena elementelor negative n tablou, prin
calcularea numrului acestora. Ea returneaz o variabil de tip float.
Parametrii funciei:
array - variabil simpl de tip pointer la nceputul tabloului unidimensional de tip float.
elements variabil simpl de tip integer, conine numrul de elemente a tabloului
unidimensional.
present variabil simpl de tip pointer. Variabila la care pointeaz aceasta este incrementat la
depistarea fiecrui element negativ din tablou.
Variabile locale:
product - variabil simpl de tip float. Este iniializat la 1 i se modific de fiece dat cnd este
ntlnit un element negativ. n ea se pstreaz valoarea returnabil funciei.
int i - variabil local simpl de tip integer, se utilizeaz pentru a itera prin tabloul
unidimensional.
void print_result(float value, int status,int neg1):
2

Funcia este utilizat pentru a afia rezultatul obinut.n cazul n care nu se depisteaz elemente
negative n tablou, este afiat mesajul: Tabloul nu are elemente negative. Funcia nu returneaz
valori.
n caz contrar, afieaz denumirea tabloului i rezultatul.
Parametrii:
value - variabil simpl de tip float. Conine produsul elementelor negative a tabloului
unidimensional.
status variabil simpl de tip integer. Utilizat de funcie pentru a decide dac s afieze
mesajul aferent tabloului A sau B.
neg1 variabil simpl de tip integer. Reprezint numrul de elemente negative din tabloul
unidimensional. Este utilizat de funcie pentru a decide dac s afieze sau nu mesajul aferent
lipsei de numere negative.
float ** allocate_barray(int elements):
Aceast funcie are scopul de a aloca spaiu pentru tabloul bidimensional, returnnd un pointer la
pointer la float. n cazul n care spaiul nu este alocat, funcia afieaz un mesaj ctre utilizator i
efectueaz ieirea din program prin funcia exit.
Parametrii funciei:
elements variabil simpl de tip integer. Conine numrul de rnduri i coloane a matricii
ptratice.
Variabile locale:
i - variabil local simpl de tip integer, se utilizeaz pentru a itera prin tabloul de pointeri.
array variabil de tip pointer la pointer la float. Conine adresa nceputului tabloului de
pointeri. Reprezint valoarea returnabil a funciei.
void read_barray(float**array, int elements):
Acest funcie este utilizat pentru ca utilizatorul s introduc valori n tabloul bidimensional
pentru care s-a alocat memorie. Funcia nu are valoare returnabil.
Parametri:
array - variabil de tip pointer la pointer la float. Conine adresa nceputului tabloului de
pointeri.
elements variabil simpl de tip integer. Conine numrul de rnduri i coloane a matricii
ptratice.
i - variabil local simpl de tip integer, se utilizeaz pentru a itera prin rndurile tabloului
bidimensional.
j - variabil local simpl de tip integer, se utilizeaz pentru a itera prin coloanele tabloului
bidimensional.
void show_barray(float **array, int elements):
Aceast funcie afieaz elementele tabloului bidimensional. Funcia nu are valoare returnabil.
Parametrii funciei:
array variabil simpl de tip pointer la nceputul tabloului de pointeri.
elements variabil simpl de tip integer, conine numrul de rnduri i coloane a matricii
ptratice.
Variabile locale:
i variabil local simpl de tip integer, se utilizeaz pentru a itera prin rndurile tabloului
bidimensional.
j - variabil local simpl de tip integer, se utilizeaz pentru a itera prin coloanele tabloului
bidimensional
void make_uniarray(float ** barray, float * array,int elements, int * index):
Aceast funcie este utilizat pentru a da valori tabloului unidimensional. Acestea includ
elementele mai mari ca 0 i mai mici ca 4 n tabloul bidimensional. Nu are valori returnabile.
Parametrii funciei:
barray variabil simpl de tip pointer la nceputul tabloului de pointeri.
array - variabil simpl de tip pointer la nceputul tabloului unidimensional de tip float.
3

elements - variabil simpl de tip integer, conine numrul de rnduri i coloane a matricii
ptratice.
index variabil simpl de tip pointer. Prin dereferenierea acestuia, putem accesa variabila
prevzut pentru pstrarea numrului de elemente a tabloului unidimensional. Variabila la care
pointeaz acesta este incrementat la adugarea fiecrui element n tabloul unidimensional.
Variabile locale:
i variabil local simpl de tip integer, se utilizeaz pentru a itera prin rndurile tabloului
bidimensional.
j - variabil local simpl de tip integer, se utilizeaz pentru a itera prin coloanele tabloului
bidimensional
float sum_elements(float * array,int elements):
Aceast funcie determin suma elementelor din tabloul unidimensional. Returneaz valoarea
acesteia, de tip float.
Parametrii funciei :
array - variabil simpl de tip pointer la nceputul tabloului unidimensional de tip float.
elements variabil simpl de tip integer, conine numrul de elemente a tabloului
unidimensional.
Variabile locale:
i - variabil local simpl de tip integer, se utilizeaz pentru a itera prin tabloul unidimensional.
sum- variabil simpl de tip float. Este variabila returnabil a funciei. Conine suma
elementelor tabloului unidimensional.
Schema logic:
Funcia main():

Funcia allocate_uniarray():

Funcia fill_1D():

Funcia

show_uniarray():

Funcia product_negative():

Funcia print_result():

Funcia allocate_barray():

Funcia read_barray:

Funcia show_barray:

Funcia make_uniarray:

Funcia sum_elements():

Codul programului n limbajul C:


#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
float sum_elements(float * array,int elements)
{
int i;
float sum = 0;
for(i = 0;i < elements;i ++)
{if((array[i] > 0)&&(array[i] < 4))
{sum += array[i];}
}
return sum;}
void make_uniarray(float ** barray,float * array,int elements,int * index)
{
int i,j;
for(i = 0; i < elements; i++)
{for(j = 0;j < elements; j++)
{if(j == elements - 1 - i)
{array[*index] = barray[i][j];
*index += 1;}}}
return;}
void show_barray(float **array, int elements)
{
int i,j;
puts("Elementele tabloului sunt: ");
for(i = 0; i < elements;i ++)
{for(j = 0;j < elements;j ++)
{printf("\t%.3f",array[i][j]);}
puts("");
}
return;}
void read_barray(float**array, int elements)
{
int i,j;
for(i = 0;i < elements; i++)
{for(j = 0;j < elements; j++)
{
printf("A[%d][%d]= ",i+1,j+1);
scanf("%f",&array[i][j]);}}
return;}
float ** allocate_barray(int elements)
{
int i;
float **array = (float**) malloc (sizeof(float)* elements);
for (i=0;i<elements;i++)
{array[i] = (float*) malloc(sizeof(float)*elements);}
9

if(array == NULL)
{puts("Memoria nu a fost alocata");exit(1);}
else
{return array;}}
void print_result(float value, int status,int neg1)
{
if (neg1 == 0)
{if(status == 0)
{printf("Tabloul A nu are elemente negative\n");}
else
{printf("Tabloul B nu are elemente negative\n");}}
else
{if (status == 0)
{printf("Pentru tabloul A, produsul elementelor negative este: %.3f\n", value);}
else
{printf("Pentru tabloul B, produsul elementelor negative este: %.3f", value); }
}
return;}
float product_negative(float *array, int elements, int*present)
{
float product = 1;
*present = 0;
int i;
for(i = 0;i<elements;i++)
{if (array[i]<0)
{product *= array[i];
*present+=1;}}
return product;}
void show_uniarray(float * array,int elements,int status)
{
int i;
if (status == 0)
{puts("Elementele tabloului unidimensional sunt: ");}
else
{puts("Diagonala secundara a tabloului este");}
for(i = 0;i < elements;i ++)
{printf("\t%.3f",array[i]);}
puts("");}
void fill_1D(float*uni,int elements, int status)
{
int i;
float value;
for(i= 0 ; i < elements; i++)
{
if (status == 0)
{printf("A[%d]= ", i+1);}
else
{printf("B[%d]= ", i+1);}
10

scanf("%f", &uni[i]);}
return;}
float* allocate_uniarray(int elements)
{
float *array = (float*) malloc(sizeof(float)*elements);
if(array == NULL)
{puts("Memoria nu a fost alocata"); exit(1);}
else {return array;}}
int main()
{
int n;
float productA, productB;
int neg1=0;
puts("Introduceti numarul de elemente a tabloului A");
scanf("%d",&n);
float* A = allocate_uniarray(n);
puts("Introduceti elementele tabloului A");
fill_1D(A,n,0);
show_uniarray(A,n,0);
productA = product_negative(A,n,&neg1);
print_result(productA,0,neg1);
free(A);
puts("Introduceti numarul de elemente a tabloului B");
scanf("%d",&n);
float* B = allocate_uniarray(n);
puts("Introduceti elementele tabloului B");
fill_1D(B,n,1);
show_uniarray(B,n,0);
productB = product_negative(B,n,&neg1);
print_result(productB,1,neg1);
free(B);
int M=0;
float sum;
puts("\nDati numarul de linii a matricii patrate");
scanf("%d", &n);
float ** BTable = allocate_barray(n);
read_barray(BTable,n);
show_barray(BTable,n);
float *Q = allocate_uniarray(n);
make_uniarray(BTable,Q,n,&M);
show_uniarray(Q,M,1);
sum = sum_elements(Q,M);
if (sum == 0)
{puts("In diagonala principala nu sunt elemente mai mari ca 0 si mai mici ca 4");}
else
{printf("Suma elementelor mai mari ca 0 si mai mici ca 4 =%3.f",sum);}
free(Q);
getch();
return 0;}
11

Codul programului n limbajul Python:


Rezultatele obinute:
Prima parte a programului a fost testat de 3 ori: Tablourile A i B primind valori de tip
diferit.
1. A = (1;0;3;6;7;8;9), astfel toate elementele tabloului A sunt pozitive
B = (-1;-7;-9;-13;-16), astfel toate elementele sunt negative. Mesajul programului
variaz n funcie de situaie.

2. Pentru tabloul A s-a dat un numr negativ de elemente, pentru a verfica func ia de
alocare. Mesajul de nealocare a fost afiat. Programul s-a terminat imediat dup acest
mesaj.

3. A = (-3;-5;8;16;3), A avnd att elemente pozitive ct i negative


B = (-1;-1;-1;-13), B a primit un numr par de elemente cu valoarea -1, astfel nct
produsul s nu schimbe valoarea iniial a produsului.

Partea a doua a programului a fost testat de 4 ori:


1. Cu toate elementele mai mici dect 4.
0 1 2
A= 3 1 2
0 2 3

( )

12

2. Tabloului A i s-a dat un numr impar de elemente. Mesajul de nealocare a fost


afiat.Programul s-a terminat imediat dup afiarea mesajului.

3.A =

( )

, toate elementele fiind mai mari dect 4. Programul a afi at mesajul

4.A =

( )

, unde unele elemente sunt mai mari, altele mai mici dect 4.

9 8 7
5 5 9
7 8 3
corespunztor.

6 7 2
3 9 8
5 9 0

Analiza rezultatelor i concluzii:


1. n urma verificriii se poate constata c rezultatele ob inute sunt corecte i programul
funcioneaz conform ateptrilor.
13

2. Funciile create pot fi reutilizate prin apelarea repetat a acestora, ceea ce economise te
destul de mult timp ce ar fi utilizat la scrierea funciilor separate pentru fiecare sarcin.
3. Variabilele de tip pointer sunt destul de utile pentru accesarea valorilor variabilelor
declarate n alte funcii. Pentru acest scop pot fi utilizate variabilele globale (declarate n
afara funciilor), ns acest lucru nu este recomandabil.
4. Prin utilizarea funciilor malloc, realloc, calloc din biblioteca stdlib, memoria poate fi
alocat n mod dinamic, conform cerinelor utilizatorului. Astfel se evit alocarea unei
poriuni prea mari de memorie, atunci cnd utilizatorul introduce o matrice mic, i se evit
depirea memoriei atunci cnd utilizatorul are nevoie s prelucreze un tablou, ce ocup mai
mult memorie dect a fost prevzut de programator.
Bibliografie:
1. Carcea L.,Vlas S., Bobicev V. Informatica:Sarcini pentru lucrri de laborator. Chi inu:
UTM, 2005. - 19p.
2.Conspectul prelegerilor cursului Programarea Calculatoarelor pentru studen i gr. TI-154,
SI-151. Lector: dr., conf. univ. M.Kulev. Chiinu, UTM, 2015.
3.Multi-dimensional arrays in C,
http://www.tutorialspoint.com/

14

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

  • Lab 1
    Lab 1
    Document10 pagini
    Lab 1
    Radu Madiudin
    Încă nu există evaluări
  • BDC Lab1
    BDC Lab1
    Document11 pagini
    BDC Lab1
    Radu Madiudin
    Încă nu există evaluări
  • Lab 1
    Lab 1
    Document7 pagini
    Lab 1
    Radu Madiudin
    Încă nu există evaluări
  • NR Fibonaci
    NR Fibonaci
    Document1 pagină
    NR Fibonaci
    Radu Madiudin
    Încă nu există evaluări