Correction d'un programme pour les opérations des Matrices
Bonjour,
s'il vous plait j'ai un problème dans ce programme qui fait les opérations sur les matrices il marche mais quand il arrive à l'inverse ne donne rien. si vous trouvez des erreurs lesquels s'il vous plait.
EDIT: Ajout de la coloration syntaxique.
s'il vous plait j'ai un problème dans ce programme qui fait les opérations sur les matrices il marche mais quand il arrive à l'inverse ne donne rien. si vous trouvez des erreurs lesquels s'il vous plait.
#include <stdio.h>
#include <stdlib.h>
void menu(){
printf("menu\n---------\n");
printf("1:addition\n");
printf("2:soustraction\n");
printf("3:produit\n");
printf("4:transpose\n");
printf("5:miseazero\n");
printf("6:inverse\n");
printf("7:sortie\n");
}
void additionMatrice();
void soustractionMarice();
void produitMatrice();
void transposeMatrice();
void miseazero();
void inverse();
int main()
{
int choix,fin=1;
menu();
while(fin){
printf("quel est votre choix : \n");
scanf("%d",&choix);
switch(choix){
case 1: additionMatrice();break;
case 2: soustractionMarice();break;
case 3: produitMatrice();break;
case 4: transposeMatrice();break;
case 5: miseazero();break;
case 6: inverse();break;
case 7: fin=0;break;
default: printf("ce choix n'existe pas !\n");}
}
system("PAUSE");
return 0;
}
void additionMatrice(){
/* Déclarations */
int A[50][50]; /* matrice donnée */
int B[50][50]; /* matrice donnée */
int C[50][50]; /* matrice résultat */
int N, M; /* dimensions des matrices */
int I, J; /* indices courants */
/* Saisie des données */
printf("Nombre de lignes (max.50) : ");
scanf("%d", &N );
printf("Nombre de colonnes (max.50) : ");
scanf("%d", &M );
printf("*** Matrice A ***\n");
for (I=0; I<N; I++)
for (J=0; J<M; J++)
{
printf("Elément[%d][%d] : ",I,J);
scanf("%d", &A[I][J]);
}
printf("*** Matrice B ***\n");
for (I=0; I<N; I++)
for (J=0; J<M; J++)
{
printf("Elément[%d][%d] : ",I,J);
scanf("%d", &B[I][J]);
}
/* Affichage des matrices */
printf("Matrice donnée A :\n");
for (I=0; I<N; I++)
{
for (J=0; J<M; J++)
printf("%7d", A[I][J]);
printf("\n");
}
printf("Matrice donnée B :\n");
for (I=0; I<N; I++)
{
for (J=0; J<M; J++)
printf("%7d", B[I][J]);
printf("\n");
}
/* Affectation du résultat de l'addition à C */
for (I=0; I<N; I++)
for (J=0; J<M; J++)
C[I][J] = A[I][J]+B[I][J];
/* Edition du résultat */
printf("Matrice résultat d'addition est :\n");
for (I=0; I<N; I++)
{
for (J=0; J<M; J++)
printf("%7d", C[I][J]);
printf("\n");
}
}
void soustractionMarice(){
/* Déclarations */
int A[50][50]; /* matrice donnée */
int B[50][50]; /* matrice donnée */
int C[50][50]; /* matrice résultat */
int N, M; /* dimensions des matrices */
int I, J; /* indices courants */
/* Saisie des données */
printf("Nombre de lignes (max.50) : ");
scanf("%d", &N );
printf("Nombre de colonnes (max.50) : ");
scanf("%d", &M );
printf("*** Matrice A ***\n");
for (I=0; I<N; I++)
for (J=0; J<M; J++)
{
printf("Elément[%d][%d] : ",I,J);
scanf("%d", &A[I][J]);
}
printf("*** Matrice B ***\n");
for (I=0; I<N; I++)
for (J=0; J<M; J++)
{
printf("Elément[%d][%d] : ",I,J);
scanf("%d", &B[I][J]);
}
/* Affichage des matrices */
printf("Matrice donnée A :\n");
for (I=0; I<N; I++)
{
for (J=0; J<M; J++)
printf("%7d", A[I][J]);
printf("\n");
}
printf("Matrice donnée B :\n");
for (I=0; I<N; I++)
{
for (J=0; J<M; J++)
printf("%7d", B[I][J]);
printf("\n");
}
/* Affectation du resultat de la soustraction à c */
for (I=0; I<N; I++)
{
for (J=0; J<M; J++)
C[I][J] = A[I][J]-B[I][J];
}
/*Edition du resultat */
printf("Matrice résultat de soustraction est :\n");
for (I=0; I<N; I++)
{
for (J=0; J<M; J++)
printf("%7d", C[I][J]);
printf("\n");
}
}
void produitMatrice(){
/* Déclarations */
int A[50][50]; /* matrice donnée */
int B[50][50]; /* matrice donnée */
int C[50][50]; /* matrice résultat */
int N, M, P; /* dimensions des matrices */
int I, J, K; /* indices courants */
/* Saisie des données */
printf("*** Matrice A ***\n");
printf("Nombre de lignes de A (max.50) : ");
scanf("%d", &N );
printf("Nombre de colonnes de A (max.50) : ");
scanf("%d", &M );
for (I=0; I<N; I++)
for (J=0; J<M; J++)
{
printf("Elément[%d][%d] : ",I,J);
scanf("%d", &A[I][J]);
}
printf("*** Matrice B ***\n");
printf("Nombre de lignes de B : %d\n", M);
printf("Nombre de colonnes de B (max.50) : ");
scanf("%d", &P );
for (I=0; I<M; I++)
for (J=0; J<P; J++)
{
printf("Elément[%d][%d] : ",I,J);
scanf("%d", &B[I][J]);
}
/* Affichage des matrices */
printf("Matrice donnée A :\n");
for (I=0; I<N; I++)
{
for (J=0; J<M; J++)
printf("%7d", A[I][J]);
printf("\n");
}
printf("Matrice donnée B :\n");
for (I=0; I<M; I++)
{
for (J=0; J<P; J++)
printf("%7d", B[I][J]);
printf("\n");
}
/* Affectation du résultat de la multiplication à C */
for (I=0; I<N; I++)
for (J=0; J<P; J++)
{
C[I][J]=0;
for (K=0; K<M; K++)
C[I][J] += A[I][K]*B[K][J];
}
/* Edition du résultat */
printf("Matrice résultat C :\n");
for (I=0; I<N; I++)
{
for (J=0; J<P; J++)
printf("%7d", C[I][J]);
printf("\n");
}
}
void transposeMatrice()
{ /* Déclarations */
int A[50][50]; /* matrice donnée */
int N, M; /* dimensions de la matrice */
int I, J; /* indices courants */
int AIDE; /* pour la permutation */
int DMAX; /* la plus grande des deux dimensions */
/* Saisie des données */
printf("Nombre de lignes (max.50) : ");
scanf("%d", &N );
printf("Nombre de colonnes (max.50) : ");
scanf("%d", &M );
for (I=0; I<N; I++)
for (J=0; J<M; J++)
{
printf("Elément[%d][%d] : ",I,J);
scanf("%d", &A[I][J]);
}
/* Affichage de la matrice */
printf("Matrice donnée :\n");
for (I=0; I<N; I++)
{
for (J=0; J<M; J++)
printf("%7d", A[I][J]);
printf("\n");
}
/* Transposition de la matrice A par permutation des */
/* éléments [I][J] à gauche de la diagonale principale */
/* avec les éléments [J][I] à droite de la diagonale. */
DMAX = (N>M) ? N : M;
for (I=0; I<DMAX; I++)
for (J=0; J<I; J++)
{
AIDE = A[I][J];
A[I][J] = A[J][I];
A[J][I] = AIDE;
}
/* Edition du résultat */
/* Attention: maintenant le rôle de N et M est inversé. */
printf("transpose du Matrice donnée est :\n");
for (I=0; I<M; I++)
{
for (J=0; J<N; J++)
printf("%7d", A[I][J]);
printf("\n");
}
system("pause");
}
void miseazero()
{
/* Déclarations */
int A[50][50]; /* matrice carrée */
int N; /* dimension de la matrice carrée */
int I, J; /* indices courants */
/* Saisie des données */
printf("Dimension de la matrice carrée (max.50) : ");
scanf("%d", &N);
for (I=0; I<N; I++)
for (J=0; J<N; J++)
{
printf("Elément[%d][%d] : ",I,J);
scanf("%d", &A[I][J]);
}
/* Affichage de la matrice */
printf("Matrice donnée :\n");
for (I=0; I<N; I++)
{
for (J=0; J<N; J++)
printf("%7d", A[I][J]);
printf("\n");
}
/* Mise à zéro de la diagonale principale */
for (I=0; I<N; I++)
A[I][I]=0;
/* Edition du résultat */
printf("Matrice résultat :\n");
for (I=0; I<N; I++)
{
for (J=0; J<N; J++)
printf("%7d", A[I][J]);
printf("\n");
}
system("pause");
}
void inverse()
{
float determinant(float[][],float);
void cofactor(float[][],float);
void transpose(float[][],float[][],float);
int main()
{
float a[25][25],k,d;
int i,j;
printf("\n C Program pour trouver l'inverse d'une Matrice\n\n");
printf("Entrer l'ordre de la Matrice : ");
scanf("%f",&k);
printf("Entrer les elements de %.0fX%.de la Matrice : \n",k,k);
for (i=0;i<k;i++)
{
for (j=0;j<k;j++)
{
scanf("%f",&a[i][j]);
}
}
d=determinant(a,k);
printf("Determinant de la Matrice = %f",d);
if (d==0)
printf("\nInverse de la Matrice is not possible\n");
else
cofactor(a,k);
getch();
}
/*pour le calcul du Determinant de la Matrice */
float determinant(float a[25][25],float k)
{
float s=1,det=0,b[25][25];
int i,j,m,n,c;
if (k==1)
{
return (a[0][0]);
}
else
{
det=0;
for (c=0;c<k;c++)
{
m=0;
n=0;
for (i=0;i<k;i++)
{
for (j=0;j<k;j++)
{
b[i][j]=0;
if (i != 0 && j != c)
{
b[m][n]=a[i][j];
if (n<(k-2))
n++;
else
{
n=0;
m++;
}
}
}
}
det=det + s * (a[0][c] * determinant(b,k-1));
s=-1 * s;
}
}
return (det);
}
void cofactor(float num[25][25],float f)
{
float b[25][25],fac[25][25];
int p,q,m,n,i,j;
for (q=0;q<f;q++)
{
for (p=0;p<f;p++)
{
m=0;
n=0;
for (i=0;i<f;i++)
{
for (j=0;j<f;j++)
{
if (i != q && j != p)
{
b[m][n]=num[i][j];
if (n<(f-2))
n++;
else
{
n=0;
m++;
}
}
}
}
fac[q][p]=pow(-1,q + p) * determinant(b,f-1);
}
}
transpose(num,fac,f);
}
/*trouver transpose de la matrice*/
void transpose(float num[25][25],float fac[25][25],float r)
{
int i,j;
float b[25][25],inverse[25][25],d;
for (i=0;i<r;i++)
{
for (j=0;j<r;j++)
{
b[i][j]=fac[j][i];
}
}
d=determinant(num,r);
for (i=0;i<r;i++)
{
for (j=0;j<r;j++)
{
inverse[i][j]=b[i][j] / d;
}
}
printf("\n\n\nl'inverse de la matrice est : \n");
for (i=0;i<r;i++)
{
for (j=0;j<r;j++)
{
printf("\t%f",inverse[i][j]);
}
printf("\n");
}
}
}
EDIT: Ajout de la coloration syntaxique.