Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1499 connectés 

  FORUM HardWare.fr
  Programmation
  C

  Programmation C - conditionnelle

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Programmation C - conditionnelle

n°2265782
keshiru
Posté le 12-09-2015 à 16:23:43  profilanswer
 

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  

mood
Publicité
Posté le 12-09-2015 à 16:23:43  profilanswer
 

n°2265785
Devil'sTig​er
Posté le 12-09-2015 à 17:38:18  profilanswer
 

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.


Message édité par Devil'sTiger le 12-09-2015 à 17:38:53
n°2265786
gilou
Modérateur
Modzilla
Posté le 12-09-2015 à 17:47:37  profilanswer
 

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+,
 
 


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2265791
leonhard
Posté le 13-09-2015 à 09:07:19  profilanswer
 

gilou a écrit :


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+,
 
 


 
 
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
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  Programmation C - conditionnelle

 

Sujets relatifs
C tri par fusion[C#] Découpage de chaine
aligner verticalement colonne en CBesoin d'aide en C
[C#] Problème récup fabrique de la classe COMMais où sont donc passées les Windows Form en C++?
QCM en programmation Caide programmation
Programmation Unity Pro DTM/DFB 
Plus de sujets relatifs à : Programmation C - conditionnelle


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR