27
PCLP11 - 1 Despre ce discutam astazi probleme rezolvate siruri de numere matrici

siruri de numere matrici - users.utcluj.rousers.utcluj.ro/~simona/pclp/pclp11.pdf · PCLP11 - 2 Siruri de numere (1) #include #include #define MAX

  • Upload
    others

  • View
    66

  • Download
    1

Embed Size (px)

Citation preview

Page 1: siruri de numere matrici - users.utcluj.rousers.utcluj.ro/~simona/pclp/pclp11.pdf · PCLP11 - 2 Siruri de numere (1) #include  #include  #define MAX

PCLP11 - 1

Despre ce discutam astazi

• probleme rezolvate

– siruri de numere

– matrici

Page 2: siruri de numere matrici - users.utcluj.rousers.utcluj.ro/~simona/pclp/pclp11.pdf · PCLP11 - 2 Siruri de numere (1) #include  #include  #define MAX

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

Page 3: siruri de numere matrici - users.utcluj.rousers.utcluj.ro/~simona/pclp/pclp11.pdf · PCLP11 - 2 Siruri de numere (1) #include  #include  #define MAX

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; }

Page 4: siruri de numere matrici - users.utcluj.rousers.utcluj.ro/~simona/pclp/pclp11.pdf · PCLP11 - 2 Siruri de numere (1) #include  #include  #define MAX

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;

}

Page 5: siruri de numere matrici - users.utcluj.rousers.utcluj.ro/~simona/pclp/pclp11.pdf · PCLP11 - 2 Siruri de numere (1) #include  #include  #define MAX

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

Page 6: siruri de numere matrici - users.utcluj.rousers.utcluj.ro/~simona/pclp/pclp11.pdf · PCLP11 - 2 Siruri de numere (1) #include  #include  #define MAX

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]; }

Page 7: siruri de numere matrici - users.utcluj.rousers.utcluj.ro/~simona/pclp/pclp11.pdf · PCLP11 - 2 Siruri de numere (1) #include  #include  #define MAX

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;

}

Page 8: siruri de numere matrici - users.utcluj.rousers.utcluj.ro/~simona/pclp/pclp11.pdf · PCLP11 - 2 Siruri de numere (1) #include  #include  #define MAX

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.

Page 9: siruri de numere matrici - users.utcluj.rousers.utcluj.ro/~simona/pclp/pclp11.pdf · PCLP11 - 2 Siruri de numere (1) #include  #include  #define MAX

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] ;

}

Page 10: siruri de numere matrici - users.utcluj.rousers.utcluj.ro/~simona/pclp/pclp11.pdf · PCLP11 - 2 Siruri de numere (1) #include  #include  #define MAX

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;

}

Page 11: siruri de numere matrici - users.utcluj.rousers.utcluj.ro/~simona/pclp/pclp11.pdf · PCLP11 - 2 Siruri de numere (1) #include  #include  #define MAX

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.

Page 12: siruri de numere matrici - users.utcluj.rousers.utcluj.ro/~simona/pclp/pclp11.pdf · PCLP11 - 2 Siruri de numere (1) #include  #include  #define MAX

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″);

}}

Page 13: siruri de numere matrici - users.utcluj.rousers.utcluj.ro/~simona/pclp/pclp11.pdf · PCLP11 - 2 Siruri de numere (1) #include  #include  #define MAX

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] ;

}

Page 14: siruri de numere matrici - users.utcluj.rousers.utcluj.ro/~simona/pclp/pclp11.pdf · PCLP11 - 2 Siruri de numere (1) #include  #include  #define MAX

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);

}

Page 15: siruri de numere matrici - users.utcluj.rousers.utcluj.ro/~simona/pclp/pclp11.pdf · PCLP11 - 2 Siruri de numere (1) #include  #include  #define MAX

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;

}

Page 16: siruri de numere matrici - users.utcluj.rousers.utcluj.ro/~simona/pclp/pclp11.pdf · PCLP11 - 2 Siruri de numere (1) #include  #include  #define MAX

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

Page 17: siruri de numere matrici - users.utcluj.rousers.utcluj.ro/~simona/pclp/pclp11.pdf · PCLP11 - 2 Siruri de numere (1) #include  #include  #define MAX

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″);

}}

Page 18: siruri de numere matrici - users.utcluj.rousers.utcluj.ro/~simona/pclp/pclp11.pdf · PCLP11 - 2 Siruri de numere (1) #include  #include  #define MAX

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] ;

}

Page 19: siruri de numere matrici - users.utcluj.rousers.utcluj.ro/~simona/pclp/pclp11.pdf · PCLP11 - 2 Siruri de numere (1) #include  #include  #define MAX

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;

}

Page 20: siruri de numere matrici - users.utcluj.rousers.utcluj.ro/~simona/pclp/pclp11.pdf · PCLP11 - 2 Siruri de numere (1) #include  #include  #define MAX

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] ;

}

Page 21: siruri de numere matrici - users.utcluj.rousers.utcluj.ro/~simona/pclp/pclp11.pdf · PCLP11 - 2 Siruri de numere (1) #include  #include  #define MAX

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

Page 22: siruri de numere matrici - users.utcluj.rousers.utcluj.ro/~simona/pclp/pclp11.pdf · PCLP11 - 2 Siruri de numere (1) #include  #include  #define MAX

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]);

}

}

Page 23: siruri de numere matrici - users.utcluj.rousers.utcluj.ro/~simona/pclp/pclp11.pdf · PCLP11 - 2 Siruri de numere (1) #include  #include  #define MAX

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;}

Page 24: siruri de numere matrici - users.utcluj.rousers.utcluj.ro/~simona/pclp/pclp11.pdf · PCLP11 - 2 Siruri de numere (1) #include  #include  #define MAX

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;

}

Page 25: siruri de numere matrici - users.utcluj.rousers.utcluj.ro/~simona/pclp/pclp11.pdf · PCLP11 - 2 Siruri de numere (1) #include  #include  #define MAX

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]);}

}

Page 26: siruri de numere matrici - users.utcluj.rousers.utcluj.ro/~simona/pclp/pclp11.pdf · PCLP11 - 2 Siruri de numere (1) #include  #include  #define MAX

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;}

Page 27: siruri de numere matrici - users.utcluj.rousers.utcluj.ro/~simona/pclp/pclp11.pdf · PCLP11 - 2 Siruri de numere (1) #include  #include  #define MAX

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;

}