Go Down

Topic: besoin de vos lumieres pour avancer dans le c++ (Read 578 times) previous topic - next topic

vimper

j'ai commencé un cours en c++ je fais ca juste pour le loisir car la programmation m'attire malgrés mon age :) je tient a signaler que je ne veux nullement que l'on me fasse l'exercice mais que l'on m'aide a mieux comprendre mes erreurs et je ne suis pas pressé par le temps.voila l'exercice est sur un location de vélo de 0h à 24h avec des heures creuse et des heures pleine avec entrée par l'utilisateur manuellement heure du début et l'heure de fin de location je n'envoie que la partie qui me pose souci en  y mettant en mon raisonnement  la ou ca me pose le plus problème c'est pour faire fonctionner les if  la partie comme elle est envoyé compile
Code: [Select]
int hTotal(fin-debut);
 int a(debut);
 int b(fin);
 int x; //(hTotal-hP) je dois affecter a x
 int y; //(hTotal-(hC1+hC2)) je dois affecter a y
 int hC1; //heure creuse1 de 0 heure à 7 heure à 1 franc que je dois faire calculer par le programme
 int hC2; //heure creuse2 de 17 heure à 24 heure à 2 francs que je dois faire calculer par le programme
 int hP; //heure pleine de 7h inclu à 17 heure inclu que je dois faire calculer par le programme
 
 if ((a>=7 or a <=17) and (b>=7 or b<=17))
 {
 cout<<(hP=(b-a));
 }
 
 if ((a>=0 or a<7) and (b>0 or b<7))
 {
 cout<<(hC1=(b-a));
 }
 
 if ((a>17 or a<24) and (b>17 or b>=24))
 {
 cout<<(hC2=(b-a));
 }
 
 int h1; //(x*1) je dois affecter à h1
 int h2; //(y*2) je dois affecter à h2
 int total; //(h1+h2) je dois afffecter à total
 
 if (h1){
 cout<<x<<" heure(s) au tarif horaire de "<<"1"
 <<(h1)<<" franc(s)" << endl;
 }
 
 if (h2){
 cout<<y<<" heure(s) au tarif horaire de "<< "2"
 <<(h2)<<" franc(s)" << endl;
 }
 
 if (total){
 cout << "Le montant total à  payer est de "
        <<(total)<< " franc(s)." << endl;
 }
        

vimper

re bonsoir j'ai revu mon code et changer ma façon de le concevoir j'ai supprimer hc1 et hc2 pour ne plus que calculer que hc(heure creuse) j'ai supprimer aussi les 2 int a et b, j'ai pu affecter les commande que je ne pouvais compiler j'ai rajouter les commandes pour utilisateur c'est la que j'ai vu que a et b étaient de trop.je pense que je suis pas loin, j'ai réussi a compiler le tout mais encore un souci pour affichage des heures  je met le code avec le message warning du compilateur et si je comprend bien ca me dis que hp et hc ne sont pas utilisé
Code: [Select]
#include <iostream>
using namespace std;

int main()
{

cout << "Donnez l'heure de début de la location (un entier) : ";
int debut;
cin >> debut;

cout << "Donnez l'heure de fin de la location (un entier) : ";
int fin;
cin>> fin;

int hTotal(fin-debut);
int hC;
int hP;
int x(hTotal-hP);//:18:17: warning: 'hP' may be used uninitialized in this function [-Wmaybe-uninitialized]
int y(hTotal-hC);//:19:17: warning: 'hC' may be used uninitialized in this function [-Wmaybe-uninitialized]

if (debut< 7 and fin <=17)
{
cout<<(hC=(7-debut))<<endl;
cout<<(hP=(fin-7))<<endl;
}

if (debut<7 and fin<7)
{
cout<<(hC=(fin-debut))<<endl;
}

if (debut>17 and fin<=24)
{
cout<<(hC=(fin-debut))<<endl;
}

int h1(x*1);
int h2(y*2);
int total(h1+h2);

if (h1){
cout<<x<<" heure(s) au tarif horaire de "<<"1"
<<(h1)<<" franc(s)" << endl;
}

if (h2){
cout<<y<<" heure(s) au tarif horaire de "<<"2"
<<(h2)<<" franc(s)" << endl;
}

if (total){
cout << "Le montant total à payer est de "
        <<(total)<< " franc(s)." << endl;
}
 
return 0;
}
si quelqu'un peu m'éclairer merci d'avance

vimper

j'ai réussi a enlever 1 warning du compilateur et si je comprend bien mon souci reside dans le fais que htotal est connu par mon programme mais reste en inconnu en ce qui concerne hp ou x car il n'ont pas de valeur et la je suis a cours d'idée, j'ai rajouter quel if de plus je ne sais pas si c'est bon
Code: [Select]
#include <iostream>
using namespace std;

