Se connecter / S'enregistrer
Votre question

[RESOLU] Problème en C (programme sans interface graphique)

Tags :
  • Programme
  • Programmation
Dernière réponse : dans Programmation
28 Janvier 2006 14:14:39

Bonjour à tous !

Voilà mon problème :
Je débute en C et je fais une petite calculette (sans interface graphique) histoire de me perfectionné...
Ma calculette fait appel à une fonction selon le type d'opération, actuellement je suis en train de faire la fonction addition() et quand je veux mettre des nombres décimaux, il saute le scanf suivant et écrit que le résultat est le nombre tronqué.
Je pense que vous comprendrez mieu avec le code source :

Citation :

int addition()
{
double nb1 = 0, nb2 = 0, resultat = 0;
printf("Entrez le nombre 1 : ");
scanf("%ld", &nb1);
printf("\n +\n");
printf("Entrez le nombre 2 : ");
scanf("%ld", &nb2);
printf("\n ___________\n");
resultat = nb1 + nb2;
printf(" %ld", resultat);
return 0;
}


Et voilà le résultat sur la console :


Merci d'avance pour vos solutions ;-) !

Autres pages sur : resolu probleme programme interface graphique

a b L Programmation
28 Janvier 2006 14:44:40

ça c'est bien décrit ;-)
Du coup, j'ai compris ton problème:
dans ton scanf tu met en gros %d. Or, ce n'est que pour les nombres entiers (d comme decimal et pas double ;-) )
il faut utiliser %f (pour float et double).

EDIT: dans ton exemple si tu mettais un fflush(stdin), il te le redemanderait, mais si tu met 3.5, il n'aurait pris en compte que 2 pour le premier et 3 pour le second.
28 Janvier 2006 16:04:41

Merci !

Je débute et j'ai pas encore vu la fonction fflush(stdin)
Elle consite en quoi ? et comment l'utiliser ?
Contenus similaires
a b L Programmation
28 Janvier 2006 16:13:28

si tu demande 3 entiers avec scanf() et que l'utilisateur tapes: 21,56,89
le premier scanf prend "21", et laisse ",56,89" dans le buffer (mémoire tampon) du clavier, le prochain scanf prend "56" et laisse ",89" sans que l'utilisateur n'ai eu le temps de taper quoi que ce soit.
fflush(stdin) permet de vider ce buffer clavier après utilisation. Dans l'exemple des 3 scanf(), le 2ème scanf() redemandera une nouvelle valeur car "56,89" ne se trouvent plus dans le buffer clavier.

Personnellement, je pense qu'un fflush(stdin) devrait être fait après tout appel à scanf(). Sinon ça sert aussi à l'écriture de fichiers pour s'assurer que tout y est écrit avant de le fermer.

  1. double nb1 = 0, nb2 = 0, resultat = 0;
  2. printf("Entrez le nombre 1 : ");
  3. scanf("%ld", &nb1);
  4. fflush(stdin);
  5. printf("\n +\n");
  6. printf("Entrez le nombre 2 : ");
  7. scanf("%ld", &nb2);
  8. fflush(stdin);
  9. printf("\n ___________\n");
  10. resultat = nb1 + nb2;
  11. printf(" %ld", resultat);
  12. return 0;
28 Janvier 2006 16:14:13

Argh ! nouveau problème !


Voilà ce que j'ai mis :
Citation :

int addition()
{
double nb1 = 0, nb2 = 0, resultat = 0;
printf("Entrez le nombre 1 : ");
scanf("%f", &nb1);
printf("\n +\n");
printf("Entrez le nombre 2 : ");
scanf("%f", &nb2);
printf("\n ___________\n");
resultat = nb1 + nb2;
printf(" %f", resultat);
return 0;
}


Et voilà le resultat :


Tu peux m'aider ? ;-)
28 Janvier 2006 16:19:16

J'ai mis le fflush(stdin) dans mon code :

Citation :

int addition()
{
double nb1 = 0, nb2 = 0, resultat = 0;
printf("Entrez le nombre 1 : ");
scanf("%f", &nb1);
fflush(stdin);
printf("\n +\n");
printf("Entrez le nombre 2 : ");
scanf("%f", &nb2);
fflush(stdin);
printf("\n ___________\n");
resultat = nb1 + nb2;
printf(" %f", resultat);
return 0;
}


Mais mon compilateur refuse de compiler il dit "Permission denied".
Ai-je fais une erreur de syntaxe ?
a b L Programmation
28 Janvier 2006 16:26:14

Effectivement, je me suis trompé.
Le printf prend %f pour les type "float" et "double".
Mais le scanf, lui, ne prend que les types "float" pour %f
Et d'après ce que j'ai vu dans la doc, il n'y a rien pour les "double".
Donc tu n'as que 2 possibilités:
- soit tu déclares tes variables en "float"
  1. float nb1 = 0, nb2 = 0, resultat = 0;
  2. printf("Entrez le nombre 1 : ");
  3. scanf("%f", &nb1);
  4. ...


- soit tu gardes tes "double" et tu ajoute une autre variable temporaire en "double" et tu fait une conversion implicite de float en double (car le codage de ces types sont différents).
  1. double nb1 = 0, nb2 = 0, resultat = 0;
  2. float temp=213.5;
  3. printf("Entrez le nombre 1 : ");
  4. scanf("%f", &temp);
  5. nb1 = temp;
  6. ...
a b L Programmation
28 Janvier 2006 16:30:03

Pour le fflush(stdin); si tu as mis le #include <stdio.h>, et que tu n'as pas déclaré de variable stdin, il ne devrait pas y avoir de problème,
29 Janvier 2006 16:06:21

Citation :

CRicky a écrit :
Effectivement, je me suis trompé.
Le printf prend %f pour les type "float" et "double".
Mais le scanf, lui, ne prend que les types "float" pour %f
Et d'après ce que j'ai vu dans la doc, il n'y a rien pour les "double".
Donc tu n'as que 2 possibilités:
- soit tu déclares tes variables en "float"
  1. float nb1 = 0, nb2 = 0, resultat = 0;
  2. printf("Entrez le nombre 1 : ");
  3. scanf("%f", &nb1);
  4. ...


- soit tu gardes tes "double" et tu ajoute une autre variable temporaire en "double" et tu fait une conversion implicite de float en double (car le codage de ces types sont différents).
  1. double nb1 = 0, nb2 = 0, resultat = 0;
  2. float temp=213.5;
  3. printf("Entrez le nombre 1 : ");
  4. scanf("%f", &temp);
  5. nb1 = temp;
  6. ...



Ok merci, je t'avais dis que t'étais un boss en programmation ! ;-)

Pour le fflush(stdin), c'était un bug de mon compilateur et rien de plus.

Mais j'ai une question à te poser :
Est-ce que la variable "temp" est particulière ?
Est-t-elle l'inverse des constante ?
Pourquoi tu l'initialise à 213.5 ?

Bon d'accord sa fait plusieurs questions mais c'est sur un seul sujet ! :-D ;-)
a b L Programmation
29 Janvier 2006 16:48:09

non temp est une variable comme une autre. Je sais pas pourquoi je l'ai initialisé à 213.5, mais ça n'a aucun intérêt :-D
l'intérêt de la variable temp est de faire passer un float
en fait une variable float te suffit, pour faire le scanf(), ensuite elle est convertie en double lorsque tu fait un = car nb1=temp; est en fait traduit par le compilateur en nb1=(double)temp; c'est le cast implicite.
29 Janvier 2006 18:50:48

Ok merci beaucoup pour ton aide CRicky !
Tom's guide dans le monde
  • Allemagne
  • Italie
  • Irlande
  • Royaume Uni
  • Etats Unis
Suivre Tom's Guide
Inscrivez-vous à la Newsletter
  • ajouter à twitter
  • ajouter à facebook
  • ajouter un flux RSS