Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
856 connectés 

 


 Mot :   Pseudo :  
 
 Page :   1  2
Page Suivante
Auteur Sujet :

[C] Calcul du déterminant d'une matrice [résolu] :sol

n°276184
Giz
Posté le 26-12-2002 à 20:21:18  profilanswer
 

Reprise du message précédent :

farib a écrit :


 
il a pas besoin de tant allouer !


 
Rien a foutre de l'optimisation c un sujet d'examen !! ... le but c ke ca marche !  :fou:

mood
Publicité
Posté le 26-12-2002 à 20:21:18  profilanswer
 

n°276248
farib
Posté le 26-12-2002 à 23:04:25  profilanswer
 

Giz a écrit :


 
Rien a foutre de l'optimisation c un sujet d'examen !! ... le but c ke ca marche !  :fou:  


waza


Message édité par farib le 26-12-2002 à 23:28:20

---------------
Bitcoin, Magical Thinking, and Political Ideology
n°276495
Giz
Posté le 27-12-2002 à 16:19:02  profilanswer
 

Giz a écrit :

Voilà je galère un peu, alors j'ai l'algo (c t un ex a faire):
 
On considère une matrice carrée M de dimension n, n >= 1, dont les éléments sont notés m(i,j), avec 1<=i<=n, 1<=j<=n. Le déterminant de M noté D est égal à:
 
D= m(1,1) si n=1,
   Somme de k=1 à n de : (-1)^(k+1)*m(k,1)D(k) si n>1.
 
D(k) est le déterminant d'une sous matrice de M obtenue en lui supprimant la ligne k et la colonne 1.
 
--> Ecrire une fonction C qui permet de calculer le déterminant d'une matrice carrée de dimension n.
 
----------------------------------------------------------------
Voilà ci dessus TEL QUEL l'énoncé.
 
Voici ci dessous ma fonction C (décomposé en 2 fonctions) dont je sais qu'elle est fausse car:
1- Le résultat est faux (mon determine est tjs nul)
2- Je ne sais pas comment libérer la mémoire allouer par malloc()
 
 

Code :
  1. /***************************************************************************************/
  2. //Calcul du determinant de la matrice M
  3. int determinant(int **M, int dim)
  4. {
  5. int somme = 0, **m;
  6. int i, k, taille = dim;
  7. static int compteur = 0;
  8. compteur++;
  9. printf("entree n %d dans la fonction determinant()\n", compteur);
  10. afficher(M, dim);
  11. if (taille > 1)
  12. {
  13.  for(k=0;k<taille;k++)
  14.  {
  15.   //Calcul du "sous" determinant
  16.   m = (int**)malloc(sizeof(int*)*taille-1);
  17.   for(i=0;i<taille-1;i++)
  18.    m[i] = (int*)malloc(sizeof(int)*taille-1);
  19.   initialisation_sous_matrice(m, M, k, taille);
  20.   //Cas k pair
  21.   if((k+1)%2)
  22.                         //les 2 lignes ci dessous, la ou é t l'erreur (avec balises )
  23.    somme += -1*M[k][ [g]1 ]*determinant(m, taille-1);
  24.   //Cas k impair
  25.   else
  26.    somme += M[k][ 1 ]*determinant(m, taille-1);
  27.  }
  28.                 //Ce qui suit est en commentaire car je ne vois pas comment déssallouer la mémoire ds un 1er tps !
  29.  /*for(i=0;i<taille-1;i++)
  30.   free(m[i]);
  31.  free (m);*/
  32. }
  33. else
  34.  return M[0][0];
  35. return somme;
  36. }
  37. /***************************************************************************************/
  38. //Calcul du sous determinant de la matrice M
  39. void initialisation_sous_matrice(int **m, int **M, int k, int taille)
  40. {
  41. int i, j, l;
  42. l = -1;
  43. for(i=0;i<taille;i++)
  44. {
  45.  if (i==k)
  46.  {
  47.   l = i-1;
  48.   continue;
  49.  }
  50.  l++;
  51.  for(j=1;j<taille;j++)
  52.   m[l][j-1] = M[i][j];
  53. }
  54. return;
  55. }


----------------------------------------------------------------
 
Comme d'hab, si vous a v des questions ou besoin de précision pour m'éclaicir sur ce code, dite le moi ;) ... parce que jsuis un peu bloqué (jmi suis penché 1H !)


 
Nickel, j'ai trouvé !  [:thraell]  
...2 caractères ds le code a changer ! (en gras)
ds l'énoncé c t marké :
Somme de k=1 à n de : (-1)^(k+1)*m(k,1)D(k) si n>1.
le "*m(k,1)" ca ve dire, k-ième ligne, 1ère colonne donc d'indice ZERO !!...2 caractères a changer et now ca roulezzzzzzz.... :sol:  
 
Thx a tous qd meme :)


Message édité par Giz le 27-12-2002 à 16:23:01
n°276540
Giz
Posté le 27-12-2002 à 17:15:39  profilanswer
 

Voilà la version finale, avec pour exemple le calcul du déterminant d'une matrice symétrique :
0 2 2
2 0 2
2 2 0
 
(det = 16)
 
