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 boucle et décrémentation


Sujet :

C

  1. #1
    Candidat au Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Novembre 2018
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Novembre 2018
    Messages : 5
    Points : 2
    Points
    2
    Par défaut Problème boucle et décrémentation
    Bonjour à tous,

    Je débute en C et j'ai un petit problème dans mon code.

    C'est un jeu ou on génère un nombre aléatoire. Le joueur est invité à entrer un nombre, suivant le nombre on lui dit si c'est + ou -.
    Mon problème ce trouve dans ma boucle, la décrémentation se passe correctement mais la ou il faudrait sortir de la boucle si le nombre d'essai arrive à 0 le compteur continue en partant dans les négatifs.
    Je pense que c'est une simple erreur mais je ne le vois pas.

    Merci d'avance pour votre aide

    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
    66
    67
    68
    69
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
     
    int main()
    {
        srand(time(NULL));
        const int MAX = 100, MIN = 1;
        int nombreMystere = (rand() % (MAX - MIN + 1)) + MIN;
        int nombreChoisi = 0;
        int rejouer = 1;
     
        // Boucle pour rejouer
        while (rejouer == 1)
        {
        printf ("***PLUS ou MOINS***\n");
        printf ("-------------------\n");
        printf ("Trouver le nombre mystere(uniquement des nombres entiers compris entre 1 et 100)\n");
        printf ("Vous avez 10 essais\n");
     
            // Boucle tant que pour ne pas dépasser 10 et tant que le nombre choisi n'est pas égale au nombre mystère
            int essai = 0;
            printf("Votre nombre :\n");
            scanf("%d",&nombreChoisi);
     
            while (essai < 0 || nombreChoisi != nombreMystere)
            {
                if (nombreChoisi > nombreMystere)
                {
                    printf("C'est moins\n");
                    essai--;
                    printf("Il vous reste %d\n",essai);
                    printf("Votre nombre :\n");
                    scanf("%d",&nombreChoisi);
                }
                else if (nombreChoisi < nombreMystere)
                {
                    printf("c'est plus\n");
                    essai--;
                    printf("Il vous reste %d\n",essai);
                    printf("Votre nombre :\n");
                    scanf("%d",&nombreChoisi);
                }
                else
                {
                    printf("BRAVO !!!\n");
                }
     
            }
     
        printf("******************\n");
        printf("Voulez-vous rejouer\n");
        printf("1. Oui\n");
        printf("2. Non\n");
        scanf("%d",&rejouer);
            if (rejouer == 1)
            {
                int rejouer = 1;
                int essai = 10;
            }
            else
            {
                printf("Merci d'avoir joue\n");
                int rejouer = 0;
            }
        }
        return 0;
    }

  2. #2
    Expert éminent sénior
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    Mai 2010
    Messages
    3 214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : Mai 2010
    Messages : 3 214
    Points : 10 140
    Points
    10 140
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
            if (rejouer == 1)
            {
                int rejouer = 1;
                int essai = 10;
            }
            else
            {
                printf("Merci d'avoir joue\n");
                int rejouer = 0;
            }
    Je suis étonné que cela compile , vu que tu as déjà déclarer ces variables , ou alors il considérer que c'est des nouvelles variables mais du coup leur porté est limité aux {}.
    Mais dans tout les cas il faut vraiment enlever ces int...

  3. #3
    Candidat au Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Novembre 2018
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Novembre 2018
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    D'accord, mais même en retirant cette partie du code le problème reste le même

    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
     
    int main()
    {
        srand(time(NULL));
        const int MAX = 100, MIN = 1;
        int nombreMystere = (rand() % (MAX - MIN + 1)) + MIN;
        int nombreChoisi = 0;
     
     
        printf ("***PLUS ou MOINS***\n");
        printf ("-------------------\n");
        printf ("Trouver le nombre mystere(uniquement des nombres entiers compris entre 1 et 100)\n");
        printf ("Vous avez 10 essais\n");
     
            // Boucle tant que pour ne pas dépasser 10 et tant que le nombre choisi n'est pas égale au nombre mystère
            int essai = 10;
            printf("Votre nombre :\n");
            scanf("%d",&nombreChoisi);
     
            while (essai < 0 || nombreChoisi != nombreMystere)
            {
                if (nombreChoisi > nombreMystere)
                {
                    printf("C'est moins\n");
                    essai--;
                    printf("Il vous reste %d\n",essai);
                    printf("Votre nombre :\n");
                    scanf("%d",&nombreChoisi);
                }
                else if (nombreChoisi < nombreMystere)
                {
                    printf("c'est plus\n");
                    essai--;
                    printf("Il vous reste %d\n",essai);
                    printf("Votre nombre :\n");
                    scanf("%d",&nombreChoisi);
                }
                else
                {
                    printf("BRAVO !!!\n");
                }
     
            }
        return 0;
    }
    Nom : CUsershenroma1PersonalCours Ctest2binDebugtest2.png
Affichages : 375
Taille : 11,3 Ko

    Merci

  4. #4
    Membre expérimenté
    Avatar de sambia39
    Homme Profil pro
    No Comment
    Inscrit en
    Mai 2010
    Messages
    543
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : No Comment
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mai 2010
    Messages : 543
    Points : 1 745
    Points
    1 745
    Par défaut
    Bonsoir,
    C'est normal que le programme se comporte de la sorte puisque dès le départ, la variable d'essai est initialisée avec la valeur zéro. Puis, dans la boucle "tant que" celle-ci est décrémentée, il serait préférable de fournir le nombre d'essais avant de pouvoir commencer à jouer.
    Plus bas dans votre code, il faudrait restaurer le nombre d'essais dans la variable "essai", après que le joueur ait choisi de rejouer une partie. Il faudrait également ajouter l'évaluation de la variable essai, car c'est t'elle qui arrête le jeu et affiche échec de la partie quand celui-ci arrive a zéro. ( game over); et également tenir compte des remarques de @Kannagi

    À bientôt
    Celui qui peut, agit. Celui qui ne peut pas, enseigne.
    Il y a deux sortes de savants: les spécialistes, qui connaissent tout sur rien,
    et les philosophes, qui ne connaissent rien sur tout.
    George Bernard Shaw

  5. #5
    Candidat au Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Novembre 2018
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Novembre 2018
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Merci pour ta réponse Sambia,

    J'ai rectifier le 1er code en fonction de la réponse de Kannagi, dans la réponse j'ai bien initialisé la variable essai à 10 directement. Regarde p-e le code que j'ai posté dans ma réponse qui est moins développé mais pour lequel le problème se pose toujours.

    Que veux-tu dire par cette phrase ? "il serait préférable de fournir le nombre d'essais avant de pouvoir commencer à jouer"

    et également par celle ci :

    "Il faudrait également ajouter l'évaluation de la variable essaie" ?

    Merci d'avance.

  6. #6
    Membre expérimenté
    Avatar de sambia39
    Homme Profil pro
    No Comment
    Inscrit en
    Mai 2010
    Messages
    543
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : No Comment
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mai 2010
    Messages : 543
    Points : 1 745
    Points
    1 745
    Par défaut
    Citation Envoyé par maBs12 Voir le message
    Que veux-tu dire par cette phrase ? "il serait préférable de fournir le nombre d'essais avant de pouvoir commencer à jouer"
    Exemple unsigned short essai = 5; (Chose que vous avez rectifiée dans votre précédent code en mettant la valeur 10)

    Citation Envoyé par maBs12 Voir le message
    "Il faudrait également ajouter l'évaluation de la variable essaie" ?
    Exemple:
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     /*
         * Si le nombre d'essais est atteint
         */
         if( 5 == essai )
            (void)puts("game over");
        .............

    À bientôt
    Celui qui peut, agit. Celui qui ne peut pas, enseigne.
    Il y a deux sortes de savants: les spécialistes, qui connaissent tout sur rien,
    et les philosophes, qui ne connaissent rien sur tout.
    George Bernard Shaw

  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 684
    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 684
    Points : 30 973
    Points
    30 973
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par maBs12 Voir le message
    mais la ou il faudrait sortir de la boucle si le nombre d'essai arrive à 0 le compteur continue en partant dans les négatifs.
    Ben oui, tu pars avec "essai" à 0, ta boucle demande while (essai < 0 || pas trouvé) (rappel, un while c'est un "tant que" et non un "jusqu'à") donc comme le cas "pas trouvé" est vrai la boucle démarre puis tu demandes essai--. Donc c'est parti pour ne plus d'arrêter (ou plus exactement tu t'arrêteras quand "essai" atteindra -2147483648 et que le décrément de plus le passera à 2147483647).

    Citation Envoyé par maBs12 Voir le message
    J'ai rectifier le 1er code en fonction de la réponse de Kannagi, dans la réponse j'ai bien initialisé la variable essai à 10 directement. Regarde p-e le code que j'ai posté dans ma réponse qui est moins développé mais pour lequel le problème se pose toujours.
    Quelle que soit la valeur de départ de "essai", le souci se pose parce que demandes "tant que essai est négatif ou nombre pas trouvé". Donc ta boucle passe par deux phases
    • la première partie où "essai" est positif mais le nombre n'est pas trouvé => condition vraie
    • la seconde partie où "essai" est négatif => condition vraie que le nombre soit trouvé ou pas


    Citation Envoyé par Kannagi Voir le message
    ou alors il considérer que c'est des nouvelles variables mais du coup leur porté est limité aux {}.
    Exactement ça. Tout nouveau bloc (même intérieur) a le droit de déclarer des variables de son choix qui prendront le pas sur les variables éventuellement déjà existantes du bloc supérieur mais toute variable située dans un bloc est limitée à son bloc.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  8. #8
    Candidat au Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Novembre 2018
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Novembre 2018
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Bonjour Sve@r,

    Merci pour ta réponse.

    Si je comprends bien je dois simplement changer la condition dans ma boucle au niveau d'essai comme ci-dessous :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while (nombreChoisi != nombreMystere || essai > 0)
    Si je lis bien la, ca donne "tant que nombre choisi est différent du nombre mystère ou essai est plus grand que 0"
    Je viens d'essayer à nouveau et le problème reste le même les essais passent en négatif, alors que normalement dés que essai arrive à 0 une des confitions n'est plus vrai donc on devrait sortir de la boucle non ?

  9. #9
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 684
    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 684
    Points : 30 973
    Points
    30 973
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par maBs12 Voir le message
    Si je lis bien la, ca donne "tant que nombre choisi est différent du nombre mystère ou essai est plus grand que 0"
    Tout à fait exact.

    Citation Envoyé par maBs12 Voir le message
    Je viens d'essayer à nouveau et le problème reste le même les essais passent en négatif, alors que normalement dés que essai arrive à 0 une des confitions n'est plus vrai donc on devrait sortir de la boucle non ?
    Hé non, là tu réfléchis à l'envers. On ne demande pas à sortir sur l'expression mais à rester sur l'expression !!! Et le "ou" valide l'expression si l'une des deux conditions est vraie. Donc essai passe en négatif ok mais comme le nombre mystère n'est pas trouvé, alors la condition reste vraie et la boucle continue.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  10. #10
    Candidat au Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Novembre 2018
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Novembre 2018
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    D'accord, je dois simplement changer mon "Ou" par un "Et" et ca fonctionne.

    Merci

  11. #11
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 684
    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 684
    Points : 30 973
    Points
    30 973
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par maBs12 Voir le message
    D'accord, je dois simplement changer mon "Ou" par un "Et" et ca fonctionne.
    Exactement. Un mathématicien nommé "De Morgan" a établi les lois qui permettent d'inverser une condition (dites lois de "De Morgan"). Elles ne sont pas très compliquées et peuvent d'ailleurs se déduire des tables de vérité de base (OU, ET et NON).
    Elles sont:
    • NON(A OU B) = NON(A) ET NON(B)
    • NON(A ET B) = NON(A) OU NON(B)


    Elles peuvent aussi se retrouver grâce à la réflexion. Si par exemple je veux un nombre compris entre 10 et 20 (donc >= 10 ET <= 20), alors le contraire c'est un nombre qui n'est pas compris entre 10 et 20 (donc < 10 OU > 20). Et si je veux un nombre divisible par 3 OU par 5 alors le contraire sera un nombre non divisible par 3 ET non divisible par 5.
    Donc adapté à ton problème: si tu veux sortir sur "A OU B", alors il te faut demander à rester sur "non(A OU B)" soit "non(A) ET non(B)".
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

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

Discussions similaires

  1. Problème Boucle Do-While?!
    Par Julien_C++ dans le forum C++
    Réponses: 6
    Dernier message: 29/07/2006, 12h23
  2. [Débutant] Problème boucle for
    Par toniooooo dans le forum Langage
    Réponses: 10
    Dernier message: 18/04/2006, 14h42
  3. [XSL] problème boucle
    Par VolaiL dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 10/04/2006, 16h55
  4. Problème boucle while et evenement
    Par tse_tilky_moje_imja dans le forum Général Python
    Réponses: 2
    Dernier message: 30/03/2006, 18h11
  5. [FLASH 8] Problème Boucle For
    Par Begood dans le forum Flash
    Réponses: 6
    Dernier message: 21/03/2006, 11h36

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