Sunday, March 6, 2016
23) Ridicarea unei matrice la o putere data - alocare dinamica
#include <stdio.h>
#include <stdlib.h>
void citireMatrice(int ***a, int *n) {
int i,j;
printf("Numarul de linii & coloane: "); scanf("%d", &(*n));
(*a) = (int**)malloc((*n)*sizeof(int));
for(i=0;i<(*n);i++) {
(*a)[i] = (int*)malloc((*n)*sizeof(int));
}
for(i=0;i<*n;i++) {
for(j=0;j<*n;j++) {
printf("a[%d][%d] = ",i,j); scanf("%d", &(*a)[i][j]);
}
}
}
void afisareMatrice(int **a, int n) {
int i,j;
for(i=0;i<n;i++) {
for(j=0;j<n;j++) {
printf(" %d ", a[i][j]);
}
puts(" ");
}
}
void putere(int **a, int ***b, int ***c, int n, int p) {
int i,j,q,k;
//alocare dinamica pentru matricele B si C
(*b) = (int**)malloc(n*sizeof(int));
for(i=0;i<n;i++) {
(*b)[i] = (int*)malloc(n*sizeof(int));
}
(*c) = (int**)malloc((n)*sizeof(int));
for(i=0;i<n;i++) {
(*c)[i] = (int*)malloc((n)*sizeof(int));
}
//generarea matricei unitate de ordin n
for(i=0;i<n;i++)
for(j=0;j<n;j++) {
(*b)[i][j]=(i==j);
}
for(q=0;q<p;q++) {
for(i=0;i<n;i++)
for(j=0;j<n;j++) {
(*c)[i][j]=0;
for(k=0;k<n;k++)
(*c)[i][j] = (*c)[i][j]+(*b)[i][k]*a[k][j];
}
for(i=0;i<n;i++)
for(j=0;j<n;j++)
(*b)[i][j]=(*c)[i][j];
}
//afisarea matricei rezultate
printf("Matricea ridicata la puterea %d este: \n", p);
for(i=0;i<n;i++) {
for(j=0;j<n;j++) {
printf(" %d ", (*b)[i][j]);
}
puts(" ");
}
}
void eliberare(int **a, int **b, int **c, int n) {
int i;
for(i=0;i<n;i++) {
free(a[i]);
}
free(a);
for(i=0;i<n;i++) {
free(b[i]);
}
free(b);
for(i=0;i<n;i++) {
free(c[i]);
}
free(c);
}
void main(){
int **a, **b, **c;
int i,j,n,p;
citireMatrice(&a,&n);
afisareMatrice(a,n);
printf("Puterea este: "); scanf("%d", &p);
putere(a,&b,&c,n,p);
eliberare(a,b,c,n);
}
Labels:
alocare dinamica,
matrice,
putere
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment