Calculatrice basique + - * / inverse.c++.fonctionne aussi par ligne de commandes+flotsd'entrees sorties

Soyez le premier à donner votre avis sur cette source.

Vue 6 141 fois - Téléchargée 256 fois

Description

Une calculatrice en C++ basique mais hyper efficace.Opérations réalisables: + - * / inverse d'un nombre,uniquement avec des nombres entiers sauf pour la division et l'inverse qui utilisent le float et double.Fonctionne aussi par ligne de commandes quelque soit le système d'exploitation.Conserve les résultats dans un fichier texte grâce au flots d'E/S.Utilise la classe string fournie avec...
Petits menus simples,aide disponible...bref tout ce qu'il faut pour un ptit projet de C++... ;-)

MàJ:
Les flots pour écrire les résultats dans le fichier ont été changés de place,merci à djl.
J'ai aussi enlevé mes ';' inutiles

Source / Exemple :


#include<iostream>
#include"string"
#include<cstdlib>           // nécessaire pour le atoi() //
#include<fstream>           // utilisé pour les flots d'entrés/sorties //
using namespace std;

// réalisée par Sebastien et Baptiste TP 131 --- IUT d'Orsay --- Projet n°3 de C++ //

  // Déclaration des prototypes //
double conversion(string);
void calcul(string,double,double,double &,float &);
void arguments();
void arguments(string);
void arguments(string,string,string);

ofstream f("resultats.txt",ios::app);

  // Programme principal //
int main(int argc,char *argv[])
{
    cout<<"======================"<<endl;
    cout<<"|----Calculatrice----|"<<endl;
    cout<<"======================"<<endl<<endl;
    switch(argc)
           {
           case 1 : arguments();break;
           case 2 : arguments(argv[1]);break;
           case 4 : arguments(argv[1],argv[2],argv[3]);break;
           default : cerr<<argv[0]<<" : Mauvais nombre d'arguments,consultez l'aide.(entrez calcul -?)"<<endl;
           f.close();
           }
};

     // Convertion d'un string vers un entier //
double conversion(string chaine)
{
   double nb=atoi(chaine.c_str());
   return(nb);
};

     // FONCTION "calcul" //
void calcul(string operation,double nb1,double nb2,double &resultat,float &resultatDiv)
{
     if (operation=="+") resultat=nb1+nb2;
     if (operation=="-") resultat=nb1-nb2;
     if ((operation=="x") || (operation=="*")) resultat=nb1*nb2;
     if (operation=="/") resultatDiv=nb1/nb2;
};

     // FONCTION "sans opérandes" //
void arguments()
{    int rep;
     string nb1,nb2,operation;
     do
        {
        do
          {
          cout<<">> Quelle operation voulez-vous realiser?"<<endl;
          cout<<"          Addition       [+]"<<endl;
          cout<<"          Soustraction   [-]"<<endl;
          cout<<"          Multiplication [*] (ou [x])"<<endl;
          cout<<"          Division       [/]"<<endl;
          cout<<"          Inverse        [n]"<<endl;
          cout<<"          Aide           /? (ou [-?] ou [--help])"<<endl;
          cout<<"          Quitter        [q] (ou [Q])"<<endl;
          cout<<">> ";
          cin>>operation;
          cout<<"________________________________________________"<<endl<<endl;
          }
     while (operation!="q" && operation!="Q" && operation!="x" && operation!="*" && operation!="-" && operation!="+" && operation!="/" && operation!="n" && operation!="--help" && operation!="-?" && operation!="/?");

if (operation=="Q" || operation=="q") exit(1);

if (operation=="--help" || operation=="-?" || operation=="/?") arguments("/?");
        else
            {
            if (operation !="n")
               {
               cout<<"Entrez operande 1 : ";
               cin>>nb1;
               cout<<"Entrez operande 2 : ";
               cin>>nb2;

               cout<<"______________________________________"<<endl<<endl;
               arguments(operation,nb1,nb2);
               cout<<"______________________________________"<<endl<<endl;
               }
            else
               {
               cout<<"Entrez votre nombre:"<<endl;
               cin>>nb1;
               arguments(nb1);
               }
            }
cout<<endl<<"Voulez vous effectuer un nouveau calcul [1] oui [2] non ? : ";
cin>>rep;
cout<<"__________________________________________________________"<<endl<<endl;
        }
     while(rep!=2);

f<<endl;
f<<"_______________________________________________________________"<<endl;
f<<endl;
};

     // FONCTION "inverse ou aide" //
