Programmation C - conditionnelle - C - Programmation
Marsh Posté le 12-09-2015 à 17:38:18
Je pige pas tout de pourquoi on te demande cela.
Mais les assertions sont des functions qui -dans chaque language- permettent de tester que quelque chose est vrai, ou faux.
Exemple:
assert(3x4 == 12)
Te permet de tester 3x4, est bien égal à 12.
Ici bien sur ca n'a pas de sens réellement, car il est évident que tous les languages te donneront la bonne réponse. Mais imagine maintenant que tu fais la même chose en remplacant le 3x4 par un calcul en base de données, qui te dit que tu n'as pas fait une faute de frappe ?
Et bien l'assertion te permet de tester cela.
Tu auras compris: ca sert surtout pour tester quelque chose, donc ca rentre plus dans l'écriture des tests unitaires (cf google), qui sont très important lors du développement d'un logiciel pour vérifier que ce que tu as écris correspond à ce qui était attendu.
Marsh Posté le 12-09-2015 à 17:47:37
assert(max == 5.2); // vérifie que max vaut bien 5.2
Assert, ça fait ça:
Si ce qui est dans la parenthèse est vrai (donc si la valeur max est bien égale a 5.2) le programme continue comme si de rien était.
Si ce qui est dans la parenthèse est faux (donc si la valeur max est différente de 5.2) le programme s'arrête et affiche "Assert bla bla bla " sur la console d'erreur.
Dans certains langages, assert ne fonctionne que si le programme est en mode DEBUG. En C je me souviens plus.
D'autre part, comme indiqué, en C, les tests d'égalité ou de non-égalité marchent impec avec les nombres entiers, et déconnent souvent avec nombres à virgules (parce que 5.2 c'est peut être un truc qui tombe pas juste en représentation binaire et qu'il y a des erreurs d'arrondi). Donc pour ce type de nombre, il faut ruser, et utiliser plutôt des tests de comparaison < et >
A+,
Marsh Posté le 13-09-2015 à 09:07:19
gilou a écrit : |
Justement la méthode "standard" pour ruser c'est de faire des tests du genre:
assert (abs(max-5.2) < EPSILON), avec epsilon une constante dépendant du type de la variable "max" (float ou double) et de l'ordre de grandeur (pour des valeurs entre 1 et 100 on peut prendre 1e-6 par exemple, mais pour des grandeurs de plusieurs millions, il faut prendre epsilon = quelques dizaines).
Pour plus de détails on peut se référer au célèbre article de Goldberg "What every computer scientist should know about floating-point arithmetic" par exemple à l'adresse :
http://perso.ens-lyon.fr/jean-mich [...] ldberg.pdf
Marsh Posté le 12-09-2015 à 16:23:43
Quelqu'un peut m'aider à traiter ce sujet ? Je comprend pas le concept d'assertion
Affichez le plus grand parmi trois nombres réels. Au choix vous les saisirez ou les initialiserez avec differentes
valeurs ( et dans ce dernier cas vous recompilerez votre projet) pour tester votre programme sur plusieurs cas.
Au lieu d'afficher le résultat vous pouvez écrire une assertion de la forme
assert(max == 5.2); // vérifie que max vaut bien 5.2
L'inclusion <assert.h> devra alors être ajoutée avant la fonction main ( ).
Une insertion interrompt l'éxécution du programme avec un message d'errer si elle est fausse.
Hélas, pour comprarer deux réels il est vivement conseillé de prévoir une marge d'erreur et d'écrire plutôt:
double marge = 0.0001 ; // par exemple
| max-5.2 | < marge (1)
Rappel : |x| = -x si x<0 sinon x
Exprimer (1) sous forme d'une expression booléeenne