Sunteți pe pagina 1din 21

Universitatea Tehnică a Moldovei

Facultatea Calculatoare Informatică și Microelectronică


Departamentul Ingineria Software și Automatică

RAPORT
la lucrarea de laborator nr. 5-6

la Programarea Calculatoarelor

Tema: „Tehnicile prelucrării tablourilor, utilizînd subprogram”

Varianta 12

A efectuat: Studentul grupei TI-201 Lefter Vadim

A verificat: Dumitru Prijilevschi

Chişinău 2020
Scopul lucrării

Insuşirea tehnicilor de algoritmizare şi programare cu subprograme în prelucrarea


tablourilor uni- și bidimensionale în C.

Obiectivele temei

1. Aprofundarea cunoştinţelor în limbajul şi mediul TurboC şi perfecţionarea


tehnicii de programare cu subprograme în prelucrarea tablourilor uni- și
bidimensionale.
2. Dezvoltarea procedeelor de algoritmizare şi progamare prin descompunerea
problemei în module autonome care, apoi, vor fi reprezentate prin module de
program pentru prelucrarea tablourilor uni- și bidimensionale în C după principii
comune cu apeluri multiple, analizând soluţiile stereotipe şi cele eficiente.
3. Însuşirea tehnicilor eficiente de parcurgere, căutare, schimbare şi ordonare a
structurilor şi calculul conform cunoştinţelor obţinute din matematică şi în baza
lucrărilor precedente într-un program complex, alcătuit după principiile top-down.
4. Llab. 5 se analizează testele din Anexa 2,3. și se preia variantele problemelor
din Llab. 3 și se transformă în programe cu funcții proprii după stil vechi și nou.
5. Llab. 6 se preia variantele problemelor din Llab. 4 și se transformă în
programe cu funcții proprii definite ca “proceduri” în C cu transmiterea
argumentelor funcțiilor în câteva moduri. Totodată se aplică și la soluționarea
problemelor din Anexa 4.

1. Extras Teoretic
2. O functie este o parte denumita a programului care poate fi apelata din alte
parti ale programului atit de des, cit este nevoie. Conform consideraţiilor
teoretice funcţiile sunt un aspect important al programării, ce permit
încapsularea unor rutine in cadrul unor "cutii negre", astfel ca programatorul
care se foloseşte de anumite funcţii, elaborate de programator, trebuie sa
cunoască acţiunea lor şi modul in care sunt implementate, iar pentru cele din
bibliotecile standarde al limbajului C doar acţiunea lor, nu si modul in care
sunt implementate. Totodată, funcţiile permit structurarea programului pe
blocuri, separând astfel zonele de cod ce îndeplinesc aceleaşi acţiuni si
conferând o mai mare lizibilitate a codului.
Funcţiile mai pot fi clasificate în:
3. - funcţii care întorc un rezultat;
4. - funcţii care nu întorc nici un rezultat;
5. - funcţii care întorc mai mute rezultate.
6. Definiţia funcţiilor
7. Sintaxa definiţiei unei funcţii este următoarea:
8. Definiţia-funcţiei:
9. <clasă de memorie> tip-funcţie<opt> nume-funcţie(lista-parametri)
10.{ corp-funcţie }
11.unde lista-parametri:
12.declaraţie-parametru
13.declaraţie-parametru, lista-parametri
14.Corpul-funcţiei:
15.<declaraţiile variabilelor locale>; < <instrucţiuni> <instrucţiune-
compusă>>; <return rezultatul final>;

2.1. Noţiuni generale despre pointeri. Un pointer este o variabilă care conţine
adresa unei alte variabile. Pointerii sunt foarte mult utilizaţi în programe scrise în
C, pe de o parte pentru că uneori sunt unicul mijloc de a exprima un calcul, iar pe
de altă parte pentru că oferă posibilitatea scrierii unui program mai compact şi mai
eficient decît ar putea fi obţinut prin alte căi. Deoarece un pointer conţine adresa
unui obiect, cu ajutorul lui putem avea acces, în mod indirect, la acea variabilă
(obiect). Să presupunem că x este o variabilă de tip întreg şi px un pointer la
această variabilă. Atunci aplicând operatorul unar & lui x, instrucţiunea: px = &x;
atribuie variabilei px adresa variabilei x; în acest fel spunem că px indică
(pointează) spre x. Invers, dacă px conţine adresa variabilei x, atunci instrucţiunea:
y = *px;

Rezolvare

Anexa 2. Teste de verificre ale cunostintelor:


1. Analizaţi şi argumentaţi ce valori va afişa secvenţa din următorul program C:
int msort(x, y) int x, y;

int tmp;
if(x > y)
{
tmp=x;
x=y;
y=tmp;
}
return (x+y)/2;
}
int x=20, y=8;
main()
{
msort(x,y);
printf("%d %d\n", x, y);
}

3. Analizaţi şi argumentaţi ce valori va afişa secvenţa din


următorul program C:
int a=2, b=13, c;
int f(x, y, z) int x, *y, z;
{
*y += x;
x *= *y;
z--;
return (x + z - a);
}
main()
{
c=f(a, &b, a+4);
printf("%d %d %d\n",a,b,c);
}

4. Analizaţi şi argumentaţi eroarea din program:


#include <stdio.h>
// Desenarea unei bare orizontale compuse din n caractere
void bar (int n)
{
int i;
for (i=0; i<n; i++) putchar('#');
putchar('\n');
}
// Desenare histograma pe baza unui vector de intregi
void main ()
{
int a[24]= {5,10,15,10,5},n=5,k;
// sterge ecran
for (k=0; k<n; k++)
bar (a[k]); // desenare bara k de lungime a[k]
}

6.
#include <stdio.h>
main()
{ int sum = 0, card;
char answer[36];
srand( getpid()); /* рандом */
do
{ printf( "aveiti %d puncte. inca? ", sum);
if( *gets(answer) == 'n' ) break;
/* Altfel va fi prea puțin */
printf( " %d puncte\n",card = 6 + rand() % (11 - 6 + 1));
}
while((sum += card) < 21); /* SIC ! */
printf ( sum == 21 ? "puncte\n" :
sum > 21 ? "depășit\n":
"%d puncte \n", sum);
}
Acest program ia random numere pozitive de la 6 pana la 11,declarandunele ca niste
puncte.Compiland programul avem 0 puncte,daca mai dorim puncte apasam
enter,maximum de puncte care putem sal avem in program e setat <21.Cand intrecem
maximul de puncte,programul ne anunta ca am depasit.

7.
/* файл A.c */
int x=666; /*глоб.*/
main() {
f(3);
printf(" ::x = %d\n", x); g(2); g(5);
printf(" ::x = %d\n", x); }g(n) {
static int x=17;
/*видима только в g*/
printf("g::x = %2d g::n = %d\n", x++, n);
if(n) g(n-1); else x = 0; } /* файл B.c */ extern x; /*глобал*/ f(n){ /*локал функции*/ x+
+; /*глобал*/ {
int x; /*локал блока*/
x = n+1; /*локал*/
n = 2*x; /*локал*/ } x = n-1; /*глобал*/}
Programul dat printeaza la inceputul programului si sfarsitul lui numarul “7”.Acest
numar este setat prin f(3) unde 3 este n,iar in program numarul n adica 3 se aduna cu 1
apoi se inmulteste cu 2 si se scade cu 1.adica ((3+1)*2)-1=7.Iar intre numerele 7 sunt doua
coloane.In coloanal din stanga se printeaza numere de la 0 pana la 5 asa este dat in
program,iar coloanal din partea dreapta se printeaza numere de la 5 la 0 ,descrescator.

8.
#include <stdio.h>
// Desenarea unei bare orizontale compuse din n caractere
void bar (int n) { int i;
for (i=0;i<n;i++) putchar('#'); putchar('\n'); }
// Desenare histograma pe baza unui vector de intregi
void main () {
int a[24]={5,10,15,10,5},n=5,k;
clear(); // sterge ecran
for (k=0;k<n;k++)
bar (a[k]); // desenare bara k de lungime a[k]
}

Ruland programul,ne da eroare in legatura cu “clear”.


Compiland programul ne afiseaza un desen histogram din elemente “#”.Este dat n=5 care raspunde
de cate randuri sa fie desenul si deja vectorul care raspunde de cate # sa fie fiecare rand.In cazul
nostrum primul rand va avea 5# al doilea 10# …
9.
void minmax ( float x[],int n,float* pmin, float* pmax) {
float xmin,xmax; int i;
xmin=xmax=x[0];
for (i=1;i<n;i++) { if (xmin > x[i]) xmin=x[i]; if (xmax=x[i]) (xmax=x[i]); }
*pmin=xmin; *pmax=xmax;
}
// utilizare functie
void main () { float a[]={3,7,1,2,8,4}; float a1,a2;
minmax (a,6,&a1,&a2); printf("%f %f \n",a1,a2);
}
In primul rand compiland programul ne de eroare,cauza a fost in lispa parantezei (xmax=x[i])
Analizand programul am observant ca nu are nici o functie.Am observant ca randul
{ if (xmin > x[i]) xmin=x[i]; if (xmax =x[i]) (xmax=x[i]); }
Este gresit eu lam corectat astfel
{ if (xmin < x[i]) xmin=x[i]; if (xmax > x[i]) (xmax=x[i]); }
1.Era semnul > la min,trebuie sa sa fie <
2.era semnul = la max,trebuie sa fie >
Dupa corectare,programul ne afiseaza punctul maximum si puntul minimum din vector.

10.

Analizand programul am gasit eraore.Am inseamnato cu rosu.Programul dat ne afiseaza o matrice


de 2 linii si 2 coloane ,asa este dat in program “n=2”,apasand enter valoarea lui n se mareste cu 1
,limita este pana la 10.Matricea data este cu conditia u[i][j]=0 si u[i][i]=1,in asa caz toate elementele
diagonalei principale se egaleaza cu 1 iar restul elementelor cu 0.
Ex.13

Analizand programul am observant ca se creaza un vector cu elemente random de la 0


pana la 8 cu ajutorul functiei random.Apoi se printeaza vectorul.Dupa asta elementele din
vector se ordoneaza crescator asta se observa vu ajutorul lui semnului din interiorul lui
if(a[i]>a[j]),apoi se printeaza vectorul ordonat.Si ultima etapa este iar printarea vectorului
care sa facut random,apoi printarea vectorului ordonat.

.....................................................................................................................................
Din lab3
12. Să se elaboreze algoritmul şi programul pentru următoarele: Să se
compună un algoritm şi să se scrie un program C pentru aflarea tuturor
numerelor naturale ce nu depăşesc numărul N>9999, considerat
cunoscut, şi sunt egale cu suma cuburilor cifrelor lui. Toate rezultatele să
se scrie într-un tablou care să fie afişat într-un mod clar.
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#include<time.h>

int check(int x)
{
int value = x;
int cnt = 0;
while(value)
{
cnt += (int)pow(value % 10,3);
value /= 10;
}

if ( cnt == x ) {return 1;}


return 0;
}

int a[10005];
int n = 0;

int main()
{
for(int i = 0; i <= 9999; i++)
if( check(i))
a[n++] = i;

for(int i = 0; i < n; i++)


printf("%d ",a[i]);

return 0;
}

Run
0 1 153 370 371 407

Process returned 0 (0x0) execution time : 9.789 s


Press any key to continue.

32. Să se elaboreze algoritmul şi programul pentru: Este dat tabloul


unidimensional A={ ai }, i=1,…,n, cu valori aleatorii, în baza căruia să
se obţină un nou tablou din şirul de elemente a1, a2,... an conform
următoarelor scheme: 1) a1a2, a3a4,...,an-1an, a1+a2+...an-1+an.

