Les variables - C - Programmation
Marsh Posté le 11-03-2005 à 18:11:16
joymaxxx a écrit :
|
Problème classique du à une mauvaise utilisation de scanf(). Je recommande ceci:
http://mapage.noos.fr/emdel/notes.htm#saisie
Marsh Posté le 11-03-2005 à 18:23:15
Désolé mais je ne comprend pas comment on se sert de ces instruction.
Quelqu'un aurait un autre tuto a me proposer ? Ou aute solution ?
Merci beaucoup pour votre aide et merci a toi emmanuel ;-)
Marsh Posté le 11-03-2005 à 18:52:38
joymaxxx a écrit : Désolé mais je ne comprend pas comment on se sert de ces instruction. |
Quelles instructions ? Qu'est-ce que tu ne comprends pas ? As-tu essayé au moins ?
Citation : |
Dans mon article, je propose d'utiliser fgets() et la fonction de conversion qui va bien. Sinon, j'utilise mes propres fonctions de saisies:
http://mapage.noos.fr/emdel/clib.htm
Module IO
Marsh Posté le 11-03-2005 à 20:54:34
erreur connue faut vider le buffer avant
printf ("Bienvenue programme\n" );
printf ("Quelle est ta premiere note en math ??? \n " );
scanf ("%f" , &math1);
printf ("Quelle est ta deuxieme note en maths ???\n" );
scanf ("%f", &math2);
printf ("As tu d'autres notes en maths (y/n)?\n" );
fflush (stdin);
scanf ("%c", &question1);
l'erreur vient du fait, qu'apres le deuxieme scanf, le buffer contient encore le ENTER dans son buffer... de ce fait quand le troisieme scanf arrive, comme il y qqch dans le buffer, il le prend et tu n'as mm pas le temps de tapé qqch... donc faut vider le buffer grace à la fonction fflush ()
dans les () tu passes "stdin" qui est le buffer d'entrée par défaut associé au clavier. Il existe également "stdout" qui est le buffer par défaut de sortie de l'écran et "stderr" qui est le buffer standart d'erreur (qui lui se vide automatiquement après chaque opération).
Marsh Posté le 11-03-2005 à 21:02:50
Ouhlala... pourvu que Taz ne passe pas par là...
Marsh Posté le 11-03-2005 à 21:08:47
moi23372 a écrit : erreur connue faut vider le buffer avant |
Ouhlala... pourvu que Taz ne passe pas par là...
Il ne faut pas vider le buffer. Il faut comprendre que lorsque tu tapes ta seconde note en maths (et aussi ta première), tu tapes un nombre et tu appuies sur "return". Eh bien la fonction "scanf" récupère le nombre mais laisse le "return" dans le buffer. Le scanf(%c) suivant récupère ce "return"
Il ne faut donc pas vider le buffer, il suffit juste demander au programme d'aller lire un caractère dans le buffer après chaque saisie de notes
=> getchar() après chaque scanf(%f)
Ou bien utiliser tout le temps une saisie de type chaîne (style gets) et récupérer les valeurs issues de la chaîne (sscanf)
De plus, on ne compare pas une variable "question1" ne contenant qu'un seul caractère à une chaîne qui en fait plusieurs "yes". Ce ne sera jamais égal !
Enfin avant de s'aventurer dans le dangereux concept de chaînes de caractères en C, il serait judicieux que tu te forces à assimiler le fait suivant: le C ne connaît pas la notion "chaîne de caractères". Donc, même si "question1" est définit avec le bon type, n'essaye pas non plus de faire if (question1 == "yes" ) parce que ça ne marchera pas non plus.
Va voir les pages de Emmanuel qui t'enseigneront le C
Marsh Posté le 11-03-2005 à 21:09:30
moi23372 a écrit : erreur connue faut vider le buffer avant |
Non. Il faut vider le buffer après ! C'est chaque scanf() qui laisse trainer un '\n'.
|
Citation :
|
Sujet débattu ad nausemam... Le comportement est indéfini. En effet, fflush() n'est défini que pour les flux de sorties. Certains compilateurs pour MS-DOS supportent une extension acceptant stdin, mais ce n'est pas portable. Des cas de plantage ont été rapportés sous Unixoide. (au mieux, ça ne fait rien...)
Des alternatives existent.
Marsh Posté le 11-03-2005 à 21:11:10
Sve@r a écrit : |
Exactement.
Citation : |
Je suppose que tu as voulu dire fgets(), parce que gets() est un bug.
Marsh Posté le 11-03-2005 à 21:13:53
Emmanuel Delahaye a écrit : Exactement. |
J'ai dit style gets (donc de la famille à ...)
Il me semblait bien qu'il y avait un soucis avec "gets"
Marsh Posté le 11-03-2005 à 21:54:58
Merci a tous pour votre aide !! Ca y es ca marche !
Mais en fait les deux solution marche (getchar() et fflush (stdin)) et j'ai pas trop compris la difference entre les deux mais bon ca y es ca marche !
Je vais relire les cours de emmanuel depuis le debut pour continuer mon apprentissage.
Merci encore ! ;-)
Marsh Posté le 11-03-2005 à 22:26:45
moi23372 a écrit : erreur connue faut vider le buffer avant |
tu confirmes encore une fois, par ce code et cette explication des plus moisis, que tu racontes connerie sur connerie au fur et à mesure de tes posts ici (utilisation de scanf, fflush(stdin), etc...)
tu n'as pas encore compris que tu as encore beaucoup à apprendre ?
Marsh Posté le 11-03-2005 à 22:56:00
joymaxxx a écrit : Merci a tous pour votre aide !! Ca y es ca marche ! |
Je réexplique calmement
la fonction "fflush" a pour but de vider les buffer. Sauf que les buffer qu'on a généralement besoin de vider sont des buffer d'écriture (j'écris sur un disque, j'écris dans un fichier, j'écris à l'écran). La fonction "fflush" synchronise les écritures en attentes dans les buffer à cet effet.
Comme c'est inutile de vider les buffer de lecture (clavier entre autres) la fonction "fflush", au-mieux, ne fait rien quand on lui passe "stdin". Au pire, elle te fera n'importe quoi. Sur certains systèmes, comme Sun, la fonction vide réellement le buffer "stdin" mais ce n'est pas standard.
Donc tu appelles "fflush(stdin)" mais c'est inutile et peut-être dangereux
Pourquoi getchar ?
Imagine ton clavier comme une grosse suite de cases mémoires. Tu appelles "scanf(%f)" et tu tapes "12.5" plus "return", ben tes cases mémoires se remplissent avec les valeurs '1' '2' '.' '5' 'return'
Ensuite, scanf lit ces cases mais ne prend que les nombres flottants et s'arrête lorsque la case n'est plus du nombre réel. Il lit les cases '1', '2' '.' et '5'. Ces cases lues disparaissent du clavier.
Que reste-t-il ? Il reste le 'return' que scanf a refusé.
A la saisie suivante, si tu lui demandes de saisir un caractère (%c, &question1), ben scanf a déjà ce caractère présent 'return' et l'utilise pour remplir la variable "quesion1".
Donc toi, il te faut faire saisir "pour rien" ce 'return' par un "getchar" pour que tu puisses saisir efficacement ta réponse. Et où placer ce "getchar" ? Ben juste après l'endroit où tu as tapé ce "return" génant c'est à dire juste après le "scanf(%f)"
Marsh Posté le 11-03-2005 à 17:30:44
Bonjour a tous, je viens de me lancer dans le C et je tente d'écrire mon tout premier programme de calcul de moyenne, apres le classqiue hello world
Voila le code de ce que j'ai fait :
#include <stdio.h>
#include <stdlib.h>
float math1,math2,math3;
char question1;
char yes;
int main()
{
printf ("Bienvenue programme\n" );
printf ("Quelle est ta premiere note en math ??? \n " );
scanf ("%f" , &math1);
printf ("Quelle est ta deuxieme note en maths ???\n" );
scanf ("%f", &math2);
printf ("As tu d'autres notes en maths (y/n)?\n" );
scanf ("%c", &question1);
if (question1==yes)
{
printf ("blablabla" );
}
else
{
printf ("bliblibli" );
}
getchar ()
return 0;
}
Le probleme avec ce code c'est que au moment de poser la question dont la reponse doit etre validée ou non par IF, le programme affiche directement la condition else c'est a dire bliblibli.
Je crois que j'ai fait une erreur dans la déclaration des variables (en particulier yes) mais je n'en sait pas plus. J'ai tenté de déclarer la variable "yes" mais le compilateur rencontrait un probleme a la compilation.
Quelqu'un pourrait me corriger en me rajoutant la déclaration de "yes" et tout ce qui va avec ? Et m'expliquer par la meme occasion ?
De plus, ce programme fonctionne sous DOS mais j'aimerais l'integrer a une interface graphique plus tard. Faudra t il que je modifie le code ou je pourrais faire un copier coller ??
Merci d'avance pour votre aide !