Sources du sujet précédent

Voir le sujet précédent Voir le sujet suivant Aller en bas

Sources du sujet précédent

Message  stallaf le Jeu 27 Nov 2008 - 18:39

Voici donc le code correspondant à l'énoncé du topic précédent :

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 : 54
Localisation : Gard

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Re: Sources du sujet précédent

Message  -ed- le Ven 28 Nov 2008 - 3:42

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.
OK. Quelle est la question ?

-ed-
Admin
Admin

Messages : 289
Date d'inscription : 26/05/2008
Age : 60
Localisation : Paris 6eme arrondissement (75, France)

Voir le profil de l'utilisateur http://bien-programmer.fr

Revenir en haut Aller en bas

Re: Sources du sujet précédent

Message  stallaf le Ven 28 Nov 2008 - 11:44

- ed -
OK. Quelle est la question ?
- stallaf -
Je suis bloqué à la fin de la première phase de recherche après l'affichage du tableau optimal[].
C'est donc l'enchaînement de la suite qui me pose problème.
- ed -
Je pourrais t'aider pour le codage si tu as une analyse claire (algorithme, pseudo-code)...
En effet, je ne perçois pas l'articulation que doit avoir le code pour pouvoir poursuivre.
- ed -
Je suppose que tu as eu un cours sur le graphes, l'algo de Dijkstra etc...
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 -
... Pas dans mes compétences, désolé. Je connais mes limites !
Heu, alors là... si j'en crois ce que j'ai lu un peu partout sur toi, tu exagères. Laughing

Merci cependant tu temps que tu m'as accordé.

stallaf

Messages : 4
Date d'inscription : 24/11/2008
Age : 54
Localisation : Gard

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Re: Sources du sujet précédent

Message  -ed- le Ven 28 Nov 2008 - 12:20

stallaf a écrit:
- ed -
... Pas dans mes compétences, désolé. Je connais mes limites !
Heu, alors là... si j'en crois ce que j'ai lu un peu partout sur toi, tu exagères.
Hélas non. Je t'ai donné quelques pistes.

-ed-
Admin
Admin

Messages : 289
Date d'inscription : 26/05/2008
Age : 60
Localisation : Paris 6eme arrondissement (75, France)

Voir le profil de l'utilisateur http://bien-programmer.fr

Revenir en haut Aller en bas

Re: Sources du sujet précédent

Message  Contenu sponsorisé Aujourd'hui à 21:20


Contenu sponsorisé


Revenir en haut Aller en bas

Voir le sujet précédent Voir le sujet suivant Revenir en haut

- Sujets similaires

 
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum