Sunteți pe pagina 1din 16

Bazele programarii

calculatoarelor

Seminar 11
Subprograme,
alocare statica de memorie

Conf. univ. dr. Radu Mogos

2023
Cuprins
Probleme matrice

1. Scrieți programul C care realizează citirea si afișarea unui vector utilizând subprograme
2. Scrieți programul C care realizează produsul scalar dintre doi vectori. Cerința se va
rezolva intr-un subprogram (2 variante)
 2.1 rezultat intors prin parametru
 2.2 rezultat intors prin numele functiei
3. Scrieți programul C care realizează produsul vectorial a doi vectori. Cerința se va rezolva
intr-un subprogram (rezultat întors prin parametru).
4. Scrieți programul C care realizează suma elementelor unei matrice din triunghiul de
deasupra diagonalelor (inclusiv diagonalele) - rezultat intors prin parametru.
5. Scrieți programul C care determina elementul maximul din triunghiul din stânga
diagonalelor unei matrice pătrate (exclusiv diagonalele) - rezultat intors prin
parametru - TEMA.
6. Fie o matrice mxn care contine notele a m studenti la n discipline. Scrieti programul
C care contine subprogramul care determina disciplinele cu cei mai multi restantieri.

7. Scrieți programul C care realizează produsul dintre doua matrice. Programul va


cuprinde:
- subprogram pentru citire matrice
- subprogram pentru afisare matrice
- subprogram pentru calcul produs matrice (rezultat intors prin parametru)
2
- functia main
Problema 1
 Enunt: Scrieți programul care realizează citirea si afișarea unui vector utilizând
subprograme
 Exemplu numeric:

a[0] a[1] a[2] ... a[n-1]

3
Problema 1
 Rezolvare
#include<stdio.h> int main()
#include<conio.h> {
int m;
//nr. subprograme: 2 float v[10];
printf("Dati dimensiunea vectorului:\n");
//citirea unui vector scanf("%d", &m);
void citireV(int m, float v[10])
{ printf("\nCitire vector:\n");
int i; citireV(m,v);
for (i=0;i<m;i++)
{ printf("\nAfisare vector:");
printf("v[%d] = ", i); afisareV(m,v);
scanf("%f", &v[i]);
} getch();
} return 0;
}
void afisareV(int m, float v[10])
{
int i;
printf("\n");
for (i=0;i<m;i++)
printf("v[%d] =%6.2f\n", i, v[i]);
}
4
Problema 2
 Enunt: Scrieți programul care realizează produsul scalar dintre doi vectori. Cerința
se va rezolva intr-un subprogram (2 variante):
 -> rezultat intors prin parametru
 -> rezultat intors prin numele functiei
 Exemplu numeric:

a[0] a[1] a[2] ... a[n-1]

b[0] b[1] b[2] ... b[n-1] 5


Problema 2
 Rezolvare
#include<stdio.h> int main()
#include<conio.h> {
int m;
//citirea unui vector float v1[10], v2[10], prodSc1, prodSc2;
void citireV(int m, float v[10])
{ .... } //citire dimensiune vectori m
...
void afisareV(int m, float v[10]) //citire vector v1 si v2 prin apelarea functiei citirev ( )
{ .... } ...

// produs scalar a 2 vectori - var. 1 rezultat intors prin parametru //ps - varianta 1
void ps1(float v1[10], float v2[10], int m, float *ps) printf("\nVarianta 1");
{ ps1(v1, v2, m, &prodSc1);
int i; printf("\nProdusul scalar (var. 1) = %6.2f", prodSc1);
*ps=0;
for(i=0;i<m;i++) //ps - varianta 2
*ps=*ps + v1[i]*v2[i]; printf("\n\nVarianta 2");
} prodSc2=ps2(v1, v2, m);
printf("\nProdusul scalar (var. 2) = %6.2f", prodSc2);
// produs scalar a 2 vectori - var. 2 rezultat intors prin numele functiei //sau printf("\nProdusul scalar (var. 2) = %6.2f", ps2(v1, v2, m));
float ps2(float v1[10], float v2[10], int m) ...
{
int i; }
float ps;
ps=0;
for (i=0;i<m;i++)
ps= ps + v1[i]*v2[i];
return ps;
}

6
Problema 3
 Enunt: Scrieți programul care realizează produsul vectorial a doi vectori. Cerința se
va rezolva intr-un subprogram (rezultat întors prin parametru).
 Exemplu numeric:

a[0] a[1] a[2] ... a[n-1]

b[0] b[1] b[2] ... b[n-1]

7
Problema 3
 Rezolvare

#include<stdio.h> int main()


#include<conio.h> {

//citirea unui vector int m;


void citireV(int m, float v[10]) float v1[10], v2[10], prodVect[10];
{ ... }
//citire dimensiune vectori – m
void afisareV(int m, float v[10]) ...
{ ... }
//citire vectori prin apelul functiei citiveV ()
//pb.3 produs vectorial a 2 vectori ...
//rezultat intors prin parametru
void pv(float v1[10], float v2[10], int m, float pv[10]) printf("\nAfisare produs vectorial:");
{ pv(v1, v2, m, prodVect); //apel
int i; afisareV(m, prodVect);
for(i=0;i<m;i++)
pv[i] = v1[i] * v2[i]; ...
}
}

8
Problema 4
 Enunt: Scrieți programul care realizează suma elementelor unei matrice din
triunghiul de deasupra diagonalelor (inclusiv diagonalele) - rezultat intors prin
parametru.
 Exemplu numeric:

a[0, 0] a[0, 1] a[0, 2] ... a[0, m-1]

a[1, 0] a[1, 1] a[1, 2] ... a[1, m-1]

a[m-1, 0] a[m-1, 1] a[m-1, 2] ... a[m-1, m-1]


9
Problema 4
 Rezolvare
#include<stdio.h> int main()
#include<conio.h> {
float mat[10][10], s;
void citireM(float mat[10][10], int m, int n) int m,n;
{ ... }
//sau
void afisareM(float mat[10][10], int m, int n) //float mat[10][10]={{1,2,3},{4,5,6},{7,8,9}}, s;
{ ... } //int m=3;

//citire dimensiuni matrice – m,n


void sumaTriSupDiagIncl (float ...
mat[10][10], int m, int n, float *s)
{ //citire matrice mat[][]
int i,j; ...
*s=0;
for(i=0; i<=(m-1)/2; i++) sumaTriSupDiagIncl (mat, m, m, &s);
for(j=i; j<m-i; j++) printf("\nSuma este: %6.2f", s);
*s = *s + mat[i][j];
} ...

10
Problema 5 - TEMA
 Enunt: Scrieți programul care determina elementul maximul din triunghiul din
stânga diagonalelor unei matrice pătrate (exclusiv diagonalele) - rezultat intors
prin parametru.
 Exemplu numeric:

a[0, 0] a[0, 1] a[0, 2] ... a[0, m-1]

a[1, 0] a[1, 1] a[1, 2] ... a[1, m-1]

a[m-2, 0] a[m-2, 1] a[m-2, 2] ... a[m-2, m-1]

a[m-1, 0] a[m-1, 1] a[m-1, 2] ... a[m-1, m-1]


11
Problema 5
 Rezolvare

...
void maximTriStgDiagExcl (float mat[10][10], int m, float *max)
{
int i,j;
*max=mat[1][0];
for(i = 1; i < m-1; i++)
for(j = 0; j < m-1-i; j++)
if (*max<mat[i][j]) *max = mat[i][j];
}
...

12
Problema 6
 Enunt: Fie o matrice mxn care contine notele a m studenti la n discipline. Scrieti
programul C care contine subprogramul care determina disciplinele cu cei mai
multi restantieri
 Exemplu numeric:

a[0, 0] a[0, 1] a[0, 2] ... a[0, n-1]

a[1, 0] a[1, 1] a[1, 2] ... a[1, n-1]

a[m-1, 0] a[m-1, 1] a[m-1, 2] ... a[m-1, n-1]


13
Problema 6
 Rezolvare
#include<stdio.h>
#include<conio.h> int main()
{
void afisareV(int v[10], int m) //float mat[10][10], max;
{ ... } //int m,n;
float mat[10][10]={ { 9, 2, 5, 4},
void citireM(float mat[10][10], int m, int n)
{ ... } { 4, 9, 5, 8},
{ 9, 10, 10, 4},
void afisareM(float mat[10][10], int m, int n) {10, 3, 3, 10}};
{ ... } //Rezultat: disc: 1 si 3
int k, max,i;
void discMaxRestante (float mat[10][10], int m , int n, int nrRestF[10], int *k, int *max) int m=4;
{ int n=4;
// max - nr maxim de restante la o disciplina int nrRestF[10];
int i,j;
int nr; //nr de restante la o disciplina
int nrRest[10]; //nr restante pentru fiecare disciplina //printf("Dimensiuni matrice:\n");
//scanf("%d %d", &m, &n);
//construire vector cu nr restante pentru fiecare disciplina
for (j=0;j<n;j++) //citireM(mat, m,m);
{ afisareM(mat, m,m);
nr=0;
for(i=0;i<m;i++) printf("\n");
if (mat[i][j]<5) nr=nr+1; discMaxRestante (mat, m , n, nrRestF, &k, &max);
nrRest[j]=nr;
}
printf("Disciplinele cu nr maxim %d de restantieri sunt:\n", max);
//determinare nr maxim de restante din vectorul nrRest[ ] afisareV(nrRestF, k);
*max=nrRest[0];
for(i=1;i<n;i++) //for (i=0;i<k;i++)
if (*max<nrRest[i]) *max=nrRest[i]; // printf("Disciplina %d\n",nrRestF[i]);

//determinare discipline cu nr maxim de restante getch();


*k=0; return 0;
for (i=0;i<n;i++)
}
if (*max==nrRest[i]) {
nrRestF[*k] = i;
(*k)++;
}
14
}
Problema 7
Enunt: 7. Scrieți programul C care realizează produsul dintre doua matrice. Se vor
utiliza subprograme pentru:
- citire matrice
- afisare matrice
- calcul produs matrice (rezultat intors prin parametru)
- si functia main
 Exemplu numeric:

15
Spor la învățat !

16

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