Question en c
Fermé
Moustiquet
Messages postés
212
Date d'inscription
samedi 3 octobre 2009
Statut
Membre
Dernière intervention
27 juin 2011
-
20 oct. 2009 à 04:44
edelahaye Messages postés 9 Date d'inscription mardi 20 octobre 2009 Statut Membre Dernière intervention 26 avril 2017 - 22 oct. 2009 à 00:45
edelahaye Messages postés 9 Date d'inscription mardi 20 octobre 2009 Statut Membre Dernière intervention 26 avril 2017 - 22 oct. 2009 à 00:45
9 réponses
edelahaye
Messages postés
9
Date d'inscription
mardi 20 octobre 2009
Statut
Membre
Dernière intervention
26 avril 2017
1
22 oct. 2009 à 00:45
22 oct. 2009 à 00:45
" fflush (stdin);" n'existe pas. fflush(), n'est défini que pour les flux sortants...
L'usage correct de scanf() est délicat. Il faut vider le flux entrant si le dernier caractère lu n'est pas '\n' :
Cette fonction doit être appelée après chaque usage de scanf() avec "%d" et "%s", par exemple. Pour "%c", uniquement si le dernier caractère lu n'est pas '\n'...
On est aussi censés tester la valeur retournée par scanf(). Elle indique le nombre de conversions réussies. En cas d'erreur, il y a un traitement à faire...
Idem avec getchar()...
getch() n'est pas standard.
Cette condition
est redondante et ne teste pas la limite basse. Il faut que la vaieur soit >= à 1 et <= à 20, ce qui se code autrement, (je te laisse trouver, tout est dit ...). attention les bornes sont donc 1 et 20 et non 0 et 20 ...
Il y a un autre problème de logique. Si je mets 21, j'ai bien l'indication 'hors limite', mais le triangle est quand même dessiné... Il doit falloir un else au if ...
Une fois corrigé, ça a l'air de fonctionner correctement ...
Code à ne regarder que si tu es planté ou pour vérifier:
L'usage correct de scanf() est délicat. Il faut vider le flux entrant si le dernier caractère lu n'est pas '\n' :
static void purge(void) { int c; while ((c = getchar()) != '\n' && c != EOF) { } }
Cette fonction doit être appelée après chaque usage de scanf() avec "%d" et "%s", par exemple. Pour "%c", uniquement si le dernier caractère lu n'est pas '\n'...
On est aussi censés tester la valeur retournée par scanf(). Elle indique le nombre de conversions réussies. En cas d'erreur, il y a un traitement à faire...
Idem avec getchar()...
getch() n'est pas standard.
Cette condition
valide = (nombre == BORNE1 || nombre <= BORNE2);
est redondante et ne teste pas la limite basse. Il faut que la vaieur soit >= à 1 et <= à 20, ce qui se code autrement, (je te laisse trouver, tout est dit ...). attention les bornes sont donc 1 et 20 et non 0 et 20 ...
Il y a un autre problème de logique. Si je mets 21, j'ai bien l'indication 'hors limite', mais le triangle est quand même dessiné... Il doit falloir un else au if ...
Une fois corrigé, ça a l'air de fonctionner correctement ...
Entrez un nombre de 1 a 20:21 Vous etes hors limite recommencer Voulez-vous continuer?O/N o Entrez un nombre de 1 a 20:0 Vous etes hors limite recommencer Voulez-vous continuer?O/N o Entrez un nombre de 1 a 20:5 12345 2345 345 45 5 Voulez-vous continuer?O/N n Appuyer sur une touche pour continuer Process returned 0 (0x0) execution time : 18.956 s Press any key to continue.
Code à ne regarder que si tu es planté ou pour vérifier:
#include <stdio.h> #include <string.h> static void purge (void) { int c; while ((c = getchar ()) != '\n' && c != EOF) { } } int main (void) { const int BORNE1 = 1; /* Declaration des caractere */ const int BORNE2 = 20; int ligne, col; int nombre, valide; char reponse; /* ligne et colone*/ do /* Utilisation de la boucle do..while" */ { /* Choix de nombre par l'utilisateur */ printf ("Entrez un nombre de 1 a 20:"); /* Deposer la valeur demander a l'utilisateur */ scanf ("%d", &nombre); purge (); /* Definir la zone de fabrication du triangle permise*/ valide = nombre >= BORNE1 && nombre <= BORNE2; if (!valide) printf ("Vous etes hors limite recommencer\n"); else { /* Utilisation de for pour choisir les caractere numerique des ligne */ for (ligne = 1; ligne <= nombre; ligne++) /* initialisation */ { /* pour colonne varie de ligne jusqu'à 20 ou selon le nombre de depart choisi */ for (col = ligne; col <= nombre; col++) printf ("%d", col); printf ("\n"); /* Marque la fin dela boucle do*/ } } /* Serie d'operation pour permettre a la boucle de se refaire */ printf ("Voulez-vous continuer?O/N\n"); scanf ("%c", &reponse); if (reponse != '\n') { purge (); } reponse = toupper (reponse); } while (reponse == 'O'); printf ("Appuyer sur une touche pour continuer"); /* Instrution pour un seul caractere */ { int c = getchar (); if (c != '\n') { purge (); } } return 0; }
edelahaye
Messages postés
9
Date d'inscription
mardi 20 octobre 2009
Statut
Membre
Dernière intervention
26 avril 2017
1
20 oct. 2009 à 07:38
20 oct. 2009 à 07:38
Ton code est très incomplet et incompilable.
Je suggère que tu postes un code compilable qui montre exactement le problème.
Je suggère que tu postes un code compilable qui montre exactement le problème.
Char Snipeur
Messages postés
9813
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
3 octobre 2023
1 298
20 oct. 2009 à 08:19
20 oct. 2009 à 08:19
while(!valide);
HO !!! la jolie boucle inifinie que voilà !!! ;)
Il y a au moins une erreur là si tu n'as pas fait d'erreur de recopie.
HO !!! la jolie boucle inifinie que voilà !!! ;)
Il y a au moins une erreur là si tu n'as pas fait d'erreur de recopie.
Pilow
Messages postés
400
Date d'inscription
vendredi 2 octobre 2009
Statut
Membre
Dernière intervention
23 décembre 2009
71
20 oct. 2009 à 08:25
20 oct. 2009 à 08:25
scanf("%c",reponse);
Erreur numero deux ? :P
Erreur numero deux ? :P
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Char Snipeur
Messages postés
9813
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
3 octobre 2023
1 298
20 oct. 2009 à 08:43
20 oct. 2009 à 08:43
pour 0, c'est normal. réfléchi mieux à ta logique booléenne. (et de 3 erreurs, en 5 lignes de codes. :o)
Moustiquet
Messages postés
212
Date d'inscription
samedi 3 octobre 2009
Statut
Membre
Dernière intervention
27 juin 2011
21 oct. 2009 à 05:17
21 oct. 2009 à 05:17
Je pensais que en validant mes bornes le progarmme me demanderait (apres)avoir dit que je suis hors limite.Il me demanderait une autre valeur entre 1 et 20, mais ce n,est pas le cas.
Et ainsi continuer avec une autre valeur.
Donc Je me demnade comment valider et continuer le programme.
Et ainsi continuer avec une autre valeur.
Donc Je me demnade comment valider et continuer le programme.
Char Snipeur
Messages postés
9813
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
3 octobre 2023
1 298
21 oct. 2009 à 08:04
21 oct. 2009 à 08:04
valide=false; while(!valide){ valide=(nombre>BORNE1&&nombre<=BORNE2); if(!valide) printf("Vous etes hors limite recommencer\n"); }voilà ce qui peut fonctionner. Revoi ta logique.
Moustiquet
Messages postés
212
Date d'inscription
samedi 3 octobre 2009
Statut
Membre
Dernière intervention
27 juin 2011
21 oct. 2009 à 20:33
21 oct. 2009 à 20:33
Alors voici mon programme au complet. Remarquer que mon problème est que lorsque je veut faire une validation pour que mon programme est hors limite, il me dit que je suis hors limite et me repose la question entrer un autre valeur. Merci de votre aide : #include <stdio.h>
int main()
{
const int BORNE1=0;
const int BORNE2=20 ;/*Declaration des caractere*/
int ligne,col;
int nombre,valide;
char reponse;
/*ligne et colone*/
do{/*Utilisation de la boucle do..while"*/
printf("Entrez un nombre de 1 a 20:");//Choix de nombre par l'utilisateur*/
fflush(stdin);/*Vider la memoire tampon*/
scanf("%d",&nombre);/*Deposer la valeur demander a l'utilisateur*/
/*Defenir la zone de fabrication du triangle permise*/
valide=(nombre==BORNE1||nombre<=BORNE2);
if (!valide)
printf("Vous etes hors limite recommencer\n");
for/*Utilisation de for pour choisir les caractere numerique des ligne*/
(ligne=1; ligne<=nombre;ligne++){/*initialisation
/*pour colone varie de ligne jusqu'à 20 ou selon le nombre de depart choisi*/
for(col=ligne; col<= nombre; col++)
printf("%d", col);
printf ("\n");
/*Marque la fin dela boucle do*/
}printf("Voulez-vous continuer?O/N\n");/*Serie d'operation pour permettre a la boucle de se refaire*/
scanf("%c",&reponse);
reponse=toupper(reponse);
} while(reponse=='O');
printf("Appuyer sur une touche pour continuer");
getch();/*Instrution pour un seul caractere*/
return 0;
}
int main()
{
const int BORNE1=0;
const int BORNE2=20 ;/*Declaration des caractere*/
int ligne,col;
int nombre,valide;
char reponse;
/*ligne et colone*/
do{/*Utilisation de la boucle do..while"*/
printf("Entrez un nombre de 1 a 20:");//Choix de nombre par l'utilisateur*/
fflush(stdin);/*Vider la memoire tampon*/
scanf("%d",&nombre);/*Deposer la valeur demander a l'utilisateur*/
/*Defenir la zone de fabrication du triangle permise*/
valide=(nombre==BORNE1||nombre<=BORNE2);
if (!valide)
printf("Vous etes hors limite recommencer\n");
for/*Utilisation de for pour choisir les caractere numerique des ligne*/
(ligne=1; ligne<=nombre;ligne++){/*initialisation
/*pour colone varie de ligne jusqu'à 20 ou selon le nombre de depart choisi*/
for(col=ligne; col<= nombre; col++)
printf("%d", col);
printf ("\n");
/*Marque la fin dela boucle do*/
}printf("Voulez-vous continuer?O/N\n");/*Serie d'operation pour permettre a la boucle de se refaire*/
scanf("%c",&reponse);
reponse=toupper(reponse);
} while(reponse=='O');
printf("Appuyer sur une touche pour continuer");
getch();/*Instrution pour un seul caractere*/
return 0;
}
Moustiquet
Messages postés
212
Date d'inscription
samedi 3 octobre 2009
Statut
Membre
Dernière intervention
27 juin 2011
21 oct. 2009 à 20:40
21 oct. 2009 à 20:40
Excuser, mais je me suis mal exprimé. Lorsque je veut faire une validation pour que le programme accepte seulement les valeurs de 0 a 20 et qu'il me dise lorsque je suis hors limite et me reponse la question "Voulez-vous enter un autre valeur. C'est cela qui ne fontionne pas. Merci Excusé pour la confusion au début de mon message précédent