-----------------------------------------------------------------
 

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define N 3
  4. void initialisation(int **M);
  5. void afficher(int **M, int taille);
  6. int  determinant(int **M, int dim);
  7. void initialisation_sous_matrice(int **m, int **M, int k, int taille);
  8. int main()
  9. {
  10. //Creation de la matrice
  11. int i, **matrice;
  12. matrice  = (int**)malloc(sizeof(int*)*N);
  13. for(i=0;i<N;i++)
  14.  matrice[i] = (int*)malloc(sizeof(int)*N);
  15. initialisation(matrice);
  16. afficher(matrice, N);
  17. i = determinant(matrice, N);
  18. printf("Valeur du déterminant de la matrice : %d\n", i);
  19. afficher(matrice, N);
  20. return 0;
  21. }
  22. /***************************************************************************************/
  23. //Remplissage de la matrice par l'utilisateur
  24. void initialisation(int **M)
  25. {
  26. int i,j;
  27. printf("Saisi de la matrice : \n\n" );
  28. for(i=0;i<N;i++)
  29. {
  30.  for(j=0;j<N;j++)
  31.  {
  32.   if (i==j)
  33.    M[i][j] = 0;
  34.   else
  35.    M[i][j] = 2;
  36.   //fflush(stdin);
  37.   //scanf("%d", &M[i][j]);
  38.  }
  39.  printf("\n" );
  40. }
  41. printf("\n\n" );
  42. return;
  43. }
  44. /***************************************************************************************/
  45. //Affichage de la matrice
  46. void afficher(int **M, int taille)
  47. {
  48. int i,j;
  49. printf("Affichage de la matrice : \n\n" );
  50. for(i=0;i<taille;i++)
  51. {
  52.  for(j=0;j<taille;j++)
  53.   printf("%3d", M[i][j]);
  54.  printf("\n" );
  55. }
  56. printf("\n\n" );
  57. return;
  58. }
  59. /***************************************************************************************/
  60. //Calcul du determinant de la matrice
  61. int determinant(int **M, int dim)
  62. {
  63. int somme = 0, **m;
  64. int i, k, chiffre, taille = dim;
  65. static int **matrice_initiale = M;
  66. //5 lignes suivantes pour le debuggage
  67. static int compteur = 0;
  68. compteur++;
  69. printf("entree n %d dans la fonction determinant()\n", compteur);
  70. printf("Adresse de la matrice initiale : %s\n", matrice_initiale);
  71. afficher(M, dim);
  72. if (taille > 1)
  73. {
  74.  for(k=0;k<taille;k++)
  75.  {
  76.   //Calcul du "sous" determinant
  77.   m = (int**)malloc(sizeof(int*)*taille-1);
  78.   for(i=0;i<taille-1;i++)
  79.    m[i] = (int*)malloc(sizeof(int)*taille-1);
  80.   initialisation_sous_matrice(m, M, k, taille);
  81.   //Cas k pair
  82.   if((k+1)%2)
  83.    somme += -1*M[k][0]*determinant(m, taille-1);
  84.   //Cas k impair
  85.   else
  86.    somme += M[k][0]*determinant(m, taille-1);
  87.   if(k == taille-1)
  88.   {
  89.    /*Pensez à la désallocation mémoire de toutes les sous matrices !
  90.     *APRES que la dernière ligne a été traitée !
  91.     */
  92.    /*Ne pas effacer la PREMIERE MATRICE (passée par l'utilisateur)*/
  93.    if(M != matrice_initiale)
  94.    {
  95.     for(i=0;i<taille;i++)
  96.      free(M[i]);
  97.     free (M);
  98.    }
  99.   }
  100.  }
  101. }
  102. else
  103. {
  104.  //Pensez à la désallocation mémoire (cas de matrice 1*1) !
  105.  chiffre = M[0][0];
  106.  for(i=0;i<taille;i++)
  107.   free(M[i]);
  108.  free (M);
  109.  return chiffre;
  110. }
  111. return somme;
  112. }
  113. /***************************************************************************************/
  114. //Calcul du sous determinant de la matrice M
  115. void initialisation_sous_matrice(int **m, int **M, int k, int taille)
  116. {
  117. int i, j, l;
  118. l = -1;
  119. for(i=0;i<taille;i++)
  120. {
  121.  //Virement de la k-ième ligne
  122.  if (i==k)
  123.  {
  124.   l = i-1;
  125.   continue;
  126.  }
  127.  l++;
  128.  for(j=1;j<taille;j++)
  129.   m[l][j-1] = M[i][j];
  130. }
  131. return;
  132. }


 
----------------------------------------------------------------
 
Désallocation mémoire comprise bien sûr !
 
PS: la valeur de somme é t nul car juste au dessus c t initialisé a 0...ce n'é qua la sortie de la fct que somme vo kkchose  :sarcastic:

mood
Publicité
Posté le   profilanswer
 

 Page :   1  2
Page Suivante

Aller à :
Ajouter une réponse
 

Sujets relatifs
[Java] Convertir un String en un Object Color [Résolu][Java] Rechercher un String dans un autre String [Résolu]
[Java] Occuper plusieurs cases dans un GridLayout? [Résolu][Java] Conversion int,double <-> object est ce possible? [Résolu]
probleme de <SELECT> et présélection d'une value [RESOLU]ident failed for user machin?? d'où ça vient (Postgres inside)[résolu]
[C] Liste chainée que j'arrive pas à parcourir [resolu]Calcul volume d'une page php envoyée
[résolu - C & Linux] Compilation du C sous Mandrake[Java / Swing] Boite de dialogue avec JDialog ? [Résolu]
Plus de sujets relatifs à : [C] Calcul du déterminant d'une matrice [résolu] :sol


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR