Petit exo de programmation en C
Résolu/Fermé
A voir également:
- Petit exo de programmation en C
- Application de programmation - Guide
- Excel trier du plus grand au plus petit - Guide
- Petit 1 comme ² ✓ - Forum Windows
- Comment écrire un chiffre en petit caractè ✓ - Forum Bureautique
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
26 sept. 2010 à 18:00
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
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
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,
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...
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
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.
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
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
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.
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
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
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.
Tu as le droit de faire des P=P-150 aussi. Ceci changera la variable P.
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
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
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,
Cdlt,
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 !
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
27 sept. 2010 à 20:10
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;
}
}
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
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é ;)))
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
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
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,
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;
}
}
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
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;
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;
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
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);
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
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 :)
a += b; est équivalent à : a = a + b ;
a -= b; est équivalent à : a = a - b ;
si tu as d'autres question, pas de problème :)
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
27 sept. 2010 à 23:34
Mon message explique tes erreurs. Non ?