PDA

Afficher la version complète : [Réglé] else if, je coince!!!



moniroje
22/07/2016, 16h53
Histoire d'animer Programmation de Alionet
mais aussi (et surtout) m'éviter la honte chez Developpez.com,:gloups:
voilà mon pb:


#include<iostream>

// Quel est ton indice de masse corporelle?

using namespace std;

int main()
{
string nom("chais pas");
int age, poids, taille;

cout << "Salut!! comment tu t'appelles? " <<endl;
cin >> nom;
cout << "Quel âge as-tu ? " ; cin >> age;
cout << "Ta taille, en centimètres ? "; cin >> taille;
cout << "tu pèses combien ? rien que les kilos " ; cin >> poids;

// calcul de l'IMC = Poids/taille au carré
double imc(0);
int tailleAuCarre(100);
tailleAuCarre = taille * taille ;
// imc = poids* 10000/tailleAuCarre;
// par contre, imc = ça n'a pas marché quand j'ai fait: */
// cout << imc << endl;
/* maître Médinoc: tu peux aussi faire la conversion sans cast, en forçant une opération avec un double: */
imc = poids * 10000 * 1.0 /tailleAuCarre;
// ce qui me plaît le + de par sa simplicité

if (imc < 16.5)
{
cout <<"Cher(e) "<< nom << " ton IMC est de " <<imc<< endl;
cout << "Dénutrition" << endl;
}
else if (16.5<=imc<=18.5)
// warning: comparisons like 'X<=Y<=Z' do not have their mathematical meaning [ -Wparentheses] tout le long des else if
{
cout <<"Cher(e) "<< nom << " ton IMC est de " <<imc<< endl;
cout << "T'es maigre!! "<< endl;
}
else if (18.5<=imc<=21.75)
{
cout <<"Cher(e) "<< nom << " ton IMC est de " <<imc<< endl;
cout << "Svelte, mince, t'es beau !! " << endl;
}
else if (21.75<imc<=25)
{
cout <<"Cher(e) "<< nom << " ton IMC est de " <<imc<< endl;
cout << "C'est parfait! "<< endl;
}
else if (25<imc<27.5)
{
cout <<"Cher(e) "<< nom << " ton IMC est de " <<imc<< endl;
cout << "Enrobé (ou rondelette) mais bon! attention à ta gourmandise! "<< endl;
}
else if (27.5<= imc <=30)
// warning comparison of constant '30' with boolean expression is always true [ -Wbool-com...
{
cout <<"Cher(e) "<< nom << " ton IMC est de " <<imc<< endl;
cout << "t'es en surpoids; corrige!!! "<< endl;
}
else if (30< imc <35)
// warning comparison of constant '35' with boolean expression is always true [ -Wbool-com...
{
cout <<"Cher(e) "<< nom << " ton IMC est de " <<imc<< endl;
cout << "là, ça devient de l'obésité; attention!! "<< endl;
}
else if (35< imc <40)
{
cout <<"Cher(e) "<< nom << " ton IMC est de " <<imc<< endl;
cout << "Obésité sévère "<< endl;
}
else (40< imc)
{ // shit! pour cette ligne j'ai ERROR: expected ';' before { token et je vois pas qu'il manque un {
cout <<"Cher(e) "<< nom << " ton IMC est de " <<imc<< endl;
cout << " Obésité morbide ou massive"<< endl;
}
/* ci-dessous selon le corrigé: je crois comprendre que c'est pour celui que ça
* n'intéresse pas: */
// cout << "Appuyez sur une touche pour continuer." << endl;
/* on appuie sur une touche, ça la tape et c'est tout... bizarre!
* donc je commente
// cin.ignore();
// cin.get();
/* Cette fonction main() doit renvoyer un entier (puisque de type int) pour
* signaler si elle a été menée à bien ou non au système d'exploitation...
* La valeur de cet entier est 0 si ca c'est bien passé (il existe une constante
* EXIT_SUCCESS, qui vaut elle aussi 0) */
// return EXIT_SUCCESS; ben non, ça m'a envoyé: ERROR: 'EXIT_SUCCESS' was not declared in this scope; donc:
return 0;
}

Alors, questions:
surtout pourquoi ERROR parce qu'il attend un ; devant { !!! c'est bizarre, ça !! où c'est que ça manque ??
et puis tous ces Warning énervants.

ahlner
22/07/2016, 17h14
Es-tu sûr de la validité de cette ligne :


else if (16.5<=imc<=18.5)

Cela me gène ces deux omparaisons!
Que sont 16.5 et 18.5? Des constantes déclarées?
Et pourquoi "." au lieu de ","?
Ça fait rrès longtemeps que je n'ai pas programmé en C, et jamais en C++.

jupar
22/07/2016, 17h18
Hello,

Regardes bien ta ligne 72, tu écris else (40<imc) Bon c'est là le probleme, un else tout seul c'est else {block d'instruction}, donc il semblerait que tu aies oublié un petit if apres ton else

ahlner
22/07/2016, 17h24
Hello,

Regardes bien ta ligne 72, tu écris else (40<imc) Bon c'est là le probleme, un else tout seul c'est else {block d'instruction}, donc il semblerait que tu aies oublié un petit if apres ton else

Donc else doit toujours suivi d'un if ou d'une instruction de condition?

moniroje
22/07/2016, 19h37
Hello ahlner!!!
tu vois, je reprends au début mon apprentissage du C++; paraît-il que j'étais trop fantaisiste...
nan, ce n'est pas comme tu dis.. c'est le résultat de imc: si son résultat tombe entre 16.5 et 18.5, hop!! ça t'annonce que t'es trop maigre...
Hello jupar... t'as trouvé!!!
else non suivi de if n'a pas à avoir de parenthèse avec condition; il a seulement droit à ses accolades.
J'ai donc fait cela:

#include<iostream>

// Quel est ton indice de masse corporelle?

using namespace std;

int main()
{
string nom("chais pas");
int age, poids, taille; // déclare les variables: age poids en kg & taille en cm

cout << "Salut!! comment tu t'appelles? " <<endl;
cin >> nom;
cout << "Quel âge as-tu ? " ; cin >> age;
cout << "Ta taille, en centimètres ? "; cin >> taille;
cout << "tu pèses combien ? rien que les kilos " ; cin >> poids;

// calcul de l'IMC = Poids/taille au carré
double imc(0);
int tailleAuCarre(100);
tailleAuCarre = taille * taille ;

imc = poids * 10000 * 1.0 /tailleAuCarre;

if (imc < 16.5)
{
cout <<"Cher(e) "<< nom << " ton IMC est de " <<imc<< endl;
cout << "Dénutrition" << endl;
}
else if (16.5<=imc<=18.5)
{
cout <<"Cher(e) "<< nom << " ton IMC est de " <<imc<< endl;
cout << "T'es maigre!! "<< endl;
}
else if (18.5<=imc<=21.75)
{
cout <<"Cher(e) "<< nom << " ton IMC est de " <<imc<< endl;
cout << "Svelte, mince, t'es beau !! " << endl;
}
else if (21.75<imc<=25)
{
cout <<"Cher(e) "<< nom << " ton IMC est de " <<imc<< endl;
cout << "C'est parfait! "<< endl;
}
else if (25<imc<27.5)
{
cout <<"Cher(e) "<< nom << " ton IMC est de " <<imc<< endl;
cout << "Enrobé (ou rondelette) mais bon! attention à ta gourmandise! "<< endl;
}
else if (27.5<= imc <=30)
{
cout <<"Cher(e) "<< nom << " ton IMC est de " <<imc<< endl;
cout << "t'es en surpoids; corrige!!! "<< endl;
}
else if (30< imc <35)
{
cout <<"Cher(e) "<< nom << " ton IMC est de " <<imc<< endl;
cout << "là, ça devient de l'obésité; attention!! "<< endl;
}
else if (35< imc <40)
{
cout <<"Cher(e) "<< nom << " ton IMC est de " <<imc<< endl;
cout << "Obésité sévère "<< endl;
}
else if (40<imc)
{
cout <<"Cher(e) "<< nom << " ton IMC est de " <<imc<< endl;
cout << " Obésité morbide ou massive"<< endl;
}
else
{
cout <<"chais pas quoi te dire; salut!"<< endl;
}
return 0;
}

et là, :waoo: trop bien!!! ça marche!!!
Mais heu... le résultat n'est pas conforme:


Salut! comment tu t'appelles?
Hélène
Quel âge as-tu ? 55
Ta taille en centimètres? 156
tu pèses combien? rien que les kilos 65
Cher(e) Hélène ton IMC est de 26.7094
T'es maigre!!

Process returned 0 (0x0= execution time: 32.867 s
Press ENTER to continue

ma tendre épouse toute contente que ce programme la trouve maigre !!!
alors qu'il aurait fallu ce message:
else if (25<imc<27.5)
{
cout <<"Cher(e) "<< nom << " ton IMC est de " <<imc<< endl;
cout << "Enrobé (ou rondelette) mais bon! attention à ta gourmandise! "<< endl;

elleaime
22/07/2016, 22h00
Ca ne serait pas mieux avec des "case" plutôt que tout ces else if ?

'fin le dis ça, mais ça fais longtemps que je n'ai pas fait de C moi aussi.

ahlner
22/07/2016, 22h44
moni,

Quand j'ai étudié et pratiqué le C, des expressions telles :


if (25<imc<27.5)

m'auraient gratifié de mots aimables de la part du compilateur!

moniroje
23/07/2016, 19h58
@elleaime
kikoo!!!
j'ai regardé avec case; je suppose que tu pensais à switch; j'ai regardé mon cours; ah wé, ça aurait été bien mais:

switch ne permet de tester que l'égalité. Vous ne pouvez pas tester « Si le nombre d'enfants est supérieur à 2 » avec switch : il faut dans ce cas utiliser if.
De plus, switch ne peut travailler qu'avec des nombres entiers (int, unsigned int, char). Il est impossible de tester des nombres décimaux (double).

Maintenant, mon problème, c'est que ce job, il fonctionne, il ouvre la console, il demande les infos et hop! il affiche l'IMC.
L'ennui, c'est que quelque soit cet indice (j'ai essayé pour l'obèse, le maigrichon, un beau comme moi et j'ai eu 3 indices différents
mais à ces 3 indices, j'ai le même message: "T'es maigre!!"
Ça cloche donc quelque part...
Quelle prise de tête!!

ahlner
23/07/2016, 22h50
moni,

La formule est correcte, l'ayant vérifiée pour deux valeurs quasiment extrêmes.
Il te faut revoir tes "conditionnelles".

ahlner
24/07/2016, 21h02
moni,

Je te propose de modifier les conditions ainsi :


if (imc>= ) and (imc< ......)


Il doit y avoir un problème d'évaluation d'un Booléen dans une expression telle que :


if (25<imc<27.5)

car il y a deux conditions à vérifier :

if (25<imc) = if (imc>25)

et

if (imc<27.5)

Pour que cette instruction soit exécutée, il faut que les deux conditions soit vérifiées simultanément, Booléen TRUE
Le compilateur n'interprète pas ce genre d'expression comme un humain. Tel est mon avis.
Je ne me rprésente pas bien comment ces expressions seront évaluées par le compilateur.

moniroje
24/07/2016, 21h49
Bonsoir ahlner...
Intéressant et donc j'ai suivi ta proposition:

else if(16.5<=imc) and (imc<=18.5) // => ERROR: expected identifier before '(' token à toutes les lignes où j'ai fait ainsi

regardé mon cours et essayé ceci:


else if(16.5<=imc) && (imc<=18.5) / => ERROR: expected identifier before '(' token
ça fait mal à la tête, ces messages d'erreur!!!
et pourquoi qu'il attend pas un identifier quand on a fait: else if(16.5<=imc<=18.5)
Je viens d'essayer aussi:

else if(16.5<=imc) and if(imc<=18.5) // => ERROR: expected identifier before 'if' token

ahlner
24/07/2016, 22h12
moni,

Personnellement moi-même ahlner, je désapprouve ce genre d'expression


if(16.5<=imc)

pour la remplacer par :


if (imc>=16.5)

imc est une varible de type real : un identificateur; 16.5 est real : une constante.
Dans ma conception (peut-être bornée), je compare un identificateur (variable) à une expression numérique ou littérale. Pas comme tu le fais intuitiovement car tu es un humain et non un programme, créé par un humain, moyennant des spécifications. Comment a traduit cet humain ces successions d'opérations? Ce que nous faisons mentalement simultanément, un programme le fait en plusieurs phases.

ahlner
24/07/2016, 22h33
moni,

J'ai peut-être compris :


if(16.5<=imc)

FAUX!


if (16.5<=imc)

BON : AU MOINS UN ESPACE!

jupar
25/07/2016, 08h45
Hello,

C'est pas mal ça


else if(16.5<=imc) && (imc<=18.5) / => ERROR: expected identifier before '(' token

Mais avec une paire de parenthèse en plus ce serait encore mieux il me semble :)



else if( (16.5<=imc) && (imc<=18.5) ) % une parenthese globale pour toute l'expression qui doit etre evaluee par le if

ahlner
25/07/2016, 10h27
En plein accord avec ahlner, je tiens à mes espaces, comme dans le #1 :

if (imc < 16.5)

jupar
25/07/2016, 11h20
Oui l'espace est utile pour une question de lisibilité et de présentation du code. En revanche pour la compilation, ça ne change rien. Mais c'est vrai que c'est une bonne pratique de le mettre.

En revanche dasn un cas
if ( (16.5<=imc) && (imc<=18.5) ) , il faut bien la parenthèse globale. Sinon, sans ces parentheses globale, à la fin de la parenthese sur la premiere condition, le compilateur pense que la condition est finie, et il s'attend à une instruction ou bloc {} (mais pas à un &&).

linux5623
25/07/2016, 12h16
Alors la de la fantaisie, il y en a !!!

Une condition en C c'est :


if ( condition ) { instruction } else { instruction }

Le clause else est facultative.
La condition doit être une expression qui revoie 0 pour faux et différent de 0 pour vrai !

Après il faudra revoir les opérateurs et leurs priorités !!!



if(16.5<=imc) and if(imc<=18.5) ca c'est n'importe quoi !!

if(16.5<=imc && imc<=18.5) Ca suffit !! Et ça fonctionne en plus !!



Sinon les warnings c'est bon sauf à ce qu'il existe une vraie raison il doit pas y en avoir.

ahlner
25/07/2016, 15h36
Alors la de la fantaisie, il y en a !!!

Peut-être peux-tu t'exprimer en d'autres termes!
Transmettre la conaissance sans condescendance, c'est bien mieux.
Je me sens concerné par le ressenti des autres lecteurs.

ahlner
25/07/2016, 15h45
Oui l'espace est utile pour une question de lisibilité et de présentation du code. En revanche pour la compilation, ça ne change rien. Mais c'est vrai que c'est une bonne pratique de le mettre.

En revanche dasn un cas
if ( (16.5<=imc) && (imc<=18.5) ) , il faut bien la parenthèse globale. Sinon, sans ces parentheses globale, à la fin de la parenthese sur la premiere condition, le compilateur pense que la condition est finie, et il s'attend à une instruction ou bloc {} (mais pas à un &&).

Pour les espaces, je me fie à ce que je vois dans la Bible de Kernighan et Ritchie, édition 1991.

linux5623
25/07/2016, 15h54
Peut-être peux-tu t'exprimer en d'autres termes!
Transmettre la conaissance sans condescendance, c'est bien mieux.
Je me sens concerné par le ressenti des autres lecteurs.

Je n'ai fait que reprendre ce que Moni dit lui même de son code.
Sinon comme il le dit lui même il aurait été sur developpez.com, mais il attendrait surement encore de l'aide.

linux5623
25/07/2016, 16h10
if ( (16.5<=imc) && (imc<=18.5) )


Les espaces, tabulation ou retour à la ligne sont rarement des séparateurs en C. Mais plutôt pour la présentation du code. La séparateur c'est le point-virgule ;

Mais la on peut se passer de parenthèses la priorité des opérateurs. Les opérateurs de comparaisons sont prioritaires sur les opérateurs logique &&, || et !,

Du coup ça suffit


if( 16.5<=imc && imc<=18.5 )

ahlner
25/07/2016, 16h24
Et de telles expressions sont-elles "licites" :


if( 16.5<=imc

alors que :


if(imc>=16.5

me semblent plus "régulières"?

linux5623
25/07/2016, 16h26
Il n'y a pas de règle pour l'ordre. Mais beaucoup référé la deuxième écriture.

ahlner
25/07/2016, 16h30
Il n'y a pas de règle pour l'ordre. Mais beaucoup référé la deuxième écriture.

Merci.

moniroje
25/07/2016, 17h09
Salut les potos !!!
J'ai trouvé et ça marche super!!! trop bien!!! :D
En fait, c'est ahlner qui m'a mis sur la voie.
Au vu de mon cours, les exemples qu'ils donnent, c'est du genre: if else (nbEnfants>=2)
donc ça commence toujours par ... l'identificateur? et moi, je faisais if else (18.5<=imc<=22)
Alors j'ai fait: if else (imc>=18.5 && imc<=22) et ... roule ma poule!!!
Bon, je sais que vous vous en foutez, hi hi, mais la fierté de mettre MON job à moi qui marche:

#include <iostream>

// Quel est ton indice de masse corporelle?

using namespace std;

int main()
{
string nom("chais pas");
// ne pas oublier le ; !!! sinon, ERROR
// tout ce qu'on déclare doit être utilisé sinon ERROR
int age, poids, taille; // déclare les variables: age poids en kg & taille en cm

cout << "Salut!! comment tu t'appelles? " <<endl;
cin >> nom; // là, il tape son nom
// endl crée un retour à la ligne dans la console
cout << "Quel âge as-tu ? " ; cin >> age;
cout << "Ta taille, en centimètres ? "; cin >> taille;
cout << "tu pèses combien ? rien que les kilos " ; cin >> poids;

// calcul de l'IMC = Poids/taille au carré
double imc(0); // je déclare cette variable qui risque d'être avec virgule
int tailleAuCarre(100); // je déclare encore pour faire:
tailleAuCarre = taille * taille ;
imc = poids * 10000 * 1.0 /tailleAuCarre; // ce qui me plaît le + de par sa simplicité

cout <<"Cher(e) "<< nom << " ton IMC est de " <<imc<< endl;
if (imc < 16.5) // et non (16.5<imc)
{
cout << "Dénutrition" << endl;
}
// else if (16.5<=imc<=18.5) / dans le cours, il y a un espace après if
else if (imc>=16.5 && imc<=18.5)
{
cout << "T'es maigre!! "<< endl;
}
// else if (18.5<=imc<=21.75)
else if (imc>=18.5 && imc<=21.75)
{
cout << "Svelte, mince, t'es beau !! " << endl;
}
// else if (21.75<imc<=25)
else if (imc>=21.75 && imc<=25)
{
cout << "C'est parfait! "<< endl;
}
// else if (25<imc<27.5)
else if (imc>25 && imc<=27.5)
{
cout << "Enrobé (ou rondelette) mais bon! attention à ta gourmandise! "<< endl;
}
// else if (27.5<= imc <=30)
else if (imc>=27.5 && imc<=30)
{
cout << "t'es en surpoids; corrige!!! "<< endl;
}
// else if (30< imc <35)
else if (imc>30 && imc<35)
{
cout << "là, ça devient de l'obésité; attention!! "<< endl;
}
// else if (35< imc <40)
else if (imc>35 && imc<40)
{
cout << "Obésité sévère "<< endl;
}
// else (40< imc)
else if (imc>40)
{
cout << " Obésité morbide ou massive"<< endl;
}
else
{
cout <<"chais pas quoi te dire; salut!"<< endl;
}
/* ci-dessous selon le corrigé: je crois comprendre que c'est pour celui que ça
* n'intéresse pas: */
// cout << "Appuyez sur une touche pour continuer." << endl;
/* on appuie sur une touche, ça la tape et c'est tout... bizarre!
* donc je commente l99 et l102 & 103
cin.ignore();
cin.get();
*/
// return 0 ;
/* Cette fonction main() doit renvoyer un entier (puisque de type int) pour
* signaler si elle a été menée à bien ou non au système d'exploitation...
* La valeur de cet entier est 0 si ca c'est bien passé (il existe une constante
* EXIT_SUCCESS, qui vaut elle aussi 0) */
// return EXIT_SUCCESS; ben non, ça m'a envoyé: ERROR: 'EXIT_SUCCESS' was not declared in this scope; donc:

return 0;
}

Maintenant je vais lire les posts que vous m'avez envoyés pendant que je réfléchissais, hi hi...
tiens, linux753 !!! hello!!!
Le coup de l'identificateur d'ahlner, j'ai lu ça qqpart; n'empêche dans le cours des conditions, ils auraient pu le rappeler.

ahlner
25/07/2016, 17h23
Super ta réussite.
Une idée que je garde : le chemin parcouru est au moins aussi important que le but.

Edit
Un identificateur, cela n'est-il pas très proche d'un pointeur?

moniroje
25/07/2016, 19h41
Me revoilà, j'ai bien lu...
T'inquiète pas, ahlner, j'ai bien compris que linux5623 ne faisait que reprendre mes termes, sans condescendance du tout.
Ce pourquoi d'ailleurs, je préfère poser mes questions chez Alionet.
Par ailleurs, c'est vrai que des fois, je me suis fait allumer sacrément.
Tant que j'avais envisagé d'abandonner le C++ pour les prières...
mais là aussi, faut être réaliste...
Petite correction à linux5623: j'ai osé developpez.com et surprise: ils ont été sympas et ils ont été super-réactifs.
Mais si j'ai préféré poser ici mon pb, c'est que vous me connaissez bien, chuis plus à l'aise avec vous.
J'ai essayé mon job avec

// else if (imc>=16.5 && imc<=18.5) / ça, c'est moi et ça marche.
// if ( (16.5<=imc) && (imc<=18.5) ) / autre possibilité: Jupar: avec parenthèses globales
// if(16.5<=imc && imc<=18.5) / linux5623: Ca suffit !! Et ça fonctionne en plus !! En effet
et aucun pb, ça marche aussi.
et ça me rassure: j'avais peur que C++ faut être super dans les rails; et là, 3 solutions possibles!! j'aime cette souplesse.
Bon, je vous embête plus.

elleaime
25/07/2016, 23h58
Je vais jouer le rabat-joie, mais il reste quelque coquilles dans la succession des tests.
Il y a deux réponses possibles si le résultat est égale à 27.5 et aucunes pour 35 et 40 (à part "chais pas quoi te dire; salut!"). La succession des opérateurs n'est pas régulière.


else if (imc>25 && imc<=27.5)
{
cout << "Enrobé (ou rondelette) mais bon! attention à ta gourmandise! "<< endl;
}

else if (imc>=27.5 && imc<=30)
{
cout << "t'es en surpoids; corrige!!! "<< endl;
}

else if (imc>30 && imc<35)
{
cout << "là, ça devient de l'obésité; attention!! "<< endl;
}

else if (imc>35 && imc<40)
{
cout << "Obésité sévère "<< endl;
}
else if (imc>40)

linux5623
26/07/2016, 10h14
Je vais jouer le rabat-joie, mais il reste quelque coquilles dans la succession des tests.
Il y a deux réponses possibles si le résultat est égale à 27.5 et aucunes pour 35 et 40 (à part "chais pas quoi te dire; salut!"). La succession des opérateurs n'est pas


Il y a en a plein d'autre des coquilles ou trucs pas terrible dans son code.

Mais la question est plutôt de savoir si Moni veut aussi qu'on lui donne des conseils ou pas !!!

ahlner
26/07/2016, 15h10
Il y a en a plein d'autre des coquilles ou trucs pas terrible dans son code.

Je suis intéressé par du code sans erreur.
Merci.
Pour moni, il pourrait mettre des lunettes pour la soudure autogène, ou mieux la protection pour la soudure à l'arc avant de consulter les nouveaux messages.

moniroje
26/07/2016, 17h18
mais non, elleaime n'est pas rabat-joie du tout.
Au contraire, j'aime qu'on s'occupe comme ça de m'apprendre; vous êtes les profs qui me manquent quand je n'ai que mon cours pour m'initier.
Merci pour le 27.5... hi hi..
Par contre, je me suis fait 92 kg pour 159cm => imc 36 et message idoine: Obésité sévère...


Il y a en a plein d'autre des coquilles ou trucs pas terrible dans son code.
Mais la question est plutôt de savoir si Moni veut aussi qu'on lui donne des conseils ou pas !!!
Ben justement, si j'ai mis mon programme ici, c'est justement pour apprendre de vous!!
Alors, svp!!! dites moi les coquilles et trucs pas terribles!!!
J'apprends le C++; mon exo est le 2° et j'en suis qu'aux conditions et boucles;
l'exo j'ai voulu le faire sans regarder le corrigé: donc çà ne m'étonne pas trop qu'il y ait des coquilles (hi hi, c'est joli, ça,: coquilles)
marrant, on dirait que je me défends... OK, j'ai dû écrire un code à faire bondir d'indignation plus d'un. Sot rit.
Ah ?? on se demande si je veux qu'on me donne des conseils ou pas???
putain, j'ai dû dire de sacrés vannes pour avoir fâché ainsi linux...
Je comprends maintenant ahlner qui avait l'air de me défendre...
mais pourquoi tu veux que je me mette à la soudure à l'arc ??? t'es bizarre, toi...
Hey, les gars, je vous demande pardon si je vous ai vexés...
et le plus mieux est qu'on ferme ce poste, OK ???

linux5623
26/07/2016, 21h06
Ah non je suis pas fâché du tout !!
Mais bon si je te dis que petit exercice peut être réduit à ça



#include<iostream>
#include<stdio.h>

int main()
{
std::string nom;
double age, poids, taille;
std::cout << "Salut!! comment tu t'appelles? " <<std::endl; std::cin >> nom;
std::cout << "Quel âge as-tu ? "; std::cin >> age;
std::cout << "Ta taille, en centimètres ? "; std::cin >> taille;
std::cout << "tu pèses combien ? rien que les kilos "; std::cin >> poids;
double imc = poids * 10000 /(taille*taille);
if (imc < 16.5)
std::cout <<"Cher(e) "<< nom << " ton IMC est de " <<imc<< std::endl
<< "Dénutrition" << std::endl;
else if (imc < 18.5)
std::cout <<"Cher(e) "<< nom << " ton IMC est de " <<imc<< std::endl
<< "T'es maigre!! "<< std::endl;
else if (imc < 21.75)
std::cout <<"Cher(e) "<< nom << " ton IMC est de " <<imc<< std::endl
<< "Svelte, mince, t'es beau !! " << std::endl;
else if (imc < 25)
std::cout <<"Cher(e) "<< nom << " ton IMC est de " <<imc<< std::endl
<< "C'est parfait! "<< std::endl;
else if (imc < 27.5)
std::cout <<"Cher(e) "<< nom << " ton IMC est de " <<imc<< std::endl
<< "Enrobé (ou rondelette) mais bon! attention à ta gourmandise! "<< std::endl;
else if (imc < 30)
std::cout <<"Cher(e) "<< nom << " ton IMC est de " <<imc<< std::endl
<< "t'es en surpoids; corrige!!! "<< std::endl;
else if (imc < 35)
std::cout <<"Cher(e) "<< nom << " ton IMC est de " <<imc<< std::endl
<< "là, ça devient de l'obésité; attention!! "<< std::endl;
else if (imc < 40)
std::cout <<"Cher(e) "<< nom << " ton IMC est de " <<imc<< std::endl
<< "Obésité sévère "<< std::endl;
else
std::cout <<"Cher(e) "<< nom << " ton IMC est de " <<imc<< std::endl
<< " Obésité morbide ou massive"<< std::endl;
return EXIT_SUCCESS;
}


Maintenant tu as plus qu'a l'étudier un peu et me dire les différences que tu vois !!

moniroje
26/07/2016, 21h52
Zut!!! mon message a disparu: bon, je recommence:
Je passais par là et chouette, un message...
et la lumière fut !!! (progressivement):
ben oui!!! j'ouvre mon bouquin, ben oui, là aussi, ça me dit la même chose:

Les tests vont être lus dans l'ordre jusqu'à ce que l'un d'entre eux soit vérifié
et donc mes double-inégalités, c'était du lourd, hi hi....
OK, demain (parce que ce soir... ben heu, le soir, je réfléchis plus beaucoup), je vais refaire mon job.

ahlner disait quelque part que le chemin parcouru était plus... que le but.
Pour arriver à faire ce job, j'en ai appris plein, hi hi...

Et puis, t'as pas de bol, hi hi, je te lâche pas: je me souviens vaguement avoir étudié ça:
#include<stdio.h>
c'est pourquoi faire ??
et pourquoi je mets cout et ça marche
et toi tu mets std::cout ?

moniroje
27/07/2016, 16h18
Voilà, je crois que j'ai bien compris.... et appris...
grâce à vous tous!! hi hi, alléluya !!!
on serait en chair et en os, ça me vaudrait une tournée...
Bon, je vous montre mon bébé:

#include <iostream>

// Quel est ton indice de masse corporelle?

using namespace std;

int main()
{
string nom("chais pas");
int poids, taille;

cout << "Salut!! comment tu t'appelles? " <<endl;
cin >> nom;
cout << "Ta taille, en centimètres ? "; cin >> taille;
cout << "tu pèses combien ? rien que les kilos " ; cin >> poids;

// calcul de l'IMC = Poids/taille au carré
double imc(0);
int tailleAuCarre(100);

tailleAuCarre = taille * taille ;
imc = poids * 10000 * 1.0 /tailleAuCarre;

cout <<"Cher(e) "<< nom << " ton IMC est de " <<imc<< endl;

/* traduction de linux5623 : CHAQUE ELSE IF VA ETRE EFFECTUÉ À PARTIR DU PREMIER ELSE IF
* JUSQU'À CE QUE L'UN D'EUX, ELSE IF, SOIT VÉRIFIÉ.
* if ( condition ) { instruction } else { instruction }
* La clause else étant facultative.
* La condition doit être une expression qui revoie 0 pour faux et différent de 0 pour vrai ! */
// essayons un imc irréaliste:
if (imc <= 10.1)
{
cout << " Hey!!! logori !!" << endl;
// message curieux: "Hey logori !!" mais aussi, zut ! "Dénutrition" ??
}
if (imc <= 16.5) // préférable à (16.5<=imc)
{
cout << "Dénutrition" << endl;
}
else if (imc<=18.5) // si imc < 16.5, la boucle s'est arrêtée à Dénutrition
{
cout << "T'es maigre!! "<< endl;
}
else if (imc<=21.75) // si imc <= 18.75 , ça a eu droit déjà à "t'es maigre!! "
{
cout << "Svelte, mince, t'es beau !! " << endl;
}
else if (imc<=25)
{
cout << "C'est parfait! T'es trop! "<< endl;
}
else if (imc<27.5)
{
cout << "Enrobé (ou rondelette) mais bon! attention à ta gourmandise! "<< endl;
}
else if (imc <=30)
{
cout << "t'es en surpoids; corrige!!! "<< endl;
}
else if (imc <35)
{
cout << "là, ça devient de l'obésité; attention!! "<< endl;
}
else if (imc <40)
{
cout << "Obésité sévère "<< endl;
}
else if (imc < 46)
{
cout << " Obésité morbide ou massive"<< endl;
}
// essayons ceci:
else if (imc>46)
{
cout << " Là tu déconnes à donf! "<< endl;
}
else
{
cout <<"chais pas quoi te dire; salut!"<< endl;
}
return 0;
}

elleaime
27/07/2016, 22h58
Les tests vont être lus dans l'ordre jusqu'à ce que l'un d'entre eux soit vérifié
et donc mes double-inégalités

Je suis plus rouillé que je le pensais, je n'ai même pas réagi à cette surenchère de tests.

Par contre une remarque dans l'agencement de certaines données, j'aurais plutôt regroupé les déclarations des variables dans un même groupe :

std::string nom;
double age, poids, taille;
double imc = poids * 10000 /(taille*taille);
D'un autre côté, ça reste de l'ordre de la recommandation, histoire d'améliorer la lisibilité du code ; ça ne change rien à son fonctionnement.

linux5623
28/07/2016, 07h36
Ton regroupement ne fonctionne pas il faut les valeurs avant le calcul !

Par contre mettre les variables en double au lieu de int évite les problèmes de conversion de type.
Et ici il est tout a fait justifié d'utiliser des double.

jupar
28/07/2016, 09h20
Et pour compléter et que ce soit encore mieux, il faudrait vérifier les paramètres entrés par l'utilisateur, par exemple vérifier au moins que taillle est différent de zéro, ça pourrait posé des problème sinon :)

linux5623
28/07/2016, 12h04
Ou une interface graphique!!!

jupar
28/07/2016, 14h23
Ou une interface graphique!!!

ça, ça dépendra de la soif d'apprendre de Moniroje ;)

Cela dit, même si ma suggestion de vérifier les paramètres ça semble un peu gros pour juste un petit programme pour jouer, je pense quand même que c'est une bonne habitude de vérifier que le dénominateur n'est pas nul avant de faire une division (ici donc taille différent de 0).

linux5623
28/07/2016, 14h27
Justement Moni a fait un peu de Qt !!

moniroje
28/07/2016, 18h21
Ben dis donc, hi hi, ça fait salon ici...
Tant mieux pour moi, j'apprends:
oui, ce serait à refaire, je mettrais tout en double; comme ça, ceux qui pèseraient 68.5 kilos, ça marcherait.
Et plus besoin de compliquer la formule avec *1.0
jupar: ben si, j'avais prévu les plaisantins et ça marche: cout << " Hey!!! logori !!" << endl;
Mais effectivement, celui qui mettrait zéro en taille; grâce à toi, j'ai rajouté dans mon code:

cout << "Ta taille, en centimètres ? "; cin >> taille;
/* attention, dans ta formule de imc, taille ne peut être = 0, puisque au dénominateur; prévoir donc
* le cas où l'utilisateur tape zéro: */
if (taille == 0)
{
cout << " Les êtres pensants plus petits que un centimètre vont à la poubelle"<< endl;
cout << "Veuillez taper un autre nombre que zéro, s'il-vous-plaît"<< endl;
cin >> taille;
}

et j'ai essayé et super, ça roule [en fait, premier jet j'avais mis if (taille = 0) et ça ne marchait pas]
ah wé ?? linux5623 se souvient qu'il m'a dépanné en Qt ???
Wé, j'aimais bien les classes mais un jour, dans un forum développeurs, ils se ont mis à 2 à m'injurier
et à me conseiller de reprendre à zéro le cours C++ mais sur d'autres bouquins, que le mien était nul, etc.
Après période de déprime, hi hi,,, chuis trop nul, j'ai suivi leurs conseils, j'ai pris deux autres cours
et là, j'ai repris à zéro.
Effectivement, mon savoir était en dentelles (de Calais) mais c'est pas la faute des cours,
celui qu'ils trouvent nul est bien plus compréhensif que les autres par trop théoriques pour moi),
c'est de ma faute;
ce que j'apprends aujourd'hui, je l'oublierai dans une semaine.
Pour pallier à cela, je me fais un tuto de C++ avec plein de petites notes faciles à lire,
je commente mes exos à donf: ce sont de véritables cours.
Pour bien faire, pour que ça reste dans ma tête ("Qu'est-ce qu'elle a , ma gueule?")
faudrait que chacun des courss, comme à l'école, je fasse plein d'exos.

Et tiens, puisqu'on parle de Qt: j'ai commencé avec l'IDE CodeBlocks sur ma Debian.
Surprise, avec ma Suse, CodeBlocks se refuse à fonctionner, un bug je crois.
Donc avec Suse, j'ai essayé Eclipse: mais ça ne marche pas très bien. En désespoir de cause,
j'ai essayé avec Qt-Creator et ça marche nickel.

ahlner
28/07/2016, 21h12
Un poids et une taille nulle n'ont pas de sens. Je propose une boucle, c'est un brouillon :

while (taille * poids == o)
//Pour qu'un produit soit nul, il suffit qu'un de ses termes le soit!
{
//le code de moni qui attend poids et taille
}

linux5623
28/07/2016, 23h03
Qui serait plutôt




do
{
cout << "Ta taille, en centimètres ? "; cin >> taille;
cout << "tu pèses combien ? rien que les kilos " ; cin >> poids;
}
while ( !taille * poids );

ahlner
28/07/2016, 23h19
D'accord! Ainsi, pas de sortie de la boucle de saisie/attente tant que cezs deux conditions ne sont pas vérifiées.
Ensuite, encahîment sir le calcul de imc et des conclusions inhérentes.
Avant tout rechercher la simplicité?

Il faudrait aussi une boucle pour sortir du programme.

linux5623
29/07/2016, 21h48
Il faudrait aussi une boucle pour sortir du programme.

Ca pourrait faire un exercice pour Moni !!!