Upload
others
View
66
Download
1
Embed Size (px)
Citation preview
PCLP11 - 1
Despre ce discutam astazi
• probleme rezolvate
– siruri de numere
– matrici
PCLP11 - 2
Siruri de numere (1)
#include <stdio.h>#include <stdlib.h>#define MAX 30
void citire_sir(int n, int sir[]);void afisare_sir(int n, const int sir[]);void calcul_sir(int n, const int a[], int b[]);
void citire_sir(int n, int sir[]){ int i;
for( i=0; i<n; i++) { printf (″el[%d]=″, i+1) ;
scanf(″%d″, &sir[i]);}
}
Exemplul 1. Fie un sir a de numere intregi ale carui dimensiune sielemente se citesc de la consola. Sa se creeze un nou sir b unde:
,12
,2
i
i
ia
ab
daca ai divizibil cu 7
in rest
PCLP11 - 3
Siruri de numere (2)void afisare_sir(int n, const int sir[]){ int i;
for( i=0; i<n; i++) printf (″%d ″, sir[i]) ;
printf(″\n″);}
void calcul_sir(int n, const int a[], int b[]){ int i;
for( i=0; i<n; i++) if( a[i]%7==0)
b[i] = 2 * a[i]; else
b[i] = a[i] - 12; }
PCLP11 - 4
Siruri de numere (3)int main(){ int n, a[MAX], b[MAX];
printf (″Introduceti nr. de elemente ale sirului = ″);scanf(″%d″, &n);if(n < 1 || n > MAX)
{ printf(″Numar de elemente eronat.\n″);exit(1);
}printf (″\nIntroduceti elementele sirului:\n″) ;citire_sir(n, a);printf (″\nSirul introdus: ″) ;afisare_sir(n, a);calcul_sir(n, a, b);printf (″\nSirul generat: ″) ;afisare_sir(n, b);return 0;
}
PCLP11 - 5
Siruri de numere (4)
#include <stdio.h>#include <stdlib.h>#define MAX 30
void citire_sir(int n,double sir[]);void afisare_sir(int n, const double sir[]);void calcul_sir(int n, const double a[], const double b[], double c[]);
void citire_sir(int n, double sir[]){ int i;
for( i=0; i<n; i++) { printf (″el[%d]=″, i+1) ;
scanf(″%lf″, &sir[i]);}
}
Exemplul 2. Fie doua siruri a si b de numere reale ale caror dimensiunesi elemente se citesc de la consola. Sa se creeze un nou sir unde:
,2
,2
ii
ii
iba
bac
daca ai si bi au acelasi semn
in rest
PCLP11 - 6
Siruri de numere (5)
void afisare_sir(int n, const double sir[]){ int i;
for( i=0; i<n; i++) printf (″%.2le ″, sir[i]) ;
printf(″\n″);}
void calcul_sir(int n, const double a[], const double b[], double c[]){ int i;
for( i=0; i<n; i++) if( a[i] * b[i] > 0 )
c[i] = 2 * a[i] + b[i]; else
c[i] = a[i] – 2 * b[i]; }
PCLP11 - 7
Siruri de numere (6)int main(){ int n;
double a[MAX], b[MAX], c[MAX];printf (″Introduceti nr. de elemente ale sirurilor = ″);scanf(″%d″, &n);if(n < 1 || n > MAX){ printf(″Numar de elemente eronat.\n″);
exit(1);}printf (″\nIntroduceti elementele sirului a:\n″) ;citire_sir(n, a);printf (″\nIntroduceti elementele sirului b:\n″) ;citire_sir(n, b);calcul_sir(n, a, b, c);printf (″\nSirul a: ″) ;afisare_sir(n, a);printf (″\nSirul b: ″) ;afisare_sir(n, b);printf (″\nSirul c: ″) ;afisare_sir(n, c);return 0;
}
PCLP11 - 8
Matrici (1)
#include <stdio.h>#include <stdlib.h>#define MAX 20
void citire_mat(int nrl, int nrc, int mat[][MAX]);void afisare_mat(int nrl, int nrc, const int mat[][MAX]);void adunare_mat(int nrl, int nrc, const int A[][MAX], const int B[][MAX], \
int C[][MAX]);
void citire_mat(int nrl, int nrc, int mat[][MAX]){ int i, j;
for( i=0; i<nrl; i++) for( j=0; j<nrc; j++) { printf (″el[%d][%d]=″, i, j) ;
scanf(″%d″, &mat[i][j]);}
}
Exemplul 1. Fie doua matrici A si B ale caror dimensiuni si elementeintregi se citesc de la consola. Sa se creeze matricea C obtinuta prinadunarea celor doua matrici.
PCLP11 - 9
Matrici (2)void afisare_mat(int nrl, int nrc, const int mat[][MAX]){ int i, j;
printf(″\n″);for( i=0; i<nrl; i++) { for( j=0; j<nrc; j++)
printf (″%3d\t″, mat[i][j]) ; printf(″\n″);
}}
void adunare_mat(int nrl, int nrc, const int A[][MAX], const int B[][MAX], \int C[][MAX])
{ int i, j;for( i=0; i<nrl; i++)
for( j=0; j<nrc; j++) C[i][j] = A[i][j] + B[i][j] ;
}
PCLP11 - 10
Matrici (3)int main(){ int m, n, A[MAX][MAX], B[MAX][MAX], C[MAX][MAX];
printf (″Introduceti nr. de linii ale matricilor=″); scanf(″%d″, &m);printf (″Introduceti nr. de coloane ale matricilor=″); scanf(″%d″, &n);if(m < 1 || m > MAX || n < 1 || n > MAX){ printf(″Numar de linii sau coloane eronat.\n″);
exit(1);}printf (″Introduceti elementele matricii A:\n″) ;citire_mat(m, n, A);printf (″Introduceti elementele matricii B:\n″) ; citire_mat(m, n, B);adunare_mat(m, n, A, B, C);printf (″\nMatricea A:\n″) ;afisare_mat(m, n, A);printf (″\nMatricea B:\n″) ;afisare_mat(m, n, B);printf (″\nMatricea C = A + B este:\n″) ;afisare_mat(m, n, C);return 0;
}
PCLP11 - 11
Matrici (4)
#include <stdio.h>
#include <stdlib.h>
#define MAX 20
void citire_mat(int nrl, int nrc, int mat[][MAX]);
void afisare_mat(int nrl, int nrc, const int mat[][MAX]);
void produs_mat(int nrl1, int nrc1, int nrc2, const int A[][MAX], const int B[][MAX],\
int C[][MAX]);
Exemplul 2. Fie doua matrici A si B ale caror dimensiuni sielemente intregi se citesc de la consola. Sa se creeze matriceaC obtinuta prin inmultirea celor doua matrici.
PCLP11 - 12
Matrici (5)void citire_mat(int nrl, int nrc, int mat[][MAX]){ int i, j;
for( i=0; i<nrl; i++) for( j=0; j<nrc; j++) { printf (″el[%d][%d]=″, i, j) ;
scanf(″%d″, &mat[i][j]);}
}
void afisare_mat(int nrl, int nrc, const int mat[][MAX]){ int i, j;
printf(″\n″);for( i=0; i<nrl; i++) { for( j=0; j<nrc; j++)
printf (″%3d\t″, mat[i][j]) ; printf(″\n″);
}}
PCLP11 - 13
Matrici (6)
void produs_mat(int nrl1, int nrc1, int nrc2, const int A[][MAX], const int B[][MAX], \
int C[][MAX])
{ int i, j, k;
for( i=0; i<nrl1; i++)
for( j=0; j<nrc2; j++)
for(C[i][j] = 0, k=0; k<nrc1; k++)
C[i][j] += A[i][k] * B[k][j] ;
}
PCLP11 - 14
Matrici (7)int main(){ int m1, n1, m2, n2, A[MAX][MAX], B[MAX][MAX], C[MAX][MAX];
printf (″Introduceti nr. de linii ale primei matrici=″);scanf(″%d″, &m1);printf (″Introduceti nr. de coloane ale primei matrici =″);scanf(″%d″, &n1);if(m1<1 || m1>MAX || n1 < 1 || n1 > MAX)
{ printf(″Dimensiuni eronate.\n″);exit(1);
}printf (″Introduceti elementele primei matrici:\n″) ;citire_mat(m1, n1, A);printf (″Introduceti nr. de linii ale celei de a doua matrici =″);scanf(″%d″, &m2);printf (″Introduceti nr. de coloane ale celei de a doua matrici =″);scanf(″%d″, &n2);if(m2<1 || m2>MAX || n2 < 1 || n2 > MAX)
{ printf(″Dimensiuni eronate.\n″);exit(1);
}
PCLP11 - 15
Matrici (8)printf (″Introduceti elementele celei de a doua matrici:\n″) ; citire_mat(m2, n2, B);printf (″\n\nPrima matrice, A:\n″) ;afisare_mat(m1, n1, A);printf (″\n\nA doua matrice, B:\n″) ;afisare_mat(m2, n2, B);if(m2 != n1){ printf(″\n\nNumarul de coloane ale primei matrici este diferit ″) ;
printf(″de numarul de linii ale celei de a doua matrici. ″) ; printf(″Nu se poate calcula produsul matricilor.\n″) ; exit(1);
}produs_mat(m1, n1, n2, A, B, C);printf (″\n\nMatricea C = A * B este:\n″) ;afisare_mat(m1, n2, C);return 0;
}
PCLP11 - 16
Matrici (9)Exemplul 3. Fie doua matrici A si B patratice ale carorelemente intregi si dimensiune se citesc de la consola. Sa secreeze matricea C obtinuta astfel:
,
,
ijij
ijij
ij BA
BAC
deasupra diagonalei principale
sub si pe diagonala principala
- deasupra diag. principale i < j
- pe diag. principala i = j
- sub diag. principala i > j
PCLP11 - 17
Matrici (10)#include <stdio.h>#include <stdlib.h>
#define MAX 20
void citire_mat(int n, int mat[][MAX]);void afisare_mat(int n, const int mat[][MAX]);void calcul_mat(int n, const int mat1[][MAX], const int mat2[][MAX], \
int mat3[][MAX]);
void citire_mat(int n, int mat[][MAX]){ int i, j;
for( i=0; i<n; i++) for( j=0; j<n; j++) { printf (″el[%d][%d]=″, i, j) ;
scanf(″%d″, &mat[i][j]);}
}
void afisare_mat(int n, const int mat[][MAX]){ int i, j;
for( i=0; i<n; i++) { for( j=0; j<n; j++)
printf (″%3d\t″, mat[i][j]) ; printf(″\n″);
}}
PCLP11 - 18
Matrici (11)
void calcul_mat(int n, const int mat1[][MAX], const int mat2[][MAX], \
int mat3[][MAX])
{ int i, j;
for( i=0; i<n; i++)
for( j=0; j<n; j++)
if(i<j) //deasupra diagonalei principale
mat3[i][j] = mat1[i][j] + mat2[i][j] ;
else //sub si pe diagonala principala
mat3[i][j] = mat1[i][j] - mat2[i][j] ;
}
PCLP11 - 19
Matrici (12)int main(){ int m, A[MAX][MAX], B[MAX][MAX], C[MAX][MAX];
printf (″Introduceti dimensiunea matricilor=″);scanf(″%d″, &m);if(m<1 || m>MAX)
{ printf(″Dimensiune eronata.\n″);exit(1);
}printf (″Introduceti elementele matricii A:\n″) ;citire_mat(m, A);printf (″Introduceti elementele matricii B:\n″) ; citire_mat(m, B);calcul_mat(m, A, B, C);printf (″\nMatricea A:\n″) ;afisare_mat(m, A);printf (″\nMatricea B:\n″) ;afisare_mat(m, B);printf (″\nMatricea generata C este:\n″) ;afisare_mat(m, C);return 0;
}
PCLP11 - 20
Matrici (13)Alt mod de a calcula matricea C:
void calcul_mat(int n, const int mat1[][MAX], const int mat2[][MAX], \
int mat3[][MAX])
{ int i, j;
for( i=0; i<n; i++)
for( j=i+1; j<n; j++) //deasupra diagonalei principale
mat3[i][j] = mat1[i][j] + mat2[i][j] ;
for( i=0; i<n; i++)
for( j=0; j<=i; j++) //sub si pe diagonala principala
mat3[i][j] = mat1[i][j] - mat2[i][j] ;
}
PCLP11 - 21
Matrici (14)
Exemplul 4. Fie matricea patratica A ale carei elementeintregi si dimensiune, n, se citesc de la consola. Sa secalculeze produsul elementelor de sub diagonala secundara.
- pe diag. secundara: i + j = n-1 j = n-1-i
- deasupra diag. secundare: i + j < n-1 j < n-1-i
- sub diag. secundara: i + j > n-1 j > n-1-i
PCLP11 - 22
Matrici (15)#include <stdio.h>#include <stdlib.h>
#define MAX 20
void citire_mat(int n, int mat[][MAX]);void afisare_mat(int n, const int mat[][MAX]);double prod_el(int n, const int mat[][MAX]);
void citire_mat(int n, int mat[][MAX])
{ int i, j;
for( i=0; i<n; i++)
for( j=0; j<n; j++)
{ printf (″el[%d][%d]=″, i, j) ;
scanf(″%d″, &mat[i][j]);
}
}
PCLP11 - 23
Matrici (16)void afisare_mat(int n, const int mat[][MAX]){ int i, j;
printf(″\n″);for( i=0; i<n; i++) { for( j=0; j<n; j++)
printf (″%3d\t″, mat[i][j]) ; printf(″\n″);
}}
double prod_el(int n, const int mat[][MAX]){ int i, j;
double p=1;for( i=0; i<n; i++)
for( j=n-i; j<n; j++) p *= mat[i][j];
return p;}
PCLP11 - 24
Matrici (17)int main()
{ int m, A[MAX][MAX];
printf (″Introduceti dmensiunea matricii=″);scanf(″%d″, &m);if(m<1 || m>MAX){ printf(″Dimensiune eronata.\n″);
exit(1);}printf (″Introduceti elementele matricii:\n″) ;citire_mat(m, A);printf (″\nMatricea A:\n″) ;afisare_mat(m, A);printf (″\nProdusul el. de sub diag. sec. este %.2le\n″, prod_el(m,A)) ;return 0;
}
PCLP11 - 25
Matrici (18)Utilizarea transmiterii prin referinta (numai in C++) la citirea matricii:#include <stdio.h>#include <stdlib.h>
#define MAX 20
void citire_mat_ref(int& n, int mat[][MAX], char *msg);void afisare_mat(int n, const int mat[][MAX]);double prod_el(int n, const int mat[][MAX]);
void citire_mat_ref(int& n, int mat[][MAX], char *msg){ int i, j;
printf (″Introduceti dimensiunea matricii %s=″, msg);scanf(″%d″, &n);if(n<1 || n>MAX){ printf(″Dimensiune eronata.\n″);
exit(1); }
printf (″Introduceti elementele matricii %s:\n″, msg) ;for( i=0; i<n; i++)
for( j=0; j<n; j++) { printf (″el[%d][%d]=″, i, j) ;
scanf(″%d″, &mat[i][j]);}
}
PCLP11 - 26
Matrici (19)void afisare_mat(int n, const int mat[][MAX]){ int i, j;
printf(″\n″);for( i=0; i<n; i++) { for( j=0; j<n; j++)
printf (″%3d\t″, mat[i][j]) ; printf(″\n″);
}}
double prod_el(int n, const int mat[][MAX]){ int i, j;
double p;for( p=1.0, i=0; i<n; i++)
for( j=n-i; j<n; j++) p *= mat[i][j];
return p;}
PCLP11 - 27
Matrici (20)
int main()
{ int m, A[MAX][MAX];
citire_mat_ref(m, A, ″A″ );
printf (″\nMatricea A:\n″) ;
afisare_mat(m, A);
printf (″\nProdusul el. de sub diag. sec. este %.2le\n″, prod_el(m, A)) ;
return 0;
}