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 sur un prog qui se ferme alors qu'il ne devrait pas


Sujet :

C

  1. #1
    Membre averti
    Inscrit en
    Septembre 2005
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 30
    Par défaut Problème sur un prog qui se ferme alors qu'il ne devrait pas
    Bonjour
    mon prog (Nombre Mysère)une fois que j'ai choisi oui ou non pour accepter ou non le jeu se referme alors qu'avec le oui il devrait se poursuivre.Pourais-t-on m'aider ? Merci
    Voici le prog :

    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
    70
    71
    #include<stdio.h>
    #include<stdlib.h>
    #include<time.h>
     
     
    main()
    {
         system("cls");
         int re,nbre_alea,nbre_saisi,quitter;
         char cont[3];
     
         //variable aléatoire
         srand((int)time(NULL));        //randomize : init la fonction rand
         nbre_alea=rand()%51;               // fonction qui renvoie une variable aléatoire entre 0 et 50           
     
         printf ("%55s","Le jeux consiste a trouver le nombre mystere compris entre 0 et 50.\n\n\n");
         printf ("Veux-tu y jouer ? Ecrit oui  ou  non\n\n");
         scanf ("%c",cont);
     
         if (cont=="oui")
         {
         system ("cls");
         printf("le nombre = %d",nbre_alea);
     
     
         printf("\n\n\n");
         printf("Saisir  un nombre entre 0 et 50 :  ");
         scanf("%d",&nbre_saisi);
     
     
         while (nbre_alea!=nbre_saisi)
         {
               if (nbre_saisi>nbre_alea & nbre_saisi<50)
               {           
                           printf("\n\n");
                           printf ("%30s","Trop Grand !\n\n");
                           printf("Saisir  un nombre entre 0 et 50 :");
                           scanf("%d",&nbre_saisi);
                }
                if (nbre_saisi<nbre_alea && nbre_saisi<50)
                {
                           printf("\n\n");
                           printf ("%30s","Trop Petit !\n\n");
                           printf("Saisir  un nombre entre 0 et 50 :");         
                           scanf("%d",&nbre_saisi);
                }
                if (nbre_saisi >50)
                {
                           printf("\n\n");
                           printf ( "%60s", " Ne sois pas bete ! c'est entre 0 et 50\n");
                           scanf("%d",&nbre_saisi);
                }
          }
          system("cls");
          printf ("\n\n\n\n\n\n\n");
          printf ("%55s","Bravo !!!  Le nombre choisi est le bon\n\n");
     
          printf ("\n\n\n\n");
          printf ("%50s","Veut-tu rejouer ? 1=oui ou 0=non\n");
          scanf("%d",&re);
     
          if (re==1) {return main(); }
          else {return 0; }
          }
          else
     
          {return 0;}
     
     
     
    }

  2. #2
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    on ne peut pas comparer des chaînes de caractères ainsi. Il faut utiliser une fonction syle strcmp.(d'ailleurs tu ne lis qu'un caractère)essaie qq chose du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ((cont=='o') ||(cont=='O' ))
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (nbre_saisi>nbre_alea & nbre_saisi<50)
    erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (nbre_saisi>nbre_alea && nbre_saisi<50)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if (re==1) {return main(); } 
    else {return 0; }
    Tu ne peux pas rappeler la fonction main pour réexécuter le programme. Entoure le code à répéter d'un grand
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    do
    {
    ......
    ......
    } while(re !=1);
    Et utilise les balises code STP

  3. #3
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Par défaut
    Bonjour,
    Citation Envoyé par diogene
    Tu ne peux pas rappeler la fonction main pour réexécuter le programme.
    si c'est possible, après tout main n'est qu'une fonction comme une autre, elle peut faire l'objet d'une récurtion mais il faut au moins donner son prototype en entier :
    Mais ce n'est pas chose courrante (mis à part pour rendre le code illisible) et une boucle est bien plus pratique.

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    %s, non? (surtout si ensuite c'est puor une comparaison de chaîne)
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Membre très actif Avatar de Goundy
    Profil pro
    Étudiant
    Inscrit en
    Avril 2005
    Messages
    605
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2005
    Messages : 605
    Par défaut
    pour tes printf pourquoi tu ne fais pas tout simplement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("Trop grand \n \n");
    ....etc ?
    Compil your life guy!
    The Aures Project

  6. #6
    Membre très actif Avatar de Goundy
    Profil pro
    Étudiant
    Inscrit en
    Avril 2005
    Messages
    605
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2005
    Messages : 605
    Par défaut
    tiens je crois que c'est mieu
    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
    70
    71
     
    #include<stdio.h>
    #include<stdlib.h>
    #include<time.h>
     
     
    int main(void)
    {
        /* system("cls"); sert à rien , l'ecran est déja vide*/
         int re,nbre_alea,nbre_saisi,quitter;
         char cont;
     
         //variable aléatoire
         srand((int)time(NULL));        //randomize : init la fonction rand
         nbre_alea=rand()%51;               // fonction qui renvoie une variable aléatoire entre 0 et 50           
     
         printf ("Le jeux consiste a trouver le nombre mystere compris entre 0 et 50.\n\n\n");
         printf ("Veux-tu y jouer ? Ecrit O/oui  ou  N/non\n\n");
         scanf ("%c",&cont);
     
         if (cont=='o'||cont=='O')
         {
         system ("cls");
         printf("le nombre = %d",nbre_alea);
     
     
         printf("\n\n\n");
         printf("Saisir  un nombre entre 0 et 50 :  ");
         scanf("%d",&nbre_saisi);
     
      for(;;){
         while (nbre_saisi!=nbre_alea)
         {
               if (nbre_saisi>nbre_alea && nbre_saisi<50)
               {           
                           printf("\n\n");
                           printf ("Trop Grand !\n\n");
                           printf("Saisir  un nombre entre 0 et 50 :");
                           scanf("%d",&nbre_saisi);
                }
                  else
                if (nbre_saisi<nbre_alea && nbre_saisi<50)
                {
                           printf("\n\n");
                           printf ("Trop Petit !\n\n");
                           printf("Saisir  un nombre entre 0 et 50 :");         
                           scanf("%d",&nbre_saisi);
                }
                 else
                if (nbre_saisi >50)
                {
                           printf("\n\n");
                           printf (" Ne sois pas bete ! c'est entre 0 et 50\n");
                           scanf("%d",&nbre_saisi);
                }
          }
          system("cls");
          printf ("\n\n\n\n\n\n\n");
          printf ("Bravo !!!  Le nombre choisi est le bon\n\n");
     
          printf ("\n\n\n\n");
          printf ("Veut-tu rejouer ? 1=oui ou 0=non\n");
          scanf("%d",&re);
     
          if (re!=1)
           break; 
          }
          }
     
     
    }
    Compil your life guy!
    The Aures Project

  7. #7
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Pour réduire un peu la redondance du code de tous ces if à l'intérieur du while :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    printf("\n\n");
    if (nbre_saisi >50)   printf (" Ne sois pas bete ! c'est entre 0 et 50\n");           
      else  if (nbre_saisi>nbre_alea )  printf ("Trop Grand !\n\n"); 
              else  printf ("Trop Petit !\n\n"); 
    printf("Saisir  un nombre entre 0 et 50 :");                         
    scanf("%d",&nbre_saisi);

  8. #8
    Membre très actif Avatar de Goundy
    Profil pro
    Étudiant
    Inscrit en
    Avril 2005
    Messages
    605
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2005
    Messages : 605
    Par défaut
    pardon mon code est mal corrigé voilà :
    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
    70
    #include<stdio.h>
    #include<stdlib.h>
    #include<time.h>
     
     
    int main(void)
    {
        /* system("cls"); sert à rien , l'ecran est déja vide*/
         int re,nbre_alea,nbre_saisi,quitter;
         char cont;
     
     
         printf ("Le jeux consiste a trouver le nombre mystere compris entre 0 et 50.\n\n\n");
         printf ("Veux-tu y jouer ? Ecrit O/oui  ou  N/non\n\n");
         scanf ("%c",&cont);
     
         if (cont=='o'||cont=='O')
         {
               for(;;){                      
         system ("cls");
              //variable aléatoire
         srand((int)time(NULL));        //randomize : init la fonction rand
         nbre_alea=rand()%51;               // fonction qui renvoie une variable aléatoire entre 0 et 50  
         printf("le nombre = %d",nbre_alea);
     
     
         printf("\n\n\n");
         printf("Saisir  un nombre entre 0 et 50 :  ");
         scanf("%d",&nbre_saisi);
     
         while (nbre_saisi!=nbre_alea)
         {
               if (nbre_saisi>nbre_alea && nbre_saisi<50)
               {           
                           printf("\n\n");
                           printf ("Trop Grand !\n\n");
                           printf("Saisir  un nombre entre 0 et 50 :");
                           scanf("%d",&nbre_saisi);
                }
                  else
                if (nbre_saisi<nbre_alea && nbre_saisi<50)
                {
                           printf("\n\n");
                           printf ("Trop Petit !\n\n");
                           printf("Saisir  un nombre entre 0 et 50 :");         
                           scanf("%d",&nbre_saisi);
                }
                 else
                if (nbre_saisi >50)
                {
                           printf("\n\n");
                           printf (" Ne sois pas bete ! c'est entre 0 et 50\n");
                           scanf("%d",&nbre_saisi);
                }
          }
          system("cls");
          printf ("\n\n\n\n\n\n\n");
          printf ("Bravo !!!  Le nombre choisi est le bon\n\n");
     
          printf ("\n\n\n\n");
          printf ("Veut-tu rejouer ? 1=oui ou 0=non\n");
          scanf("%d",&re);
     
          if (re!=1)
           break; 
          }
          }
     
     
    }
    Compil your life guy!
    The Aures Project

  9. #9
    Membre averti
    Inscrit en
    Septembre 2005
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 30
    Par défaut
    Merci goundy il marche nickel à part que tu avait rajouter 2 else qu'il fallait pas.

    Merci bcp

    @+ jérémy

  10. #10
    Membre averti
    Inscrit en
    Septembre 2005
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 30
    Par défaut
    J'ai un petit problème je suis débutant et il a un morceau que je ne comprend pas bien. Pourquoi après :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (cont=='o'||cont=='O')
    Tu as écrit :

    et aussi pk tu as écrit :

    pour finir . on obtient quoi avec un break

    Merci d'avance

    @= Jérémy

  11. #11
    Membre très actif Avatar de Goundy
    Profil pro
    Étudiant
    Inscrit en
    Avril 2005
    Messages
    605
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2005
    Messages : 605
    Par défaut
    le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (cont=='o'||cont=='O')
    veut dire :
    si cont est = à o(min) ou cont est = à O (maj)
    c'est pour au cas ou l'utilisateur entre un o miniscule ou majuscule.
    boucle infenie pour pouvoir rejouer jusqu'a ce que l'utilisateur décide de quitter .
    pour quitter la boucle for(;
    Compil your life guy!
    The Aures Project

  12. #12
    Rédacteur

    Profil pro
    Étudiant
    Inscrit en
    Juin 2004
    Messages
    113
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2004
    Messages : 113
    Par défaut
    pas la peine de répéter
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
                           printf("Saisir  un nombre entre 0 et 50 :");
                           scanf("%d",&nbre_saisi);
    à chaque fois, tu peux bien l'écrire une seule fois à la fin du while non :

  13. #13
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par jejeb
    C'est une boucle inconditionelle. Equivallent à while(1). Disons que c'est la version 'gourou!'
    pour finir . on obtient quoi avec un break
    Ca, c'est écrit dans ton livre de C. break est une instruction qui fait quitter la boucle courante.

  14. #14
    Membre averti
    Profil pro
    Inscrit en
    Août 2005
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 47
    Par défaut
    bonsoir,
    je me permets de poster un petit quelque chose, mais j'ai vérifié d'abord

    c'est juste une petite remarque pour Jejeb, sur le code comme il était ds le premier post:

    ton tableau cont, tu aurais du le déclarer cont[4] pas cont[3], sinon le \n de fin de chaîne n'est pas mis en mémoire, et à l'appel du if la lecture ne s'arrête pas.

    normalement avec cont[4] tu dois pouvoir utiliser oui/non

  15. #15
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par artatum
    ton tableau cont, tu aurais du le déclarer cont[4] pas cont[3], sinon le \n de fin de chaîne n'est pas mis en mémoire, et à l'appel du if la lecture ne s'arrête pas.

    normalement avec cont[4] tu dois pouvoir utiliser oui/non
    Beaucoup de confusions...

    Si il faut stocker le mot "oui", il faut 3+1 char. En effet, la chaine "oui" est codée ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char s[] = {'o', 'u', 'i', 0};
    Je rappelle que les chaines C sont terminées par un 0.

    Maintenant si il n'y a pas la place suffisante, il y a débordement de tableau et le comportement est indéfini, et non pas "de fin de chaîne n'est pas mis en mémoire".

    La fin de chaine n'est pas '\n' (qui est la fin de ligne) mais 0.

    Enfin, scanf() ne met pas le '\n' dans la chaine saisie.

  16. #16
    Membre averti
    Profil pro
    Inscrit en
    Août 2005
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 47
    Par défaut
    à emmanuel:

    salut

    cette erreur m'avait sauté aux yeux, mais vu mes imprécisions sur les derniers posts, j'ai préféré vérifier.

    je suis au boulot, mais en rentrant chez moi demain je testerai son code avec cont[4], (et la correction du %s), normalement ça devrait marcher.

    j'avais déjà écrit ce code il y a qq temps, mais j'ai la mauvaise habitude de toujours déclarer des chaînes trop grandes donc je ne m'étais pas retrouvé confronté au problème.

    en fait les fins de chaînes sont terminées par '\0', donc 0 en ASCII, tu avais bien sûr raison j'ai corrigé une erreur, merci. 8)

Discussions similaires

  1. Réponses: 4
    Dernier message: 10/09/2013, 10h54
  2. Problème TSX37, sortie active alors qu'il le devrait pas
    Par Voss21120 dans le forum Automation
    Réponses: 8
    Dernier message: 31/05/2012, 20h31
  3. Réponses: 10
    Dernier message: 18/05/2011, 14h56
  4. Image de fonds qui bouge (alors qu'elle ne devrait pas)
    Par koukic11 dans le forum Mise en page CSS
    Réponses: 0
    Dernier message: 01/02/2010, 09h57
  5. Problème sur la prog sous VS.NET
    Par loic20h28 dans le forum Visual Studio
    Réponses: 11
    Dernier message: 23/01/2008, 12h29

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