[.C] Calculatrice qui...calcule pas

Alors tout d’abors critique off svp je débute et j’essaye en vain de faire marcher ma calulatrice si quelqu’un pouvait m’explique ce qui ne va pas là dedans :

[codebox]#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int main(int argc, char *argv[])
{
long nombre1 = 0, nombre2 = 0;
double resultat = 0;
int operation;
printf (“bienvenue dans la calculatrice BobossTM !\n”);
printf (“entrez le premier nombre de l’opération”);
scanf ("%ld", &nombre1);
printf (“entrez le nombre2”);
scanf ("%ld", &nombre2);
printf (“entrez l’opération à effectuer\n 1.opération\n 2.Soustraction\n 3.division\n”);
scanf ("%ld", operation);
switch (operation)
{
case 1:
resultat = nombre1 + nombre2;
printf("%ld + %ld = %lf", nombre1, nombre2, resultat);
break;
case 2:
resultat = nombre1 - nombre2;
printf("%ld - %ld = %lf", nombre1, nombre2, resultat);
break;
case 3:
resultat = nombre1 / nombre2;
printf("%ld / %ld = %lf", nombre1, nombre2, resultat);
break;
}
return 0;
}
[/codebox]

C’est quoi le soucis en fait ? Elle renvoie quoi comme résultat ?
En testant, j’ai une NullReferenceException. T’aurais pas oublié le ‘&’ devant opération quand tu scanf ???
A part ça chez moi elle marche ta calculette (au moins l’addition).

scanf ("%ld", operation);
il manque un & devant operation :slight_smile:

edit grilled snif :confused:

Le formateur pour les int est %d, pas %ld. Avec printf() il faut utiliser %f pour les flottants, %lf n’est supporté qu’en C99.
Tu utilises la division entière pour faire la troisième opération mais tu pourrais la forcer à se faire en flottant :

Tu n’utilises pas les paramètres de main() donc remplace la liste par un void, ce sera plus clair.
scanf() est un nid à bugs, utilise au moins cette fonction après chaque saisie pour nettoyer les restes :

[code]void purgeStdin (void)
{
int c;

while ( (c = getchar()) != ‘\n’ && c != EOF )
{
}
}[/code]

Ok merci chez moi tout marche, il me reste tout de même quelques questions:
Void késako ?
[codebox]void purgeStdin (void)
{
int c;

while ( (c = getchar()) != ‹ \n › && c != EOF )
{
}
}[/codebox]
Ca je l’exécute et scanf est nettoyé ?

Plus explicitement ça te donne quoi (oui ça marche grâce à ton (double) devant (merci !)

void veut dire que ta fonction ne renvoie rien (et ne prend rien en arguments aussi du coup ici).
Cette fonction, il me semble en effet, purge le buffer d’entrée.

Le (double) devant ton nombre converti a la volée le nombre d’un long vers un double (donc plus un entier).

Vala pour ma petite contribution, ça faisait longtemps que j’avais pas tripoté du C!

PS : disez le moi si j’ai dis du caca.

Ecrire ce genre de prog en C, faut en vouloir ou etre obligé pour un exo :slight_smile:

Écris int main (void) au lieu de la version longue que tu utilises. C’est tout aussi valable, c’est plus simple et ça t’évite d’avoir un warning avec certains compilateurs.

Les caractères tapés au clavier se retrouvent dans un flux de données, stdin. Quand scanf() le lit et que tout se passe bien il laisse au moins un caractère traîner (le saut de ligne), et ça suffit déjà à poser problème si tu lis un caractère (%c) après par exemple. Si tu veux lire des chiffres et que l’utilisateur entre des lettres c’est encore pire, scanf() va laisser toutes les lettres. En appelant purgeStdin() après chaque saisie tu es sûr que tout ce que l’utilisateur a entré a été vidé et que tu peux repartir sur une autre saisie.

Par exemple 1/3 est égal à zéro si on utilise l’arithmétique entière, et à quelque chose comme 0.333333… si on utilise l’arithmétique flottante. La règle c’est que l’opérateur / est entier si les deux opérandes sont de type entier. Si tu écris :

double d = 1/3;

1/3 va donner comme résultat 0 (opérandes de type entier, donc division entière) et va être converti implicitement en double pour que sa valeur puisse être donnée à d. Pour que 1 ou 3 soit de type double remplace-le simplement par 1.0 ou 3.0 (ajoute un f si tu veux des float).

Nan c’est simplement que j’aime avoir la calculatrice en mode console :crying:
Plus sérieusement c’est pour réviser à peu près tout ce que je connais jusqu’à maintenant et comme vous voyez je suis pas hyper loin je passe à peine aux boucles :)…
Bon merci pour vos réponses !

C’est exactement ça, j’ai le même « problème » que Boboss: scanf est barbare comme fonction mais hyper simple à utiliser pour un débutant en C, donc on nous fait travailler avec ça au début le temps de voir des choses plus correctes et user-friendly (parce que le scanf qui te laisse entrer n’importe quoi…)

Sinon il y aurait pas moyen de demander d’abord le nombre1, puis l’opération à effectuer puis le nombre 2 ?

Si bien sur, tu n’as qu’à mettre le printf-scanf du nombre deux après celui de l’opération, au fait utilise scanf("%d"…) pour l’opération et pas scanf("%lf"…) : c’est un int pas un float

Ok merci je vais tester ça dès que j’ai le temps !

Ouais bon ça marche pas… :crying:
Sinon, le code du first post n’est plus valable…j’ai déjà corrigé les erreurs ! :slight_smile:
edit: my bad ça marche… :cry:

Ah je me disais aussi…

Edit: tant qu’on y est, pour des trucs aussi basiques qu’addition, soustraction, multiplication et division tu n’as pas besoin de math.h

J’ai ajouté racine carré et autres joyeusetés !

[quote=« DaP, post:4, topic: 46727 »][code]void purgeStdin (void)
{
int c;

while ( (c = getchar()) != ‹ \n › && c != EOF )
{
}
}[/code][/quote]

J’ai un peu de mal avec ta fonction.
Je comprend globalement à quoi elle sert, et ce qu’elle fait, mais j’arrive pas à le visualiser dans les détails, étape par étape :confused:

[quote=“TheDarkSkull, post:17, topic: 46727”]J’ai un peu de mal avec ta fonction.
Je comprend globalement à quoi elle sert, et ce qu’elle fait, mais j’arrive pas à le visualiser dans les détails, étape par étape :/[/quote]

Bin il lit un caractère tant que ce qu’il lit n’est pas différent du retour chariot et du symbole de fin de flux.
En gros, tant qu’il y a des trucs dans le buffer, il les mange.
Donc en fin de boucle, ton buffer est vide, ce qui est le but de la fonction.