Sources du sujet précédent
2 participants
Page 1 sur 1
Sources du sujet précédent
Voici donc le code correspondant à l'énoncé du topic précédent :
Ce code compile et s'exécute normalement chez moi.
Voilà, merci d'avance.
- Code:
/*
Nom : devoir10.C
Copyright : aucun
Author: : stallaf
Date : 31/10/08
Description : Gestion d'itinéraire entre plusieurs villes.
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define NB_VILLES 20
#define NB_CHEMINS 5
#define LONG_NOMS 30
#define VRAI 1
#define FAUX 0
typedef int BOLEEN; /* Définition du type bolléen. */
typedef struct Chemins CHEMINS; /* Alias de structure. */
struct Chemins
{
short int villeSuivante; /* N° de la ville suivante. */
int distance; /* Distance entre 2 villes. */
} chemin[NB_VILLES][NB_CHEMINS]; /* Tableau des chemins. */
typedef struct Itineraire DITI; /* Alias de structure. */
struct Itineraire
{
short int numville; /* N° de la ville. */
short int numsuiv; /* N° de la ville suivante. */
} diti[NB_VILLES]; /* Tableau servant de pile. */
/*
Fonction "consommant" les caractères jusqu'au saut de ligne ou fin
de fichier.
*/
void purge(FILE *fd)
{
if (fd != NULL)
{
int c;
while ( (c = fgetc(fd) )!= '\n' && c != EOF);
}
}
/*
Fonction nettoyante du caractere de fin de ligne.
*/
int nettoyer (char *tampon, FILE *fd)
{
int err = 0;
if (tampon != NULL && fd != NULL)
{
char *pc = strchr(tampon, '\n');
if (pc != NULL)
{
*pc = 0;
}
else
{
purge(fd);
err = 1;
}
}
return err;
}
/*
Affichage des villes et distances avec mise en forme en tableau.
*/
void afficher (char ville[][LONG_NOMS], int *nbVilles)
{
size_t i, j = 0; /* Index courants. */
short k = 0; /* " " */
fprintf (stdout, "\n");
for (; k < *nbVilles; k++)
{
fprintf (stdout, "\t %d", k);
}
fprintf (stdout, "\n");
for (i = 0; i < *nbVilles; i++)
{
fprintf (stdout, "%s %d\t", ville[i], i);
for (j = 0; j < *nbVilles; j++)
{
fprintf (stdout, "%2d %2d\t", chemin[i][j].villeSuivante, chemin[i][j].distance);
}
fprintf (stdout, "\n");
}
}
/*
Fonction de création des villes.
*/
void creerVille (char ville[][LONG_NOMS], int *nbVilles)
{
size_t i = 0; /* Index courant. */
char s_saisie[LONG_NOMS] = ""; /* Chaîne pour le nom des villes. */
BOLEEN trouve = FAUX; /* Boléen. */
fprintf (stdout, "Veuillez saisir le nom de la ville : ");
fflush (stdout);
fgets (s_saisie, sizeof s_saisie, stdin);
nettoyer (s_saisie, stdin);
/* Vérification d'un nom de ville existant. */
while ( trouve == FAUX && i < *nbVilles )
{
if (strcmp (ville[i], s_saisie) == 0)
{
/* Si la ville existe déjà, message d'erreur. */
puts ("Cette ville existe d\x82j\x85 !\n");
trouve = VRAI;
}
else
i++;
}
/* Si la ville saisie n'existe pas on l'enregistre... */
if (trouve == FAUX)
{
strcpy (ville[*nbVilles], s_saisie);
*nbVilles += 1; /* ... Et on incrémente le compteur de villes. */
}
}
/*
Fonction enregistrant les distances entre les villes.
*/
int distance (char ville[][LONG_NOMS], int *nbVilles)
{
size_t i, j = 0; /* Index courants. */
short int numVille = 0; /* Compteur. */
int longueur = 0; /* Distance entre deux villes. */
char s_ville1[LONG_NOMS] = ""; /* Chaîne pour ville de départ. */
char s_ville2[LONG_NOMS] = ""; /* Chaîne pour ville d'arrivée. */
short int depart, arrivee = 0; /* N° villes départ et arrivée. */
BOLEEN trouve = FAUX; /* Boléen. */
fprintf (stdout, "Veuillez saisir le nom de la premiere ville : ");
fflush (stdout);
fgets (s_ville1, sizeof s_ville1, stdin);
nettoyer (s_ville1, stdin);
fprintf (stdout, "Veuillez saisir la deuxieme ville : ");
fflush (stdout);
fgets (s_ville2, sizeof s_ville2, stdin);
nettoyer (s_ville2, stdin);
/* Vérification que les villes saisies existent bien. */
while ( (trouve == FAUX) && (numVille < NB_VILLES) )
{
if (strcmp (ville[numVille], s_ville1) == 0) /* Recherche ville1. */
trouve = VRAI;
else
numVille += 1;
}
if (trouve == FAUX) /* Si ville1 pas trouvé, message d'erreur et sortie. */
{
fprintf (stdout, "%s n'existe pas !\n", s_ville1);
return EXIT_FAILURE;
}
numVille = 0; /* Réinitialisation. */
trouve = FAUX; /* "" */
while ( (trouve == FAUX) && (numVille < NB_VILLES) )
{
if (strcmp (ville[numVille], s_ville2) == 0) /* Recherche ville2. */
trouve = VRAI;
else
numVille += 1;
}
if (trouve == FAUX) /* Si ville2 pas trouvé, message d'erreur et sortie. */
{
fprintf (stdout, "%s n'existe pas !\n", s_ville2);
return EXIT_FAILURE;
}
fprintf (stdout, "Saisissez la distance entre elles : ");
scanf ("%d", &longueur);
purge (stdin);
for (i = 0; i < *nbVilles + 1; i++)
{
if (strcmp(ville[i], s_ville1) == 0)
{
depart = i; /* N° de ville1 dans départ. */
}
}
for (j = 0; j < *nbVilles + 1; j++)
{
if (strcmp(s_ville2, ville[j]) == 0)
{
arrivee = j; /* N° de ville2 dans arrivee. */
}
}
/* 2 Boucles pour traitement villeSuivante et distance. */
for (i = 0; i < *nbVilles; i++)
{
if ( chemin[depart][i].villeSuivante == -1 )
{
chemin[depart][i].villeSuivante = arrivee;
chemin[depart][i].distance = longueur;
break;
}
}
for (i = 0; i < *nbVilles; i++)
{
if ( chemin[arrivee][i].villeSuivante == -1 )
{
chemin[arrivee][i].villeSuivante = depart;
chemin[arrivee][i].distance = longueur;
break;
}
}
}
/*
Fonction parcours indiquant la distance parcourue entre départ et arrivée.
*/
int parcours (char ville[][LONG_NOMS], int *nbVilles)
{
size_t i, j = 0; /* Index courants. */
short int villeArrivee = 0; /* N° de la ville courante. */
/* Boucle de présentation des parcours. */
do
{
short int etape = 0; /* N° de la ville suivante. */
short int numChemin = 0; /* Compteur de chemins. */
long longueur = 0; /* Totalise la longueur du parcours. */
fprintf (stdout, "\nVilles disponibles au d\x82part de Paris.\n");
fprintf (stdout, " VILLES / NUMERO\n");
for (i = 0; i < 20; i++)
{
fprintf (stdout, "%c", 61);
}
fprintf (stdout, "\n");
for (i = 1; i < *nbVilles; i++)
{
fprintf (stdout, " %s\t\t%d\t\n", ville[i], i);
}
fprintf (stdout, "\nSaisissez le num\x82ro d\x82sir\x82 ou 99 pour sortir : ");
fflush (stdout);
scanf ("%d", &villeArrivee);
if (villeArrivee == 99)
{
return EXIT_FAILURE;
}
/* Affichage du choix et du total parcouru depuis le départ. */
fprintf (stdout, "\nVous avez choisi %s.\n", ville[villeArrivee]);
while (j <= villeArrivee && chemin[j][numChemin].villeSuivante != -1)
{
etape = chemin[j][numChemin].villeSuivante;
fprintf (stdout, "Prochaine \x82tape %s (%d),", ville[etape], etape);
longueur += chemin[j][numChemin].distance;
fprintf (stdout, " distance : %d Kms\n", longueur);
numChemin++;
j++;
if (chemin[j][numChemin].villeSuivante == -1)
{
numChemin--;
continue;
}
}
} while (villeArrivee != 99);
}
/*
Fonction itinéraire calculant le parcours optimal entre deux villes.
*/
int itineraire (char ville[][LONG_NOMS], int *nbVilles)
{
/* Déclarations */
size_t i, j = 0; /* Index courants. */
short int villeArrivee; /* Ville à atteindre. */
short int villeCourante; /* Poisition actuelle dans la recherche. */
short int cheminSuivant; /* Chemin suivant villeCourante. */
int long_opti; /* Longueur optimale courante. */
int long_iti; /* Total des parcours. */
int optimal[NB_VILLES]; /* Numéros des villes pour longueur optimale. */
short int nbville_opti; /* Nombre d'éléments du tableau optimal. */
BOLEEN trouve = FAUX; /* Boléen, vrai si recherche OK. */
DITI *FITI = NULL; /* Pointeur vers les élements de DITI. */
/* Affichage et saisie de la ville d'arrivée. */
fprintf (stdout, "\nVilles disponibles au d\x82part de Paris.\n");
puts (" \nVILLES / NUMERO\n");
for (i = 0; i < 20; i++)
{
fprintf (stdout, "%c", 61);
}
fprintf (stdout, "\n");
for (i = 1; i < *nbVilles; i++)
{
fprintf (stdout, " %s\t\t%d\t\n", ville[i], i);
}
fprintf (stdout, "\nSaisissez le num\x82ro d\x82sir\x82 ou 99 pour sortir : ");
fflush (stdout);
scanf ("%d", &villeArrivee);
if (villeArrivee == 99)
{
return -1;
}
fprintf (stdout, "\nVous avez choisi %s.\n", ville[villeArrivee]);
/* Initialisation. */
villeCourante = 0;
cheminSuivant = 0;
long_opti = 32000; /* Nombre assez grand évitant totue confusuon. */
nbville_opti = 0;
long_iti = 0;
FITI = &diti[0]; /* Pointeur vers le 1er élément du tableau diti. */
for (i = 0; i < NB_VILLES; i++)
{
FITI -> numville = 0;
FITI -> numsuiv = 0;
}
/* Boucle de recherche du premier itinéraire. */
while ( chemin[villeCourante][cheminSuivant].villeSuivante != -1 )
{
FITI ++;
FITI -> numville = chemin[villeCourante][cheminSuivant].villeSuivante;
while ( diti[i].numville != chemin[villeCourante][cheminSuivant].villeSuivante )
{
long_iti += chemin[villeCourante][cheminSuivant].distance;
diti[i].numville != chemin[villeCourante][cheminSuivant].villeSuivante;
i++;
if ( diti[i].numsuiv != chemin[villeCourante][cheminSuivant].villeSuivante )
{
FITI -> numsuiv++;
cheminSuivant++;
break;
}
}
villeCourante++;
}
/* Enregistrement du meilleur itinéraire. */
if (long_iti < long_opti)
{
long_opti = long_iti;
for (i = 0; i < *nbVilles; i++)
{
optimal[nbville_opti] = diti[i].numville;
nbville_opti++;
}
}
/* Affichage de diti. */
puts ("Affichage de diti[] ");
for (i = 0; i < *nbVilles; i++)
{
fprintf (stdout, "\t%d", diti[i].numville);
}
fprintf (stdout, "\n");
for (i = 0; i < *nbVilles; i++)
{
fprintf (stdout, "\t%d", diti[i].numsuiv);
}
fprintf (stdout, "\n");
/* Affichage du tableau optimal[]. */
fprintf (stdout, "\nVilles traversees enregistrees dans le tableau optimal[] ");
for (i = 0; i < *nbVilles; i++)
{
fprintf (stdout, "%d\t", optimal[i]);
}
/* Affichage du meilleur itineraire. */
fprintf (stdout, "\nDistance optimale = %d\n", long_opti);
/* Essai d'un nouveau parcours restant à implémenter. */
}
/*
Fonction de test.
*/
int main (void)
{
size_t i, j = 0; /* Index courants. */
BOLEEN fin = FAUX; /* Boléen pour boucle principale. */
int nbVilles = 0; /* Compteur de villes. */
char code[15] = "" ; /* Variable stockant le choix du menu. */
char const quitter[] = "exit"; /* Valeur de sortie du programme. */
char ville[NB_VILLES][LONG_NOMS]; /* Tableau de nom des villes. */
/* Initialisation de villeSuivante à -1. */
for (i = 0; i < NB_VILLES; i++)
{
for (j = 0; j < NB_CHEMINS; j++)
{
chemin[i][j].villeSuivante = -1;
chemin[i][j].distance = 0;
}
}
do /* Boucle principale. */
{
fprintf (stdout, "\n**** GESTION D'ITINERAIRE ****\n\n"
"Option 1 = ville\n"
"Option 2 = distance\n"
"Option 3 = parcours\n"
"Option 4 = itineraire\n"
"Option 5 = affichage\n"
"Option 6 = exit\n");
puts ("Entrez votre choix ou tapez exit pour quitter ...");
fflush (stdout);
fgets (code, sizeof code, stdin);
nettoyer (code, stdin);
/* Traitement des choix. */
if (strcmp (code, "ville") == 0)
creerVille (ville, &nbVilles);
else if (strcmp (code, "distance") == 0)
distance (ville, &nbVilles);
else if (strcmp (code, "parcours") == 0)
parcours (ville, &nbVilles);
else if (strcmp (code, "itineraire") == 0)
itineraire (ville, &nbVilles);
else if (strcmp (code, "affichage") == 0)
afficher (ville, &nbVilles);
else if (strcmp (code, quitter) == 0)
fin = VRAI;
} while (fin == FAUX);
puts ("Appuyez sur Enter pour terminer...");
getch ();
return 0;
}
Ce code compile et s'exécute normalement chez moi.
Voilà, merci d'avance.
stallaf- Messages : 4
Date d'inscription : 24/11/2008
Age : 61
Localisation : Gard
Re: Sources du sujet précédent
OK. Quelle est la question ?stallaf a écrit:Voici donc le code correspondant à l'énoncé du topic précédent :
<...>
Ce code compile et s'exécute normalement chez moi.
Voilà, merci d'avance.
Re: Sources du sujet précédent
- ed -
OK. Quelle est la question ?
C'est donc l'enchaînement de la suite qui me pose problème.- stallaf -
Je suis bloqué à la fin de la première phase de recherche après l'affichage du tableau optimal[].
En effet, je ne perçois pas l'articulation que doit avoir le code pour pouvoir poursuivre.- ed -
Je pourrais t'aider pour le codage si tu as une analyse claire (algorithme, pseudo-code)...
Hélas non... je suis une formation en programmation par correspondance. Ceci est le dernier exercice en C et les cours sur ce langage sont terminés. Seules les bases sont étudiées y compris en ce qui concerne les algorithmes.- ed -
Je suppose que tu as eu un cours sur le graphes, l'algo de Dijkstra etc...
Heu, alors là... si j'en crois ce que j'ai lu un peu partout sur toi, tu exagères.- ed -
... Pas dans mes compétences, désolé. Je connais mes limites !
Merci cependant tu temps que tu m'as accordé.
stallaf- Messages : 4
Date d'inscription : 24/11/2008
Age : 61
Localisation : Gard
Re: Sources du sujet précédent
Hélas non. Je t'ai donné quelques pistes.stallaf a écrit:Heu, alors là... si j'en crois ce que j'ai lu un peu partout sur toi, tu exagères.- ed -
... Pas dans mes compétences, désolé. Je connais mes limites !
Page 1 sur 1
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum
|
|