Petit exo de programmation en C
Résolu
1mec13
-
1mec13 -
1mec13 -
Bonjour,
Je viens vous demander quelques petits conseils au sujet d'un exercice que je dois faire et vue que je débute en C j'ai besoin de votre aide
voilà le sujet :
On désire calculer le montant de la facture d'électricité d'un abonné sachant que l'abonné :
-paye des frais fixes d'abonnement s'élevant à 25€(même s'il n'a rien consommé)
-paye sa consommation selon un tarif :
* 50 centimes par KWh pour les 100 premiers KWh
* 35 centimes par KWh pour les 150 suivants
* 20 centimes pour tout ce qui excède 250KWh
le programme demandera à l'abonné le nombre de KWh consommés et affichera le montant de la facture
Voilà je me doute bien qu'il doit falloir utiliser des WHILE et IF mais je ne les ai jamais encore utilisés ensemble si vous pouviez m'aider ce serait fort sympa merci d'avance :-)
Je viens vous demander quelques petits conseils au sujet d'un exercice que je dois faire et vue que je débute en C j'ai besoin de votre aide
voilà le sujet :
On désire calculer le montant de la facture d'électricité d'un abonné sachant que l'abonné :
-paye des frais fixes d'abonnement s'élevant à 25€(même s'il n'a rien consommé)
-paye sa consommation selon un tarif :
* 50 centimes par KWh pour les 100 premiers KWh
* 35 centimes par KWh pour les 150 suivants
* 20 centimes pour tout ce qui excède 250KWh
le programme demandera à l'abonné le nombre de KWh consommés et affichera le montant de la facture
Voilà je me doute bien qu'il doit falloir utiliser des WHILE et IF mais je ne les ai jamais encore utilisés ensemble si vous pouviez m'aider ce serait fort sympa merci d'avance :-)
A voir également:
- Petit exo de programmation en C
- Application de programmation - Guide
- Comment imprimer une photo en petit ✓ - Forum Photo numérique
- Comment ouvrir un fichier exo ? - Forum Windows
- Petit 2 ✓ - Forum Bureautique
- Imprimer une photo à la taille qu'on veut? - Forum Photo numérique
10 réponses
Bonjour,
L'utilisation des boucles while et if combinée ne change pas.
Par exemple :
Qu'est-ce qui te pose problème ?
L'utilisation des boucles while et if combinée ne change pas.
Par exemple :
while(condition) { if (condition2) { instruction; } instruction2; }
Qu'est-ce qui te pose problème ?
Slt à toi Fiddy merci de me répondre
Ce qui me pose problème c'est que je comprend pas comment il faut faire pour enchainer les deux...
C'est juste si j'enchaine :
While(X<=100) {
if (X<=150) {instructions}
else {instruction si c'est plus que 250}
instructions de while;
}
??? je comprend pas trop ou mettre l'instruction de While si ya un If
Ce qui me pose problème c'est que je comprend pas comment il faut faire pour enchainer les deux...
C'est juste si j'enchaine :
While(X<=100) {
if (X<=150) {instructions}
else {instruction si c'est plus que 250}
instructions de while;
}
??? je comprend pas trop ou mettre l'instruction de While si ya un If
Ce qui te pose problème, c'est l'algo je pense.
En français, while se traduit par TantQue et if par Si.
Ce qui te donnerait :
0->X
TantQue X >= 0, Faire :
Afficher "coucou"
Si X >5, Faire :
Afficher "toto"
Fin Si
Demander X
Fin TantQue
Dans ce programme, si l'utilisateur tape un nombre entre 0 et 5, cela affichera coucou et le programme continuera. S'il tape un nombre plus grand que 5, le programme affichera coucou puis toto et le programme continuera
S'il tape un nombre négatif, le programme s'arrêtera.
Cdlt,
En français, while se traduit par TantQue et if par Si.
Ce qui te donnerait :
0->X
TantQue X >= 0, Faire :
Afficher "coucou"
Si X >5, Faire :
Afficher "toto"
Fin Si
Demander X
Fin TantQue
Dans ce programme, si l'utilisateur tape un nombre entre 0 et 5, cela affichera coucou et le programme continuera. S'il tape un nombre plus grand que 5, le programme affichera coucou puis toto et le programme continuera
S'il tape un nombre négatif, le programme s'arrêtera.
Cdlt,
Oui mais moi il faut que j'enchaine les deux dans mon exemple...toi c'est soit un soit l'autre dans l'exemple que tu as pris
Moi si ya une consommation de 200 il faut que je fasse 100*0.5 + 50*0.35
et c'est ça que j'ai du mal à comprendre avec le while pq moi ca voudrait dire
Tant que c'est superieur à 0 faire nbr de KWh *0.5
si c'est supèrieur à 100 faire ces 100*0.5 + ces KWh superieurs *0.35
et si c'est encore superieur à 250 faire...
Moi si ya une consommation de 200 il faut que je fasse 100*0.5 + 50*0.35
et c'est ça que j'ai du mal à comprendre avec le while pq moi ca voudrait dire
Tant que c'est superieur à 0 faire nbr de KWh *0.5
si c'est supèrieur à 100 faire ces 100*0.5 + ces KWh superieurs *0.35
et si c'est encore superieur à 250 faire...
Tu peux utiliser des "else if" (sinon si).
En fait, je pense que tu n'as pas assez réfléchi sur la manière de faire en français.
Par exemple, prends des cas concrets, et vois comment traiter le problème de manière générale.
Par exemple, consommation pour 150.
Il va payer 25
Ensuite, on regarde si c'est supérieur à 100 (SI)
Oui, donc on rajoute 100*50, et il reste 50 nbKWH à traiter (150-50)
Etc.
Et en le faisant sur plusieurs exemples, tu vas sentir que c'est toujours la même façon que tu fais pour traiter le problème. Une fois que ça te sera clair, tu pourras écrire le programme en français. Et là, je pourrais t'aider à l'écrire en C.
En fait, je pense que tu n'as pas assez réfléchi sur la manière de faire en français.
Par exemple, prends des cas concrets, et vois comment traiter le problème de manière générale.
Par exemple, consommation pour 150.
Il va payer 25
Ensuite, on regarde si c'est supérieur à 100 (SI)
Oui, donc on rajoute 100*50, et il reste 50 nbKWH à traiter (150-50)
Etc.
Et en le faisant sur plusieurs exemples, tu vas sentir que c'est toujours la même façon que tu fais pour traiter le problème. Une fois que ça te sera clair, tu pourras écrire le programme en français. Et là, je pourrais t'aider à l'écrire en C.
Ok alors en prenant plusieurs exemples :
Pour 200 => 25
200>100 donc + (100*0.5)
200>150 dc + (50*0.35)
200<250 dc STOP
Pour 300 => 25
300>100 dc + (100*0.5)
300>150 dc + (50*0.35)
300>250 dc + (100*0.2)
Pour 80 => 25
80<100 dc + (80*0.5)
Pour 120 => 25
120>100 dc + (100*0.5)
120<150 dc + (20*0.35)
Bon après le problème se situe au niveau des sommes à multiplier et là ça se corse lol
Pour 200 => 25
200>100 donc + (100*0.5)
200>150 dc + (50*0.35)
200<250 dc STOP
Pour 300 => 25
300>100 dc + (100*0.5)
300>150 dc + (50*0.35)
300>250 dc + (100*0.2)
Pour 80 => 25
80<100 dc + (80*0.5)
Pour 120 => 25
120>100 dc + (100*0.5)
120<150 dc + (20*0.35)
Bon après le problème se situe au niveau des sommes à multiplier et là ça se corse lol
Le premier exemple est faux.
Il faut utiliser déjà des inégalités larges.
200>=100 donc + (100*0,5)
100>=150 (non) donc +100*0,35
0 >= 250 (non) donc STOP
Tu observes qu'il ne faut pas oublier de soustraire le nbKWH pour savoir où tu en es.
Tu vois en procédant ainsi, tu commences à voir la problématique. C'est bon signe. Essaie encore de prendre quelques exemples jusqu'à voir une démarche qui fonctionne toujours et n'oublie pas de soustraire la variable nbKWH.
Il faut utiliser déjà des inégalités larges.
200>=100 donc + (100*0,5)
100>=150 (non) donc +100*0,35
0 >= 250 (non) donc STOP
Tu observes qu'il ne faut pas oublier de soustraire le nbKWH pour savoir où tu en es.
Tu vois en procédant ainsi, tu commences à voir la problématique. C'est bon signe. Essaie encore de prendre quelques exemples jusqu'à voir une démarche qui fonctionne toujours et n'oublie pas de soustraire la variable nbKWH.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
J'ai encore le temps de te marquer ce message
j'espère avoir mieux compris j'ai une petite idée :
Tant que P>0 faire (P*0.5)+25
Si P>100 et P<250 faire (100*0.5)+((P-100) *0.35)+25
sinon faire (100*0.5)+(150*0.35)+((P-250)*0.2)+25
Voilà je sais pas si c'est bien ça mais c'est une petite idée
j'espère avoir mieux compris j'ai une petite idée :
Tant que P>0 faire (P*0.5)+25
Si P>100 et P<250 faire (100*0.5)+((P-100) *0.35)+25
sinon faire (100*0.5)+(150*0.35)+((P-250)*0.2)+25
Voilà je sais pas si c'est bien ça mais c'est une petite idée
Bonjour,
Il faut faire un truc du genre (un peu simplet ici j'avoue :p) :
float facture = 25.00;
int nbKwH = Ce que la personne renseigne
While nbKwh > 0 {
If nbKwH >=250 {
facture += 0.20;
} elseif nbKwH >=100 {
facture += 0.35;
} else {
facture += 0.50;
}
nbKwh--;
}
Edit : Désolé, sa fais trop longtemps que j'ai fais du C pour me souvenir vraiment de la syntaxe :)
Il faut faire un truc du genre (un peu simplet ici j'avoue :p) :
float facture = 25.00;
int nbKwH = Ce que la personne renseigne
While nbKwh > 0 {
If nbKwH >=250 {
facture += 0.20;
} elseif nbKwH >=100 {
facture += 0.35;
} else {
facture += 0.50;
}
nbKwh--;
}
Edit : Désolé, sa fais trop longtemps que j'ai fais du C pour me souvenir vraiment de la syntaxe :)
Fiddy jtrouve pas tu veux bien m'indiquer ce qu'il faut faire parce-que il me rend fou cet énoncé...
J'arrive pas à trouver le calcul qu'il faut réaliser si c'est pas celui que j'ai marqué plus haut :-s
Franchement j'ai cherché de partout j'ai pas trouvé un exemple tel !
J'arrive pas à trouver le calcul qu'il faut réaliser si c'est pas celui que j'ai marqué plus haut :-s
Franchement j'ai cherché de partout j'ai pas trouvé un exemple tel !
Bon, voici ce qui devrait bien t'aider :
Il te restera deux trois trucs à améliorer. L'algorithme n'est pas parfait (par exemple répétition de "afficher nbKWH et lire". Mais la structure est bonne (sauf erreur de ma part).
Si tu as des questions sur l'algo ou sur son écriture en C, n'hésite pas.
Cdlt,
NbKWH <-- 1 resultat <-- 0 Afficher "Entrer nombre de Watt en kWH (0 pour arrêter) : Lire nbKWH TantQue nbKWH > 0 Si nbKWH < 100 Alors resultat <-- nbKWH*0,50 Sinon resultat <-- 100*0,50 Fin Si Si nbKWH > 100 Et nbKWH <= 250 Alors resultat <-- resultat + (nbKWH - 100) * 0,35 Sinon Si nbKWH > 100 Alors resultat <-- resultat + (250 - 150) * 0,35 Fin Si Si ... Alors resultat ... Sinon Si ... resultat ... Fin Si Afficher "Le prix sera de : ", NbKWH Afficher "Entrer nombre de Watt en kWH (0 pour arrêter) : Lire nbKWH Fin Tant Que
Il te restera deux trois trucs à améliorer. L'algorithme n'est pas parfait (par exemple répétition de "afficher nbKWH et lire". Mais la structure est bonne (sauf erreur de ma part).
Si tu as des questions sur l'algo ou sur son écriture en C, n'hésite pas.
Cdlt,
Merci bien je vais regarder ça...là jsuis en train de tester un truc perso j'attends de l'avoir fini et jte le montre tu me diras ce que tu en penses
Voilà j'ai tenté ça et ça marche pas tu peux me dire pourquoi ?
#include <stdio.h>
int main ()
{
float facture=25;
float conso=0;
unsigned int consoprecedente, nouvelleconso, consosuivante,derniereconso;
printf("Veuillez rentrer votre nombre de KWh consommes"); scanf ("%f",&conso);
while (conso>0) {
if (conso<=100){facture+conso*0.5;}
consoprecedente=100;
nouvelleconso=conso-100;
consosuivante=150;
derniereconso=conso-100-250;
if (conso>100 && conso<=250) {facture + (consoprecedente * 0.5 ) + (nouvelleconso * 0.35);}
else {facture + (consoprecedente*0.5) + (consosuivante*0.35) + (derniereconso*0.2);}
return;
}
}
#include <stdio.h>
int main ()
{
float facture=25;
float conso=0;
unsigned int consoprecedente, nouvelleconso, consosuivante,derniereconso;
printf("Veuillez rentrer votre nombre de KWh consommes"); scanf ("%f",&conso);
while (conso>0) {
if (conso<=100){facture+conso*0.5;}
consoprecedente=100;
nouvelleconso=conso-100;
consosuivante=150;
derniereconso=conso-100-250;
if (conso>100 && conso<=250) {facture + (consoprecedente * 0.5 ) + (nouvelleconso * 0.35);}
else {facture + (consoprecedente*0.5) + (consosuivante*0.35) + (derniereconso*0.2);}
return;
}
}
Plusieurs remarques en live :
int main() => int main (void)
float facture=25; => double facture=25; /*on évite les float sauf raison particulière*/
Et attention, il faudrait faire apparaitre le 25 dans la boucle while, sinon il ne sera pas pris en compte lors du nouveau choix par l'utilisateur (boucle suivante).
facture+conso*0.5 => tu demandes à ta machine de faire cette opération, mais tu ne lui dis pas quoi en faire. Si tu veux stocker cette valeur dans facture : facture=facture+conso*0.5 (même remarque pour les lignes similaires)
return; => return 0; vu que main() renvoie un int.
N'oublie pas de mettre aussi un printf/scanf dans ton while pour que l'utilisateur puisse rentrer une valeur.
Il faut que tu affiches ta variable resultat sinon le programme ne sert à rien.
Dernier conseil, dommage que tu emploies des variables nouvelleconso, etc. Tu peux très bien faire des opérations comme : "resultat=facture+(conso-100)*0.5 etc.
Et enfin un réel plus pour ton programme et pour ta note finale : les commentaires. C'est très important. ;-))).
Sinon, bravo t'as bien avancé ;)))
int main() => int main (void)
float facture=25; => double facture=25; /*on évite les float sauf raison particulière*/
Et attention, il faudrait faire apparaitre le 25 dans la boucle while, sinon il ne sera pas pris en compte lors du nouveau choix par l'utilisateur (boucle suivante).
facture+conso*0.5 => tu demandes à ta machine de faire cette opération, mais tu ne lui dis pas quoi en faire. Si tu veux stocker cette valeur dans facture : facture=facture+conso*0.5 (même remarque pour les lignes similaires)
return; => return 0; vu que main() renvoie un int.
N'oublie pas de mettre aussi un printf/scanf dans ton while pour que l'utilisateur puisse rentrer une valeur.
Il faut que tu affiches ta variable resultat sinon le programme ne sert à rien.
Dernier conseil, dommage que tu emploies des variables nouvelleconso, etc. Tu peux très bien faire des opérations comme : "resultat=facture+(conso-100)*0.5 etc.
Et enfin un réel plus pour ton programme et pour ta note finale : les commentaires. C'est très important. ;-))).
Sinon, bravo t'as bien avancé ;)))
j'aurais plusieurs question déjà le VOID entre les parentheses il sert à quoi car pr l'instant en cours on laissait les parentheses vides...
Ensuite si je mets FACTURE=facture...ça va pas poser un problème sachant que j'ai mis en haut FLOAT FACTURE = 25
Moi jcomprend qu'on donne 25 à la variable FACTURE donc ça ferait 25=25+...
Ensuite pour DOUBLE facture je dois également mettre ça pour DOUBLE CONSO ?
jte renvoie un mess quand j'ai déjà fait tout ça lol
Ensuite si je mets FACTURE=facture...ça va pas poser un problème sachant que j'ai mis en haut FLOAT FACTURE = 25
Moi jcomprend qu'on donne 25 à la variable FACTURE donc ça ferait 25=25+...
Ensuite pour DOUBLE facture je dois également mettre ça pour DOUBLE CONSO ?
jte renvoie un mess quand j'ai déjà fait tout ça lol
En fait, le void entre parentèse c'est pour dire au compilateur que ta fonction admet 0 argument, le prototype de fonction sera pleinement défini. Mais bon, c'est pas super important ;-))).
Ensuite si je mets FACTURE=facture...ça va pas poser un problème sachant que j'ai mis en haut FLOAT FACTURE = 25
Moi jcomprend qu'on donne 25 à la variable FACTURE donc ça ferait 25=25+...
Non, ça fera : 25+... et ça stockera le tout dans la variable facture.
Il ne te restera alors plus qu'à afficher ta variable facture.
Mais réfléchis bien au fait que si tu refais une boucle, il faudra réinitialiser la variable facture à 25.
Ensuite pour DOUBLE facture je dois également mettre ça pour DOUBLE CONSO ?
Bien sûr ;-)))
Cdlt,
Ensuite si je mets FACTURE=facture...ça va pas poser un problème sachant que j'ai mis en haut FLOAT FACTURE = 25
Moi jcomprend qu'on donne 25 à la variable FACTURE donc ça ferait 25=25+...
Non, ça fera : 25+... et ça stockera le tout dans la variable facture.
Il ne te restera alors plus qu'à afficher ta variable facture.
Mais réfléchis bien au fait que si tu refais une boucle, il faudra réinitialiser la variable facture à 25.
Ensuite pour DOUBLE facture je dois également mettre ça pour DOUBLE CONSO ?
Bien sûr ;-)))
Cdlt,
Ok Ok tout s'éclaircit :-p
Par contre pour réinitialiser le variable à 25 :-s
Là le programme ne me calcule pas :-s
j'ai ça maintenant :
#include <stdio.h>
int main (void)
{
double facture=25;
double conso=0;
unsigned int consoprecedente, nouvelleconso, consosuivante,derniereconso;
printf("Veuillez rentrer votre nombre de KWh consommes : "); scanf ("%f",&conso);
while (conso>0) {
if (conso<=100){facture = facture+(conso*0.5);}
consoprecedente = 100;
nouvelleconso = conso-100;
consosuivante = 150;
derniereconso = conso-100-250;
if (conso>100 && conso<=250) {facture = facture + (consoprecedente * 0.5 ) + (nouvelleconso * 0.35);}
else {facture = facture + (consoprecedente*0.5) + (consosuivante*0.35) + (derniereconso*0.2);}
printf("Le montant de votre facture s'eleve a : ");
scanf("%f",&facture);
return 0;
}
}
Par contre pour réinitialiser le variable à 25 :-s
Là le programme ne me calcule pas :-s
j'ai ça maintenant :
#include <stdio.h>
int main (void)
{
double facture=25;
double conso=0;
unsigned int consoprecedente, nouvelleconso, consosuivante,derniereconso;
printf("Veuillez rentrer votre nombre de KWh consommes : "); scanf ("%f",&conso);
while (conso>0) {
if (conso<=100){facture = facture+(conso*0.5);}
consoprecedente = 100;
nouvelleconso = conso-100;
consosuivante = 150;
derniereconso = conso-100-250;
if (conso>100 && conso<=250) {facture = facture + (consoprecedente * 0.5 ) + (nouvelleconso * 0.35);}
else {facture = facture + (consoprecedente*0.5) + (consosuivante*0.35) + (derniereconso*0.2);}
printf("Le montant de votre facture s'eleve a : ");
scanf("%f",&facture);
return 0;
}
}
Ah, on touche au but :-).
Par contre attention, tu as fermé l'accolade du while après le return 0. Il faut le mettre avant. Le return 0; c'est juste avant l''accolade au final pour dire au programme que tout s'est bien déroulé.
printf("Le montant de votre facture s'eleve a : ");
scanf("%f",&facture);
Ce n'est pas ce que tu veux faire je pense. Là ton programme t'écrit le montant de votre facture s'élève à" et ensuite il te demande d'écrire la variable facture.
Essaie plutôt : printf("Le montant de votre facture s'élève à %lf.\n",facture);
Ceci affichera la variable facture à la place de %lf (L minuscule) et fera un saut de ligne (\n).
Et juste ensuite : tu remets printf("nouveau choix de kwh :"); scanf("%f",&conso);
Par contre pour réinitialiser le variable à 25 :-s
Tout simplement, en début de boucle while : facture=25;
Par contre attention, tu as fermé l'accolade du while après le return 0. Il faut le mettre avant. Le return 0; c'est juste avant l''accolade au final pour dire au programme que tout s'est bien déroulé.
printf("Le montant de votre facture s'eleve a : ");
scanf("%f",&facture);
Ce n'est pas ce que tu veux faire je pense. Là ton programme t'écrit le montant de votre facture s'élève à" et ensuite il te demande d'écrire la variable facture.
Essaie plutôt : printf("Le montant de votre facture s'élève à %lf.\n",facture);
Ceci affichera la variable facture à la place de %lf (L minuscule) et fera un saut de ligne (\n).
Et juste ensuite : tu remets printf("nouveau choix de kwh :"); scanf("%f",&conso);
Par contre pour réinitialiser le variable à 25 :-s
Tout simplement, en début de boucle while : facture=25;
double montant; int nb_heure; printf("entrer le nombre d'heures :"); scanf("%d",&nb_heure); montant = 25; // abonnement if(nb_heure > 100) { montant += 0.50 * 100; nb_heure -= 100; if( nb_heure > 150) { montant += 0.35 * 150; nb_heure -= 150; montant += nb_heure * 0.20; } else { montant += 0.35 * nb_heure ; } } else { montant += nb_heure * 0.50; } printf("%f", montant);