IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Mini calculatrice d'entier


Sujet :

C

  1. #1
    Membre averti Avatar de bosk1000
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    706
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 706
    Points : 367
    Points
    367
    Par défaut Mini calculatrice d'entier
    Bonjour,

    je viens de faire en exercice un programme de calculatrice

    le code bug après avoir choisi le mode de calcul en quittant le programme
    elle fonctionnait lorsque je passais par un autre système, en créant un "int" pour chaque forme de calcul,
    mais en voulant optimiser par un switch, la je bug
    merci pour votre aide

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
     
    #include <stdio.h>
     
    void calc(voi);
    void menu(void);
    int calcul(int nb1,int nb2,int typecalcul);
     
    /*-----------------------------------------------*/
    int main(void)
    {
        calc();
        return 0;
    }
    /*-----------------------------------------------*/
    void calc(void)
    {
        int menuchoice=0;
        int number1=0, number2=0, result=0;
     
        printf("\n---------------------------\n");
        printf("\tMINI CALCULATRICE");
        printf("\n---------------------------\n");
     
     
        do
        {
        //affichage menu
        menu();
     
        printf("\n\n Votre choix :");
        scanf("%d",&menuchoice);
     
     
     
        if (menuchoice==6)
            printf(" A bientot\n\n");
            return 0 ;
     
     
        printf("entrer un premier nombre\n");
        scanf("%d",&number1);
     
     
        printf("entrer un second nombre\n");
        scanf("%d",&number2);
     
        switch (menuchoice)
        {
            case 1:
                result=calcul(number1, number2,menuchoice);
                break;
            case 2:
               result=calcul(number1, number2,menuchoice);
                break;
            case 3:
                result=calcul(number1, number2,menuchoice);
                break;
            case 4:
                result=calcul(number1, number2,menuchoice);
                break;
            case 5:
                result=calcul(number1, number2,menuchoice);
                break;
     
        default:
            printf("Erreur, vous devez taper un chiffre entre 1 et 6");
            break;
        }
        printf ("le resultat du calcul est %d\n",result);
     }
        while(menuchoice!=6);
     
    }
    /*-----------------------------------------------*/
     
     
    void menu(void)
    {
        printf("Menu principal :\n\n");
        printf("1. Calculer une somme\n");
        printf("2. Calculer une difference\n");
        printf("3. Calculer un produit\n");
        printf("4. Calculer un quotient\n");
        printf("5. Calculer un modulo\n");
        printf("6. Quitter\n");
    }
    /*-----------------------------------------------*/
     
     
    int calcul(int nb1,int nb2,int typecalcul)
    {
        if(typecalcul==1)//somme
            return nb1+nb2;
        else if(typecalcul==2)//diff
            return nb1-nb2;
        else if(typecalcul==3)//produit
            return nb1*nb2;
        else if(typecalcul==4)//quotien
            return nb1/nb2;
        else if(typecalcul==5)//reste
            return nb1%nb2;
        else
            return -1;
    }

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 630
    Points : 10 556
    Points
    10 556
    Par défaut
    , python style

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        if (menuchoice==6)
            printf(" A bientot\n\n");
            return 0 ;
    En théorie ton compilateur doit te dire qu'il y a du code inatteignable

  3. #3
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    En effet.

    Avec un switch, tu pourrais ecrire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    enum calcul_type {calc_addition=1, calc_soustraction=1, calc_produit=3, calc_quotient=4, calc_reste=5};
     
    int calculer(int a, int b, enum calcul_type calcul) {
        switch (calcul) {
            case calc_addition:      return a + b;
            case calc_soustraction: return a - b;
            case calc_produit:      return a * b;
            case calc_quotient:     return a / b;
            case calc_reste:        return a % b;
            default: return 0;
        }
    }
    Cela dit, pour une fois, je pense qu'il serait encore plus prudent de ne pas faire une fonction, et d'inclure ce switch directement dans le main.
    ca éviterait d'avoir à gérer le non respect du type de calcul.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  4. #4
    Membre averti Avatar de bosk1000
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    706
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 706
    Points : 367
    Points
    367
    Par défaut
    Citation Envoyé par foetus Voir le message
    , python style

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        if (menuchoice==6)
            printf(" A bientot\n\n");
            return 0 ;
    En théorie ton compilateur doit te dire qu'il y a du code inatteignable
    mon compilateur (qtcraetor) ne me dit rien, il lance le programme
    si je fait un autre choix que le 6 il me ramene a :
    "appuyer sur entrer pour fermer"

    ceci dit ton encadré ma allumé une lumière

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     if (menuchoice==6)
        {
            printf(" A bientot\n\n");
            return 0 ;
    }
    ça fonctionne mieux ainsi

    en fait la question que je me pose c'est pourquoi ça avait fonctionné avant....
    enfin solution trouvé
    Merci

  5. #5
    Membre averti Avatar de bosk1000
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    706
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 706
    Points : 367
    Points
    367
    Par défaut
    Citation Envoyé par leternel Voir le message
    En effet.

    Avec un switch, tu pourrais ecrire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    enum calcul_type {calc_addition=1, calc_soustraction=1, calc_produit=3, calc_quotient=4, calc_reste=5};
     
    int calculer(int a, int b, enum calcul_type calcul) {
        switch (calcul) {
            case calc_addition:      return a + b;
            case calc_soustraction: return a - b;
            case calc_produit:      return a * b;
            case calc_quotient:     return a / b;
            case calc_reste:        return a % b;
            default: return 0;
        }
    }
    Cela dit, pour une fois, je pense qu'il serait encore plus prudent de ne pas faire une fonction, et d'inclure ce switch directement dans le main.
    ca éviterait d'avoir à gérer le non respect du type de calcul.
    Merci
    je vais regarder cela
    cette exemple me permet de voir une autre manière de coder et de prendre de la reflexion

  6. #6
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Personnellement, le compilateur me dirait plutot ceci:
    gcc -Wall -Wextra truc.c
    
    truc.c: In function ‘calc’:
    truc.c:37: attention : ‘return’ with a value, in function returning void
    
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  7. #7
    Membre averti Avatar de bosk1000
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    706
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 706
    Points : 367
    Points
    367
    Par défaut
    par contre en terme de gestion d'erreur je cherche quel bon message mettre si je tape 0 ou un chiffre supérieur à 7 dans le choix du menu

    j'ai mis ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
        if (menuchoice==0 ||menuchoice>6 )
        {
            printf(" Erreur, vous devez taper un chiffre entre 1 et 6\n\n");
             menu();
        }
    et j’obtiens un truc pas terrible car bien qu'il redémarre le menu, il m'indique directement d'entrer un premier nombre et non pas "votre choix"

    j'ai bien vue que mon idée de revenir sur menu() est fausse, du coup je ne vois pas comment rebouclé sur choisir le menu

  8. #8
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par bosk1000 Voir le message
    j'ai bien vue que mon idée de revenir sur menu() est fausse, du coup je ne vois pas comment rebouclé sur choisir le menu
    Bonjour
    Il te suffit de faire la gestion de la saisie et de ses erreurs éventuelles dans le menu lui-même. Ainsi quand la fonction se termine, tu es certain que ce qu'elle te renvoie (ben oui, tant qu'à faire autant lui faire renvoyer le choix de l'utilisateur) est une valeur correcte et que tu n'as plus à te préoccuper que de la gérer...

    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    unsigned short menu(void)
    {
        unsigned short n;
        char rep[100];
     
        while (1)
        {
            fputs("Menu principal :\n\n" stdout);
            fputs("1. Calculer une somme\n" stdout);
            fputs("2. Calculer une différence\n" stdout);
            fputs("3. Calculer un produit\n" stdout);
            fputs("4. Calculer un quotient\n" stdout);
            fputs("5. Calculer un modulo\n" stdout);
            fputs("0. Quitter\n", stdout);
            fputs("Votre choix :", stdout);
            fgets(rep, 100, stdin);
            if (sscanf(rep, "%hu", &n) == 1 && rep >= 0 && rep <= 5) break; 
            fputs("Choix incorrect - Recommencez !!!\n", stdout);
        }
        return rep;
    }
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  9. #9
    Membre averti Avatar de bosk1000
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    706
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 706
    Points : 367
    Points
    367
    Par défaut
    Merci
    Je dois du coup changer un peu mon schema de départ car je cherchais juste à améliorer un résultat d'un corrig" d'exo

    je vais me pencher sur ce que tu viens de me mettre

  10. #10
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Quand tu découpes ton travail en fonctions, il vaut mieux essayer d'avoir des fonctions qui font un travail complet. C'était dommage, dans ton code, d'afficher le menu d'un coté puis gérer ses erreurs d'un autre...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  11. #11
    Membre averti Avatar de bosk1000
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    706
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 706
    Points : 367
    Points
    367
    Par défaut
    Je suis parti d'un exercice trouvé sur le net
    j'avais vue une vidéo expliquant les pointeurs suite à nos précédents échange

    qui donne une bonne introduction aux pointeurs

    par la suite j'ai donc suivi l'exercice sur la mini calculatrice et je regardais pour quelques modification pour m’améliorer...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Mini-calculatrice - division avec des nombres décimaux
    Par maelyncharlene dans le forum Débuter
    Réponses: 2
    Dernier message: 26/09/2014, 11h05
  2. [TPW] Calculatrice effectuant des opérations sur les entiers longs
    Par forum dans le forum Codes sources à télécharger
    Réponses: 0
    Dernier message: 04/12/2011, 11h36
  3. Mini calculatrice en VB.net
    Par Denis61400 dans le forum VB.NET
    Réponses: 6
    Dernier message: 27/07/2011, 11h23
  4. Création d'une calculatrice a nombre "entier"
    Par en-one dans le forum Débuter
    Réponses: 3
    Dernier message: 16/11/2008, 16h19
  5. Réponses: 4
    Dernier message: 05/06/2002, 12h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo