RAPORT
la lucrarea de laborator nr. 5-6
la Programarea Calculatoarelor
Varianta 5 -25
Chişinău 2020
Scopul lucrării
însuşirea tehnicilor de algoritmizare şi programare cu subprograme în
prelucrareatablourilor uni- și bidimensionale în C
Obiectivele temei
1.Aprofundarea cunoştinţelor în limbajul şi mediul TurboC şi
perfecţionarea tehnicii de programare cusubprograme în prelucrarea
tablourilor uni- și bidimensionale.
2. Dezvoltarea procedeelor de algoritmizare şi progamare prin
descompunerea problemei în moduleautonome care, apoi, vor fi
reprezentate prin module de program pentru prelucrarea tablourilor
uni- șibidimensionale în C după principii comune cu apeluri multiple,
analizând soluţiile stereotipe şi celeeficiente.
3. Însuşirea tehnicilor eficiente de parcurgere, căutare, schimbare şi
ordonare a structurilor şi calcululconform 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 definiteca “proceduri” în C cu transmiterea
argumentelor funcțiilor în câteva moduri. Totodată se aplică și
lasoluționarea problemelor din Anexa 4.
1. Extras Teoretic
Programarea structurata este o problema ce rezolva strategia si
metodologia programării si are următoareleprincipii:
1. Structurile de control trebuie sa fie cat se poate de simple;
2. Construcţia unui program trebuie sa fie descrisa top-down.
Descrierea top-down se refera la descompunerea problemei noastre
in subprobleme. De obicei, acestesubprobleme sunt usor de descris.
Presupunem ca avem de citit câţiva intregi si trebuie sa-i afişăm in
ordine pecoloane (in capătul de sus al coloanelor trebuie sa scriem
numele câmpului), sa le afişăm suma lor parţiala,minimul si maximul
lor. Pentru scrierea unui program C ce face acest lucru, vom utiliza
proiectarea (descrierea)"top-down".
Astfel, descompunem problema in următoarele subprobleme:
1. Un antet pentru problema data;
2. Scrierea câmpurilor;
3. Citirea si scrierea lor pe coloane. ş.a.m.d.
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 anumitefuncţii,
elaborate de programator, trebuie sa cunoască acţiunea lor şi modul
in care sunt implementate, iar pentrucele 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 îndeplinescaceleaşi
acţiuni si conferând o mai mare lizibilitate a codului.
2. Rezolvare
Lab 5
#include <stdio.h>
#include <stdlib.h>
#include<time.h>
#include<math.h>
void return_var();
int check();
int main()
{
srand(time(NULL));
int p, i, n, m;
int max=0, F=0;
printf("Dati numarul de elemente a sirului:\n");
scanf("%d", &n);
printf("Dati numarul maxim generat: \n");
scanf("%d", &m);
printf("\n\n\n");
int x[n];
int check(int n, int a, int b, int c, int d, int e, int F) // verifica conditiile, daca
variabila ce numara elementele este egala cu numarul
{ // de elemente ale sirului,
lui F i se va atribui o valoare din cele enumerate;
if(a==n)
{
F = 1;
}
if(b==n)
{
F = 2;
}
if(c==n)
{
F = 3;
}
if(d==n)
{
F = 4;
}
if(e==n)
{
F = 5;
}
return F;
}
25(a) Să se elaboreze algoritmul şi programul ca să se calculeze numărul
cifrelor fiecărui număr dintr-untablou de numere pozitive care pot avea
valori cu cel puţin de 4 cifre (mii) şi de salvat în alt tablou.
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void r_gen();
int counter();
int main()
{
srand(time(NULL));
int i, n,m,p,z;
printf("Dati numarul de elemente a sirului: \n"); scanf("%d", &n);
if(n<1)
{
printf("Eroare!");
return 0;
}
printf("\n\n\n");
m = (rand()%10000);
int x[n], y[n];
for (i=0;i<n;i++)
{
r_gen(&p, m);
x[i] = p;
printf("%d\n", x[i]);
}
printf("\n\n\n");
for (i=0;i<n;i++)
{
y[i] = counter(x[i]);;
printf("%d\n", y[i]);
}
}
int counter(int v) //atat timp cat v este mai mare ca 0, va avea loc impartirea
si in acelasi timp incrimentarea variabilei ce numara procedurile;
{
int count = 0;
while (v>0)
{
v/=10;
count++;
}
return count;
}
Lab 6
Să se citească de la tastatură o matrice patratica Anxn. Sa se calculeze suma
si produsul elementelor de pe diagonala principala si de pe diagonala
secundara
#include <stdio.h>
#include <stdlib.h>
#include<time.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <malloc.h>
int** alloc_memory(int,int);
void matrix_gen(int**, int, int, int);
void matrix_print(int**, int, int);
void cadran_1(int**, int, int);
void cadran_2(int**, int, int);
void cadran_3(int**, int, int);
void cadran_4(int**, int, int);
void destroy_matrix(int**,int,int);
int main()
{
srand(time(NULL));
int i,j,r,c,m;
int **matrix;
printf("Dati numarul randurilor matricii: \n");
scanf("%d", &r);
printf("\n\n");
c = r;
printf("Dati numarul maxim generat: \n");
scanf("%d", &m);
printf("\n\n");
matrix = alloc_memory(r,c);
matrix_gen(matrix,r,c,m);
matrix_print(matrix,r,c);
cadran_1(matrix,r,c);
cadran_2(matrix,r,c);
cadran_3(matrix,r,c);
cadran_4(matrix,r,c);
destroy_matrix(matrix,r,c);
}
Răspuns: 8 20
Adică x = 8 iar y =20
Răspuns : 2 2 6
Valoarea unui element de tip char se afiseaza la ecran prin functia speciala
%c și nu %s.
1024 1 0.0009765
10 puncte
aveți 10 puncte. Încă ? 5
7 puncte
aveți 17 puncte. Încă ? 5
11 puncte
depă șit
g::x = 18 g::n = 2
g::x = 18 g::n= 5
#
#
#
#
1 0
0 1
1 0 0
0 1 0
0 0 1
Anexa 3
#include
<stdio.h>
#include
<stdlib.h>
int sign(int);
void cadran_check(int);
int main()
{
int x,y,check;
printf("Dati coordonatele: \n");
printf("X = "); scanf("%d", &x);
printf("\nY = "); scanf("%d", &y);
check = 3*sign(x) + sign(y);
printf("\n\n");
cadran_check(check);
}
int sign(int n)
{
if(n<0)
{
n = -1;
}
if(n>0)
{
n = 1;
}
if(n==0)
{
n = 0;
}
return n;
}
#include <stdio.h>
#include <stdlib.h>
#include<time.h>
#include<malloc.h>
int** alloc_memory(int,int);
int** alloc_memory_t(int,int);
void matrix_gen(int**,int,int,int);
void matrix_print(int**,int,int);
void matrix_transform(int**,int**,int,int);
void matrix_prod(int**,int**,int**,int,int);
void matrix_destroy(int**,int,int);
int main()
{
srand(time(NULL));
int** matrix;
int** A;
int**P;
int r,c,m;
printf("Dati numarul randurilor matricii\n");
scanf("%d", &r);
c=r;
printf("Dati numarul maxim generat\n");
scanf("%d", &m);
printf("\n\n");
matrix = alloc_memory(r,c);
A = alloc_memory(r,c);
P = alloc_memory(r,c); //alocarea memoriei matricilor
matrix_gen(matrix,r,c,m);
matrix_print(matrix,r,c);
matrix_transform(matrix,A,r,c);
matrix_prod(matrix,A,P,r,c);
matrix_destroy(matrix,r,c);
matrix_destroy(A,r,c);
matrix_destroy(P,r,c);
}
void matrix_gen(int**matrix,int r,int c, int m)
{
for(int i=0; i<r; i++)
{
for(int j=0; j<c; j++)
{
matrix[i][j]=((rand()%m*2)-m);
}
}
}
Concluzie:
În această lucrare de laborator, am studiat noi tehnici de programare,
prin folosirea funcțiilor proprii, astfel operând cu tablouri
unidimensionale și bidimensionale, creând programe care sunt mai
ușor de citit pentru alți utilizatori. De asemenea, în această lucrare de
laborator am studiat folosirea pointerilor, des utilizați în lucrul cu
tablourile unidimensionale și bidimensionale și funcții proprii. De
asemenea am studiat alocarea memoriei pentru pointeri care are drept
scop perfecționarea programelor și optimizarea acestora.