IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Tours de Hanoï


Sujet :

C

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 5
    Points : 2
    Points
    2
    Par défaut Tours de Hanoï
    Bonjour tout le monde,
    Je dispose d'un programme écrit en C qui traite le jeu des tours de Hanoï avec une fonction récursive.
    voilà le code source:

    http://www.codeswall.info/s553

    Je dois modifier le programme C ci-dessus a fin que chaque
    appel récursif soit effectué par un nouveau processus créé par le programme. Les processus
    devront communiquer entre eux via des tubes et des signaux devront être envoyés a fin
    d'informer les processus père et fils respectifs du bon déroulement du jeu.

    J'espère que quelqu'un a des pistes pour moi, car là je vois pas comment s'en sortir.Merci

  2. #2
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 720
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 720
    Points : 31 043
    Points
    31 043
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par bentarito Voir le message
    Bonjour tout le monde,
    Je dispose d'un programme écrit en C qui traite le jeu des tours de Hanoï avec une fonction récursive.
    voilà le code source:

    http://www.codeswall.info/s553

    Je dois modifier le programme C ci-dessus a fin que chaque
    appel récursif soit effectué par un nouveau processus créé par le programme. Les processus
    devront communiquer entre eux via des tubes et des signaux devront être envoyés a fin
    d'informer les processus père et fils respectifs du bon déroulement du jeu.

    J'espère que quelqu'un a des pistes pour moi, car là je vois pas comment s'en sortir.Merci
    Salut

    Bah, suffit de trouver l'algo. Moi je verrais bien les choses ainsi: Chaque processus aura charge de déplacer "n" pions. Toutefois, pour en déplacer "n", il faut d'abord en déplacer (n-1), puis déplacer le dernier puis redéplacer les "n-1".
    Donc créer autant de processus que de pions. Chaque processus sera chargé de déplacer le nb de pions associé à son n° (le P1 déplace 1 pions, le P2 en déplace 2 etc).
    Donc le processus qui déplace les "n" devra d'abord se mettre en contact avec le processus qui a charge de déplacer les "n-1". Il lui communiquera par pipe tous les paramètres de déplacement (tour de départ, tour d'arrivée, nb de pions).
    Cet autre processus commencera par déplacer les n-1 pions de la tour de départ vers la tour intermédiaire. Une fois qu'il aura fini ses "n-1", il enverra une info via un signal au processus qui déplace les n pour lui dire "ok". Le processus n déplacera le dernier pion puis enverra une info au processus n-1 pour lui dire "ok, tu peux recommencer" et le processus n-1 redéplacera ses "n-1" pions de la tour intermédiaire vers la tour d'arrivée. Bien entendu, le travail du processus n-1 sera basé sur le même principe (pour déplacer n-1 pions il faut en déplacer d'abord n-2 etc etc etc).
    Une fois que le dernier processus a fini, il informe les autres et tous s'éteignent proprement.

    Ensuite ben un peu de fork(), un peu de kill(), un peu de signal(), un peu de pipe() et voilà quoi. Bien entendu il te faut connaitre le fonctionnement de tous ces outils...

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Merci sve@r pour votre réponse;
    en fait ce sujet je l'ai posté y'a longtemps dans un autre forum mais j'avais pas reçu de réponse.
    Du coup j'ai avancé tout seul mais j'avais du mal à compiler( et je ne suis pas sur si c'était ce qu'il fallait faire).
    (PS: je suis débutant en C, et ce qui est pire c'est que j'ai raté une année du programme, car j'ai entamé directement la 2ème année dans mon actuelle université alors que j'ai fait ma 1ère année ailleurs)
    voilà mon code:
    http://www.codeswall.info/source-556...-de-Hanoi.html
    Merci pour votre aide

  4. #4
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 720
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 720
    Points : 31 043
    Points
    31 043
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par bentarito Voir le message
    Merci sve@r pour votre réponse;
    en fait ce sujet je l'ai posté y'a longtemps dans un autre forum mais j'avais pas reçu de réponse.
    Du coup j'ai avancé tout seul mais j'avais du mal à compiler( et je ne suis pas sur si c'était ce qu'il fallait faire).
    (PS: je suis débutant en C, et ce qui est pire c'est que j'ai raté une année du programme, car j'ai entamé directement la 2ème année dans mon actuelle université alors que j'ai fait ma 1ère année ailleurs)
    voilà mon code:
    http://www.codeswall.info/source-556...-de-Hanoi.html
    Merci pour votre aide
    Bon, ok suis allé chercher le code pour le mettre ici parce que travailler à distance...

    Donc voici le code recopié
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    #include<stdio.h>
    #include<stdlib.h>
    #include<unistd.h>
    #include<fcntl.h>
    #include<sys/wait.h>
    #include<sys/types.h>
    #include<signal.h>
     
    #define FROM 1
    #define TO 3
    #define USING 2
     
     
    void fonctionsignal(int sig)
    {
          if(sig == SIGUSR1)
          {
                fprintf(stderr, "Ecriture du message par un fils\n");
          }
    }
     
     
    void hanoi(int n, int from, int to, int using)
    {
        int pid1, pid2, statut, cpt;
        int fd1[2], fd2[2];
        char buf[30], msg[] = "Processus terminer avec succes";
     
     
        if(n>0)
        {
            //création des tubes
            if(pipe(fd1) ==-1)
            {
                perror("Erreur à la création du tube");
                exit(-2);
            }
            if(pipe(fd2) ==-1)
            {
                perror("Erreur à la création du tube");
                exit(-2);
            }
     
            //création du premier fils
            switch (pid1 = fork())
            {
                case -1 :
                    printf ("Erreur à la création du fils");
                    break;
     
                case 0 :
                    hanoi(n-1, from, using, to);
                    close(fd1[0]);
     
                    //ecriture du message
                    if(write(fd1[1],msg, sizeof(msg)) ==-1)
                    {
                        perror("Erreur lors de l'écriture du message");
                        exit(-3);
                    }
     
                    break;
     
                default :
                     //reception du signal
                    if(signal(SIGUSR1, fonctionsignal) == SIG_ERR)
                    {
                            fprintf(stderr, "Erreur lors de l'association du signal\n");
                            exit(-1);
                    }
     
                    while(wait(&statut) !=pid1); //attend que le fils se termine
                    close(fd[1]);
     
                    //lecture du message
                    while ((cpt=read(fd1[0],buf,sizeof(buf)-1))>0)
                    {
                        buf[cpt]='/0';
                        fprintf(stderr, "%s\n", buf);
                    }
     
                    printf("deplace %d --> %d\n", from, to);
     
                    //envoie du signal
                    kill (getppid(), SIGUSR1);
     
                    //création du deuxième fils
                    switch (pid2 = fork())
                    {
                        case -1 :
                            printf ("Erreur à la création du fils");
                            break;
     
                        case 0 :
                            hanoi(n-1, using, to, from);
                            close(fd1[0]);
     
                            //ecriture du message
                            if(write(fd2[1],msg, sizeof(msg)) ==-1)
                            {
                                perror("Erreur lors de l'écriture du message");
                                exit(-3);
                            }
     
                            break;
                        default :
                            //reception du signal
                            if(signal(SIGUSR1, fonctionsignal) == SIG_ERR)
                            {
                                fprintf(stderr, "Erreur lors de l'association du signal\n");
                                exit(-1);
                            }
                            while(wait(&statut) !=pid2); //attend que le fils se termine
                            close(fd[1]);
     
                            //lecture du message
                            while ((cpt=read(fd1[0],buf,sizeof(buf)-1))>0)
                            {
                                buf[cpt]='/0';
                                fprintf(stderr, "%s\n", buf);
                            }
     
                    }
            }
        }
    }
     
     
    int main(int argc, char **argv)
    {
        int n, statut, cpt;
        int fd[2];
        char buf[30], msg[] = "Processus terminer avec succes";
     
        if (argc !=2)
        {
            fprintf(stderr, "usage: %s NombreDeDisques \n", argv[0]);
            exit (1);
        }
        n = atoi (argv[1]);
     
        //Création du tube
        if(pipe(fd) ==-1)
        {
            perror("Erreur à la création du tube");
            exit(-2);
        }
     
        //Création du fils
        switch (pid = fork())
        {
            case -1 :
                printf ("Erreur à la création du fils");
                break;
     
            case 0 :
                hanoi(n, FROM, TO, USING);
                close(fd[0]);
     
                //ecriture du message
                if(write(fd[1],msg, sizeof(msg)) ==-1)
                {
                    perror("Erreur lors de l'écriture du message");
                    exit(-3);
                }
     
                break;
            default:
                //reception du signal
                if(signal(SIGUSR1, fonctionsignal) == SIG_ERR)
                    {
                        fprintf(stderr, "Erreur lors de l'association du signal\n");
                        exit(-1);
                    }
     
     
                while(wait(&statut) !=pid); //attend que le fils se termine
                //lecture du tube
                close(fd[1]);
                while ((cpt=read(fd[0],buf,sizeof(buf)-1))>0)
                {
                    buf[cpt]='/0';
                    fprintf(stderr, "%s\n", buf);
                }
        }
     
        return 0;
    }

    Pour l'instant, tout ce que je peux dire sur ce code, c'est qu'il n'y a aucune structure, aucune idée qui le sous-tend. Je le vois écrire un message dans un pipe pour être récupéré par un autre processus et affiché à l'écran. Bref aucune idée vraiment constructrice. On sent que tu sais pas où tu vas.

    Ben malheureusement un programme c'est pas des fonctions mises au hasard pour faire genre. Ca commence par une idée, qu'on couche sur papier, avec un petit schéma pour essayer de rendre le tout cohérent avec le but à atteindre. Une fois qu'on a posé la base, on peut construire le programme qui suivra la ligne directrice. On écria alors les fonctions maitresses, puis les fonctions annexes au fur et à mesure que l'idée avancera.

    En l'état, mis à part tout reprendre de zéro, on ne peut rien faire.

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Bon merci pour votre temps en tout cas , je vais réessayer et je vous poste ça dés que j finis

  6. #6
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 393
    Points : 23 740
    Points
    23 740
    Par défaut
    À noter également que « using » est un mot-clé réservé en C++. Donc, en C, il n'y a pas de problème, mais si tu utilises un compilateur qui traite les deux langages et que la distinction n'est pas faite explicitement, il va se plaindre et tu risques d'obtenir des messages d'erreur abscons.

  7. #7
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 720
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 720
    Points : 31 043
    Points
    31 043
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Obsidian Voir le message
    et tu risques d'obtenir des messages d'erreur abscons.
    Pourquoi "abs" ???

Discussions similaires

  1. Tour de hanoï
    Par overside dans le forum Débuter
    Réponses: 3
    Dernier message: 26/09/2010, 15h51
  2. Tour de Hanoï : problème
    Par frank2243 dans le forum C++
    Réponses: 3
    Dernier message: 17/09/2009, 23h45
  3. [MIDlet Pascal] Jeu des Tours de Hanoï
    Par krachik dans le forum Contribuez
    Réponses: 1
    Dernier message: 27/05/2009, 20h04
  4. Variante des tours de Hanoï (disques pairs, impairs)
    Par loader dans le forum Débuter avec Java
    Réponses: 0
    Dernier message: 23/09/2008, 09h29

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo