Interdire une division par 0 - C - Programmation
Marsh Posté le 30-09-2006 à 13:52:53
ba la solution c'est que dans ton while tu prevois une condition de sortie
Code :
|
Mais le switch existe en pas en C?? (je sais plus )
Parceque sa serai largement plus propre
Marsh Posté le 30-09-2006 à 13:55:46
Si si, le switch avec case je crois existe bien.
Mais on débute et notre professeur a voulu que nous réalisions le programme avec un if, histoire de savoir l'utiliser.
Marsh Posté le 30-09-2006 à 13:56:48
fait d'abord un test (op == '/') et ensuite à l'interieur tu fait un
if (b==0) { afficher message d'erreur }
else { RESULTAT=a/b; printf(....); }
Sinon tu utilise mal scanf et les char, tu écris n'importe-ou en mémoire et ne fais aucune vérification de dépassement, ca va te péter à la gueule rapidement si tu corrige pas ca. (lignes 6/7/20/59)
[edit]
vala, des if comme dans le code de dreamkiller...
Marsh Posté le 30-09-2006 à 14:02:18
Ah ok, j'étais pas loin en fait.
J'avais bien fait un if dans le if, mais j'avais mal écrit :
----------------------
else if(op == '/')
{
if(b=='0')
Marsh Posté le 30-09-2006 à 14:06:05
Citation : Sinon tu utilise mal scanf et les char, tu écris n'importe-ou en mémoire et ne fais aucune vérification de dépassement, ca va te péter à la gueule rapidement si tu corrige pas ca. (lignes 6/7/20/59) |
C'est à dire ?
Ligne 6 et 7 tu aurais écrit quoi par exemple ?
Tu parles du "double" ?
Marsh Posté le 30-09-2006 à 14:18:34
ReplyMarsh Posté le 30-09-2006 à 14:19:18
ligne 6 tu déclare un char, ensuite ligne 20 tu utilise scanf pour récupérer un string. Tu as utilisé un & pour avoir l'adresse du char, le compilateur est content il ferme sa gueule MAIS :
- lorsque le scanf récupère un string de longueur 1 ( par exemple "/" ) il fait 2 char de long, le caractère '/' puis le caractère '\0' de fin de chaine. résultat tu écrit le '/' dans op, et tu écris '\0' dans la case mémoire juste après op.
Qui, en l'occurence à de fortes chances d'être la cse mémoire ou se trouve rep, si tu fais ca:
rep = 'a';
scanf("%s", &op); /* la tu tappe un truc d'un seul caractère */
printf("%c\n", rep);
le printf ne va pas t'afficher le 'a', parceque le scanf aura écrasé la valeur de rep sans que tu t'en rendre compte. par chance ton code marche malgrès ca.
le problème est exactement le même avec rep, en ligne 59 tu écris "illégalement" dans une zone mémoire juste après rep.
Ensuite c'est pire, imagine que quelqu'un lors de ton scanf rentre un string superlong, la c'est pas un dépassement d'une case qu'il fait mais de plusieurs cases, ca écrit n'importe-ou après ton char, et la c'est la fête, bonne chance pour débugger quand des variables sont changées involontairement par d'autres ^^
La solution c'est de bien relire la doc de scanf (dans le man, ou la: http://xrenault.developpez.com/tutoriels/c/scanf/), tu devrais rapidement trouver de quoi remplacer tes horribles %s.
Marsh Posté le 30-09-2006 à 14:20:20
Taz a écrit : utilise fgets + sscanf. vérifie le retour de toutes ces fonctions. |
pour récupérer un seul caractère, c'est ptêtre un poil overkill non ? (sinon ouais, pour récuperer des chaines c'est "plus sur". )
Marsh Posté le 30-09-2006 à 14:24:49
Merci des tes précisions.
Marsh Posté le 30-09-2006 à 14:38:39
Nichlas a écrit :
|
On a pas le droit d'utiliser == ou != avec les flottants. Problème de précision. Il faut faire une différence absolue (fabs()) et la comparer avec FLT_EPSILON ou DBL_EPSILON selon le type (<float.h> )
C'est une FAQ, non ?
Marsh Posté le 30-09-2006 à 14:39:47
0x90 a écrit : pour récupérer un seul caractère, c'est ptêtre un poil overkill non ? (sinon ouais, pour récuperer des chaines c'est "plus sur". ) |
c'est ça ou du getchar. mais pas de scanf
Marsh Posté le 30-09-2006 à 14:41:45
Emmanuel Delahaye a écrit : On a pas le droit d'utiliser == ou != avec les flottants. Problème de précision. Il faut faire une différence absolue (fabs()) et la comparer avec FLT_EPSILON ou DBL_EPSILON selon le type (<float.h> ) |
Jme suis posé la question justement, s'il n'y a eu aucun calcul et que c'est directement un test après entrée utilisateur, que craint-on comme imprécison ?
Et d'ailleurs si la valeur n'est pas exactement 0, on ne craint justement pas de division par zéro (juste on se tappe un trèèèèès gros chiffre).
Marsh Posté le 30-09-2006 à 14:42:46
Taz a écrit : c'est ça ou du getchar. mais pas de scanf |
ouais y'a getchar certes, mais y'a t'il un danger à utiliser un %c tout seul ?
Marsh Posté le 30-09-2006 à 14:44:36
0x90 a écrit : Jme suis posé la question justement, s'il n'y a eu aucun calcul et que c'est directement un test après entrée utilisateur, que craint-on comme imprécison ? |
/ 0.0 ça va sortir un inf
/ 0 ça va planter.
Marsh Posté le 30-09-2006 à 14:47:47
Taz a écrit : / 0.0 ça va sortir un inf |
'fectivement j'ai dit une connerie, faut que jrévise mes flottants moi un de ces 4 (que j'ai vaguement tendance à fuir étrangement... )
Marsh Posté le 30-09-2006 à 13:44:20
Bonjour,
j'ai réalisé une calculatrice basique.
On entre une valeur A, un opérateur (+, -, /, *) et puis une valeur B. On peut effectuer plusieurs calculs.
Je voudrais interdire la division par 0, mais je n'y arrive pas... J'ai bien essayé un simple else if((op == '/')&&(b!=0)), mais ça termine brusquement.
Je cherche à avoir une message d'erreur du style "Division par 0 interdite", et pouvoir ensuite rerentrer une valeur B.
Merci de votre aide.