int main()
{

cout << "Donnez l'heure de début de la location (un entier) : ";
int debut;
cin >> debut;

cout << "Donnez l'heure de fin de la location (un entier) : ";
int fin;
cin>> fin;

int hTotal(fin-debut);
int hC;
int hP;
int x(hTotal-hP); //:18:17: warning: 'hP' may be used uninitialized in this function [-Wmaybe-uninitialized]
int y(hTotal-x);

if (debut<= 7 and fin <=17)
{
cout<<(hC=(7-debut))<<endl;
cout<<(hP=(fin-7))<<endl;
}

if (debut>=0 and fin<7)
{
cout<<(hC=(fin-debut))<<endl;
}

if (debut==0 and fin ==24)
{
cout<<(hC=((7-debut)+(fin-17)))<<endl;
cout<<(hP=(17-7))<<endl;
}

if (debut>17 and fin<=24)
{
cout<<(hC=(fin-debut))<<endl;
}

if (debut<=7 and fin<=24)
{
cout<<(hC=(7-debut))<<endl;
cout<<(hP=(fin-7))<<endl;
}

int h1(x*1);
int h2(y*2);
int total(h1+h2);

if (h1){
cout<<x<<" heure(s) au tarif horaire de "<<"1"
<<(h1)<<" franc(s)" << endl;
}

if (h2){
cout<<y<<" heure(s) au tarif horaire de "<<"2"
<<(h2)<<" franc(s)" << endl;
}
si quelqu'un pourrais m'aiguillé ce serais sympa, peu être que la solution est évidente mais la je ne vois pas.

vimper

j'ai réussi a tout compiler juste une erreur dans l'heure mais je pense que ca viens d'une mauvaise syntaxe niveau booléan ou des  if
Code: [Select]
int hTotal(fin-debut);
bool hC((debut>=0 and fin<7)and(debut>17 and fin<=24));
bool hP(debut>7 and fin<=17);
int x(hTotal-hP);
int y(hTotal-x);

if (debut< 7 and fin <=17)
{
cout<<(hC=(7-debut))<<endl;
cout<<(hP=(fin-7))<<endl;
}

if (debut>=0 and fin<7)
{
cout<<(hC=(fin-debut))<<endl;
}

if (debut>17 and fin<=24)
{
cout<<(hC=(fin-debut))<<endl;
}

if (debut<7 and fin<=24)
{
cout<<(hC=(7-debut))<<endl;
cout<<(hP=(fin-7))<<endl;
}
int h1(x*1);
int h2(y*2);
int total(h1+h2);
cout<<x<<" heure(s) au tarif horaire de "
<<"1"<<" franc(s)" << endl;
cout<<y<<" heure(s) au tarif horaire de "
<<"2"<<" franc(s)" << endl;

if (total){
cout << "Le montant total à payer est de "
        <<total<< " franc(s)." << endl;
}
desolé d'avoir dérangé je pense que ca vas le faire me suis alarmé trop vite :)

troisiemetype

J'ignorais que l'on pusse mettre des and et or à la place de && et ||. Visiblement cela compile aussi.

Cela dit, il y a des choses que vous pouvez améliorer dans le dernier code publié: Dnas la suite de quatre if qui compare début avec les valeurs d'heures, puisque les valeurs s'excluent mutuellement, vous pouvez mettre des else if à partir du second: ainsi le programme, si une des condition est testée positivement, les autres seront sautées.
Toujours dans cette structure, le dernier test recouvre en partie le premier, pour renvoyer le même calcul. Est-ce qu'il n'y a pas là manière à simplification, en ne gardant que le plus permissif, ou le plus restrictif des deux, en fonction du but recherché?

Et pour finir, vous pouvez améliorer la lisibilité du code et sa maintenabilité en remplaçant les valeurs utilisées dans les tests par des constates:
Code: [Select]

const int debutHP = 7;
const int debutHC = 17;

if(debut < debutHC and fin < debutHP){}


Ainsi si vous avez à changer ces paramètres, vous le faites une fois pour toute lors de la déclaration en début de programme, en n'avez pas besoin de parcourir votre code à la recherche des valeurs correspondantes. Et vous éliminez aussi le risque de remplacer un 7 quelque part qui correspondrait à une autre valeur.

vimper

merci de ces précisions je vais essayer ca.et surtout merci pour le conseil du else if car je ne savais pas que si un if étais positif ça ne prendrais pas en compte les autres. je vous souhaite de bonne fête de fin d'année

troisiemetype

si un if étais positif ça ne prendrais pas en compte les autres.
En fait si c'est uns succession de if, justement ils seront tous testés. Par contre placer des else if permet de sauter tout ce qui succède à un test positif. C'est surtout intéressant dans le cas où une éventualité est plus probable que les autres, dans un code qui doit s'exécuter vite. Dans votre cas le gain sera nul, mais ça permet aussi de matérialiser clairement l'intention dans la structure, et donc de produire un code plus lisible.

Bonnes fêtes à vous aussi!

Go Up