TutorielsVous débutez ? C'est ici qu'on commence !
Mon compte
Recherche
Livre d'or
PublicitéVous devez être inscrit pour pouvoir poster des messages
| Page : 1 | |||||||||||||||
| Auteur | Message | ||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 visiteur sur ce sujet (1 anonyme) | |||||||||||||||
| Page : 1 | |||||||||||||||
el-khawarrizmi
|
# Posté le 12/05/2008 à 01:46:01 | ||||||||||||||
|
_____/'G|U|S/'______ Groupe : Membres |
salut,
le but de nombre petit programme : contrôler le nombre saisie , il doit être un chiffre or ça affiche une erreur et donne la main pour re-saisie et les nombres négatif aussi on ne les accepte pas voilà ce que j'ai fait Code : C
Le problème que l'exécutable ne donne pas la main pour re-saisir quand on entre une lettre il affiche l'erreur numéro 2 et il l'application termine merci d'avance pour l'aide Ps:j'aime bien vos idées
SVP, ne commanter pas sur mon français svp je sais qu'il est mal mais je vous assure que je fais des efforts. |
||||||||||||||
LoupSolitaire
|
# Posté le 12/05/2008 à 03:02:49 | ||||||||||||||
![]() Groupe : Membres |
Indente correctement et saute des lignes, c'est peu lisible là...
Sinon je te conseille d'utiliser un seul scanf dans une boucle do{}while Ton contrôle est incohérent, dans tous les cas tu renvoie une erreur et au niveau de la seconde partie, tu compares un entier avec des caractères. C# m'a tuer |
||||||||||||||
aska990
|
# Posté le 12/05/2008 à 05:13:01 | ||||||||||||||
Je vais manger moult frites !![]() Groupe : Membres |
bizarre bizarre...
le post est sans aucune faute d'orthographe, mais alors les printf du programme... bon sinon ton truc est un peu incohérent tu veux faire quoi ? faire rentrer un nombre à l'utilisateur, puis vérifier si ce n'est pas une lettre et si il est compris entre 1 et 50 ? si c'est le cas tu as une drôle de façon de procéder c'est normal qu'il te mette l'erreur 2 : Code : C
vu que tu fais un do...while, le contenu de la boucle s'éxécute au moins une fois, donc il te mettra forcément au moins une fois l'erreur 2. D'ailleurs, ton erreur 2 dit que le caractere doit être un chiffre, mais tu testes (pour tester un nombre, pas besoin de le mettre entre guillemets, ça c'est pour les caractères autres que les nombres) si il est supérieur à 50 ou inférieur à 1 !! De toutes façon, en console, si l'utilisateur rentre des lettres au lieu de chiffres, le programme se met toujours à bugger par contre, tu ne fais pas de boucle pour la première erreur, ça veut dire que l'utilisateur ne pourra pas rentrer un nombre au dessous de zéro la première fois, mais après, il le pourra ensuite, à quoi ça sert de renvoyer le nombre ?? bon, voici le code corrigé : Code : C
j'ai remplacé l'erreur "le caractere doit être un chiffre" par "Le caractere doit etre inferieur a 50" j'ai aussi corrigé les fautes d'orthographe (tu avais aussi mis des accents : ils n'apparaissent pas en console )allez, bye
Édité
le 12/05/2008 à 05:31:55
par aska990
|
||||||||||||||
el-khawarrizmi
|
# Posté le 13/05/2008 à 12:48:47 | ||||||||||||||
|
_____/'G|U|S/'______ Groupe : Membres |
c'est régler pour les chiffres merci
mais quand je tape une lettre ou un caractère comme le point la virgule...etc. Il boucle une boucle infinie c'est pour ça j'ai fait '1' et '50' est-ce que je peux trouver ici les codes ASCII des caractère
Édité
le 13/05/2008 à 12:58:41
par el-khawarrizmi
SVP, ne commanter pas sur mon français svp je sais qu'il est mal mais je vous assure que je fais des efforts. |
||||||||||||||
LoupSolitaire
|
# Posté le 13/05/2008 à 13:04:51 | ||||||||||||||
![]() Groupe : Membres |
recherche google ascii, tu trouve plein d'images représentant la table des caractères ASCII
C# m'a tuer |
||||||||||||||
el-khawarrizmi
|
# Posté le 13/05/2008 à 13:40:08 | ||||||||||||||
|
_____/'G|U|S/'______ Groupe : Membres |
Code : C
j'ai ajouté le contrôle des lettres alphabétique et j'ai convertie le int à un char mais toujours boucle infiniment SVP, ne commanter pas sur mon français svp je sais qu'il est mal mais je vous assure que je fais des efforts. |
||||||||||||||
-ed-
|
# Posté le 13/05/2008 à 14:05:06 | ||||||||||||||
C is a sharp tool![]() Groupe : Membres |
Citation : guis
le but de nombre petit programme Aucun sens. Essaye d'écrire en français compréhensible... Pour ton problème, il faut travailler sur 3 niveaux : 1 - commence par faire une saisie de ligne correcte et stable : http://www.siteduzero.com/tuto-3-11181 [...] -a-fgets.html 2 - ensuite, tu la convertis en entier en utilisant correctement strtol(), qui est capable de dire si la chaine saisie est correcte ou non. 3 - Enfin, tu vérifie que le domaine de valeurs est correct.
Édité
le 13/05/2008 à 14:08:31
par -ed-
Emmanuel Delahaye. ![]() Des infos sur la programmation et le langage C: http://bien-programmer.blogspot.com/ http://mapage.noos.fr/emdel/ |
||||||||||||||
aiii
|
# Posté le 13/05/2008 à 14:05:54 | ||||||||||||||
![]() Groupe : Membres |
Ouch, on voit bien les limites de scanf ...
Ton programme est ... dénudé de sens. La logique de codage est incompréhensible. @-ed-: Oui, mais si je tape 'e', et que fais une conversion, que vais-je obtenir ? 0 !
Édité
le 13/05/2008 à 14:16:48
par aiii
|
||||||||||||||
tc
|
# Posté le 13/05/2008 à 14:19:25 | ||||||||||||||
Readability counts![]() Groupe : Membres |
Pour vérifier une saisie, tu peux utiliser:
Code : C
Tu peux également baser cette fonction sur fgets() et strtol(). Thierry "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth | FAQ-Python | FAQ-C - FAQ-c.l.c | FAQ-C++ - FAQ-Lite | |
||||||||||||||
-ed-
|
# Posté le 13/05/2008 à 14:57:55 | ||||||||||||||
C is a sharp tool![]() Groupe : Membres |
Citation : aiii
@-ed-: Oui, mais si je tape 'e', et que fais une conversion, que vais-je obtenir ? 0 ! Il faut traiter intelligemment l'information donnée par le 2ème paramètre de strtol(). Pour ça, il faut commencer par lire la doc et en comprendre le rôle. @Thierry : Ton code ignore silencieusement l'erreur de saisie : Code : Console
Édité
le 13/05/2008 à 15:00:43
par -ed-
Emmanuel Delahaye. ![]() Des infos sur la programmation et le langage C: http://bien-programmer.blogspot.com/ http://mapage.noos.fr/emdel/ |
||||||||||||||
tc
|
# Posté le 13/05/2008 à 15:35:45 | ||||||||||||||
Readability counts![]() Groupe : Membres |
Citation : -ed-
@Thierry : Ton code ignore silencieusement l'erreur de saisie : Code : Console
Oui. C'était un choix délibéré, la question étant de savoir s'il est pertinent d'ignorer ce type d'erreur de saisie. Ceci corrige mon code précédent: Code : C
Thierry "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth | FAQ-Python | FAQ-C - FAQ-c.l.c | FAQ-C++ - FAQ-Lite | |
||||||||||||||
el-khawarrizmi
|
# Posté le 13/05/2008 à 17:26:25 | ||||||||||||||
|
_____/'G|U|S/'______ Groupe : Membres |
merci pour l'aide
j'ai lu le tuto qui l'a donné -ed- j'ai trouver cette fonction Code : C
Code : C
Code : C
SVP, ne commanter pas sur mon français svp je sais qu'il est mal mais je vous assure que je fais des efforts. |
||||||||||||||
tc
|
# Posté le 13/05/2008 à 19:26:49 | ||||||||||||||
Readability counts![]() Groupe : Membres |
La fonction purge() permet d'éliminer les caractères non lus par scanf(), tel que le caractère de fin de ligne '\n' qui vient de la validation de la saisie à l'aide de la touche ENTER de ton clavier. purge() fonctionne de la manière suivante:
Code : C
On lit chaque caractère qui se trouve dans le tampon du flux d'entrée standard (normallement le flux associé au clavier) jusqu'à ce qu'on rencontre le caractère de validation par ENTER (i.e. '\n'). On ignore chacun de ces caractères. Késako le flux d'entrée standard ? Tampon ? Lorsque tu demandes à l'utilisateur d'entrer un nombre au clavier, celui-ci s'exécute et entre par exemple le nombre 1977 + ENTER. Ensuite, les caractères ('1', '9', '7', '7', '\n') sont stockés via le flux associé au clavier (flux d'entrée standard ou encore stdin) dans un espace mémoire mémoire appelé tampon. C'est dans cet espace tampon que scanf() vient puiser les caractères dont elle a besoin pour effectuer la conversion demandée. Ainsi, scanf() va extraire les caractères ('1', '9', '7', '7') du tampon de stdin, effectuer la conversion, et stocker la valeur entière 1977 dans la variable ret, qui n'est rien d'autre que la variable contenant la valeur qui sera retournée par notre fonction saisir_entier(). Seulement, voilà! Il reste encore dans notre tampon le caractère '\n'. La présence de ce caractère peux se montrer génante pour les saisies futures. C'est pourquoi il est conseillé de purger le tampon de stdin pour éliminer '\n' et les autres caractères qui n'auraient éventuellement pas été lus par scanf(). En effet, il n'est pas garanti que l'utilisateur se limite à saisir les caractères "1977" + '\n'. Il se peut que par maladresse (ou dans un but moins louable), ce même utilisateur saisisse les caractères "1977abcdefghijklmn" + '\n'. Dans ce cas, scanf() consomme les 4 premiers caractères (les chiffres) pour accomplir sa conversion, mais les caractères "abcdefghijklmn\n" restent dans le tampon en attente d'un prochain appel à scanf(), fgets() ou fgetc(stdin). Tant qu'il reste des caractères dans le tampon, les fonctions d'entrée que je vient de citer chercheront à les utiliser et elles n'attendront pas que l'utilisateur introduise une nouvelle saisie. C'est ce qui passe avec le code suivant: Code : C
Si l'utilisateur introduit "1977abcdefghijklmn" + '\n', on constate que le programme part dans une boucle infinie. Que se passe-t'il ? scanf() commence par convertir les 4 premiers caractères et stocke la valeur entière 1977 dans la variable n. Comme n est plus grand que 10, on recommence l'opération. Comme il reste des caractères dans le tampon du flux d'entrée standard, scanf() n'attend pas que l'utilisateur effectue une nouvelle saisie. Il cherche à nouveau à convertir une valeur entière. Comme il ne reste que des lettres dans le tampon, il n'y parvient pas. Sur cet échec, scanf() retourne la valeur 0 pour indiquer qu'il n'a pas été en mesure d'effectuer la conversion, mais comme on ne vérifie pas cette valeur, on ne le voit pas. La valeur de n reste inchangée et vaut toujours 1977. Comme 1977 est plus grand que 10, rebelotte! On effectue un nouveau tour de boucle. scanf() essaie à nouveau d'extraire des caractères du tampon de stdin pour sa conversion, mais sans succès. scanf() continue à retourner 0 et la valeur de n reste inchangée à la valeur 1977. On part dans une boucle infinie. Le petit exemple ci-dessus démontre pourquoi il est important de purger la tampon du flux d'entrée standard après chaque saisie. La fonction purge() fonctionne comme suit: elle lit chacun des caractères non lus "abcdefghijhklmn\n" un à un. Au 1er tour de boucle, c reçoit la valeur 'a'. Comme cette valeur est différente de '\n' et de EOF, la boucle continue sans rien faire avec la valeur de c (le corps de la boucle est vide). Au 2ème tour de boucle, c reçoit la valeur 'b' qui est différente de '\n' et de EOF. On continue et on ne fait toujours rien de c (chaque caractère lu est ignoré)! Et ainsi de suite jusqu'au 15e tour de boucle ou c reçoit la valeur '\n'. La boucle s'arrete et il ne reste plus de caractère dans le tampon du flux d'entrée standard. Voilà, notre code s'améliore: Code : C
Notre code est maintenant plus sur. Lorsque l'utilisateur introduit quelque chose comme "1977abcdefghijklmn"+'\n', on ne part plus dans une boucle infinie. Il ne nous reste plus qu'à gérer les erreurs de conversion. Comme nous l'avons évoqué précédamment, lorsqu'un utilisateur maladroit introduit la saisie "abcde" + '\n' alors qu'on attend de lui un entier, scanf() ne parvient pas à effectuer la conversion. Pour repérer cette erreur, il suffit de tester la valeur de retour de scanf() (c'est d'ailleurs un pratique conseillée de tester cette valeur de manière systématique). Notre code devient: Code : C
A ce stade, notre code est pas mal, mais il accepte encore des entrées telles que "10abcdef" + '\n'. Pour remédier à cela, on place l'indicateur d'erreur à 1 si le premier caractère lu après la saisie de l'entier est différent de '\n' ou de EOF. On obtient finalement un code équivalent à celui posté avec la fonction saisir_entier: Code : C
Voilà, j'aurais sans doute pu faire plus court, mais je n'étais pas très inspiré. En ce qui concerne l'appel à fflush(stdout) que tu as également demandé d'expliquer, il est nécessaire pour forcer l'affichage de l'invite de saisie lorsque celle-ci ne se termine pas par un caractère de fin de ligne. En effet, comme avec le flux d'entrée standard, printf() envoie les caractères à afficher dans le tampon du flux de sortie standard. Il ne vide ce tampon qu'occasionnellement. Ce mécanisme a été mis en place afin d'optimiser les opérations d'affichage qui sont relativement lentes. Il y a trois événement qui purgent le tampon de stdout et déclanchent ainsi l'affichage sur la console:
Ainsi, lorsqu'on écrit: Code : C
On est assuré que l'invite sera affichée avant que la saisie n'ait lieu. Si par contre, on écrit: Code : C
L'appel à fflush(stdout) est nécessaire pour s'assurer que la chaine "Entrez un entier : " soit affichée avant que la saisie n'ait lieu. Certains système purgent automatiquement le tampon du flux de sortie standard lorsqu'on effectue une saisie sur le flux d'entrée standard. Il est en général déconseillé de compter sur ce comportement. En terme de portabilité, c'est une bonne pratique d'appeler explicitement fflush() à chaque fois qu'on désire synchroniser l'affichage d'une invite et une opération de saisie. Thierry "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth | FAQ-Python | FAQ-C - FAQ-c.l.c | FAQ-C++ - FAQ-Lite | |
||||||||||||||
aska990
|
# Posté le 14/05/2008 à 12:09:48 | ||||||||||||||
Je vais manger moult frites !![]() Groupe : Membres |
Citation : guis
mais quand je tape une lettre ou un caractère comme le point la virgule...etc. Il boucle une boucle infinie c'est pour ça j'ai fait '1' et '50' t'es aveugle ou quoi ? : Citation : aska990 De toutes façon, en console, si l'utilisateur rentre des lettres au lieu de chiffres, le programme se met toujours à bugger ceci dit la solution proposée est pas mal mais en tout cas ça sert a rien de faire '1', '50'
Édité
le 14/05/2008 à 12:15:57
par aska990
|
||||||||||||||
el-khawarrizmi
|
# Posté le 15/05/2008 à 16:05:51 | ||||||||||||||
|
_____/'G|U|S/'______ Groupe : Membres |
tu ma pas compris j'ai cru quand je met '1' ou même 'a' il donne respectivement leur code ASCII
mais un grand merci à qui ma donner un coup de main SVP, ne commanter pas sur mon français svp je sais qu'il est mal mais je vous assure que je fais des efforts. |
||||||||||||||
Retour au forum "Langage C" ou à la liste des forums
Vous devez être inscrit pour pouvoir poster des messages
Changer de design |
En savoir plus |
Plan du site |
Politique d'accessibilité |
Règles |
RSS tutoriels |
RSS news
Édité par Simple IT SARL :
Nous contacter
| Notre blog | Revue de presse | Publicité
Y'a plus rien à lire, faut remonter maintenant !
Hébergement web - Correction de tutoriels - Créer un site
Vous souhaitez apparaître ici ? Contactez-nous.
335 Zéros connectés |
8 requêtes |
0.0814s (0.0551s)
