Aller au contenu

Change
Photo

Soucis boucle While en C


  • Veuillez vous connecter pour répondre
19 réponses à ce sujet

#1
Fitfit

Fitfit

    Geek certifié

  • Membre
  • 1 558 messages
  • Localisation<°(((((><
Bonjour à tous ! :slt:

Lors de la réalisation d'un petit programme, une erreur survient lors d'une saisie incorrecte. Grace à la boucle while, l'utilisateur est censé recevoir 1 message d'erreur puis doit à nouveau rentrer une donnée.
Le problème, c'est que le message s'affiche 2 fois pour une raison qui m'échappe.


    char choix;
    
    printf(" Entrez 'o' ou 'h' : ");
        //lecture du choix
        scanf("%c",&choix);

    while(choix!='o' && choix!='h')
    {
        printf("Choix incorrect ! "); // erreur?
            scanf("%c",&choix);
    }
Pourriez-vous m'éclairer ? Merci ! ;)
  • 0

1353655852-userbar-p4g.jpg
G73JH-A1 150W [1er modèle]
Intel Core i7 720QM - 8GB DDR3 1333MHz RAM - ATI Mobility™ Radeon HD 5870, 1GB GDDR5 VRAM -  Ecran 17.3" AUO B173HW01 V.5 Full LED Backlit - 2x500GB Seagate Momentus™ 7200rpm - Lecteur Blu-ray


#2
mahousensei

mahousensei

    Lécheur fou

  • Membre
  • 5 955 messages
  • LocalisationBelgique
C'est pas un && (et) c'est un || (ou, en java c'est || en C je sais pas) que tu dois mettre, sinon tu dois mettre o et h. :P

Modifié par mahousensei, 19 novembre 2012 - 13:07.

  • 0

D4G: P8Z68-V PRO Gen3, >i5-2500k< 4,6GHz 1,3v, MSI >SLI GTX 670 PE<, Co&Ge 16Go, Fractal Core 3k, S. 830 SSD 64Go + Sea. 1To 7,2kTr/mn, C.TX850M. FS10629.

ASUS G46VW-CZ078H: HD+, >i7-3630QM<, C.Vengeance 8Go, >GTX 660M OC<,  750Go. FS2297. Sony VAIO VGN-FE21H: 1er portable/secours. M15x: vendu.
Bureau: Asus 3xVE228H, Razer Mamba 4G, Leviathan et Sabertooth, Steelseries QcK, G430, G27, CM QuickFire TK, etc. "Consoles": OnePlus 2, Gear VR 2 + S6.


#3
taredevideo

taredevideo

    Vidéopathe

  • Membre
  • 3 685 messages
  • LocalisationToronto (PVT) =D
:+1: Il faut mettre || dans la boucle
  • 0

#4
Fitfit

Fitfit

    Geek certifié

  • Membre
  • 1 558 messages
  • Localisation<°(((((><
J'ai essayé, mais ça fait exactement la même chose, le programme marque 2 fois le message d'erreur. Le seul cas ou le programme marque une seule fois le message, c'est quand on effectue une saisie vide :gne:
  • 0

1353655852-userbar-p4g.jpg
G73JH-A1 150W [1er modèle]
Intel Core i7 720QM - 8GB DDR3 1333MHz RAM - ATI Mobility™ Radeon HD 5870, 1GB GDDR5 VRAM -  Ecran 17.3" AUO B173HW01 V.5 Full LED Backlit - 2x500GB Seagate Momentus™ 7200rpm - Lecteur Blu-ray


#5
mahousensei

mahousensei

    Lécheur fou

  • Membre
  • 5 955 messages
  • LocalisationBelgique
Et si tu sépare ton while (tu en met 2 en cascade) ? (moi c'est java donc je ne connais pas les spécificités du C)
  • 0

D4G: P8Z68-V PRO Gen3, >i5-2500k< 4,6GHz 1,3v, MSI >SLI GTX 670 PE<, Co&Ge 16Go, Fractal Core 3k, S. 830 SSD 64Go + Sea. 1To 7,2kTr/mn, C.TX850M. FS10629.

ASUS G46VW-CZ078H: HD+, >i7-3630QM<, C.Vengeance 8Go, >GTX 660M OC<,  750Go. FS2297. Sony VAIO VGN-FE21H: 1er portable/secours. M15x: vendu.
Bureau: Asus 3xVE228H, Razer Mamba 4G, Leviathan et Sabertooth, Steelseries QcK, G430, G27, CM QuickFire TK, etc. "Consoles": OnePlus 2, Gear VR 2 + S6.


#6
Fitfit

Fitfit

    Geek certifié

  • Membre
  • 1 558 messages
  • Localisation<°(((((><
Je ne vois pas trop comment le mettre en cascade :/
La condition pour entrer dans le boucle, c'est que la donnée ait une valeur différente de h ou o.

Normalement c'est censé m'afficher uniquement une fois le message d'erreur il me semble ...
  • 0

1353655852-userbar-p4g.jpg
G73JH-A1 150W [1er modèle]
Intel Core i7 720QM - 8GB DDR3 1333MHz RAM - ATI Mobility™ Radeon HD 5870, 1GB GDDR5 VRAM -  Ecran 17.3" AUO B173HW01 V.5 Full LED Backlit - 2x500GB Seagate Momentus™ 7200rpm - Lecteur Blu-ray


#7
mahousensei

mahousensei

    Lécheur fou

  • Membre
  • 5 955 messages
  • LocalisationBelgique
char choix;
    
printf(" Entrez 'o' ou 'h' : ");
//lecture du choix
scanf("%c",&choix);

while(choix!='o'){
      while(choix!='h'){
        printf("Choix incorrect ! "); // erreur?
           scanf("%c",&choix);
        }
}
EDIT: Non en fait c'est de la *oups, j'ai marché dedans !* ce que je viens de faire laisse tomber. XD

Avec le || si tu met o ou h il rentre dans la boucle ou pas ?

Modifié par mahousensei, 19 novembre 2012 - 13:40.

  • 0

D4G: P8Z68-V PRO Gen3, >i5-2500k< 4,6GHz 1,3v, MSI >SLI GTX 670 PE<, Co&Ge 16Go, Fractal Core 3k, S. 830 SSD 64Go + Sea. 1To 7,2kTr/mn, C.TX850M. FS10629.

ASUS G46VW-CZ078H: HD+, >i7-3630QM<, C.Vengeance 8Go, >GTX 660M OC<,  750Go. FS2297. Sony VAIO VGN-FE21H: 1er portable/secours. M15x: vendu.
Bureau: Asus 3xVE228H, Razer Mamba 4G, Leviathan et Sabertooth, Steelseries QcK, G430, G27, CM QuickFire TK, etc. "Consoles": OnePlus 2, Gear VR 2 + S6.


#8
Fitfit

Fitfit

    Geek certifié

  • Membre
  • 1 558 messages
  • Localisation<°(((((><
EDIT : Oui, cela fait la même chose que mon code, la syntaxe est correcte ( il ne faut pas oublier d'enlever les ' ' ). Ha non, j'aurais juré que ça marchait xD

Modifié par Fitfit, 19 novembre 2012 - 13:46.

  • 0

1353655852-userbar-p4g.jpg
G73JH-A1 150W [1er modèle]
Intel Core i7 720QM - 8GB DDR3 1333MHz RAM - ATI Mobility™ Radeon HD 5870, 1GB GDDR5 VRAM -  Ecran 17.3" AUO B173HW01 V.5 Full LED Backlit - 2x500GB Seagate Momentus™ 7200rpm - Lecteur Blu-ray


#9
Arkh

Arkh

    Geek diplomé

  • Membre
  • 2 259 messages
Bon alors, on recommence par remettre le && (Logical AND) a la place du || (Logical OR) qui était correct. En effet la boucle while se lit : Tant que vrai, continuer a faire la boucle. Si tu lis ton premier code, il est conforme a la logique : Tant que le caractère rentre est diffèrent de o et est diffèrent h alors on continue de demander.. Dans le cas d'un doute, faites une table de vérité...

Ensuite, petit re-factoring de code pour ne pas écrire deux fois la même portion :
char choice;
//lecture du choix  
do
{
   printf(" Entrez 'o' ou 'h' : "); // Évite de faire disparaître la commande avec des messages d'erreur.
   scanf("%c",&choix);
}
while(choix!='o' && choix!='h');
Enfin, pour ce qui t'intéresse, il faut comprendre ce que l'utilisateur tape : pour un choix erroné, par exemple : x\n
Cette nouvelle ligne vient de l'appui sur la touche entrée. Le programme va donc lire ces deux caractères s'il y a une erreur sur le premier. C'et pour cela que tu vois deux erreurs (test : affiche le caractère mis en cause pour vérifier). Par contre, pour ton code, je suis contre scanf, un petit getchar serait beaucoup mieux adapte : [C++ Reference]getchar.
  • 0

D900F : I7 950 (8x3.1Ghz) /// 6GB DDR3 1333MHz (3x2Go) /// GTX 280M (128CC/1GHz/1Go) /// 2x320GB 7200Trs/min /// WUXGA Non-Glare Screen 1920x1200 /// Razer Abyssus /// NC-2000 /// By PcSystems-EvolutionX /// Powered by Debian!

> Get Process Explorer


#10
Fitfit

Fitfit

    Geek certifié

  • Membre
  • 1 558 messages
  • Localisation<°(((((><
Merci pour tes conseils, mais le code qui est écrit affiche deux fois le message d'erreur lui aussi :/
  • 0

1353655852-userbar-p4g.jpg
G73JH-A1 150W [1er modèle]
Intel Core i7 720QM - 8GB DDR3 1333MHz RAM - ATI Mobility™ Radeon HD 5870, 1GB GDDR5 VRAM -  Ecran 17.3" AUO B173HW01 V.5 Full LED Backlit - 2x500GB Seagate Momentus™ 7200rpm - Lecteur Blu-ray


#11
Arkh

Arkh

    Geek diplomé

  • Membre
  • 2 259 messages

Merci pour tes conseils, mais le code qui est écrit affiche deux fois le message d'erreur lui aussi :/

Euh, tu n'as pas lu mon post n'est-ce-pas?
char choice;
//lecture du choix  
do
{
   printf(" Entrez 'o' ou 'h' : ");
   choice = getchar();
   putchar(choice);
   printf("\n");
}
while(choice!='o' && choice!='h');

Modifié par Arkh, 19 novembre 2012 - 16:35.

  • 0

D900F : I7 950 (8x3.1Ghz) /// 6GB DDR3 1333MHz (3x2Go) /// GTX 280M (128CC/1GHz/1Go) /// 2x320GB 7200Trs/min /// WUXGA Non-Glare Screen 1920x1200 /// Razer Abyssus /// NC-2000 /// By PcSystems-EvolutionX /// Powered by Debian!

> Get Process Explorer


#12
Fitfit

Fitfit

    Geek certifié

  • Membre
  • 1 558 messages
  • Localisation<°(((((><
Il n'y a pas moyen d'empêcher la lecture de plus d'un caractère ?
Juste lire le premier caractère donc.
  • 0

1353655852-userbar-p4g.jpg
G73JH-A1 150W [1er modèle]
Intel Core i7 720QM - 8GB DDR3 1333MHz RAM - ATI Mobility™ Radeon HD 5870, 1GB GDDR5 VRAM -  Ecran 17.3" AUO B173HW01 V.5 Full LED Backlit - 2x500GB Seagate Momentus™ 7200rpm - Lecteur Blu-ray


#13
Arkh

Arkh

    Geek diplomé

  • Membre
  • 2 259 messages
Tu peux flusher stdin après le scanf, mais c'est juste dégueulasse :
while (c!='\n' && c!=EOF) c=getchar();

  • 0

D900F : I7 950 (8x3.1Ghz) /// 6GB DDR3 1333MHz (3x2Go) /// GTX 280M (128CC/1GHz/1Go) /// 2x320GB 7200Trs/min /// WUXGA Non-Glare Screen 1920x1200 /// Razer Abyssus /// NC-2000 /// By PcSystems-EvolutionX /// Powered by Debian!

> Get Process Explorer


#14
Fitfit

Fitfit

    Geek certifié

  • Membre
  • 1 558 messages
  • Localisation<°(((((><
Bah j'en ai besoin donc vu que ça fonctionne je vais le laisser. Merci pour l'idée ;)
Sinon, en quoi c'est dégueulasse ?

EDIT : Le problème c'est que ça ne prends plus en compte le 'o' ou 'h' dans ce cas là.

Modifié par Fitfit, 19 novembre 2012 - 16:56.

  • 0

1353655852-userbar-p4g.jpg
G73JH-A1 150W [1er modèle]
Intel Core i7 720QM - 8GB DDR3 1333MHz RAM - ATI Mobility™ Radeon HD 5870, 1GB GDDR5 VRAM -  Ecran 17.3" AUO B173HW01 V.5 Full LED Backlit - 2x500GB Seagate Momentus™ 7200rpm - Lecteur Blu-ray


#15
Arkh

Arkh

    Geek diplomé

  • Membre
  • 2 259 messages
Et bien généralement, on essaie de faire au plus simple et au plus propre. Si tu veux lire un seul caractère venant de l'utilisateur, tu fais getchar sinon, si tu veux lire une chaîne, tu utilise gets (mais je suis pas contre recoder quelque chose pour éviter le dépassement de tampon) sinon, tu veux lire l'entrée de façon formaté donc tu utilises scanf.

Modifié par Arkh, 19 novembre 2012 - 17:05.

  • 0

D900F : I7 950 (8x3.1Ghz) /// 6GB DDR3 1333MHz (3x2Go) /// GTX 280M (128CC/1GHz/1Go) /// 2x320GB 7200Trs/min /// WUXGA Non-Glare Screen 1920x1200 /// Razer Abyssus /// NC-2000 /// By PcSystems-EvolutionX /// Powered by Debian!

> Get Process Explorer


#16
Fitfit

Fitfit

    Geek certifié

  • Membre
  • 1 558 messages
  • Localisation<°(((((><
do

    {

        //LECTURE CHOIX

        printf("Entrez 'o' pour octal ou 'h' pour hexadecimal : ");

            scanf("%c",&choix);

       

        //FLUSH STDIN - pour eviter d'afficher le 'printf' plusieurs fois

        while (choix!='\n' && choix!=EOF) choix=getchar();



    }while(choix!='o' && choix!='h'); //VERIFICATION CHOIX

  • 0

1353655852-userbar-p4g.jpg
G73JH-A1 150W [1er modèle]
Intel Core i7 720QM - 8GB DDR3 1333MHz RAM - ATI Mobility™ Radeon HD 5870, 1GB GDDR5 VRAM -  Ecran 17.3" AUO B173HW01 V.5 Full LED Backlit - 2x500GB Seagate Momentus™ 7200rpm - Lecteur Blu-ray


#17
Arkh

Arkh

    Geek diplomé

  • Membre
  • 2 259 messages
Ah oui effectivement, mais la avant le test while(choix!='o' && choix!='h'), la variable choix ne peut contenir que '\n' ou EOF, a cause du code de la ligne précédente; donc forcément ça ne passe pas. Il faut remplacer choix dans while (choix!='\n' && choix!=EOF) choix=getchar(); par une variable bidon qui ne servira qu'a ça...

Mais je maintiens que ça serait BEAUCOUP mieux avec getchar.
  • 0

D900F : I7 950 (8x3.1Ghz) /// 6GB DDR3 1333MHz (3x2Go) /// GTX 280M (128CC/1GHz/1Go) /// 2x320GB 7200Trs/min /// WUXGA Non-Glare Screen 1920x1200 /// Razer Abyssus /// NC-2000 /// By PcSystems-EvolutionX /// Powered by Debian!

> Get Process Explorer


#18
Fitfit

Fitfit

    Geek certifié

  • Membre
  • 1 558 messages
  • Localisation<°(((((><
Tu pourrais me réécrire le code comme tu le vois ?
Parce que j'ai testé avec getchar et je n'ai pas vu de différence :/
  • 0

1353655852-userbar-p4g.jpg
G73JH-A1 150W [1er modèle]
Intel Core i7 720QM - 8GB DDR3 1333MHz RAM - ATI Mobility™ Radeon HD 5870, 1GB GDDR5 VRAM -  Ecran 17.3" AUO B173HW01 V.5 Full LED Backlit - 2x500GB Seagate Momentus™ 7200rpm - Lecteur Blu-ray


#19
Arkh

Arkh

    Geek diplomé

  • Membre
  • 2 259 messages
Oups my bad...

//lecture du choix
        char choice = '\n'; // evite le premier flush
        do
        {
                while(choice!='\n' && choice!=EOF) choice=getchar(); // flush si la précédente saisie est erronée
                printf(" Entrez 'o' ou 'h' : ");
                choice = getchar();
        }
        while(choice!='o' && choice!='h');

Modifié par Arkh, 19 novembre 2012 - 17:29.

  • 0

D900F : I7 950 (8x3.1Ghz) /// 6GB DDR3 1333MHz (3x2Go) /// GTX 280M (128CC/1GHz/1Go) /// 2x320GB 7200Trs/min /// WUXGA Non-Glare Screen 1920x1200 /// Razer Abyssus /// NC-2000 /// By PcSystems-EvolutionX /// Powered by Debian!

> Get Process Explorer


#20
Fitfit

Fitfit

    Geek certifié

  • Membre
  • 1 558 messages
  • Localisation<°(((((><
Un grand merci ! :D

J'ai appris 2-3 trucs qui me seront surement utiles ;)
  • 0

1353655852-userbar-p4g.jpg
G73JH-A1 150W [1er modèle]
Intel Core i7 720QM - 8GB DDR3 1333MHz RAM - ATI Mobility™ Radeon HD 5870, 1GB GDDR5 VRAM -  Ecran 17.3" AUO B173HW01 V.5 Full LED Backlit - 2x500GB Seagate Momentus™ 7200rpm - Lecteur Blu-ray





0 utilisateur(s) li(sen)t ce sujet

0 membre(s), 0 invité(s), 0 utilisateur(s) anonyme(s)