Tom's Guide > Forum > Programmation > [RESOLU] Problème en C (programme sans interface graphique)

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

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

TomsGuide.com : 800 000 inscrits répondent à toutes vos questions high-tech et informatique. Pour obtenir de l'aide, inscrivez-vous gratuitement !
Mot :    Pseudo :           
 

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 :
http://img82.imageshack.us/img82/1641/pbc2an.gif

Merci d'avance pour vos solutions ;-) !

Liens sponsorisés
Inscrivez-vous ou connectez-vous pour masquer ceci.

ç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.

Répondre à CRicky

Merci !

Je débute et j'ai pas encore vu la fonction fflush(stdin)
Elle consite en quoi ? et comment l'utiliser ?

Répondre à aerocell

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.

Code :
  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;

Répondre à CRicky

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 :
http://img293.imageshack.us/img293/2995/pbc6os.gif

Tu peux m'aider ? ;-)

Répondre à aerocell

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 ?

Répondre à aerocell

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"

Code :
  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).

Code :
  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. ...

Répondre à CRicky

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,

Répondre à CRicky

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"

Code :
  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).

Code :
  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 ;-)

Répondre à aerocell

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.

Répondre à CRicky

Ok merci beaucoup pour ton aide CRicky !

Répondre à aerocell
Tom's Guide > Forum > Programmation > [RESOLU] Problème en C (programme sans interface graphique)
Aller à :

Il y a 2229 utilisateurs connus et inconnus. Pour voir la liste des connectés connus, cliquez ici.

Attention

Vous allez répondre sur un sujet resté inactif pendant plus de 6 mois.
Assurez-vous d'apporter des éléments nouveaux à la discussion avant de poursuivre.

Répondre Annuler
Liens