Dissocier les fonctions

Dissocier les fonctions - C - Programmation

Marsh Posté le 27-02-2007 à 22:08:25    

Voila j'ai le code suivant dont je n'arrive pas à faire des fonctions indépendantes, à cause de l'allocation dynamique des matrices...
si quelqu'un pourrait m'aider ca serait supre sympa ;)

Code :
  1. // Projet2A.cpp : Defines the entry point for the console application.
  2. //
  3. #include "stdafx.h"
  4. #include "stdio.h"
  5. #include "stdlib.h"
  6. #include "malloc.h"
  7. int main()
  8. {
  9. int **ini, **min, **regret, nbrVilles=0, ligne=0, k=0, min_i, min_j;
  10. int carac;
  11. FILE *ptrFichier;
  12. if((ptrFichier=fopen("D:\\Projet\\CP2\\Projet\\resultats.txt","r" ))==NULL)
  13.  exit(-1);
  14. while(carac!='\n')
  15. {
  16.  carac=fgetc(ptrFichier);
  17.  if(carac=='\t')
  18.   nbrVilles++;
  19. }
  20. rewind(ptrFichier);
  21. // on alloue dynamiquement les matrices en fonction du nombre de ville
  22. if( (ini=(int **)malloc(nbrVilles*sizeof(int *))) == NULL ) exit(-1);
  23. for( int j=0;j<nbrVilles;j++)
  24. {
  25.  if( (*(ini + j)=(int *)malloc(nbrVilles*sizeof(int))) == NULL ) exit(-1);
  26. }
  27. if( (regret=(int **)malloc(nbrVilles*sizeof(int *))) == NULL ) exit(-1);
  28. for( j=0;j<nbrVilles;j++)
  29. {
  30.  if( (*(regret + j)=(int *)malloc(nbrVilles*sizeof(int))) == NULL ) exit(-1);
  31. }
  32. // on alloue dynamiquement une matrice en fonction du nombre de ville + la colonne pour le min pr partir de chaque ville + ligne pour min en colonne
  33. if( (min=(int **)malloc( (nbrVilles+1)*sizeof(int *)) ) == NULL ) exit(-1);
  34. for(j=0;j<=nbrVilles;j++)
  35. {
  36.  if( (*(min + j)=(int *)malloc( (nbrVilles+1)*sizeof(int)) ) == NULL ) exit(-1);
  37. }
  38. for(int i=0;i<=nbrVilles;i++)
  39.  min[i][nbrVilles]=0;
  40. for(j=0;j<=nbrVilles;j++)
  41.  min[nbrVilles][j]=0;
  42. // on rempli la matrice initiale avec les distances
  43. for(i=0;i<nbrVilles;i++)
  44. {
  45.  for(j=i+1;j<nbrVilles;j++)
  46.  {
  47.   fscanf(ptrFichier,"%d",&ini[i][j]);
  48.   ini[j][i]=ini[i][j];
  49.  }
  50. }
  51. // initialisation de la matrice min
  52. for(i=0;i<nbrVilles;i++)
  53. {
  54.  printf("\n" );
  55.  for(j=0;j<nbrVilles;j++)
  56.  {
  57.   min[i][j]=ini[i][j];
  58.  }
  59. }
  60. // calcul du minimum
  61. for( i=0;i<nbrVilles;i++ )
  62. {
  63.  j=0;
  64.  if(i!=j) min[i][nbrVilles]=ini[i][j];
  65.  else min[i][nbrVilles]=ini[i][j+1];
  66.  for( j=1;j<nbrVilles;j++ )
  67.  {
  68.   if( i!=j && ini[i][j]<min[i][nbrVilles] ) min[i][nbrVilles]=ini[i][j];
  69.  }
  70. }
  71. printf("\n" );
  72. //calcul min pour partir de chaque ville
  73. for(i=0;i<nbrVilles;i++)
  74. {
  75.  for(j=0;j<nbrVilles;j++)
  76.   if(i!=j) min[i][j]-=min[i][nbrVilles];
  77. }
  78. //calcul du min par colonne et du total
  79. for( j=0;j<nbrVilles;j++ )
  80. {
  81.  i=0;
  82.  if(i!=j) min[nbrVilles][j]=min[i][j];
  83.  else min[nbrVilles][j]=min[i+1][j];
  84.  for( i=1;i<nbrVilles;i++ )
  85.   {
  86.    if(i!=j && min[i][j]<min[nbrVilles][j] ) min[nbrVilles][j]=min[i][j];
  87.   }
  88. }
  89. for( i=0;i<nbrVilles;i++)
  90. {
  91.  min[nbrVilles][nbrVilles]+=min[i][nbrVilles];
  92. }
  93. for( j=0;j<nbrVilles;j++)
  94. {
  95.  min[nbrVilles][nbrVilles]+=min[nbrVilles][j];
  96. }
  97. //calcul du regret
  98. for( i=0;i<nbrVilles;i++)
  99. {
  100.  for (j=0;j<nbrVilles;j++)
  101.  {
  102.   if( min[i][j]==0 && i!=j )
  103.   {
  104.    min_i=min[nbrVilles][nbrVilles];
  105.    for( int e=0;e<nbrVilles;e++ )
  106.    {
  107.     if(min[i][e]<min_i && e!=j && e!=i)  min_i=min[i][e];
  108.    }
  109.    min_j=min[nbrVilles][nbrVilles];
  110.    for( int f=0;f<nbrVilles;f++ )
  111.    {
  112.     if(min[f][j]<min_j && f!=i && f!=j)  min_j=min[f][j];
  113.    }
  114.    regret[i][j]=min_i+min_j;
  115.   }
  116.  }
  117. }
  118. // on affiche la matrice min pour partir de chaque ville relativement a Di
  119. printf("\n\n\nMatrice des distances separant les villes\n" );
  120. for(i=0;i<nbrVilles;i++)
  121. {
  122.  printf("\n" );
  123.  for(j=0;j<nbrVilles;j++)
  124.  {
  125.   if(i==j && i<nbrVilles && j<nbrVilles) printf("\t" );
  126.   else printf("%d \t",ini[i][j]);
  127.  }
  128. }
  129. // on affiche la matrice min pour partir de chaque ville relativement a Di
  130. printf("\n\n\nMatrice min pour partir de chaque ville relativement a Di\n" );
  131. for(i=0;i<=nbrVilles;i++)
  132. {
  133.  printf("\n" );
  134.  for(j=0;j<=nbrVilles;j++)
  135.  {
  136.   if(i==j && i<nbrVilles && j<nbrVilles) printf("\t" );
  137.   else printf("%d \t",min[i][j]);
  138.  }
  139. }
  140. // on affiche la matrice regret
  141. printf("\n\n\nMatrice des regrets\n" );
  142. for(i=0;i<nbrVilles;i++)
  143. {
  144.  printf("\n" );
  145.  for(j=0;j<nbrVilles;j++)
  146.  {
  147.   if(min[i][j]!=0) printf("\t" );
  148.   else printf("%d \t",regret[i][j]);
  149.  }
  150. }
  151. printf("\nIl y a %d villes\n",nbrVilles);
  152. system("PAUSE" );
  153. return 0;
  154. }

Reply

Marsh Posté le 27-02-2007 à 22:08:25   

Reply

Marsh Posté le 27-02-2007 à 22:24:37    

dRfELL a écrit :

Voila j'ai le code suivant dont je n'arrive pas à faire des fonctions indépendantes, à cause de l'allocation dynamique des matrices...
si quelqu'un pourrait m'aider ca serait supre sympa ;)


  • Le fichier source devrait s'appeler .c et non .cpp. Sinon, tu risques de ne pas compiler en C.
  • "stdafx.h" : fichier inconnu
  • "stdio.h" etc. n'existent pas. C'est <stdio.h> etc.
  • <malloc.h> n'est pas standard et inutile ici.
  • si une fonction n'a pas de paramètres, on le précise avec (void)
  • 'ligne' et 'k' ne sont pas utilisés
  • 'carac' est lu avant d'avoir été initialisé; Comportement indéfini.
  • les cast des malloc() sont inutiles
  • exit (-1); n'est pas portable. C'est exit (EXIT_FAILURE);
  • for (int j=0;j<nbrVilles;j++) est correct en C99, mais pas en C90
  • *(ini + j) est une façon compliquée d'écrire ini[j]


Voici de meilleures bases pour démarrer un découpage :

 

Fait de ton mieux. Des structures de données peuvent aider...

Code :
  1. struct tab2D
  2. {
  3.    int ni;
  4.    int nj,
  5.    int **tab;
  6. };


Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int main (void)
  4. {
  5.    int **ini, **min, **regret, nbrVilles = 0, min_i, min_j;
  6.    int carac;
  7.    FILE *ptrFichier;
  8.    if ((ptrFichier =
  9.         fopen ("D:\\Projet\\CP2\\Projet\\resultats.txt", "r" )) == NULL)
  10.       exit (-1);
  11.    while ((carac = fgetc (ptrFichier)) != '\n')
  12.    {
  13.       if (carac == '\t')
  14.          nbrVilles++;
  15.    }
  16.    rewind (ptrFichier);
  17. // on alloue dynamiquement les matrices en fonction du nombre de ville
  18.    if ((ini = malloc (nbrVilles * sizeof *ini)) == NULL)
  19.       exit (EXIT_FAILURE);
  20.    {
  21.       int j;
  22.       for (j = 0; j < nbrVilles; j++)
  23.       {
  24.          if ((ini[j] = malloc (nbrVilles * sizeof *ini[j])) == NULL)
  25.             exit (EXIT_FAILURE);
  26.       }
  27.    }
  28.    if ((regret = malloc (nbrVilles * sizeof *regret)) == NULL)
  29.       exit (EXIT_FAILURE);
  30.    {
  31.       int j;
  32.       for (j = 0; j < nbrVilles; j++)
  33.       {
  34.          if ((regret[j] = malloc (nbrVilles * sizeof *regret[j])) == NULL)
  35.             exit (EXIT_FAILURE);
  36.       }
  37.    }
  38. // on alloue dynamiquement une matrice en fonction du nombre de ville + la colonne pour le min pr partir de chaque ville + ligne pour min en colonne
  39.    if ((min = malloc ((nbrVilles + 1) * sizeof *min)) == NULL)
  40.       exit (EXIT_FAILURE);
  41.    {
  42.       int j;
  43.       for (j = 0; j <= nbrVilles; j++)
  44.       {
  45.          if ((min[j] = malloc ((nbrVilles + 1) * sizeof *min[j])) == NULL)
  46.             exit (EXIT_FAILURE);
  47.       }
  48.    }
  49.    {
  50.       int i;
  51.       for (i = 0; i <= nbrVilles; i++)
  52.          min[i][nbrVilles] = 0;
  53.    }
  54.    {
  55.       int j;
  56.       for (j = 0; j <= nbrVilles; j++)
  57.          min[nbrVilles][j] = 0;
  58.    }
  59. // on rempli la matrice initiale avec les distances
  60.    {
  61.       int i;
  62.       for (i = 0; i < nbrVilles; i++)
  63.       {
  64.          int j;
  65.          for (j = i + 1; j < nbrVilles; j++)
  66.          {
  67.             fscanf (ptrFichier, "%d", &ini[i][j]);
  68.             ini[j][i] = ini[i][j];
  69.          }
  70.       }
  71.    }
  72. // initialisation de la matrice min
  73.    {
  74.       int i;
  75.       for (i = 0; i < nbrVilles; i++)
  76.       {
  77.          int j;
  78.          printf ("\n" );
  79.          for (j = 0; j < nbrVilles; j++)
  80.          {
  81.             min[i][j] = ini[i][j];
  82.          }
  83.       }
  84.    }
  85. // calcul du minimum
  86.    {
  87.       int i;
  88.       for (i = 0; i < nbrVilles; i++)
  89.       {
  90.          int j = 0;
  91.          if (i != j)
  92.             min[i][nbrVilles] = ini[i][j];
  93.          else
  94.             min[i][nbrVilles] = ini[i][j + 1];
  95.          for (j = 1; j < nbrVilles; j++)
  96.          {
  97.             if (i != j && ini[i][j] < min[i][nbrVilles])
  98.                min[i][nbrVilles] = ini[i][j];
  99.          }
  100.       }
  101.    }
  102.    printf ("\n" );
  103. //calcul min pour partir de chaque ville
  104.    {
  105.       int i;
  106.       for (i = 0; i < nbrVilles; i++)
  107.       {
  108.          int j;
  109.          for (j = 0; j < nbrVilles; j++)
  110.             if (i != j)
  111.                min[i][j] -= min[i][nbrVilles];
  112.       }
  113.    }
  114. //calcul du min par colonne et du total
  115.    {
  116.       int j;
  117.       for (j = 0; j < nbrVilles; j++)
  118.       {
  119.          int i = 0;
  120.          if (i != j)
  121.             min[nbrVilles][j] = min[i][j];
  122.          else
  123.             min[nbrVilles][j] = min[i + 1][j];
  124.          for (i = 1; i < nbrVilles; i++)
  125.          {
  126.             if (i != j && min[i][j] < min[nbrVilles][j])
  127.                min[nbrVilles][j] = min[i][j];
  128.          }
  129.       }
  130.    }
  131.    {
  132.       int i;
  133.       for (i = 0; i < nbrVilles; i++)
  134.       {
  135.          min[nbrVilles][nbrVilles] += min[i][nbrVilles];
  136.       }
  137.    }
  138.    {
  139.       int j;
  140.       for (j = 0; j < nbrVilles; j++)
  141.       {
  142.          min[nbrVilles][nbrVilles] += min[nbrVilles][j];
  143.       }
  144.    }
  145. //calcul du regret
  146.    {
  147.       int i;
  148.       for (i = 0; i < nbrVilles; i++)
  149.       {
  150.          int j;
  151.          for (j = 0; j < nbrVilles; j++)
  152.          {
  153.             if (min[i][j] == 0 && i != j)
  154.             {
  155.                min_i = min[nbrVilles][nbrVilles];
  156.                {
  157.                   int e;
  158.                   for (e = 0; e < nbrVilles; e++)
  159.                   {
  160.                      if (min[i][e] < min_i && e != j && e != i)
  161.                         min_i = min[i][e];
  162.                   }
  163.                }
  164.                min_j = min[nbrVilles][nbrVilles];
  165.                {
  166.                   int f;
  167.                   for (f = 0; f < nbrVilles; f++)
  168.                   {
  169.                      if (min[f][j] < min_j && f != i && f != j)
  170.                         min_j = min[f][j];
  171.                   }
  172.                }
  173.                regret[i][j] = min_i + min_j;
  174.             }
  175.          }
  176.       }
  177.    }
  178. // on affiche la matrice min pour partir de chaque ville relativement a Di
  179.    printf ("\n\n\nMatrice des distances separant les villes\n" );
  180.    {
  181.       int i;
  182.       for (i = 0; i < nbrVilles; i++)
  183.       {
  184.          int j;
  185.          printf ("\n" );
  186.          for (j = 0; j < nbrVilles; j++)
  187.          {
  188.             if (i == j && i < nbrVilles && j < nbrVilles)
  189.                printf ("\t" );
  190.             else
  191.                printf ("%d \t", ini[i][j]);
  192.          }
  193.       }
  194.    }
  195. // on affiche la matrice min pour partir de chaque ville relativement a Di
  196.    printf
  197.       ("\n\n\nMatrice min pour partir de chaque ville relativement a Di\n" );
  198.    {
  199.       int i;
  200.       for (i = 0; i <= nbrVilles; i++)
  201.       {
  202.          int j;
  203.          printf ("\n" );
  204.          for (j = 0; j <= nbrVilles; j++)
  205.          {
  206.             if (i == j && i < nbrVilles && j < nbrVilles)
  207.                printf ("\t" );
  208.             else
  209.                printf ("%d \t", min[i][j]);
  210.          }
  211.       }
  212.    }
  213. // on affiche la matrice regret
  214.    printf ("\n\n\nMatrice des regrets\n" );
  215.    {
  216.       int i;
  217.       for (i = 0; i < nbrVilles; i++)
  218.       {
  219.          int j;
  220.          printf ("\n" );
  221.          for (j = 0; j < nbrVilles; j++)
  222.          {
  223.             if (min[i][j] != 0)
  224.                printf ("\t" );
  225.             else
  226.                printf ("%d \t", regret[i][j]);
  227.          }
  228.       }
  229.    }
  230.    printf ("\nIl y a %d villes\n", nbrVilles);
  231.    system ("PAUSE" );
  232.    return 0;
  233. }


