Emmanuel Delahaye C is a sharp tool | 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 :
- struct tab2D
- {
- int ni;
- int nj,
- int **tab;
- };
|
Code :
- #include <stdio.h>
- #include <stdlib.h>
- int main (void)
- {
- int **ini, **min, **regret, nbrVilles = 0, min_i, min_j;
- int carac;
- FILE *ptrFichier;
- if ((ptrFichier =
- fopen ("D:\\Projet\\CP2\\Projet\\resultats.txt", "r" )) == NULL)
- exit (-1);
- while ((carac = fgetc (ptrFichier)) != '\n')
- {
- if (carac == '\t')
- nbrVilles++;
- }
- rewind (ptrFichier);
- // on alloue dynamiquement les matrices en fonction du nombre de ville
- if ((ini = malloc (nbrVilles * sizeof *ini)) == NULL)
- exit (EXIT_FAILURE);
- {
- int j;
- for (j = 0; j < nbrVilles; j++)
- {
- if ((ini[j] = malloc (nbrVilles * sizeof *ini[j])) == NULL)
- exit (EXIT_FAILURE);
- }
- }
- if ((regret = malloc (nbrVilles * sizeof *regret)) == NULL)
- exit (EXIT_FAILURE);
- {
- int j;
- for (j = 0; j < nbrVilles; j++)
- {
- if ((regret[j] = malloc (nbrVilles * sizeof *regret[j])) == NULL)
- exit (EXIT_FAILURE);
- }
- }
- // 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
- if ((min = malloc ((nbrVilles + 1) * sizeof *min)) == NULL)
- exit (EXIT_FAILURE);
- {
- int j;
- for (j = 0; j <= nbrVilles; j++)
- {
- if ((min[j] = malloc ((nbrVilles + 1) * sizeof *min[j])) == NULL)
- exit (EXIT_FAILURE);
- }
- }
- {
- int i;
- for (i = 0; i <= nbrVilles; i++)
- min[i][nbrVilles] = 0;
- }
- {
- int j;
- for (j = 0; j <= nbrVilles; j++)
- min[nbrVilles][j] = 0;
- }
- // on rempli la matrice initiale avec les distances
- {
- int i;
- for (i = 0; i < nbrVilles; i++)
- {
- int j;
- for (j = i + 1; j < nbrVilles; j++)
- {
- fscanf (ptrFichier, "%d", &ini[i][j]);
- ini[j][i] = ini[i][j];
- }
- }
- }
- // initialisation de la matrice min
- {
- int i;
- for (i = 0; i < nbrVilles; i++)
- {
- int j;
- printf ("\n" );
- for (j = 0; j < nbrVilles; j++)
- {
- min[i][j] = ini[i][j];
- }
- }
- }
- // calcul du minimum
- {
- int i;
- for (i = 0; i < nbrVilles; i++)
- {
- int j = 0;
- if (i != j)
- min[i][nbrVilles] = ini[i][j];
- else
- min[i][nbrVilles] = ini[i][j + 1];
- for (j = 1; j < nbrVilles; j++)
- {
- if (i != j && ini[i][j] < min[i][nbrVilles])
- min[i][nbrVilles] = ini[i][j];
- }
- }
- }
- printf ("\n" );
- //calcul min pour partir de chaque ville
- {
- int i;
- for (i = 0; i < nbrVilles; i++)
- {
- int j;
- for (j = 0; j < nbrVilles; j++)
- if (i != j)
- min[i][j] -= min[i][nbrVilles];
- }
- }
- //calcul du min par colonne et du total
- {
- int j;
- for (j = 0; j < nbrVilles; j++)
- {
- int i = 0;
- if (i != j)
- min[nbrVilles][j] = min[i][j];
- else
- min[nbrVilles][j] = min[i + 1][j];
- for (i = 1; i < nbrVilles; i++)
- {
- if (i != j && min[i][j] < min[nbrVilles][j])
- min[nbrVilles][j] = min[i][j];
- }
- }
- }
- {
- int i;
- for (i = 0; i < nbrVilles; i++)
- {
- min[nbrVilles][nbrVilles] += min[i][nbrVilles];
- }
- }
- {
- int j;
- for (j = 0; j < nbrVilles; j++)
- {
- min[nbrVilles][nbrVilles] += min[nbrVilles][j];
- }
- }
- //calcul du regret
- {
- int i;
- for (i = 0; i < nbrVilles; i++)
- {
- int j;
- for (j = 0; j < nbrVilles; j++)
- {
- if (min[i][j] == 0 && i != j)
- {
- min_i = min[nbrVilles][nbrVilles];
- {
- int e;
- for (e = 0; e < nbrVilles; e++)
- {
- if (min[i][e] < min_i && e != j && e != i)
- min_i = min[i][e];
- }
- }
- min_j = min[nbrVilles][nbrVilles];
- {
- int f;
- for (f = 0; f < nbrVilles; f++)
- {
- if (min[f][j] < min_j && f != i && f != j)
- min_j = min[f][j];
- }
- }
- regret[i][j] = min_i + min_j;
- }
- }
- }
- }
- // on affiche la matrice min pour partir de chaque ville relativement a Di
- printf ("\n\n\nMatrice des distances separant les villes\n" );
- {
- int i;
- for (i = 0; i < nbrVilles; i++)
- {
- int j;
- printf ("\n" );
- for (j = 0; j < nbrVilles; j++)
- {
- if (i == j && i < nbrVilles && j < nbrVilles)
- printf ("\t" );
- else
- printf ("%d \t", ini[i][j]);
- }
- }
- }
- // on affiche la matrice min pour partir de chaque ville relativement a Di
- printf
- ("\n\n\nMatrice min pour partir de chaque ville relativement a Di\n" );
- {
- int i;
- for (i = 0; i <= nbrVilles; i++)
- {
- int j;
- printf ("\n" );
- for (j = 0; j <= nbrVilles; j++)
- {
- if (i == j && i < nbrVilles && j < nbrVilles)
- printf ("\t" );
- else
- printf ("%d \t", min[i][j]);
- }
- }
- }
- // on affiche la matrice regret
- printf ("\n\n\nMatrice des regrets\n" );
- {
- int i;
- for (i = 0; i < nbrVilles; i++)
- {
- int j;
- printf ("\n" );
- for (j = 0; j < nbrVilles; j++)
- {
- if (min[i][j] != 0)
- printf ("\t" );
- else
- printf ("%d \t", regret[i][j]);
- }
- }
- }
- printf ("\nIl y a %d villes\n", nbrVilles);
- system ("PAUSE" );
- return 0;
- }
|
---------------
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/
|