Petit exo de programmation en C

Résolu/Fermé
1mec13 - 26 sept. 2010 à 17:57
 1mec13 - 28 sept. 2010 à 19:41
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 :-)


10 réponses

fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 842
26 sept. 2010 à 18:00
Bonjour,

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 ?
0
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
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 842
26 sept. 2010 à 18:19
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,
0
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...
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 842
26 sept. 2010 à 18:45
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.
0
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
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 842
26 sept. 2010 à 19:15
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.
0
Ecoute jvais voir ce que je peux trouver mais ce soir jpourrai plus répondre au mess donc demain si ça t'embete pas trop...et j'espere avoir la réponse demain soir car je dois rendre ça mardi

Jvais réfléchir ce soir et jte dis ça demain...;-)

bonne soirée et merci encore de l'aide
0

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
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 842
26 sept. 2010 à 20:54
Non c'est toujours pas bon. Si tu prends P=150. Tu vas faire 150*0.5+25 (P*0.5)+25
Tu as le droit de faire des P=P-150 aussi. Ceci changera la variable P.
0
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 :)
0
Merci Bomber pour ton aide mais je comprend pas le calcul à chaque fois !?

Mais jvais essayer d'en tenir compte pour finaliser la syntaxe... :-)
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 842
27 sept. 2010 à 20:13
Bien qu'élégante, la façon de décrémenter nbKwH à chaque itération ne marchera pas puisqu'on pert une information importante : est-on dans les 100 premiers kwh, dans les 150 suivants, etc. Ou alors il faudrait utiliser des variables en plus, obligeant de facto à compliquer l'algorithme.
Cdlt,
0
Bomber Defender
27 sept. 2010 à 22:32
Je vois pas en quoi ce code ne marche pas, mais bon... :)
0
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 !
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 842
27 sept. 2010 à 20:10
Bon, voici ce qui devrait bien t'aider :

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,
0
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
0
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;
}
}
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 842
27 sept. 2010 à 21:42
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é ;)))
0
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
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 842
27 sept. 2010 à 22:09
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,
0
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;
}
}
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 842
27 sept. 2010 à 22:35
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;
0
watou Messages postés 199 Date d'inscription vendredi 27 juin 2008 Statut Membre Dernière intervention 19 avril 2013 28
27 sept. 2010 à 22:57
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);
0
Merci pour ton contribution mais comme expliqué plus haut je débute donc ce que tu as marqué je pige à moitié surtout le += que je sais pas ce qu'il veut dire
0
watou Messages postés 199 Date d'inscription vendredi 27 juin 2008 Statut Membre Dernière intervention 19 avril 2013 28
27 sept. 2010 à 23:07
explication :

a += b; est équivalent à : a = a + b ;
a -= b; est équivalent à : a = a - b ;

si tu as d'autres question, pas de problème :)
0
ah ok merci je connaissais pas et au niveau de ce que j'ai fait moi tu sais pas pourquoi ça pose problème par hasard ?
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 842
27 sept. 2010 à 23:34
Mon message explique tes erreurs. Non ?
0