Aide sur exercice simple [BOUCLE]

Fermé
Gouag Messages postés 32 Date d'inscription vendredi 22 novembre 2013 Statut Membre Dernière intervention 28 mars 2014 - Modifié par Gouag le 13/02/2014 à 05:42
 evilfalcon - 14 févr. 2014 à 11:15
Bonjour à tous,



J'aurais besoin de votre aide afin de trouver une solution à ce problème qui, en apparence, et pour moi, apparaissait simple au premier abord en lisant l'énoncé. Comme quoi il ne faut pas se fier aux apparences.

Je précise que je débute sur les notions générales de boucle. Aujourd' hui je découvre « WHILE » « DO WHILE » et « FOR ». C'est justement pour m'exercer sur ce thème que j'ai trouvé cet exercice sur les boucles en me promenant sur Internet (voici le lien :

http://www.fresnel.fr/perso/stout/langage_C/Wiki_Chap_4_Boucle_for,do,while.pdf

Enoncé de l'exercice :

Ecrire un programme qui demande à l'utilisateur de taper un entier et qui affiche GAGNE si l'entier est entre 56 et 78 bornes incluses PERDU sinon.



Voici mon programme (gloups !):



#include <stdio.h>

#include <stdlib.h>

#include <math.h>

int main(int argc, char *argv[])

{

int X;

int nombre;

printf("Saisir un nombre entier positif ou nul:");

scanf("%d",&nombre);

for (X=nombre;X>=0;scanf("%d",&X))

{

if (X<0)

{

printf("Ce n'est pas un entier positif ou nul\n");

}

else if (X>78||X<53)

{

printf("Perdu\n");

}

else

{

printf("Gagne\n");

}

}

return 0;

}



In fine ce programme fonctionne tant que la personne saisit effectivement un entier positif ou nul (un bon élève qui écoute ce qu'on lui demande). Là où ça se complique c'est en cas de non respect de cette instruction.[A noter que je suppose que l'énoncé demande la saisie d'un entier positif ...alors qu'il y est cependant précisé seulement entier. Il ne demande pas de message d'erreur non plus en cas de saisie d'un nombre autre qu'entier. Personnellement j'ai souhaité aller un peu plus loin en m'imposant cette petite contrainte]

En effet dans mon programme, la saisie d'un nombre entier négatif, ne fait rien : je n'ai pas le message prévu, je n'ai pas « Gagne » non plus ni « Perdu ». Par ailleurs il n'est alors pas proposé de saisir un nouveau nombre (le programme s'arrête), ce qui est par contre automatiquement le cas lorsque je saisis un nombre dans la plage prévue.



J'ai donc plusieurs petites questions et remarques :

1. Je pense que si mon premier If fonctionnait, c'est-à-dire la prise en compte d'une saisie d'un nombre entier négatif, j'entrerais dans une boucle sans fin avec le message « Ce n'est pas un nombre entier positif » compte tenu de ma condition X>=0 ? Juste ou pas ?

2. La condition If (X<0) n'est pas suffisante pour moi. La condition idéale serait Si X n'est pas un entier positif ou nul . Pouvez-vous m'indiquer comment mettre en forme cette condition dans la boucle ? (j'avoue, je n'ai pas encore regarder ce point sur Internet)

3. Comment faire pour que la boucle se répète sans problème quelque-soit le nombre saisi entier ou pas, positif ou pas, c'est-à-dire par exemple : la personne saisit -2.3 message d'erreur « Ceci n'est pas un entier positif ou nul » nouvelle saisie possible etc....

4. Peut-on changer Int X et Int nombre pas Long X et Long nombre ? Est-ce que cela a un intérêt quelconque ? Je pose cette question car si je saisis 1000000000000....le programme ne fonctionne pas....ni d'ailleurs avec Long int. Nécessaire de passer en long double pour que soit pris en compte n'importe quel nombre entier? En gros peut on demander à une variable de prendre une valeur infinie??

5. J'ai légèrement modifié mon programme en posant dès la première saisie la condition X>=0 (juste après le scanf de nombre) et en modifiant mes déclarations de la façon suivante : int X=0; int nombre=0; Il y a du mieux : effectivement j'ai alors le message attendu lorsque j'entre un entier négatif lors de la première saisie mais il n'est pas proposé une nouvelle saisie donc le programme s'arrête. Comment faire pour qu'une nouvelle saisie soit proposée malgré tout (pa ailleurs la saisie d'un nombre décimal positif ou négatif n'est toujours pas réglée)?De plus, si j'entre un nombre entier dans la plage prévue lors de la première saisie mais un nombre négatif la deuxième fois le programme s'arrête...



Merci d'avance à ceux qui auront le temps et le courage de m'aider. Je continue bien sûr de mon côté à chercher.

Bien cordialement

Gouager



PS: Une dernière question: cet exercice serait il faisable avec "While"?

4 réponses

Onitz Messages postés 23 Date d'inscription lundi 30 décembre 2013 Statut Membre Dernière intervention 16 septembre 2015
13 févr. 2014 à 08:08
Bonjour,

Je ne connais pas le C mais bon cette exercice est similaire à ce que l'on fait quant ont apprend les boucle en JAVA, j'essaie quand même de t'aider ^^.

tu devrai mettre ta boucle directement dans un while, genre:


ok=0;

while(ok==0){
//Saisie de l'utilisateur

if(pasbon)
{

message "C'est pas bon !";

}
else
{

message "C'est bon !";
ok=1;

}
}

La je répond juste à la 3ème question à la dernière désolé.

Je crois que ta boucle for est blizzard aussi. C'est censé être quelque chose comme ça:

<code>
for(départ de X,limite max de X,compteur++){//instruction}
</code
0
Archeus01 Messages postés 1567 Date d'inscription mercredi 3 octobre 2007 Statut Membre Dernière intervention 9 juin 2022 447
13 févr. 2014 à 11:24
for (X=nombre;X>=0;scanf("%d",&X))

Si le type tape -1, x est donc égale à -1 donc inférieur à 0 donc ça rentre pas dans ta boucle. Il ne faut pas le laisser l'utilisateur saisir un truc la dedans (sauf à la limite le nombre de chance auquel il a droit.

Mets plutôt un truc du style (la le mec aura 5 essais , ça fait longtemps que j'ai pas fait de c ; vérifier le X=X+1):

for (X=0;X<5;X=X+1)
printf("Saisir un nombre entier positif ou nul:");

scanf("%d",&nombre);
0
Gouag Messages postés 32 Date d'inscription vendredi 22 novembre 2013 Statut Membre Dernière intervention 28 mars 2014
13 févr. 2014 à 20:25
Merci à tous les deux pour vos réponses et remarques.

Voici ce que j'ai fait avec
while
. Cela fonctionne tant que la personne suit l'instruction de départ à savoir saisir un entier positif ou nul. En revanche, bien sûr, si je saisis -3 le programme s'arrête. Or c'est justement à ce moment que je voudrais qu'il dise
Ce n'est pas un entier positif ou nul
et qu'il propose une nouvelle saisie:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>



int main(int argc, char *argv[])
{

int nombre;


printf("Saisir un entier positif ou nul:");
scanf("%d",&nombre);


 while(nombre>=0)
{
   if (nombre<56||nombre>78)
   {
   printf("perdu\n");
   scanf("%d",&nombre);
   }
   else
   {
   printf("gagne\n");
   scanf("%d",&nombre);
   }
}
return 0;
} 


Je continue à chercher.
0
Gouag Messages postés 32 Date d'inscription vendredi 22 novembre 2013 Statut Membre Dernière intervention 28 mars 2014
13 févr. 2014 à 20:36
Et voila j'ai trouvé!!! (on laisse tomber pour la partie ou le nombre saisi serait décimal)
Merci a vous deux, c'était
While
et non
For
....
Il me reste juste le point 4. ci dessus dans mon poste initial. Quelqu'un aurait il une réponse?

#include <stdio.h>
#include <stdlib.h>
#include <math.h>



int main(int argc, char *argv[])
{

int nombre;


printf("Saisir un entier positif ou nul:");
scanf("%d",&nombre);


 while(nombre)
 {
   if (nombre<0)
   {
   printf("ce n'est pas un entier positif ou nul\n");
   scanf("%d",&nombre);
   }
   else if (nombre<56||nombre>78)
   {
   printf("perdu\n");
   scanf("%d",&nombre);
   }
   else
   {
   printf("gagne\n");
   scanf("%d",&nombre);
   }
}
return 0;
}
0
Onitz Messages postés 23 Date d'inscription lundi 30 décembre 2013 Statut Membre Dernière intervention 16 septembre 2015
Modifié par Onitz le 14/02/2014 à 09:34
Tu ne peut pas demander à une variable de prendre une valeur infini (ou alors tu peut mais je ne vois pas comment ^^).

Mais apparemment tu peut limiter le nombre de caractère pris en compte lors de la saisie :
http://progdupeu.pl/#3-comment-bien-utiliser-scanf

Ça a déjà l'avantage d'empêcher ton programme de planter.
0
Le problème vient de la limite de la mémoire!
Quand tu initialises, tu prends un int, tu travaillera alors une variable à 16 bits, si je me souviens bien. Tu peux aller de -32 768 à 32 767, si tu prend une valeurs au dessus ton programme plante, car la valeur enregistrer n'est plus bonne!
Avec un long double, tu passes à 80 bits donc de -3.4*10-4932 à 3.4*104932, mais tu es toujours limiter, et tu n'aura jamais un nombre infini!
Après, mais je ne suis pas sur, il doit exister une fonction qui te permet toi-même de donner le nombre de bit à ta variable. Mais là à toi de chercher!
0