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

Soyez le premier à donner votre avis sur cette source.

Vue 6 515 fois - Téléchargée 287 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
cs_patapain Messages postés 1 Date d'inscription mercredi 18 février 2004 Statut Membre Dernière intervention 18 février 2004
18 févr. 2004 à 16:51
Pourquoi ne pas avoir mis l'exe dans le zip ???
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 13
15 janv. 2004 à 18:37
mets plutot des commentaires que des ; pour tes reperes
cs_timinou Messages postés 29 Date d'inscription mercredi 14 janvier 2004 Statut Membre Dernière intervention 5 mars 2007
15 janv. 2004 à 13:06
Si qqn à des conseils à me soumettre n'hésitez pas...
cs_timinou Messages postés 29 Date d'inscription mercredi 14 janvier 2004 Statut Membre Dernière intervention 5 mars 2007
14 janv. 2004 à 23:16
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...
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
14 janv. 2004 à 23:04
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.