Probleme "if" en c ++

Fermé
nikoleboss13 - 24 avril 2009 à 01:09
 loupius - 24 avril 2009 à 02:01
Bonjour,
Voici mon programme :
#include <stdlib.h>
#include<stdio.h>
#include<math.h>
#include<conio.h>
#include<stdlib.h>

double heuresdenuit (double hd,double hf)
{
double hdn;


if ((6<hd<21)&&(6<hf<21)&&(hd<=hf)) hdn = 1;
if ((6<hd<21)&&(6<hf<21)&&(hd>hf)) hdn = 2;
if ((hd<6)&&(hf<6)&&(hf>hd) ) hdn = 3;
if ((hd<6)&&(hf<6)&&(hd>hf) ) hdn = 4;
if ((hd>21)&& (hf>21)&&(hd<hf)) hdn = 5;
if ((hd>21)&& (hf>21)&&(hf<hd)) hdn = 6;
if ((hd<6)&&(6<hf<21)&&(hd<hf)) hdn = 7;
if ((hf<6)&&(6<hd<21)&&(hf<hd)) hdn = 8;
if ((6<hd<21)&&(hf>21)) hdn = 9;
if ((6<hf<21)&&(hd>21)) hdn = 10;
if ((hd<6)&&(hf>21)) hdn = 11;
if ((hf<6)&&(hd>21)) hdn = 12;

return hdn;
}
int main( )
{
double hd,hf,hdn,n;

while (n!=0) {

printf("Indiquez l'heure de commancement : ");
scanf("%lf",&hd);

printf("Indiquez l'heure de fin : ");
scanf("%lf",&hf);
printf("\n");

printf("le nombre d'heures de nuit est : %lf ",heuresdenuit (hd,hf));
printf("\n");

system ("pause");


}}
je le fais tourner eavec dev c++.
MOn probleme est si je rentre par exemple hd=2 et hf=3 il me dit que hnc=7 au lieu 3.
Par contre si je met hd=13 et hf=17 il me sort bien hnc= 1 .
J'ai aussi remarquer que si je lever les lignes de hnc egal a 7 jusqu'a hnc egal a 12 (donc je laisse les lignes d ehnc=1 jusqu'a 6) alors la le programme marche bien.
J'y comprend plus rien.
Merci de votre aide

3 réponses

fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
24 avril 2009 à 01:25
Salut,

if ((6<hd<21) n'est pas correct.
Cela va évaluer 6<hd qui va te renvoyer 1 ou 0 en fonction de la véracité de l'expression.
Et ensuite le programme évaluera 0 (ou 1)<21.
Toi ce que tu veux faire est : if((6<hd && hd<21) && ... )
De plus, tu devrais plutôt utiliser des else if ou alors effectuer directement tes return dans les if (par exemple : if ((6<hd<21)&&(6<hf<21)&&(hd<=hf)) return 1; )
Cela simplifiera considérablement tes conditions.

Sinon, pourquoi utiliser un compilateur C++ alors que ton programme est du C ? (utilisation de stdlib.h, stdio.h, etc)
Et enfin, en C pour afficher un double (comme un float), on utilise %f et non %lf.

printf("le nombre d'heures de nuit est : %f ",heuresdenuit (hd,hf));

Cdlt
1
salut

rappel: je suis une bille en C++
1. je savais pas qu'un langage proposait enfin des prédicats d'encadrement : a < x < b
d'habitude, il faut noter a < x et x < b. Jolie prouesse du C++

2. le plus important : toutes les lignes de tes tests sont exécutées.
en imaginant que les test avec encadrements fonctionne, il y a bien un moment ou hdn vaut 3... mais les tests continuent !!!
et arrivé au test if ((hd<6)&&(6<hf<21)&&(hd<hf)) hdn = 7; il se trouve que pour hd=2 et hf=3, la condition est vérifiée, on met donc 7 dans hdn ! exit le 3 :D

ça répond à ta question ?
0
mouaaahhh ZERO pointé !

j'ai lu trop vite... le test pour hdn = 7 n'est pas ce que j'ai compris.

Mais l'explication de fiddy me semble juste (si le C++ était fabuleurx, ça se saurait)
donc le test avec hdn = 7 est vérifié car hd < 6 et l'encadrement n'est compris que par toi => hdn = 7 !!!
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
24 avril 2009 à 01:36
si le C++ était fabuleurx, ça se saurait
Objection ! Je dirais plutôt : "si le C et le C++ étaient des langages faciles". ^^
0
Si tu veux pouvoir écrire des tests du style if ( 0 < x < 9), prends le python.
0