Programme langage C

Fermé
am202 - 7 oct. 2020 à 18:35
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 - 8 oct. 2020 à 09:50
Bonjour,
voici le programme que j'ai écris pour un exercice correspondant à la caisse enregistreuse,
avec des promotions à appliquer dans certains intervalles, sauf que le programme ne comptabilise pas les promotions, je ne comprends pas c'où viens mon erreur..
#include <stdio.h>

int main ()
{
float prix;
float x=0;
do {
printf ("saisir prix\n");
scanf("%f",&prix);
x = x+prix;
} while( prix != 0);
if (99<prix<500) {
prix=x*0.9;
}
if(500<prix<1000);{
prix=x*0.8;
}
if (prix>999){
prix=x*0.7;
}
printf("total : %f\n",x);

}


Configuration: Windows / Chrome 85.0.4183.121

2 réponses

[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
Modifié le 7 oct. 2020 à 19:06
Salut am202,

Quand tu postes du code sur le forum, fais le avec les balises de code.

Il y a plusieurs problèmes.

Les plus saillants sont :
  • tes tests du type
    if (99<prix<500) {
    ne font pas ce que tu penses. En C il faudrait écrire
    if ( (99<prix) && (prix<500) ) {
    pour avoir l'effet recherché
  • à la ligne
    if(500<prix<1000);{
    , en plus du problème similaire à celui ci-dessus, tu as mis un
    ;
    après la parenthèse, comme si tu voulais terminer ton instruction (et que tu dois bien sûr retirer)
  • tes tests seront toujours faux, car tu compares la variable
    prix
    à ces bornes, alors que
    prix
    vaut
    0
    à ce stade, car c'est dans
    x
    que tu fais ton addition
  • probablement, en fin de programme, tu voudras afficher
    prix
    , qui est la variable contenant le résultat de ton calcul de remise, non ?


En compilant ce code avec un compilateur signalant, outre des erreurs de syntaxe, des avertissements, on obtient une floppée d'avertissements :

$ gcc -Wall 36879476.c
36879476.c: In function ‘main’:
36879476.c:6:3: warning: implicit declaration of function ‘printf’ [-Wimplicit-function-declaration]
   printf ("saisir prix\n");
   ^~~~~~
36879476.c:6:3: warning: incompatible implicit declaration of built-in function ‘printf’
36879476.c:6:3: note: include ‘<stdio.h>’ or provide a declaration of ‘printf’
36879476.c:1:1:
+#include <stdio.h>
 int main (void)
36879476.c:6:3:
   printf ("saisir prix\n");
   ^~~~~~
36879476.c:7:3: warning: implicit declaration of function ‘scanf’ [-Wimplicit-function-declaration]
   scanf("%f",&prix);
   ^~~~~
36879476.c:7:3: warning: incompatible implicit declaration of built-in function ‘scanf’
36879476.c:7:3: note: include ‘<stdio.h>’ or provide a declaration of ‘scanf’
36879476.c:10:13: warning: comparison of constant ‘500’ with boolean expression is always true [-Wbool-compare]
  if (99<prix<500) {
             ^
36879476.c:10:8: warning: comparisons like ‘X<=Y<=Z’ do not have their mathematical meaning [-Wparentheses]
  if (99<prix<500) {
      ~~^~~~~
36879476.c:13:13: warning: comparison of constant ‘1000’ with boolean expression is always true [-Wbool-compare]
  if(500<prix<1000);{
             ^
36879476.c:13:8: warning: comparisons like ‘X<=Y<=Z’ do not have their mathematical meaning [-Wparentheses]
  if(500<prix<1000);{
     ~~~^~~~~
36879476.c:13:2: warning: this ‘if’ clause does not guard... [-Wmisleading-indentation]
  if(500<prix<1000);{
  ^~
36879476.c:13:20: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the ‘if’
  if(500<prix<1000);{
                    ^
36879476.c:19:2: warning: incompatible implicit declaration of built-in function ‘printf’
  printf("total : %f\n",x);
  ^~~~~~
36879476.c:19:2: note: include ‘<stdio.h>’ or provide a declaration of ‘printf’


N'ignore pas les avertissements, car, quand bien même ton code compile, les avertissements te signalent dans la quasi totalité des cas des choses qui n'ont pas de sens et qui sont très probablement des erreurs.

Dal
0
#include <stdio.h>

int main ()
{
float prix;
float x=0;
do {
printf ("saisir prix\n");
scanf("%f",&prix);
x = x+prix;
} while( prix != 0);
if ((99<x)&&(x<500)){
prix=x*0.9;
}
if((500<x)&&(x<1000)){
prix=x*0.8;
}
else{
prix=x*0.7;
}
printf("total : %f\n",prix);

}

j'ai écris ça du coup en corrigant sauf que à tout les coups il me calcule une remise de 30% à tout les coups
0
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
Modifié le 8 oct. 2020 à 09:56
pour que ton code soit doté de la coloration syntaxique correspondante au bon langage, il faut cliquer sur la flèche basse à droits de l'icône de balise de code et choisir le langage C.

pour ton problème, il ne se serait pas manifesté si tu n'avais pas remplacé la dernière condition présente dans ton code posté à l'origine par un
else
dans le code ci-dessus. Ce
else
s'exécute toujours lorsque la condition qui précède est fausse, ce qui n'est pas le comportement souhaité.

fais également les deux tests suivants et déduis en les changements à effectuer à ton code pour qu'il se comorte comme il le devrait :
  • achète deux articles à 250 chacun
  • achète un article à 10


aide toi de
printf()
intermédiaires où tu affiches les valeurs de
x
et de
prix
à différents moments
0