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

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

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.