Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 25/09/2019, à 20:30

chris7522

Ca ne se passe comme je le souhaiterai (C)

Bonjour a toutes et a tous ,
Je n'arrive pas a appliquer la remise sur ce code , pouvez vous m'apporter votre aide s'il vous plait .

#include <stdio.h>
#define prixCle 10
#define prixOrdi 500
int calcul(int nArticle,int prix);

int main(void)
{
 int choix,remiseIm,nArticle,remise,prix;
 choix=0;prix=0;remise=0;remiseIm=0;nArticle=0;

 puts("************************************************\n");
 puts("*********|BIENVENUE CHEZ OIM|*******************\n");
 puts("************************************************\n");

 puts("Article disponible en stock:\n");

 puts("\tCHOIX 1:cle usb");
 puts("\t(prix a l'unité: 10 euros)\n");

 puts("\tCHOIX 2:ordinateur portable(10%% remise immédiate)");
 puts("\t(prix a l'unité: 500 euros)\n");

 puts("\t10 article acheté,5%% de remise sur tous les articles");
 puts("\t50 article acheté,10%% de remise sur tous les articles\n");

 printf("Quel est votre choix?\n");
 scanf("%d",&choix);
 while((choix!=1)&&(choix!=2))
   {
    printf("Mauvais choix,recommencez\n");
    scanf("%d",&choix);
   }

 printf("Combien d'article désirez vous?\n"); 
 scanf("%d",&nArticle); 
  
 switch(choix)
 {
  case 1:
      prix=calcul(nArticle,prixCle);
      printf("Vous avez choisis %d cle usb\n",nArticle);
      printf("Votre montant total sera de:%d Euros\n",prix);
      break; 
  case 2:
      prix=calcul(nArticle,prixOrdi);
      remiseIm=(prixOrdi*10)/100;
      prix=prix-remiseIm;
      printf("Vous avez choisis %d ordinateurs portable\n",nArticle);
      printf("Votre montant total sera de:%d Euros\n",prix);
      break;
  default:
     printf("Mauvais choix!\n");
      break;
  }
 return 0;
 }

 int calcul(int nArticle,int prix)
 {int remise=0,result=0;
   if((nArticle>=10) && (nArticle<50))
     {
      remise=(prix*5)/100;
      result=prix-remise;
      result=result*nArticle;
     }
   else if(nArticle>=50)
     {
      remise=(prix*10)/100;
      result=prix-remise;
      result=result*nArticle;
     }
   else
     {
      result=prix*nArticle;
     }
   return result;
 }
   

Hors ligne

#2 Le 25/09/2019, à 20:48

pingouinux

Re : Ca ne se passe comme je le souhaiterai (C)

Bonsoir,
Il faut déclarer les variables en float et non en int.

Hors ligne

#3 Le 25/09/2019, à 20:49

NicoApi73

Re : Ca ne se passe comme je le souhaiterai (C)

Bonsoir,

Pour la remise à 5% sur les clés, ça ne peut pas fonctionner : 5% de 10€ font 0.5€, or tu l'as déclaré en integer...

Si tu veux rester en integer, il faut d'abord multiplier le prix par le nombre d'articles, puis appliquer la remise sur le total. Tu auras une division avec modulo

EDIT : grillé par pingouinux smile

Dernière modification par NicoApi73 (Le 25/09/2019, à 20:50)

Hors ligne

#4 Le 26/09/2019, à 07:17

DonutMan75

Re : Ca ne se passe comme je le souhaiterai (C)

Bonjour,
par ailleurs scanf() remet dans le flux d'entrée le premier caractère qu'il n'arrive pas à interpréter.
Du coup, il est facile de faire entrer ce programme dans une boucle infinie :

$ ./a.out 
************************************************

*********|BIENVENUE CHEZ OIM|*******************

************************************************

Article disponible en stock:

	CHOIX 1:cle usb
	(prix a l'unité: 10 euros)

	CHOIX 2:ordinateur portable(10%% remise immédiate)
	(prix a l'unité: 500 euros)

	10 article acheté,5%% de remise sur tous les articles
	50 article acheté,10%% de remise sur tous les articles

Quel est votre choix?
A <ENTREE>
Mauvais choix,recommencez
Mauvais choix,recommencez
Mauvais choix,recommencez
Mauvais choix,recommencez
Mauvais choix,recommencez
[...]
Mauvais choix,recommencez
^C

La solution ?
Travailler avec le couple fgets/sscanf (par exemple).

Bonne journée à tous,

Donut

Hors ligne

#5 Le 26/09/2019, à 07:43

grigouille

Re : Ca ne se passe comme je le souhaiterai (C)

Sacré scanf, il revient toujours wink.


Debian (xfce) 12
HP LaserJet M1132 MFP

Hors ligne

#6 Le 26/09/2019, à 09:17

DonutMan75

Re : Ca ne se passe comme je le souhaiterai (C)

... mon stylo s'appelle scanf tongue

Hors ligne

#7 Le 26/09/2019, à 16:30

chris7522

Re : Ca ne se passe comme je le souhaiterai (C)

ĴEt moi je m'appelle monsieur bourin smile
Laissez moi le temps de virer ce vilain scanf et de faire le necessaire ...

Dernière modification par chris7522 (Le 26/09/2019, à 16:32)

Hors ligne

#8 Le 27/09/2019, à 15:09

chris7522

Re : Ca ne se passe comme je le souhaiterai (C)

Moi qui pensais faire ca en 2 temps 3 mouvements , je suis incapable d'adapter fgets a ce code . Pouvez vous m'apporter votre aide ?
  Voici le code , un petit peu plus long cette fois-ci :

#include <stdio.h>
#define prixCle 10
#define prixOrdi 500
float calcul(int nArticle,float prix);

int main(void)
{
 char tab[3];
 float remiseIm,remise,prix,result,paiement,billet500;
 int nArticle,choix,billet100,billet50,billet10,pieces2,pieces1,
rendu;
 choix=0;prix=0;remise=0;remiseIm=0;nArticle=0;paiement=0; result=0;rendu=0;billet100=0;billet50=0;billet10=0;pieces2=0;
 pieces1=0;
 puts("***************************************************\n");
puts("********** |BIENVENUE CHEZ OIM| *******************\n");
puts("***************************************************\n");

 puts("Article disponible en stock:\n");

 puts("\tCHOIX 1:cle usb");
 puts("\t(prix a l'unité: 10 euros)\n");

 puts("\tCHOIX 2:ordinateur portable(10%% remise supplementaire)");
 puts("\t(prix a l'unité: 500 euros)\n");

 puts("\t10 article acheté,5%% de remise sur tous les articles");
 puts("\t50 article acheté,10%% de remise sur tous les articles\n");

 printf("Quel est votre choix?\n");
 scanf("%d",&choix);
 while((choix!=1)&&(choix!=2))
   {
    printf("Mauvais choix,recommencez\n");
    scanf("%d",&choix);
   }
 do
   {printf("Combien d'article désirez vous?\n"); 
    scanf("%d",&nArticle); 
   }while(nArticle<1);
 
 switch(choix)
 {
  case 1:
      result=calcul(nArticle,prixCle);
      printf("Vous avez choisis %d cle usb\n",nArticle);
      printf("Votre montant total sera de:%4.0f Euros\n",result);
      break; 
  case 2:
      
      result=calcul(nArticle,prixOrdi);
      printf("Vous avez choisis %d ordinateurs portable\n",nArticle);
      printf("Votre montant total sera de:%5.0f Euros\n",result);
      remise=(result*10)/100;
      result=result-remise;
      printf("Le montant total apres remise supplémentaire:%5.0f Euros\n",result);
      break;
  default:
      break;
 }
 printf("\n\n");
 printf("________________________ PAIEMENT_________________________\n\n");
 printf("Paiement par espece seulement disponible!\n");
 printf("Quel sera le montant de votre paiement?\n");
 scanf("%f",&paiement);

 if(paiement<result)
   { printf("Votre paiement est insuffisant!\n");
     while(paiement<result)
     { printf("Entrez un montant plus élevé\n");
       scanf("%f",&paiement);
     }
   }
 else if(paiement==result)
  printf("Aucune monnaie a vous rendre\n");
 else(paiement>result);
 {
   rendu=paiement-result;
   billet100=rendu/100;
   rendu %= 100;
   billet50=rendu/50;
   rendu %= 50;
   billet10=rendu/10;
   rendu %= 10;
   pieces2=rendu/2;
   rendu %= 2;
   pieces1=rendu/1;
   rendu %= 1;

 printf("\n______________ MONNAIE RENDUE _____________________\n\n");
 printf("Nombre de billet de 100 Euros: %d\n",billet100);
 printf("Nombre de billet de 50 Euros: %d\n",billet50);
 printf("Nombre de bilet de 10 Euros: %d\n",billet10);
 printf("Nombre de pieces de 2 Euros: %d\n",pieces2);
 printf("Nombre de pieces de 1 Euros: %d\n",pieces1);
 }
 printf("\n\n");
 printf("\t--> code promo pour un futur achat  :\"MANGER DES POMMES!\"\n");

 return 0;
}

 float calcul(int nArticle,float prix)
 {float remise=0,result=0;
   if((nArticle>=10) && (nArticle<50))
     {
      remise=(prix*5)/100;
      result=prix-remise;
      result=result*nArticle;
     }
   else if(nArticle>=50)
     {
      remise=(prix*10)/100;
      result=prix-remise;
      result=result*nArticle;
     }
   else
     {
      result=prix*nArticle;
     }
   return result;
 }
   

Hors ligne

#9 Le 27/09/2019, à 16:28

pingouinux

Re : Ca ne se passe comme je le souhaiterai (C)

C'est du bricolage, et il y a certainement plus propre.
Lorsqu'une valeur est erronée, je vide la ligne d'entrée avant de lancer le scanf suivant.

#include <stdio.h>
#define prixCle 10
#define prixOrdi 500
float calcul(int nArticle,float prix);

int main(void)
{
 char tab[3];
 float remiseIm,remise,prix,result,paiement,billet500;
 int nArticle,choix,billet100,billet50,billet10,pieces2,pieces1,
rendu;
 choix=0;prix=0;remise=0;remiseIm=0;nArticle=0;paiement=0; result=0;rendu=0;billet100=0;billet50=0;billet10=0;pieces2=0;
 pieces1=0;
 puts("***************************************************\n");
puts("********** |BIENVENUE CHEZ OIM| *******************\n");
puts("***************************************************\n");

 puts("Article disponible en stock:\n");

 puts("\tCHOIX 1:cle usb");
 puts("\t(prix a l'unité: 10 euros)\n");

 puts("\tCHOIX 2:ordinateur portable(10%% remise supplementaire)");
 puts("\t(prix a l'unité: 500 euros)\n");

 puts("\t10 article acheté,5%% de remise sur tous les articles");
 puts("\t50 article acheté,10%% de remise sur tous les articles\n");

 printf("Quel est votre choix?\n");
 scanf("%d",&choix);
 while((choix!=1)&&(choix!=2))
   {
    printf("Mauvais choix,recommencez\n");
    scanf("%*[^\n]%*[\n]");
    scanf("%d",&choix);
   }
 do
   {printf("Combien d'article désirez vous?\n"); 
    scanf("%*[^\n]%*[\n]");
    scanf("%d",&nArticle); 
   }while(nArticle<1);
 
 switch(choix)
 {
  case 1:
      result=calcul(nArticle,prixCle);
      printf("Vous avez choisis %d cle usb\n",nArticle);
      printf("Votre montant total sera de:%4.0f Euros\n",result);
      break; 
  case 2:
      
      result=calcul(nArticle,prixOrdi);
      printf("Vous avez choisis %d ordinateurs portable\n",nArticle);
      printf("Votre montant total sera de:%5.0f Euros\n",result);
      remise=(result*10)/100;
      result=result-remise;
      printf("Le montant total apres remise supplémentaire:%5.0f Euros\n",result);
      break;
  default:
      break;
 }
 printf("\n\n");
 printf("________________________ PAIEMENT_________________________\n\n");
 printf("Paiement par espece seulement disponible!\n");
 printf("Quel sera le montant de votre paiement?\n");
 scanf("%f",&paiement);

 if(paiement<result)
   { printf("Votre paiement est insuffisant!\n");
     while(paiement<result)
     { printf("Entrez un montant plus élevé\n");
       scanf("%*[^\n]%*[\n]");
       scanf("%f",&paiement);
     }
   }
 else if(paiement==result)
  printf("Aucune monnaie a vous rendre\n");
 else(paiement>result);
 {
   rendu=paiement-result;
   billet100=rendu/100;
   rendu %= 100;
   billet50=rendu/50;
   rendu %= 50;
   billet10=rendu/10;
   rendu %= 10;
   pieces2=rendu/2;
   rendu %= 2;
   pieces1=rendu/1;
   rendu %= 1;

 printf("\n______________ MONNAIE RENDUE _____________________\n\n");
 printf("Nombre de billet de 100 Euros: %d\n",billet100);
 printf("Nombre de billet de 50 Euros: %d\n",billet50);
 printf("Nombre de bilet de 10 Euros: %d\n",billet10);
 printf("Nombre de pieces de 2 Euros: %d\n",pieces2);
 printf("Nombre de pieces de 1 Euros: %d\n",pieces1);
 }
 printf("\n\n");
 printf("\t--> code promo pour un futur achat  :\"MANGER DES POMMES!\"\n");

 return 0;
}

 float calcul(int nArticle,float prix)
 {float remise=0,result=0;
   if((nArticle>=10) && (nArticle<50))
     {
      remise=(prix*5)/100;
      result=prix-remise;
      result=result*nArticle;
     }
   else if(nArticle>=50)
     {
      remise=(prix*10)/100;
      result=prix-remise;
      result=result*nArticle;
     }
   else
     {
      result=prix*nArticle;
     }
   return result;
 }

Par rapport à ton fichier en #8, il y a 3 lignes en plus, de ce type :

    scanf("%*[^\n]%*[\n]");

Édité : Simplification

Dernière modification par pingouinux (Le 27/09/2019, à 16:32)

Hors ligne

#10 Le 27/09/2019, à 17:13

chris7522

Re : Ca ne se passe comme je le souhaiterai (C)

Merci de ton aide . Bien compris pour la purge du scanf en cas d'erreurs . Mais je pensais qu'il etait préférable  de se passer de scanf complètement .

Hors ligne

#11 Le 27/09/2019, à 17:45

NicoApi73

Re : Ca ne se passe comme je le souhaiterai (C)

Quel éditeur ou IDE utilises tu?

Hors ligne

#12 Le 27/09/2019, à 18:38

chris7522

Re : Ca ne se passe comme je le souhaiterai (C)

gedit +gcc

Hors ligne

#13 Le 27/09/2019, à 20:08

NicoApi73

Re : Ca ne se passe comme je le souhaiterai (C)

Je ne connais pas gedit, je suis sous xubuntu et j'ai donc mousepad. Il est probablement possible de le configurer pour la programmation, mais je ne sais pas t'orienter.

Il y a un logiciel que j'aime beaucoup car très simple : tu peux essayer geany, ça t'aidera pour l'indentation. Tu pourras au choix soit compiler à la main comme tu le fais, soit compiler en passant par geany (c'est également gcc qui est utilisé).

EDIT
Pour l'installation c'est très simple :

sudo apt install geany

Dernière modification par NicoApi73 (Le 27/09/2019, à 20:08)

Hors ligne

#14 Le 27/09/2019, à 20:59

NicoApi73

Re : Ca ne se passe comme je le souhaiterai (C)

Je ne suis pas sûr que ton code fasse ce que tu souhaites :

 else(paiement>result);

est je pense une erreur de ta part.

Hors ligne

#15 Le 28/09/2019, à 08:28

chris7522

Re : Ca ne se passe comme je le souhaiterai (C)

NicoApi73 a écrit :

Je ne suis pas sûr que ton code fasse ce que tu souhaites :

 else(paiement>result);

est je pense une erreur de ta part.

Avec ce else , je souhaitais que si la somme versé par le client est plus importante que le prix des l'articles , je lui rende la difference avec le moins de monnaie possible . Dabord en billet de 100 puis 50 etc ..
J'ai encore essayé ce matin , ca fonctionne .
Ha ! je viens de comprendre , tu veux parler du point virgule ? Oui je ne comprends rien a ce qui se passe , puisque ca fonctionne malgres tout ! etrange quand meme !

Dernière modification par chris7522 (Le 28/09/2019, à 08:30)

Hors ligne

#16 Le 28/09/2019, à 08:39

chris7522

Re : Ca ne se passe comme je le souhaiterai (C)

NicoApi73 a écrit :

Je ne connais pas gedit, je suis sous xubuntu et j'ai donc mousepad. Il est probablement possible de le configurer pour la programmation, mais je ne sais pas t'orienter.

Il y a un logiciel que j'aime beaucoup car très simple : tu peux essayer geany, ça t'aidera pour l'indentation. Tu pourras au choix soit compiler à la main comme tu le fais, soit compiler en passant par geany (c'est également gcc qui est utilisé).

EDIT
Pour l'installation c'est très simple :

sudo apt install geany

Merci beaucoup ! Je vais essayer ce matin , avec gcc seul , difficile de faire du travail propre et bien indenté , ca fait vraiment dégeulasse . J'utilise lubuntu , ca devrai fonctionner .

Hors ligne

#17 Le 28/09/2019, à 09:00

pingouinux

Re : Ca ne se passe comme je le souhaiterai (C)

chris7522 #15 a écrit :

Ha ! je viens de comprendre , tu veux parler du point virgule ? Oui je ne comprends rien a ce qui se passe , puisque ca fonctionne malgres tout ! etrange quand meme !

À cause du ;, tu calcules le rendu de monnaie même si tu as donné le compte juste.

Quel est votre choix?
1
Combien d'article désirez vous?
1
Vous avez choisis 1 cle usb
Votre montant total sera de:  10 Euros


________________________ PAIEMENT_________________________

Paiement par espece seulement disponible!
Quel sera le montant de votre paiement?
10
Aucune monnaie a vous rendre

______________ MONNAIE RENDUE _____________________

Nombre de billet de 100 Euros: 0
Nombre de billet de 50 Euros: 0
Nombre de bilet de 10 Euros: 0
Nombre de pieces de 2 Euros: 0
Nombre de pieces de 1 Euros: 0

Hors ligne

#18 Le 28/09/2019, à 09:36

chris7522

Re : Ca ne se passe comme je le souhaiterai (C)

Bien compris ce qu'il se passait ! Merci de ton aide

Hors ligne

#19 Le 28/09/2019, à 11:22

NicoApi73

Re : Ca ne se passe comme je le souhaiterai (C)

chris7522 a écrit :

J'utilise lubuntu , ca devrai fonctionner .

geany fonctionne sur tout, des ordinausores aux machines de courses, en passant par Raspberry pi smile

Hors ligne

#20 Le 28/09/2019, à 12:05

NicoApi73

Re : Ca ne se passe comme je le souhaiterai (C)

Concernant ton else tu as ajouté une comparaison qui ne sert à rien et le ; termine la séquence. Donc comme l'a fait remarqué pingouinux la séquence suivante est toujours exécutée.

Pourquoi as tu mis une comparaison (paiement>result) dans ton else? Ca ne sert à rien, le résultat n'est pas utilisé...

Hors ligne

#21 Le 28/09/2019, à 14:24

grigouille

Re : Ca ne se passe comme je le souhaiterai (C)

NicoApi73 a écrit :

geany fonctionne sur tout, des ordinausores aux machines de courses, en passant par Raspberry pi smile

Il faut une interface graphique quand même.


Debian (xfce) 12
HP LaserJet M1132 MFP

Hors ligne

#22 Le 28/09/2019, à 17:51

NicoApi73

Re : Ca ne se passe comme je le souhaiterai (C)

grigouille a écrit :

Il faut une interface graphique quand même.

Bonjour grigouille smile

De quelle interface graphique parles tu?

Si c'est de l'IDE, geany est un IDE avec une interface graphique (parfois considéré comme un éditeur de texte plus q'un IDE). Ca reste très simple. L'inconvénient est qu'il n'y a pas de debuggueur intégré. Sur raspberry pi, j'ai l'environnement graphique de la raspbian basée sur Stretch, à savoir LXDE. Sur l'ordinausore, c'est AntiX17, avec JWM. Geany fonctionne très bien sur les 2 (je crois même qu'il est mis par défaut)

Si c'est d'une bibliothèque graphique, tu peux très bien linker la SDL avec Geany. Celle-ci est dispo pour les PC. Pour les bibliothèques Qt, je n'utilise que l'IDE Qt, mais je ne proposerai pas celui-ci à un débutant ni sur rapsberry (et encore moins sur un ordinausore)

Hors ligne

#23 Le 28/09/2019, à 18:37

grigouille

Re : Ca ne se passe comme je le souhaiterai (C)

Je pensais à Ubuntu serveur.


Debian (xfce) 12
HP LaserJet M1132 MFP

Hors ligne

#24 Le 28/09/2019, à 19:25

NicoApi73

Re : Ca ne se passe comme je le souhaiterai (C)

ok, j'ai compris ta remarque (désolé, il me faut un peu de temps parfois smile )

Un simple gestionnaire de fenêtres est suffisant (comme JWM), mais effectivement une interface graphique est nécessaire.

Dernière modification par NicoApi73 (Le 28/09/2019, à 19:26)

Hors ligne

#25 Le 28/09/2019, à 22:18

chris7522

Re : Ca ne se passe comme je le souhaiterai (C)

NicoApi73 a écrit :

Concernant ton else tu as ajouté une comparaison qui ne sert à rien et le ; termine la séquence. Donc comme l'a fait remarqué pingouinux la séquence suivante est toujours exécutée.

Pourquoi as tu mis une comparaison (paiement>result) dans ton else? Ca ne sert à rien, le résultat n'est pas utilisé...

Tu as raison la comparaison est completement inutile !
En la retirant et en retirant egalement le ;  , ca ne calcule plus le rendu meme si je donne le compte juste.

Hors ligne