Message cité 1 fois
Message édité par Emmanuel Delahaye le 27-02-2007 à 23:04:50

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 27-02-2007 à 22:43:15    

Emmanuel Delahaye a écrit :

Analyse en cours ...

 

  • Le fichier source devrait s'appeler .c et non .cpp. Sinon, tu risques de ne pas compiler en C.

du à Visual Studio (on utilise ça, ce n'est pas mon choix...)

  • "stdafx.h" : fichier inconnu

du à Visual Studio (on utilise ça, ce n'est pas mon choix...)

  • "stdio.h" etc. n'existent pas. C'est <stdio.h> etc.

du à Visual Studio (on utilise ça, ce n'est pas mon choix...)

  • <malloc.h> n'est pas standard et inutile ici.

je l'utilise pour l'allocation dynamique des tableaux... y a t-il une autre solution ?

  • for (int j=0;j<nbrVilles;j++) est correct en C99, mais pas en C90

peux-tu expliquer ? je ne sais pas ce qu'est la différence...



en tout cas, merci pour ton aide ;)

Reply

Marsh Posté le 27-02-2007 à 23:15:00    

dRfELL a écrit :

   * Le fichier source devrait s'appeler .c et non .cpp. Sinon, tu risques de ne pas compiler en C.
    * "stdafx.h" : fichier inconnu
    * "stdio.h" etc. n'existent pas. C'est <stdio.h> etc.

 

du à Visual Studio (on utilise ça, ce n'est pas mon choix...)

 

Je ne veux pas entendre ça. Si c'est vrai, change de compilateur. Mais tu as toujours le choix... Il suffit de mettre le bon code. Ne te laisse pas impressionner par ce que croit savoir Visual C++.

 
  • Créée un projet C
  • Sans fichiers
  • Créée un fichier vierge (xxx.c)
  • Met ce que tu veux dedans.
  • Ajoute le au projet

Non mais.

Citation :


    * <malloc.h> n'est pas standard et inutile ici.

 

je l'utilise pour l'allocation dynamique des tableaux... y a t-il une autre solution ?


Il y a déjà tout ce qu'il faut dans <stdlib.h>

 
Citation :

   * for (int j=0;j<nbrVilles;j++) est correct en C99, mais pas en C90

 

peux-tu expliquer ? je ne sais pas ce qu'est la différence...


Le C a connu 3 grandes phase d'évolution :

 
  • La naissance dans les années 70. C'est le C K&R. Il a permis d'écrire les premiers Unix...
  • La normalisation en 89/90. C'est ce C là (dit C90) qui est utilisé partout (98%)
  • La modernisation en 99. (C99) Tellement moderne qu'il n'est pas encore implémenté correctement. A éviter...


Message édité par Emmanuel Delahaye le 27-02-2007 à 23:50:38

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 27-02-2007 à 23:27:40    

/me efface vite le drapeau

Reply

Marsh Posté le 28-02-2007 à 11:27:50    

ok...
mon probleme est plus pour le moment de séparer mes fonctions de la fct main...

Reply

Marsh Posté le 28-02-2007 à 11:31:22    

dRfELL a écrit :

ok...
mon probleme est plus pour le moment de séparer mes fonctions de la fct main...


Certes, mais il fallait préparer le travail. Alors quel est le problème ? Quels sont tes essais ?
 


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 28-02-2007 à 12:16:30    

oui, je sais, j'ai fait le travail à l'envers :/
 
le probleme est que j'aimerais faire un passage par référence, et je n'y arrive pas du tout,  
j'ai bien essayé de dibouillé des trucs, genre avec un pointeur triple, mais je n'y arrive pas :sweat:

Reply

Marsh Posté le 28-02-2007 à 12:34:04    

dRfELL a écrit :

oui, je sais, j'ai fait le travail à l'envers :/
 
le probleme est que j'aimerais faire un passage par référence, et je n'y arrive pas du tout,  
j'ai bien essayé de dibouillé des trucs, genre avec un pointeur triple, mais je n'y arrive pas :sweat:


Normal, les passages par références, ça n'existe pas en C...
 
Un peu de lecture...
 
http://mapage.noos.fr/emdel/tad.htm
 
Pose des questions si tu ne comprends pas.


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 28-02-2007 à 16:07:44    

je ne vois pas comment ça peut résoudre mon probleme ?
le probleme est peut etre, que je suis pas dans une école d'info et donc la maniere dont on nous apprend le C a peut etre un manque de rigueur...
 
est-ce possible de séparer toutes les fonctions et d'en faire des fonctions autonomes (en dehors de main) ?

Reply

Marsh Posté le 28-02-2007 à 16:07:44   

Reply

Marsh Posté le 28-02-2007 à 18:43:29    

dRfELL a écrit :

je ne vois pas comment ça peut résoudre mon probleme ?
le probleme est peut etre, que je suis pas dans une école d'info et donc la maniere dont on nous apprend le C a peut etre un manque de rigueur...
 
est-ce possible de séparer toutes les fonctions et d'en faire des fonctions autonomes (en dehors de main) ?


Oui bien sûr. C'est la compilation séparée. La méthode de base est celle-ci :
 
http://mapage.noos.fr/emdel/codage [...] ser_source
http://mapage.noos.fr/emdel/codage.htm#organiser


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 04-03-2007 à 20:26:24    

merci pour la lecture, mais l'inverter de l'écran de portable à lâcher, je lirai ça dès que je le pourrai :)
 
merci!

Reply

Sujets relatifs:

Leave a Replay

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