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
    Nouveau membre du Club
    Inscrit en
    Septembre 2005
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 30
    Points : 28
    Points
    28
    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 éminent sénior
    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
    Points : 13 926
    Points
    13 926
    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
    Points : 11 625
    Points
    11 625
    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 sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut
    %s, non? (surtout si ensuite c'est puor une comparaison de chaîne)

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2005
    Messages : 605
    Points : 386
    Points
    386
    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 ?

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2005
    Messages : 605
    Points : 386
    Points
    386
    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; 
          }
          }
     
     
    }

  7. #7
    Expert éminent sénior
    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
    Points : 13 926
    Points
    13 926
    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 averti Avatar de Goundy
    Profil pro
    Étudiant
    Inscrit en
    Avril 2005
    Messages
    605
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2005
    Messages : 605
    Points : 386
    Points
    386
    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; 
          }
          }
     
     
    }

  9. #9
    Nouveau membre du Club
    Inscrit en
    Septembre 2005
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 30
    Points : 28
    Points
    28
    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
    Nouveau membre du Club
    Inscrit en
    Septembre 2005
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 30
    Points : 28
    Points
    28
    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 averti Avatar de Goundy
    Profil pro
    Étudiant
    Inscrit en
    Avril 2005
    Messages
    605
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2005
    Messages : 605
    Points : 386
    Points
    386
    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(;

  12. #12
    Rédacteur

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2004
    Messages : 113
    Points : 276
    Points
    276
    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 sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    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 du Club
    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
    Points : 46
    Points
    46
    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 sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    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 du Club
    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
    Points : 46
    Points
    46
    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