#include<stdio.h>
#include<math.h>
#include<time.h>

void create_array(int a[100], int i, int n);


void array_b(int a[100], int b[100], int i, int j, int o, int n, int q);
void array_w(int a[100], int w[100], int i, int j, int o, int n);
void array_bw(int a[100], int b[100], int i, int j, int n, int q);
void print_array(int b[100], int i, int n);

int main()
{
srand(time(NULL));
int n;
printf("Marimea tabloului : ");
scanf("%d", &n);
int a[n];
int i;
create_array(a, i, n);

printf("\n\n");
int j = 1;
int b[n];
int q = 0;
int o;
array_b(a, b, i, j, o, n, q);

int w[n];
array_w(a, w, i, j, o, n);
array_bw(b, w, i, j, n, q);
printf("Tabloul care se cere in conditie : \n\n");
print_array(b, i, n);

return 0;

}
void create_array(int a[100], int i, int n)
{
for(i = 0; i < n; i++)
{
a[i] = rand() % 10;
printf("%d ", a[i]);
}
}

void array_b(int a[100], int b[100], int i, int j, int o, int n, int q)
{
for(i = 0, j = 1, o = 0; o < n, i < n; i++, j++, o++)
{
b[o] = a[i] * a[j];
i = i + 1;
j = j + 1;
q++;
}
}
void array_w(int a[100], int w[100], int i, int j, int o, int n)
{
for(i = 0, j = 1,o = 0; o < n, i < n; i++, j++, o++)
{
w[o] = a[i] + a[j];
i = i + 1;
j = j + 1;

}
}

void array_bw(int b[100], int w[100], int i, int j, int n, int q)


{
for(j = 0, i = q; j < q, i < n; j++, i++)
{
b[i] = w[j];
}
}

void print_array(int b[100], int i, int n)


{
for(i = 0; i < n; i++)
{
printf("%d ", b[i]);
}
}

.....................................................................................................................................
Din lab4

12. Sa se calculeze suma elementelor din triunghiul inferior


