Téléchargement
illégal
Posez votre question Signaler

Petit exo de programmation en C [Résolu]

1mec13 - Dernière réponse le 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 :-)
Lire la suite 

Petit exo de programmation en C »

38 réponses
Réponse
+0
moins plus
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 ?
Ajouter un commentaire
Réponse
+0
moins plus
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
fiddy- 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,
Ajouter un commentaire
Réponse
+0
moins plus
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...
fiddy- 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.
Ajouter un commentaire
Réponse
+0
moins plus
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
fiddy- 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.
1mec13 - 26 sept. 2010 à 19:43
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
Ajouter un commentaire
Réponse
+0
moins plus
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
fiddy- 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.
Ajouter un commentaire
Réponse
+0
moins plus
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 :)
1mec13 - 27 sept. 2010 à 11:12
Merci Bomber pour ton aide mais je comprend pas le calcul à chaque fois !?

Mais jvais essayer d'en tenir compte pour finaliser la syntaxe... :-)
fiddy- 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,
Bomber Defender - 27 sept. 2010 à 22:32
Je vois pas en quoi ce code ne marche pas, mais bon... :)
Ajouter un commentaire
Réponse
+0
moins plus
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 !
fiddy- 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,
Ajouter un commentaire
Réponse
+0
moins plus
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
Ajouter un commentaire
Réponse
+0
moins plus
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;
}
}
1mec13 - 28 sept. 2010 à 01:13
j'avais pas fait copier/coller car jvoulais garder celui que j'avais taper :-p jsuis un sentimental mdr

franchement merci bcp ça marche nikel

Ah et aussi le UNSIGNED...ca veut dire quoi ? car jles fait par rapport à un exemple que j'ai trouvé site un site mais jconnais pas :-p

edit : jvais dormir jpense que tu dors déjà lol on reparle demain ;-)
fiddy- 28 sept. 2010 à 08:19
unsigned veut dire "non signé" (n'accepte pas le moins devant). Autrement dit la plus petite valeur que peut prendre un unsigned est 0.
1mec13 - 28 sept. 2010 à 19:41
Ok alors merci encore beaucoup beaucoup pour tout
et surtout du temps que tu as pris pr m'expliquer
Bonne continuation à toi Fiddy et si j'ai encore un problème j'hésiterai pas à venir te voir :-)
Ajouter un commentaire
Réponse
+0
moins plus
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);
watou- 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 :)
1mec13 - 27 sept. 2010 à 23:11
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 ?
fiddy- 27 sept. 2010 à 23:34
Mon message explique tes erreurs. Non ?
Ajouter un commentaire
Ce document intitulé « petit exo de programmation en C » issu de CommentCaMarche (www.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.
Dossier à la une
Passage au tout numérique : quel coût pour les particuliers ?