Calculatrice

Fermé
jeandchanel Messages postés 135 Date d'inscription vendredi 10 juin 2016 Statut Membre Dernière intervention 31 mai 2017 - Modifié par baladur13 le 16/06/2016 à 08:59
Rhydan1 Messages postés 382 Date d'inscription jeudi 3 juillet 2014 Statut Membre Dernière intervention 2 avril 2017 - 26 juin 2016 à 00:19
Bonjour,
Je vous remercie pour vos conseilles et votre aide dans la réalisation de ce programme.
Voici le code complet de ma calculette, j’attends vos idées pour l’améliorer :
#include <stdio.h>
#include <stdlib.h>

#define TAILLEMAX 1000

typedef enum Bool Bool;
enum Bool
{
    TRUE, FALSE
};

int demanderMenu()
{
    int userChoice;
    printf("\n");
    printf("Quelle operation voulez-vous effectuer ?\n");
    printf("1. Addition\n2. Multiplication\n3. Division\n4. Modulo\n");
    do
    {
        printf("Votre choix ? ");
        scanf("%d", &userChoice);
    }while(userChoice < 1 || userChoice > 4);
    
    return userChoice;
}

double addition(double tableau[], int tailleTab)
{
    int i; 
    double somme = 0;
    
    for(i = 0; i < tailleTab; i++)
    somme += tableau[i];
    
   return somme; 
}

double multiplication(double tableau[], int tailleTab)
{
    int i = 0;
    double produit = 1;
    
    for(i = 0; i < tailleTab; i++)
    produit *= tableau[i];
    
    return produit; 
    
}

int demanderNombresAddition()
{
   int i, tailleTab = 0;
    double tableau[TAILLEMAX] = {};
    
    printf("\n");
    printf("Vous avez choisi l'Addition !\n");
    printf("Entrez le nombre de termes ");
    scanf("%d", &tailleTab);
    
    for(i = 0; i < tailleTab; i++)
    {
        printf("Entrez le nombre N* %d ? ", i);
        scanf("%lf", &tableau[i]);
    }
    
    addition(tableau, tailleTab);
    printf("\n");
    printf("La somme de ces %d nombres est de %.2lf\n", i, addition(tableau, tailleTab));
    
    return tailleTab;
}

int demanderNombresMultiplication()
{
    int i = 0, tailleTab = 0;
    double tableau[TAILLEMAX] = {};
    
    printf("\n");
    printf("Vous avez choisi la Multiplication !\n");
    printf("Entrez le nombre de termes ");
    scanf("%d", &tailleTab);
    
    for(i = 0; i < tailleTab; i++)
    {
        printf("Entrez le nombre N* %d ? ", i);
        scanf("%lf", &tableau[i]);
    }
    
    multiplication(tableau, tailleTab);
    printf("\n");
    printf("Le produit de ces %d nombres est de %.2lf\n", i, multiplication(tableau, tailleTab));
    
    return tailleTab;
}

double division(double tableau[], int tailleTab)
{
    int i = 0;
    double diviseur = tableau[0];
    
     for(i = 1; i < tailleTab; i++)
    {
       diviseur /=tableau[i];
    }
    
    return diviseur;
}

void demanderNombresDivision()
{
    int i, tailleTab;
    double tableau[TAILLEMAX] = {};
    
    
    printf("\n");
    printf("Vous avez choisi la Division !\n");
    
    printf("Entrez le nombre de termes ");
    scanf("%d", &tailleTab);
    
    for(i = 0; i < tailleTab; i++)
    {
        printf("Entrez le nombre N* %d ? ", i);
        scanf("%lf", &tableau[i]);
    }
    
    division(tableau, tailleTab);
    printf("\n");
    printf("Le resultat de la division est de %.2lf\n", division(tableau, tailleTab));
    
}


int modulo(int nombre1, int nombre2)
{
    return nombre1 % nombre2;
}

void demanderNombresModulo()
{
    
    int nombre1 = 0, nombre2 = 0;
    
    printf("\n");
    printf("Vous avez choisi le Modulo !\n");
    printf("Entrez le Dividende ");
    scanf("%d", &nombre1);
    
    printf("Entrez le Diviseur ");
    scanf("%d", &nombre2);
    
    
    modulo(nombre1, nombre2);
    printf("\n");
    printf("Le reste de la division de %d par %d est %d\n", nombre1, nombre2, modulo(nombre1, nombre2));
    
    
}

Bool effectuerOperation()
{
    int choice;
    printf("\n\n\n");
    printf("Voulez-vous effectuer une autre operation ?\n ");
    printf("1. Oui\n2. Non\n");
    do
    { 
        printf("Votre choix ? ");
        scanf("%d", &choice);
    }while(choice < 1 || choice > 2);
    
    return choice == 1;
}


int main()
{
    printf("\n");
    printf("Ce programme vous aide a effectuer les operations de base,\n");
    printf("comme l' addition, la multiplication, la division et le modulo !\n");
    printf("J'espere qu'il vous plaira, sinon faites les propositions d'ameliorations !\n");
    printf("Votre humble serviteur, Jean Dechanel.\n");
    printf("\n");
 do
 {
    
   int userChoice = demanderMenu();
    
   switch(userChoice)
   {
    case 1:
    demanderNombresAddition();
    break;
    
    case 2:
    demanderNombresMultiplication();
    break;
    
    case 3:
    demanderNombresDivision();
    break;
 
    case 4:
    demanderNombresModulo();
    break;
    
    default :
    printf("Erreur, choix non disponible !!! ");
    break;
   }
   
 }while(effectuerOperation());
    
    printf("\n\n");
    printf("Merci d'avoir essayer ce programme, a bientot ! ");    
    return 0;
} 


EDIT : Ajout des balises de code (la coloration syntaxique).
Explications disponibles ici : ICI

Merci d'y penser dans tes prochains messages.




A voir également:

2 réponses

paly2 Messages postés 254 Date d'inscription vendredi 29 août 2014 Statut Membre Dernière intervention 15 février 2018 25
Modifié par paly2 le 16/06/2016 à 13:09
Pourquoi crées-tu une énumération Bool ? Le type est déjà défini dans stdbool.h (il s'agit généralement d'un unsigned char), avec deux macro "true" et "false". Très souvent (bien que ce ne soit pas standard), il est même nativement supporté par le compilateur.

Moi ainsi que tous les programmeurs du C te déconseillons très fortement d'utiliser la fonction scanf(), qui peut causer des buffer overflow. Utilise fgets() sur
stdin
à la place.

Pense aussi à mettre des \n à la fin de test deux dernier printf() (lignes 212 et 219), c'est bien plus agréable !

Ça serait bien aussi de pouvoir choisir entre division euclidienne et division décimale, et d'ajouter les puissances !

Une amélioration au niveau propreté du code: toutes ces fonctions sont un peu redondantes, tu pourrais faire des macros par exemple pour limiter le code quasi-identique à recopier.

Et pour finir, quelque chose qui changerait radicalement le fonctionnement du programme mais le rendrait bien plus pratique: on entre une chaîne de caractères contenant deux nombres et un signe opératoire, et le programme donne le résultat. Et ensuite, permettre de donner une expression entière (avec tous les opérateurs, les parenthèses...), et à partir de là, tu peux faire beaucoup d'améliorations pour le transformer en véritable calculatrice (fonctions trigonométriques, calcul en degrés/minutes/secondes, support des séries statistiques, simplification de fractions, décomposition de nombres premiers, résultat en écriture scientifique, manipulation de nombres imaginaires, développement/factorisation, bref, tout ce que me propose de faire ma calculatrice collège) !

Bonne chance !

La curiosité est une excellente qualité !
0
Rhydan1 Messages postés 382 Date d'inscription jeudi 3 juillet 2014 Statut Membre Dernière intervention 2 avril 2017 70
26 juin 2016 à 00:19
Plop !

Un exercice qui peut être sympa : "Calcul libre".
Ce dernier laisse l'utilisateur taper en entier son calcul genre 3*6 + 5 / (60-5)

Ensuite à toi de traiter les opérateurs de calcul, les priorités d'opération etc.. ;)
0