prob avec mon code

prob avec mon code - C - Programmation

Marsh Posté le 16-11-2014 à 10:26:40    

c'est le code d'un carré magique . j'ai un probleme quand avec la fonction verifMagique partie aprés else car meme quand j'introduit une matrice magique exp de carré magique  2 7 6 9 5 1 4 3 8

Code :
  1. #include<stdio.h>
  2. #include<conio.h>
  3. void saisieMat(int T[50][50],int n)
  4. {int i,j;
  5. printf("saisir\n" );
  6. for(i=0;i<n;i++)
  7. for(j=0;j<n;j++)
  8. {
  9. printf("T[%d][%d]=\t",i,j);
  10. scanf("%d",&T[i][j]);
  11. }
  12. }
  13. void afficher(int T[50][50],int n)
  14. {
  15. int i,j;
  16.  printf("les elements du tab\n" );
  17. for(i=0;i<n;i++)
  18.  for(j=0;j<n;j++)
  19. printf("%d\t",T[i][j]);
  20. }
  21. int verifMagique(int T[50][50],int n)
  22. {
  23. int verif,i,j,d1,d2,s1,s2;
  24. d1=0;
  25. d2=0;
  26. s1=0;
  27.  s2=0;
  28.    verif=1;
  29. for(i=0;i<n;i++)
  30. {
  31.  d1=d1+T[i][i];
  32.  d2=d2+T[i][n-1-i];
  33. }
  34. if(d1!=d2)
  35.     verif=0;
  36. else
  37. { j=0;
  38. do
  39. {
  40.  for(i=0;i<n;i++)
  41.  {
  42.   s1+=T[j][i];
  43.   s2+=T[i][j];
  44.  }        j++;
  45.  if(s1!=d1||s2!=d1)
  46.  verif=0;
  47. }while(j<=n&&verif==1);}
  48. return(verif);}
  49. int main()
  50. {int n,verif;
  51. int T[50][50];
  52. do
  53. {printf("saisir taille de la matrice n=" );
  54. scanf("%d",&n);
  55. }while(0>=n);
  56. saisieMat(T,n);
  57. afficher(T,n);
  58. verif=verifMagique(T,n);
  59. printf("\ncarre magique si verif = 1 sinon verif=0\nverif=%d",verif);
  60. }


merci :)


Message édité par gilou le 16-11-2014 à 11:20:08
Reply

Marsh Posté le 16-11-2014 à 10:26:40   

Reply

Marsh Posté le 16-11-2014 à 14:05:44    

J'ai tapé à vue (donc sans tester), mais j'aurais fait qque chose comme ceci:
 

Code :
  1. int verifMagique(int T[50][50],int n)
  2. {
  3.     int i, j;
  4.     int sum = 0, dia = 0;
  5.     // calcul de la valeur pour la diagonale principale
  6.     for( i = 0; i < n; i++) {
  7.         dia += T[i][i];
  8.     }
  9.     // calcul de la valeur pour la diagonale secondaire
  10.     for( i = 0; i < n; i++) {
  11.         sum += T[i][n-(i+1)];
  12.     }
  13.     // test
  14.     if ( sum - dia) {
  15.         return 0;
  16.     }
  17.     // calcul pour chaque ligne
  18.     for( i = 0; i < n; i++) {
  19.         // RAZ
  20.         sum = 0;
  21.         // calcul de la ligne
  22.         for( j = 0; j < n; j++) {
  23.             sum += T[i][j];
  24.         }
  25.         // test
  26.         if ( sum - dia) {
  27.             return 0;
  28.         }
  29.     }
  30.     // calcul pour chaque colonne
  31.     for( i = 0; i < n; i++) {
  32.         // RAZ
  33.         sum = 0;
  34.         // calcul de la colonne
  35.         for( j = 0; j < n; j++) {
  36.             sum += T[j][i];
  37.         }
  38.         // test
  39.         if ( sum - dia) {
  40.             return 0;
  41.         }
  42.     }
  43.     // les deux diagonales, chaque ligne et chaque colonne égale à la valeur de dia
  44.     // we've got a winner
  45.     return 1;
  46. }


 
et on peut regrouper pour gagner en concision:
 

Code :
  1. int verifMagique(int T[50][50],int n)
  2. {
  3.     int i, j;
  4.     int sum1 = 0, sum2 = 0, dia = 0;
  5.     for( i = 0; i < n; i++) {
  6.         dia += T[i][i];
  7.         sum1 += T[i][n-(i+1)];
  8.     }
  9.     if ( sum1 - dia) {
  10.         return 0;
  11.     }
  12.     for( i = 0; i < n; i++) {
  13.         // RAZ
  14.         sum1 = 0;
  15.         sum2 = 0;
  16.         for( j = 0; j < n; j++) {
  17.             sum1 += T[i][j];
  18.             sum2 += T[j][i];
  19.         }
  20.         if ((sum1 - dia) || (sum2 - dia)) {
  21.             return 0;
  22.         }
  23.     }
  24.     return 1;
  25. }


C'est plus ou moins ton code, mais c'est plus clair avec des boucles for que des do IMHO. Et tu oublies de réinitialiser tes sommes dans ton code.
Et avoir des returns un peu partout dans cette fonction n'est pas un pb, vu qu'elle n'alloue aucune ressource.
A+,


Message édité par gilou le 16-11-2014 à 14:28:34

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed