Problèmes dans un programme de TVA

Résolu/Fermé
SIMO97 Messages postés 65 Date d'inscription mardi 19 février 2013 Statut Membre Dernière intervention 30 novembre 2013 - Modifié par SIMO97 le 19/03/2013 à 23:00
SIMO97 Messages postés 65 Date d'inscription mardi 19 février 2013 Statut Membre Dernière intervention 30 novembre 2013 - 21 mars 2013 à 14:03
Bonsoir;
je suis débutant en C et j'ai besoin de votre aide,aidez"moi s'il vous plaît à corriger ce programme;Merci d'avance:


/*Categorie_TVA*/
#include<stdio.h>
#include<conio.h>
main(){
float PHT,PTTC;
//PHT=Prix hors taxes PTTC=Prix touts taxes comprises
char cate;
printf("Ce programme vous donne le prix TTC d'un produit en lui fournissant son prix HT et sa catégorie\nEntrez le prix HT de votre produit\n");
scanf("%f",&PHT);
printf("Entrez la catrgorie de ce produit\nA-TVA=7pour cent\nB-TVA=14pour cent\nC-TVA=20pour cent\n");
scanf("%c",&cate);
switch(cate){
case'A':{
PTTC=PHT+PHT*7/100;
break;
}
case'B':{
PTTC=PHT+PHT*14/100;
break;
}
case'C':{
PTTC=PHT+PHT*20/100;
break;
}
default :{
printf("La categorie doit etre A,B,ouC\n");
}
}
printf("Le prix TTC de votre produit est: %f",PTTC);
getch();
}

3 réponses

mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
19 mars 2013 à 23:17
Plusieurs choses ne vont pas.

Sur le fond :

1) <conio.h> n'est pas un header standard (et en plus il ne sert à rien dans ce programme) donc inutile de l'inclure. En effet ton programme qui n'utilise aucune spécificité de windows ne pourrait pas compiler par exemple sous Mac ou sous Linux à cause de cette inclusion.

2) Les buffers de saisie sont mal vidés. Le problème est expliqué ici (mais les solutions sont fausses ou sales ou ne marchent pas systématiquement) :
http://www.linuxforums.org/forum/programming-scripting/67560-problem-scanf.html#post355499

Une résolution standard et correcte est donnée ici
https://c.developpez.com/faq/?page=Gestion-du-clavier-et-de-l-ecran-en-mode-console#CONS_vider_buffer_clavier

3) La fonction main est sensée retourner 0 quand tout va bien, un code d'exécution non nul sinon qui peut être rattrapé par le programme qui invoque ton programme. De plus toute fonction doit avoir un type de retour (quitte à mettre void si la fonction ne retourne rien, voir exemple ci-dessous avec clean_stdin)

4) Algorithmiquement parlant, j'imagine que le programme devrait redemander une valeur de categorie si la saisie est incorrecte, ou abandonner et quitter.

5) Le calcul du prix TTC étant le même quelque soit le code, cette partie devrait être commune quelque soit le code (code dit factorisé), quitte à ajouter une variable intermédiaire (appelons-là par exemple taux)

Sur la forme :

1) Les blocs d'un switch case n'ont pas besoin d'être enveloppé d'une paire d'accolade.

switch (condition) {
  case 1:
    instruction1a;
    instruction1b;
    break;
  case 2:
    instruction2a;
    instruction2b;
    break;
  default:
    instructionda;
    instructiondb;
}


2) L'indentation et le nom des variables laisse à désirer. Et aère ton code !! :-)

3) Normalement les majuscules sont réservées aux constantes (#define par exemple), les macros, et dans certaines bibliothèque (par exemple l'API windows) des types, mais c'est rare.

4) La fin (getch()) est un patch pour windowsien qui lance le programme depuis l'explorateur windows (au lieu de le lancer par exemple depuis les commandes ms-dos) afin de laisser la fenêtre ms-dos ouverte une fois le programme terminé, mais dans la vraie vie, ça n'a rien à faire dans ton programme.

#define PI 3.14159
#define MIN(a, b) a < b ? a : b


Voici à quoi ton code pourrait ressembler :

#include <stdio.h>

// https://c.developpez.com/faq/?page=Gestion-du-clavier-et-de-l-ecran-en-mode-console
// Note: fflush(stdin) a un comportement indéterminé
void clean_stdin(void) {
    int c;
    do {
        c = getchar();
    } while (c != '\n' && c != EOF);
}

int main() {
    float prix_ht, prix_ttc;
    int taux, ok = 0;
    char categorie;

    printf(
        "Ce programme vous donne le prix TTC d'un produit en lui fournissant son prix HT et sa catégorie\n"
        "Entrez le prix HT de votre produit\n"
    );
    scanf("%f", &prix_ht);

    printf(
        "Entrez la categorie de ce produit\n"
        "A) TVA = 7  \%\n"
        "B) TVA = 14 \%\n"
        "C) TVA = 20 \%\n"
    );

    do {
        clean_stdin();
        scanf("%c", &categorie);

        ok = 1;
        switch (categorie) {
            case 'A': taux = 7;  break;
            case 'B': taux = 14; break;
            case 'C': taux = 20; break;
            default :
                ok = 0;
                printf("La categorie doit être A, B ou C\n");
        }
    } while (!ok);

    prix_ttc = prix_ht + (prix_ht * taux) / 100;
    printf("Le prix TTC de votre produit est: %f\n", prix_ttc);

    // Pour les windowsiens :-)
    clean_stdin();
    printf("Appuyez sur une touche pour quitter");
    getchar();
    return 0;
}


Bonne chance
1
SIMO97 Messages postés 65 Date d'inscription mardi 19 février 2013 Statut Membre Dernière intervention 30 novembre 2013 5
20 mars 2013 à 00:11
Mrc mon ami, même si je n'ai pas tt compris est-ce-que je peut avoir un code plus facile(près du mien)sans boucles sans do{...} qui soit tt simple
Mrc une 2eme fois
0
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
20 mars 2013 à 07:26
Euh non le code est simple, et le but c'est que tu apprennes. Donc éventuellement je t'explique ce que tu n'as pas compris dans le code ci-dessus, mais je ne ferai pas ton exercice à ta place.
0
SIMO97 Messages postés 65 Date d'inscription mardi 19 février 2013 Statut Membre Dernière intervention 30 novembre 2013 5
20 mars 2013 à 13:40
c pas que je veux que tu me fasse l'exercice mais je veux juste savoir
En tt cas Mrc infiniment
0
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
20 mars 2013 à 19:30
Tu vois :-)

Au passage, n'hésite pas à encadrer ton code avec les balises de code. Pour ça il suffit de sélectionner le code avec la souris et de cliquer sur le bouton <>, situé au dessus de la boîte dans laquelle tu saisis ton message.

Bonne continuation ;-)
1
SIMO97 Messages postés 65 Date d'inscription mardi 19 février 2013 Statut Membre Dernière intervention 30 novembre 2013 5
21 mars 2013 à 14:03
Mrc ami;)
0
SIMO97 Messages postés 65 Date d'inscription mardi 19 février 2013 Statut Membre Dernière intervention 30 novembre 2013 5
20 mars 2013 à 13:57
Le voilà;


/*CAT_TVA*/
#include<stdio.h>
#include<conio.h>
main(){
float pht,pttc;
//PHT=Prix hors taxes PTTC=Prix touts taxes comprises
char cat;
printf("Ce programme vous donne le prix TTC d'un produit en lui fournissant son prix HT et sa categorie\nveuillez choisir votre categorie\n");
printf("\nA-TVA=7%");
printf("\nB-TVA=14%");
printf("\nC-TVA=20%\n");
scanf("%c",&cat);
printf("\nveuillez entrer le prix hors taxes:");
scanf("%f",&pht);
switch(cat){
case'A':
pttc=pht+pht*7/100;
printf("\nle prix TTC est de: %.2f",pttc);
break;
case'B':
pttc=pht+pht*14/100;
printf("\nle prix TTC est de: %.2f",pttc);
break;
case'C':
pttc=pht+pht*20/100;
printf("\nle prix TTC est de: %.2f",pttc);
break;
default :
printf("\nLa categorie doit etre A,B,ouC\n");
}
getch();
return 0;
}
0