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 :

Problème de boucle do..while


Sujet :

C

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 57
    Par défaut Problème de boucle do..while
    Je sors de ma boucle alors que les conditions ne sont pas remplies, quelqu'un peut m'aider : voici mon code :
    Code : 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
     
    int ArretProgramme()
    {
        /* Fonction renvoyant 0 ou 1
        0 traduit o et 1 traduit n
        0=On quitte le programme
        1=On reste dans le programe
        */
        int i;
        int car;   
        printf("\nConfirmez-vous vraiment l'arr%ct du programme : (O)OUI et (N)NON :",136);
        car=getche(); /*Recupération de la valeur saisie sur écran */
        if ((car=='o') || (car=='O')) /* Si on a tapé o ou O donc on quitte */
        {
            i=1;
        }
        else /*Sinon n ou autre valeur on ne quitte pas et on renvoie une erreur si ce n'etait n */
        {
            if ((car=='N') || (car=='n'))
            {
                i=0;
            }
            else
            {
                printf("Retour au menu principal, car mauvais choix.\n");
                i=0;
            }
        }
        /*printf("Nombre retourné :%d\n",i);*/
        return i; /*Renvoi de la valeur saisie */
    }
     
     
     
     
    int main(int argc, char *argv[])
    {
        int iOption;
        int iArret;
        /*Appel de l'affichage du menu principal*/
        do
        {
            iArret=1;
            AffichageMenu();
            /*iOption=ChoixOption();*/
            printf("Veuillez-S%cl%ctionner une option 1,2,3,4 : ",130,130);
            iOption=getche();
            /*printf("Valeur de l'option : %c\n",iOption);*/
            switch (iOption)
            {
                case 49:
                    printf("\nModule de saisie\n");
                    /*iOption=*/getche();
                   continue;
                case 50:printf("\nModule de tri\n");getche();break;
                case 51:printf("\nModule de suppression\n");getche();break;
                case 52 :iArret=ArretProgramme();break;
                default : iOption=getche();printf("\nValeur par defaut\n");continue; 
            }
     
        }while(iArret != 1 && iOption != 53); /* tant que iArret(flag de la fonction Arret programme ne vaut pas 1 et iOption choix menu
        différent de 4 on affiche le menu principal */  
        printf("\nValeur de iOption : %d\n",iOption);
    	return 0;
    }

  2. #2
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Bien le bonjour,

    - Quelle condition ?
    - Quelle est l'exécution que tu fais qui pose problème...

    Jc

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 57
    Par défaut condition
    salut,

    la voici mes conditions

    while(iArret != 1 && iOption != 53);

  4. #4
    Membre expérimenté

    Étudiant
    Inscrit en
    Mai 2006
    Messages
    200
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2006
    Messages : 200
    Par défaut
    tu n'aurait pas fait une erreur ??

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    case 52 :iArret=ArretProgramme();break;
    et plus loin

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    }while(iArret != 1 && iOption != 53);
    ca vient peut etre de là

  5. #5
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Premièrement :
    Code : 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
     
    cond.c: In function 'ArretProgramme':
    cond.c:10: warning: implicit declaration of function 'printf'
    cond.c:10: warning: incompatible implicit declaration of built-in function 'printf'
    cond.c:11: warning: implicit declaration of function 'getche'
    cond.c: In function 'main':
    cond.c:43: warning: implicit declaration of function 'AffichageMenu'
    cond.c:45: warning: incompatible implicit declaration of built-in function 'printf'
    cond.c:62: warning: incompatible implicit declaration of built-in function 'printf'
    cond.c:35: warning: unused parameter 'argc'
    cond.c:35: warning: unused parameter 'argv'
    /tmp/ccCsRWfB.o: In function `ArretProgramme':cond.c:(.text+0x1b): undefined reference to `getche'
    /tmp/ccCsRWfB.o: In function `main':cond.c:(.text+0x5c): undefined reference to `AffichageMenu'
    :cond.c:(.text+0x7d): undefined reference to `getche'
    :cond.c:(.text+0x97): undefined reference to `getche'
    :cond.c:(.text+0xf2): undefined reference to `getche'
    :cond.c:(.text+0x11f): undefined reference to `getche'
    :cond.c:(.text+0x14c): undefined reference to `getche'
    Voilà ce que me rend le compilateur...

    Ensuite :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
            switch (iOption)
            {
                case 49:
                    printf("\nModule de saisie\n");
                    /*iOption=*/
                   continue;
                case 50:printf("\nModule de tri\n");break;
                case 51:printf("\nModule de suppression\n");break;
                case 52 :iArret=ArretProgramme();break;
                default : iOption=getchar();printf("\nValeur par defaut\n");continue; 
            }
    Utiliser les codes ascii en numérique rend le code non portable... Il faut utiliser '1', '2', '3' ...

    Enfin, je ne sais pas ce que tu fais pour voir le problème... Donne un exemple d'exécution à problème...

    Jc

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 57
    Par défaut condition
    Oui, peut être à ce niveau, mais je viens de corriger et je continue toujoirs à sortir du boucle.
    En tapant 1(49), je devrais me retrouver toujours à l'écran avec module de saisie mais au contraire je sors.

  7. #7
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Citation Envoyé par chental
    Oui, peut être à ce niveau, mais je viens de corriger et je continue toujoirs à sortir du boucle.
    En tapant 1(49), je devrais me retrouver toujours à l'écran avec module de saisie mais au contraire je sors.
    Non, en tapant 1, iArret demeure à 1 donc la boucle se termine...

    Jc

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 57
    Par défaut Conditions
    Ci-joint la fonction main modifiée mais le problème persiste.
    Il faut que les deux conditions suivantes soient remplies pour sortir de la boucle :
    Pour sortir de la boucle, il faut que iArret valle 1 et iOption valle 5

    int main(int argc, char *argv[])
    {
    int iOption=1;
    int iArret=0;
    /*Appel de l'affichage du menu principal*/
    do
    {
    iArret=1;
    AffichageMenu();
    /*iOption=ChoixOption();*/
    printf("Veuillez-S%cl%ctionner une option 1,2,3,4 : ",130,130);
    iOption=getche();
    /*printf("Valeur de l'option : %c\n",iOption);*/
    switch (iOption)
    {
    case '1':
    printf("\nModule de saisie\n");
    /*iOption=*/getche();
    continue;
    case '2':printf("\nModule de tri\n");getche();break;
    case '3':printf("\nModule de suppression\n");getche();break;
    case '4':printf("\nModule de sauvegarde\n");getche();break;
    case '5' :iArret=ArretProgramme();break;
    default : iOption=getche();printf("\nValeur par defaut\n");break;
    }

    }while(iArret != 1 && iOption != '5'); /* tant que iArret(flag de la fonction Arret programme ne vaut pas 1 et iOption choix menu
    différent de 4 on affiche le menu principal */
    printf("\nValeur de iOption : %d\n",iOption);
    return 0;
    }

  9. #9
    Membre expérimenté

    Étudiant
    Inscrit en
    Mai 2006
    Messages
    200
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2006
    Messages : 200
    Par défaut
    il faut que tu initailise et dans la condition de ta boucle tu poura enlever car ca ne servira plus je pense

  10. #10
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Je crois que t'as un problème de compréhension sur le fonctionnement de la condition...

    Si la condition est fausse -> On sort

    Or : Si iArret == 1 alors (!iArret && n'importe quoi) -> FAUX donc la boucle se termine...

    Ce que tu voudrais serait plutôt :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    !((iArret==1)&&(iOption=='5'))
    ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ((!iArret)||(iOption!='5'))
    (Loi de Morgan)
    Jc

  11. #11
    Membre Expert
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Par défaut
    Pourquoi pas juste

    Vu que la fonction "ArretProgramme()" indique vraiment si on doit sortir ou non

    et bien placer iArret à 0 et pas à 1

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    int iArret=0;
    /*Appel de l'affichage du menu principal*/
    do
    {
    iArret=1; // à supprimer !

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 57
    Par défaut Conditions
    J'ai enlevé la condition iOption et laissé le iArret à (iarret!=1) et cela fonctionne, merci les gars de votre participation, en effet j' en conclus un problème de compréhension car en ce moment stressé par ma non rapidité dans l'écriture de ce futuire dll. encore une fois merci

  13. #13
    Membre Expert
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Par défaut
    Mais de rien Chantal, nous sommes des chevaliers servant, sans peur et sans reproche, qui volons à la rescousse des plus démunis dans ce monde impitoyable qu'es le C

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème avec variable dans boucle DO WHILE
    Par bandit_debutant dans le forum Langage
    Réponses: 13
    Dernier message: 25/02/2008, 16h34
  2. [MySQL] Problème sur Boucle While après un LEFT JOIN
    Par matperino dans le forum PHP & Base de données
    Réponses: 12
    Dernier message: 28/05/2007, 17h43
  3. [MySQL] Problème de boucle while
    Par Justin_C dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 27/12/2006, 19h16
  4. Problème Boucle Do-While?!
    Par Julien_C++ dans le forum C++
    Réponses: 6
    Dernier message: 29/07/2006, 12h23
  5. [MySQL] Problème de boucle while sur base de données
    Par Darhyl dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 05/05/2006, 15h11

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