jamsss | Bon je l'avais pas mis complet parce qu'il est un peu long mais si vous y tenez A noter que j'ai courcircuité toute la première partie qui ne sert qu'à entrer les données en mettant toute les infos directement dans les tableaux afin de tester la nouvelle fonction crée c'est à dire la fonction optimise()
Code :
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- /*Déclarations des fonctions*/
- void ajout_ville();
- void distance();
- void parcours();
- void purger();
- void optimise();
- /*Déclarations des constantes*/
- #define LONGNOM 30
- #define NB_VILLES 20
- #define NB_CHEMINS 5
- /*Déclarations des variables globales*/
- int *nbvilles;
- char ville[NB_VILLES][LONGNOM]={"paris","arras","reims","dijon","metz"};
- struct {
- short ville_suiv;
- short distance;
- } chemin[NB_VILLES][NB_CHEMINS]={{{1,170},{2,140},{3,315},{-1,0},{-1,0}},{{0,170},{4,345},{2,160},{-1,0},{-1,0}},{{0,140},{1,160},{4,175},{-1,0},{-1,0}},{{0,315},{4,235},{-1,0},{-1,0},{-1,0}},{{1,345},{2,175},{3,235},{-1,0},{-1,0}},{{-1,0},{-1,0},{-1,0},{-1,0},{-1,0}},{{-1,0},{-1,0},{-1,0},{-1,0},{-1,0}},{{-1,0},{-1,0},{-1,0},{-1,0},{-1,0}},{{-1,0},{-1,0},{-1,0},{-1,0},{-1,0}},{{-1,0},{-1,0},{-1,0},{-1,0},{-1,0}},{{-1,0},{-1,0},{-1,0},{-1,0},{-1,0}},{{-1,0},{-1,0},{-1,0},{-1,0},{-1,0}},{{-1,0},{-1,0},{-1,0},{-1,0},{-1,0}},{{-1,0},{-1,0},{-1,0},{-1,0},{-1,0}},{{-1,0},{-1,0},{-1,0},{-1,0},{-1,0}},{{-1,0},{-1,0},{-1,0},{-1,0},{-1,0}},{{-1,0},{-1,0},{-1,0},{-1,0},{-1,0}},{{-1,0},{-1,0},{-1,0},{-1,0},{-1,0}},{{-1,0},{-1,0},{-1,0},{-1,0},{-1,0}},{{-1,0},{-1,0},{-1,0},{-1,0},{-1,0}}};;
- typedef struct
- {
- short numville;
- short numsuiv;
- } DITI;
- int main()
- {
- /*Déclarations des variables locales*/
- int i,j;
- char code[8];
- nbvilles=0;
- /*Initialisation du tableau 'chemin'
- for(i=0;i<NB_VILLES;i++)
- {
- for(j=0;j<NB_CHEMINS;j++)
- {
- chemin[i][j].ville_suiv=-1;
- }
- }*/
- /*Affichage du menu*/
- while(strcmp(code,"quitter" )!=0)
- {
- printf("-Pour entrer une nouvelle ville, tapez 'ville'\n" );
- printf("-Pour entrer une distance entre 2 villes, tapez 'distance'\n" );
- printf("-Pour calculer un parcours, tapez 'parcours'\n" );
- printf("-Pour rechercher l'itinéraire optimal entre deux villes, tapez 'optimise'\n" );
- printf("-Pour quitter le programme, tapez 'quitter'\n" );
- scanf("%s",code);
- purger();
- if(strcmp(code,"ville" )==0) ajout_ville(&nbvilles);
- else if(strcmp(code,"distance" )==0) distance(&nbvilles);
- else if(strcmp(code,"parcours" )==0) parcours(&nbvilles);
- else if(strcmp(code,"optimise" )==0) optimise(&nbvilles);
- }
- return 0;
- }
- void ajout_ville(int *nbvilles)
- {
- int i;
- char nomville[LONGNOM];
- /*Vérification qu'on ne depasse pas la capacité du tableau*/
- if(*nbvilles>=NB_VILLES)
- {
- printf("Vous avez atteint le nombre maximum de villes\n" );
- return;
- }
- /*Entrée de la nouvelle ville*/
- (*nbvilles)++;
- printf("Entrez le nom de la nouvelle ville:\n" );
- scanf("%s",nomville);
- purger();
- /*Vérification que la ville n'est pas déjà existante*/
- for(i=0;i<*nbvilles;i++)
- {
- if(strcmp(ville[i],nomville)==0)
- {
- printf("La ville existe déjà !\n" );
- (*nbvilles)--;
- return;
- }
- }
- /*Copie de la ville dans le tableau*/
- strcpy(ville[*nbvilles-1],nomville);
- }
- void distance(int *nbvilles)
- {
- char ville1[LONGNOM],ville2[LONGNOM];
- int longueur, depart, arrivee, i;
- depart=21;
- arrivee=21;
- /*Entrée des villes et de la distance*/
- printf("Entrez la première ville\n" );
- scanf("%s",ville1);
- purger();
- printf("Entrez la deuxième ville\n" );
- scanf("%s",ville2);
- purger();
- printf("Entrez la distance entre les 2\n" );
- scanf("%i",&longueur);
- purger();
- /*Recherche des villes dans le tableau*/
- for(i=0;i<*nbvilles;i++)
- {
- if(strcmp(ville[i],ville1)==0) depart=i;
- if(strcmp(ville[i],ville2)==0) arrivee=i;
- }
- /*Vérification que les 2 villes existent*/
- if(depart==21)
- {
- printf("La ville %s n'existe pas ! (Utilisez le module 'Entrer une ville')\n\n",ville1);
- return;
- }
- if(arrivee==21)
- {
- printf("La ville %s n'existe pas ! (Utilisez le module 'Entrer une ville')\n\n",ville2);
- return;
- }
- /*Entrées des informations dans le tableau chemin*/
- i=0;
- while(chemin[depart][i].ville_suiv!=-1) i++;
- chemin[depart][i].ville_suiv=arrivee;
- chemin[depart][i].distance=longueur;
- i=0;
- while (chemin[arrivee][i].ville_suiv!=-1) i++;
- chemin[arrivee][i].ville_suiv=depart;
- chemin[arrivee][i].distance=longueur;
- }
- void parcours(int *nbvilles)
- {
- int i,j,k,ville_courante,longueur,ville_precedente;
- longueur=0;
- /*Affichage de toutes les villes avec leur numéro*/
- for(i=0;i<*nbvilles;i++) printf("%i-%s\n",i,ville[i]);
- /*Demande de saisie de la ville de départ*/
- printf("Entrez le numéro de la ville de départ:\n" );
- scanf("%i",&ville_courante);
- purger();
-
- i=0;
- while(chemin[ville_courante][i].ville_suiv!=-1)
- {
- printf("Destinations possibles:\n" );
- for(j=0;chemin[ville_courante][j].ville_suiv!=-1;j++) printf("%i-%s\n",chemin[ville_courante][j].ville_suiv,ville[chemin[ville_courante][j].ville_suiv]);
- printf("La longueur totale parcourue est de %i Km\n",longueur);
- ville_precedente=ville_courante;
- i=0;
- printf("Entrez le numéro de la ville suivante:\n" );
- scanf("%i",&ville_courante);
- purger();
- while(ville_precedente==ville_courante)
- {
- printf("Vous etes déja à %s, entrez une autre ville svp:\n",ville[ville_courante]);
- scanf("%i",&ville_courante);
- purger();
- }
- if(ville_courante==99) return;
- k=0;
- while(chemin[ville_courante][k].ville_suiv!=ville_precedente) k++;
- longueur+=chemin[ville_courante][k].distance;
- i++;
- }
- printf("Il n'y a pas d'autres villes suivantes ! (Utilisez le module 'Entrer une distance')\n\n" );
- }
- void optimise(int *nbvilles)
- {
- *nbvilles=5;
- /*Déclarations des variables locales*/
- DITI *diti;
- DITI *fiti;
- DITI *test;
- int long_opti,optimal[NB_VILLES],nbville_opti,i,long_iti,ville_fin,j;
- short sortie;
- /*Allocation des pointeurs*/
- diti=malloc(sizeof(DITI));
- fiti=malloc(sizeof(DITI));
- test=malloc(sizeof(DITI));
- for(i=0;i<NB_VILLES;i++)
- {
- for(j=0;j<NB_CHEMINS;j++)
- {
- printf("%i\n",chemin[i][j].ville_suiv);
- }
- }
- /*Initialisation des variables*/
- long_opti=32000;
- long_iti=0;
- nbville_opti=0;
- sortie=0;
- /*Demande du choix de l'itinéraire*/
- printf("Villes disponibles:\n" );
- for(i=0;i<*nbvilles;i++) printf("%i-%s\n",i,ville[i]);
- printf("Entrez l'itinéraire à calculer\n" );
- printf("N° de la ville de départ\n" );
- scanf("%hi",&diti->numville);
- purger();
- printf("N° de la ville d'arrivée\n" );
- scanf("%i",&ville_fin);
- purger();
- /*On met le premier chemin à essayer dans la première case du tableau*/
- if(chemin[0][diti->numville].ville_suiv!=-1) diti->numsuiv=0;
- else printf("Il n'y a aucun chemin qui part de cette ville !\n" );
- fiti=diti;
- /*Boucle jusqu'à la fin de la recherche*/
- while(sortie!=1)
- {
- if(chemin[fiti->numsuiv][fiti->numville].ville_suiv!=-1)
- {
- (fiti+1)->numville=chemin[fiti->numsuiv][fiti->numville].ville_suiv;
- (fiti+1)->numsuiv=0;
- }
- else
- {
- fiti--;
- if (fiti==diti) sortie=1;
- }
- /*Recherche si la ville n'est pas déjà présente*/
- for(test=diti;test<(fiti+1);test++)
- {
- if((fiti+1)->numville==test->numville)
- {
- (fiti->numsuiv)++;
- (fiti+1)->numville=chemin[fiti->numsuiv][fiti->numville].ville_suiv;
- break;
- }
- else
- {
- long_iti+=chemin[fiti->numsuiv][fiti->numville].distance;
- nbville_opti++;
- fiti++;
- }
- }
- if(fiti->numville==ville_fin && long_iti<long_opti)
- {
- long_opti=long_iti;
- for(i=0;i<nbville_opti;i++) optimal[i]=(diti+i)->numville;
- fiti--;
- long_iti-=chemin[fiti->numville][fiti->numsuiv].distance;
- nbville_opti--;
- fiti->numsuiv++;
- }
- }
- /*On affiche la longueur totale et la liste des villes traversés*/
- printf("La distance la plus courte entre %s et %s est de %i Km\n",ville[diti->numville],ville[ville_fin],long_opti);
- printf("Liste des villes traversées:\n" );
- for(i=0;i<nbville_opti;i++) printf("%s\n",ville[optimal[i]]);
- }
- void purger()
- {
- int c;
- while ((c=getchar()) != '\n' && c != EOF)
- {}
- }
|
|