void arguments(string chaine)
{
     float inverse;

     // FONCTION "aide" //
  if ((chaine=="--help") || (chaine=="-?") || (chaine=="/?"))
     {
     cout<<"Usage du programme Calcul :"<<endl;
     cout<<"Aide : calcul --help  ou  calcul -?  ou  calcul /?"<<endl<<endl;
     cout<<"Calculs (en entier sauf pour la division et l'inverse)"<<endl;
     cout<<"        calcul + n1 n2"<<endl;
     cout<<"        calcul - n1 n2"<<endl;
     cout<<"        calcul x (ou *) n1 n2"<<endl;
     cout<<"        calcul / n1 n2"<<endl;
     cout<<"        calcul n   (inverse de n)"<<endl<<endl;
     }
     // FONCTION "inverse" //
  else {
     double nb=conversion(chaine);
     if(nb==0) cout<<"Inverse de "<<chaine<<" impossible"<<endl;
     else
         {
         inverse=1/(nb);
         cout<<"______________________________________"<<endl<<endl;
         cout<<">> Le résultat de 1/"<<nb<<" = "<<inverse<<endl;
         cout<<"______________________________________"<<endl<<endl;
         f<<">> Le résultat de 1/"<<nb<<" = "<<inverse<<endl;
         }
     }
};

     // FONCTION "opérations classiques" //
void arguments(string operation,string operande1,string operande2)
{
     float  resultatDiv;
     double resultat;
     double nb1=conversion(operande1);
     double nb2=conversion(operande2);

     if(operation!="+" && operation!="-" && operation!="x" && operation!="*" && operation!="/")
                  {
                  cout<<"operation inconnue!"<<endl;
                  exit(1);
                  }
     if(operation=="/" && nb2==0) cout<<">> Division par zero impossible!"<<endl;
     else
        {
        calcul(operation,nb1,nb2,resultat,resultatDiv);
        if(operation=="/") {
          cout<<">> Le resultat de "<<nb1<<" / "<<nb2<<" est "<<resultatDiv<<endl;
          f<<">> Le resultat de "<<nb1<<" / "<<nb2<<" est "<<resultatDiv<<endl;
          }
        else {
          cout<<">> Le resultat de "<<nb1<<" "<<operation<<" "<<nb2<<" est "<<resultat<<endl;
          f<<">> Le resultat de "<<nb1<<" "<<operation<<" "<<nb2<<" est "<<resultat<<endl;
          }
        }
};

Conclusion :


Programmé vonlontairement pour n'afficher les résultats en entier sauf pour la division et l'inverse (consignes du projet...)
Un bug connu et intouchable: ne tappez jamais l'étoile "multiplier" du pavé numérique sous DOS ou UNIX (ou autre).le signe est utilisé par le système et cause des erreurs...

Codes Sources

A voir également

Ajouter un commentaire Commentaires
Messages postés
1
Date d'inscription
mercredi 18 février 2004
Statut
Membre
Dernière intervention
18 février 2004

Pourquoi ne pas avoir mis l'exe dans le zip ???
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
9
mets plutot des commentaires que des ; pour tes reperes
Messages postés
29
Date d'inscription
mercredi 14 janvier 2004
Statut
Membre
Dernière intervention
5 mars 2007

Si qqn à des conseils à me soumettre n'hésitez pas...
Messages postés
29
Date d'inscription
mercredi 14 janvier 2004
Statut
Membre
Dernière intervention
5 mars 2007

les ; me servent uniquement de repère,je sais que ça sert à rien t'inquiete pas
j'ai vu les flots ya vraiment pas longtemps,pas encore eu le temps de tout tester.donc si tu pouvais m'expliciter ton commentaire ça serait sympa pour que je m'auto-corrige..merci...
Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
8
ofstream f("resultats.txt",ios::app); ==> ca te gene pas ca en globale?
les ; sont inutiles apres la definition d'une fonction et pense a passer tes string par reference
Afficher les 6 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.