diagonalelor
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
void Random(int (*c)[100], int i, int j, int n)
{ srand(time(NULL));
for (i=0; i<n; i++)
{
for (j=0; j<n; j++)
{
c[i][j] = rand() % 9-0;
}
}
}
void Afisare(int (*c)[100], int i, int j, int n)
{
for(int i = 0; i < n; i++)
{
for(int j = 0; j < n; j++)
{
printf("%d\t", c[i][j]);
}
printf("\n");
}
}
void Rezolv(int i, int n,int j,int (*c)[100])
{
int s=0;
for (i=0; i<n; i++)
{
for (j=0; j<n; j++)
{
if ((i+j)>=n && i>j)
s=s+c[i][j];
}
}
printf("\n Suma elementelor matricei din triunghiul inferior=%d",s);
}
int main()
{int i,j,a,b,s,n;
printf("Inroduceti numarul liniilor si coloanelor=");
scanf("%d",&n);
int c[100][100];
Random(c,i,j,n);
Afisare(c,i,j,n);
Rezolv(i,n,j,c);

return(0);
}
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
void IntroMatrixA(int j,float(*a)[8])
{
printf("Introdu prima linie:");
for (j=0; j<8; j++)
{
scanf("%f",&a[0][j]);
}
}
void StructureA(int j,int i,float(*a)[8])
{
for (j=0; j<8; j++)
{
for (i=1; i<8; i++)
{
a[i][j]=pow(a[0][j],i+1);
}
}
}
void Afisarea(int i,int j,float(*a)[8])
{
for (i=0; i<8; i++)
{
printf("\n");

for (j=0; j<8; j++)


{
printf("%.2f ",a[i][j]);

}
}
}void Afisarea1(int i1,int j1,float(*b)[8])
{for (i1=0; i1<8; i1++)
{
printf("\n");

for (j1=0; j1<8; j1++)


{
printf("%.2f ",b[i1][j1]);

}
}}
void StructureB(int j1, int i1, float (*b)[8])
{
for (j1=0; j1<8; j1++)
{
b[i1][j1]=1;
}
}
void StructureB1(int j1,float (*b)[8],float (*a)[8])
{
for (j1=0; j1<8; j1++)
{
b[1][j1]=a[0][j1];
}
}
void StructureB2(int j1, int i1, float (*b)[8],float (*a)[8])
{
for (j1=0; j1<8; j1++)
{
for (i1=2; i1<8; i1++)
{
b[i1][j1]=pow(b[1][j1],i1);
}
}
printf("\n");
}
void StructureC(int i, int j,float (*c)[8],int k, float (*a)[8],float (*b)[8])
{
for(i=0; i<=8; i++)
{
for(j=0; j<=8; j++)
{
c[i][j]=0;
for(k=0; k<=8; k++)
c[i][j]=c[i][j]+3*a[i][k]*b[k][j];
}
}
}
void EMax(int i,int j,float max, float (*c)[8])
{
for (i=0; i<8; i++)
{
for (j=0; j<8; j++)
{
if ((i+j)>=8 && i>j && (max<c[i][j]))
max=c[i][j];
}
}
printf("\n \nelementul max din triunghiul hasurat=%f",max);
}
int main()
{
int i,j,s,n,m,i1,j1,k;
float a[8][8];
float b[8][8];
float c[8][8];
IntroMatrixA(j,a);
StructureA(j,i,a);
Afisarea(i,j,a);
StructureB(j,i,b);
StructureB1(j,b,a);
StructureB2(j,i,b,a);
Afisarea1(i,j,b);
StructureC(i,j,c,k,a,b);
printf("\n");
Afisarea(i,j,c);float max1=c[0][0];
EMax(i,j,max1,c);

return (0);
}
Ex.6 Anexa 4

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
void Random(int (*c)[100], int i, int j, int n)
{
srand(time(NULL));
for (i=0; i<n; i++)
{
for (j=0; j<n; j++)
{
c[i][j] = rand() % 9-0;
}
}
}
void Afisare(int (*c)[100], int i, int j, int n)
{
for(int i = 0; i < n; i++)
{
for(int j = 0; j < n; j++)
{
printf("%d\t", c[i][j]);
}
printf("\n");
}
}
void Min(int i,int n, int min,int (*c)[100])
{
for (i=0; i<n; i++)
{
if (min>c[i][0])
{
min=c[i][0];
}
}
printf("\n Min=%d",min);
}
void Suma(int i,int n, int (*c)[100])
{
int s=0;
for (i=0; i<n; i++)
{
s+=c[i][3];

}
printf("\n Suma coloanei 4=%d",s);
}
void MaxSecGalben(int i,int n,int j, int max,int (*c)[100])
{
for (i=0; i<n; i++)
{
for (j=1; j<n; j=j+3)
if (max<c[i][j])
{
max=c[i][j];
}
}printf("Max din Galben= %d",max);
}
void MaxSecVerde(int i,int n,int j, int max,int (*c)[100])
{
for (i=0; i<n; i+=2)
{
for (j=0; j<n; j=j+1)
if (max<c[i][j])
{
max=c[i][j];
}
}printf("Max din Verde= %d",max);
}
int main()
{
int i,j,n,max,min,s;
int c[100][100];
printf("Inroduceti numarul liniilor si coloanelor=");
scanf("%d",&n);
Random(c,i,j,n);
Afisare(c,i,j,n);
Min(i,n,min,c);
Suma(i,n,c);
MaxSecGalben(i,n,j,max,c);
MaxSecVerde(i,n,j,max,c);

return (0);
}

Concluzie

În urma efectuarii lucrarii de laborator am însușit multe informații noi, și


am studiat materialul, care conține toate necesare despre functii. În
exemplele propuse variantei mele am facut cunoștința cu proprietățile
functiilor, lucrul cu ajutorul lor, la fel si apelarea lor in program.

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