Correction d'un programme pour les opérations des Matrices

Fermé
MohammedKarim Messages postés 3 Date d'inscription mardi 23 décembre 2014 Statut Membre Dernière intervention 23 décembre 2014 - Modifié par Whismeril le 23/12/2014 à 15:43
MohammedKarim Messages postés 3 Date d'inscription mardi 23 décembre 2014 Statut Membre Dernière intervention 23 décembre 2014 - 23 déc. 2014 à 19:23
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.
#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.

A voir également:

1 réponse

fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
23 déc. 2014 à 18:00
Bonjour,

T'es sûr que ce programme compile ?
void inverse()
{
float determinant(float[][],float);
void cofactor(float[][],float);
void transpose(float[][],float[][],float);

Il manque l'accolade fermante pour finir la fonction inverse().

Cdlt,
0
MohammedKarim Messages postés 3 Date d'inscription mardi 23 décembre 2014 Statut Membre Dernière intervention 23 décembre 2014
23 déc. 2014 à 18:53
où ? s'il vous plait.
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
23 déc. 2014 à 19:07
A la fin de ta fonction inverse()...
0
MohammedKarim Messages postés 3 Date d'inscription mardi 23 décembre 2014 Statut Membre Dernière intervention 23 décembre 2014
23 déc. 2014 à 19:23
:/ pas de résultat
0