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 :

Compilation d'une boucle switch + Char


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Apprenti programmeur
    Inscrit en
    Août 2019
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Apprenti programmeur
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2019
    Messages : 7
    Par défaut Compilation d'une boucle switch + Char
    bonjour, je suis en apprentissage C++, j'ai besoin d'aide pour la compilation d'un " Tant que( while) et Cie."

    Mais je comprends pas l'erreur. Merci pour votre aide ,meme simple vous parait-il...

    Nom : Erreur 1.jpg
Affichages : 3729
Taille : 153,6 KoNom : Erreur 2.jpg
Affichages : 5845
Taille : 94,5 Ko

  2. #2
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 599
    Par défaut
    Bonjour,

    Il y a en effet des erreurs:
    - tu n'as pas compris la syntaxe d'un do { sequence } while(condition_pour_recommencer);. Il n'y a jamais d'expression en parenthèse après le do, c'est toujours après le while. Et peut-être voulais-tu faire un simple if?
    - Pour tester si deux chaines sont égales, on ne peut pas écrire "reponse" == "oui", reponse est une variable et "oui" une chaîne. Aucune raison de mettre des guillemets autour d'une variable.
    - Pour que reponse contienne la réponse, il faut la mettre à un moment. Il n'y a aucune magie qui fasse que reponse se remplisse spontanément avant la comparaison.
    - tu n'as pas compris comment fonctionne un switch(expression_a_rechercher) { case X: .......}. Après chaque case il faut mettre une constante qui peut être un nombre entier ou un caractère, il sera comparé à ce qui est entre les parenthèse du switch, rien d'autre.

    Il y a peut-être d'autres erreurs. Le code doit être mis entre balises (bouton [ # ]), merci d'éviter les copies d'écran c'est très pénible à lire, et empêche de te donner de réponses précises.

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Apprenti programmeur
    Inscrit en
    Août 2019
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Apprenti programmeur
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2019
    Messages : 7
    Par défaut
    Merci, dalfab,

    mon but est de crée un boucle variée:

    -faire .... si la réponse est "oui" (recommencer le programme entièrement+remise a 0)

    -initier le compteur
    -*saisir char
    -décompte du compteur -1
    -comparaison du char (oui afficher+demander une réponse , non...-->
    -->>comparaison du char (oui afficher - non afficher)

    -vérification d'un compteur

    =0 ->sortie de boucle +demander une réponse

    !=0 ->recommencer la saisie*)

    (réponse = oui -->recommencer et ré-initier le compteur
    non --> sortie du prog.)


    si ca peut t'aider a me corriger.


    si t'as des conseils la dessus

  4. #4
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut, et bienvenue sur le forum

    D'abord et avant tout : au lieu de t'emm..der à créer des image de tes différentes fenêtre, lorsque tu dois présenter du code, pourrais tu utiliser le bouton en forme de # qui se trouve juste au dessus de la zone d'édition de ton message (sur la droite de la deuxième ligne de bouton) et faire un copier coller de ton code entre les balises [ CODE ] et [ /CODE ] qui apparaitront

    Cela mettra permettra de montrer ton code, en respectant la mise en forme et en proposant une coloration syntaxique de manière plus sympa, parce que cela nous permettra, à nous, de faire un copier coller de ton code au besoin afin de l'analyser à notre aise de notre coté

    En faisant une sélection au niveau de la ligne de commande de windows et en appuyant sur les touche <ctrl> + C, tu pourras d'ailleurs utiliser le même principe pour nous indiquer les erreurs émises lors de la compilation

    Ceci étant dit : C++ est un ensemble de conventions qui doivent -- comme le français -- impérativement être respectées si on veut que tous les interlocuteurs se comprennent : si tu demandes le "machin" à quelqu'un, il y a peu de chance qu'il te passe la cuiller que tu souhaite avoir! C'est exactement la même chose en C++ : si tu donne une instruction qu'il ne comprend pas au compilateur, il n'y a aucune chance qui accepte ce que tu lui dit

    Par exemple, C++ fournit -- comme beaucoup d'autres langages d'ailleurs -- (entre autres) les trois sortes de boucles "classiques", à savoir:
    1. Les boucles "tant que", qui vérifient si il faut entrer dans la boucle AVANT d'exécuter les instructions de la boucle
    2. les boucles "jusque", qui vérifier s'il faut entrer "une fois de plus" dans la boucle après que les instructions qu'elle contient aient été exécutées et
    3. les boucles "pour" qui permettent de compter le nombre de passage dans la boucle, et qui s'arrêtent quand le compteur atteint une certaine valeur

    Les boucles "tant que" vont prendre une forme proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    while(<condition_pour_entrer_dans_la_boucle>){
        // Ce qu'il faut faire
    }
    avec la particularité que, si la condition pour entrer dans la boucle est fausse dés le départ, la boucle ne sera jamais exécutée.

    Les boucles "jusque" vont prendre une forme proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    do{
         // ce qu'il faut faire
    }while(<condition_pour_retourner_dans_la_boucle); // !!! n'oublie pas le ;
    avec la particularité le fait que la boucle sera au moins exécutée une fois (avant que la condition ne soit vérifiée)
    et les boucles "pour" vont prendre une forme proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for(<type> <variable> = <valeur_de_depart>; <condition_pour_continuer>; <calcul_valeur_suivante>){
        // ce qu'il faut faire
    }
    avec comme particularité le fait que la boucle sera exécutée le nombre de fois que l'on pourra passer "à la valeur suivante" à partir de "la valeur de départ" en respectant la "condition pour continuer".

    Comme tu peux le voir, il n'y a absolument aucune possibilité dans laquelle nous aurions un code proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    do (condition){
        ce qu'il faut faire
    } while
    Il faut donc commencer par résoudre ce problème en utilisant une des formes de boucle que le compilateur pourra accepter

    Ensuite, il faut faire attention au guillemet ", car ils permettent de créer ce que l'on appelle une "chaine littérale". Ainsi, lorsque tu écris le code "reponse" tu crée une chaine de caractères qui contient explicitement les caractères 'r','e','p','o','n','s' et 'e', ce qui n'a absolument rien à voir avec la variable nommée reponse que tu veux justement utiliser pour ton test

    Si tu veux tester la valeur d'une variable qui est de type std::string, le test doit prendre la forme de if(nom_de_la_variable == "valeur souhaitée")En outre, le switch ... case ne s'utilise absolument pas comme un test normal, et pour cause : c'est un test dit "à choix multiple": pour une variable donnée, on peut indiquer "plusieurs valeurs" qui permettent d'activer des comportements différents.

    La particularité de ce genre de test, c'est que la variable testée doit obligatoirement représenter une valeur numérique entière. La chance, c'est que le type char représente effectivement une valeur numérique entière (correspondant, pour faire simple, à l'indice du "glyphe" représenté dans une table de caractères). Mais le seul moyen d'utiliser ce genre de test serait proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    switch (c){
         case 'd' : 
             // ce qu'il faut faire si la variable c représente le caractère d
             break;
         case 'f' :
             // ce qu'il faut faire si la variable c représente le caractère f
             break;
         /* ... */
         default :
            // ce qu'il faut faire si la variable c représente n'importe quelle valeur non prise en compte
    }
    Au passage, tu remarqueras que, pour indiquer la valeur d'un caractère unique, on doit utiliser l'apostrophe ' au lieu des guillemets doubles ".

    Enfin, on essayera -- autant que possible -- de déclarer les différentes variables aussi près que possible de leur première utilisation, et, si possible, on essayera de leur donner un nom qui correspond à ce que l'on attend de leur part.

    Au final, ton code devrait donc ressembler à quelque chose comme
    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
    int main(){
        /* parce que la réponse doit exister au moment du while */
        std::string reponse;
        do{
            int count=0;
            /* parce que l'on a 5 coups maximum */
            while(count <5){
                /* ce qu'il faut faire tant que nous sommes sur l'un des cinq coup acceptés
                 * par exemple, accepter un caractère
                 */
                char choix;
                /* bla bla */
                if(choix <'k'){
                    // si choix est plus petit que k
                } else{
                    // sinon, c'est qu'il est plus grand ou égal à k
                }
            }
            /* arrivé ici, les cinq coups on été joués, que faut-il faire? */
        }while(reponse == "oui");
        /* arrivé ici, reponse est different de "oui", on va donc quitter l'application */
        return 0;
    }
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Apprenti programmeur
    Inscrit en
    Août 2019
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Apprenti programmeur
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2019
    Messages : 7
    Par défaut
    Bonjour,

    Merci pour ces conseils Koala01;

    je comprends que la logique doit être TRÈS claire pour la programmation , mais beaucoup de terme a respecter ,

    et j'y prends très plaisir a faire( même si a des erreurs....). c'est le début.
    Voici mon code : ....corriger ?:

    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
     
     
    #include <iostream>
    #include <string>
     
    int main()
     
    {    
        std::string reponse;
     
        do{
     
            int count=0;
     
            while(count < 5)
            {
                char c;
                std::cout << " Saisir une lettre : ";
                std::cin >> c;
                count = count + 1;
     
     
                if(c == 'k')
                {
     
                    std::cout << "gagne" << std::endl;
                    std::cout << "recommencer ?" << std::endl;
                    std::cin >> reponse >> std::endl;
                }
     
                else if( c > 'k')
                        {
                            std::cout << "en dessous" << std::endl;
                            std::cout << "perdu" << std::endl;
                            std::cout << "recommencer ?" << std::endl;
                            std::cin >> reponse >> std::endl; 
                        }
                else
                {
                    std::cout << "au dessus" << std::endl;
                    std::cout << "perdu" << std::endl;
                    std::cout << "recommencer ?" << std::endl;
                    std::cin >> reponse >> std::endl;
                }  
     
                if (count == 5)
                {
                    std::cout << "perdu" << std::endl;
                    std::cout << "recommencer ?" << std::endl;
                    std::cin >> reponse >> std::endl;
                }
     
            }
     
        }while(reponse == 'oui');
     
        /* je dois recommencer le prog + remise a 0 du "count" /
        
        - je copie a nouveau le code ? */
     
     
     
        return 0;
     
    }
    Mais comme tu peux le voir, c'est pas encore cohérent. je doute sur un "switch" ou "if".
    Pour le "switch" , je n'ai pas tellement de "default"... ou dois je le présenter autrement ?

    Merci encore pour ton aide.

  6. #6
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Ce qu'il faut comprendre, c'est que l'ordinateur, c'est un brave petit soldat qui va faire exactement ce qu'on lui dit, sans se poser la moindre question: si on lui dit de sauter, il va sauter. Sans se poser de question. Peu importe si, devant lui, il y a le vide, il sautera quand même.

    Le code que tu écris pour lui indiquer ce qu'il doit faire doit donc suivre une logique totalement imparable si tu veux qu'il puisse réagir exactement de la manière don tu t'y attend

    Alors, dis moi : lorsque tu as une boucle qui s'assure un compteur (count) est "plus petit que cinq" (c'est exactement ce que tu indique avec le code while count < 5)), quelle chance y a-t-il que, dans la boucle, un test qui s'assure explicitement que count est égal à 5 (c'est ce que tu fais avec la ligne if(count == 5) qui est l'une des instructions effectuée dans la boucle) puisse donné un résultat autre que "faux"

    Pire encore, si tu suis la logique "ligne par ligne", et que tu rentre plusieurs fois dans la boucle, quelle sera la valeur de count au moment où toutes les instructions comprises dans la boucle (while(count < 5) ) auront été exécutées Est-ce que le test effectué pour déterminer s'il faut entrer dans la boucle a la moindre chance de donner un résultat autre que vrai

    Dans le même ordre d'idée, c'est très bien d'avoir une boucle "jusqu'à" qui s'assure teste la valeur de réponse, mais, quelle est cette valeur au moment du test

    Quand tu auras répondu à ces questions et que tu auras corrigé le code en conséquence, tu auras sans doute la réponse aux questions que tu te poses juste avant le return 0
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

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

Discussions similaires

  1. [XL-2007] Grand débutant tentant d'affronter une erreur de compilation
    Par lolbop dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 20/11/2016, 07h39
  2. Erreur lors de compilation avec une bibliothèque externe
    Par Nouri.Mdafer dans le forum Fortran
    Réponses: 6
    Dernier message: 31/03/2016, 14h52
  3. Erreur de compilation d'une JSP
    Par casho dans le forum Servlets/JSP
    Réponses: 4
    Dernier message: 17/10/2006, 14h50
  4. Réponses: 20
    Dernier message: 08/06/2006, 10h12
  5. Erreur de compilation sur une librairie en mode debug
    Par bakaneko dans le forum C++Builder
    Réponses: 2
    Dernier message: 18/05/2006, 16h32

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