|
Trouver une ressource
Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !
CALCULATRICE BASIQUE
Information sur la source
Description
Cette source montre comment lire les arguments de la ligne de commande, et donne un exemple de surcharge de fonction.
Source
- #include <iostream>
- #include <string.h>
- #include <cstdlib>
-
- using namespace std;
- //Prototypes des fonctions:
- int calcul(char,int,int);
- double calcul(char,double,double);
- bool conversion(string,double&);
- void arguments();
- void arguments(string);
- void arguments(string,string,string);
-
- //Fonction principale:
- int main(int argc, char *argv[])
- {
- string nomProg;
- nomProg = argv[0];
-
- switch (argc)
- {
- case 1 : arguments();break;
- case 2 : arguments(argv[1]);break;
- case 4 : arguments(argv[1],argv[2],argv[3]);break;
- default : cerr << nomProg << " : Mauvais nombre d arguments" << endl;
- }
- }
- //Definition des fonctions:
-
- //calcul qui prend en parametre l operation demandee, les operandes,et qui effectue l operation.
- int calcul(char operation, int operande1,int operande2)
- {
- int result;
- switch (operation)//Effectue l operation:
- {
- case 'x' : result= (operande1 * operande2);break;
- case '-' : result= (operande1 - operande2);break;
- case '+' : result= (operande1 + operande2);break;
- }
- //affichage du resultat:
- cout << endl << "Le resultat de " << operande1 << " " << operation << " " << operande2 << " est " << result << endl;
-
- //Cette fonction retourne le resultat de l operation si necessaire.
- return result;
- }
- //calcul(double,double) qui fait de meme pour la division.
- double calcul(char operation, double dividende, double diviseur)
- {
- double result;
- if(diviseur != 0)
- result = (dividende / diviseur);
- else {//cas de la division par 0: sort de calcul en renvoyant 1,2345(valeur arbitraire)
- cerr << "Attention,division par 0 interdite,operation fausse!";
- return 1.2345;
- }
- cout << endl << "Le resultat de " << dividende << " " << operation << " " << diviseur << " est " << result << endl;
- return result;
- }
-
- bool conversion(string arg,double& entier)
- {
- int i = (arg.length()-1),signe = 1,debut = 0,e = 1;
- bool test = 1;
- //dans le cas ou un argument est negatif:
- if (arg[0] == '-')
- {
- signe = -1;//signe devient -1
- debut = 1;//et debut devient 1 (dans la boucle suivante,le premier caractere,etant '-' ne sera pas testé).
- }
- entier = 0;//initialisation de entier a 0.
- while (i >= debut && test == 1)
- {
- test =(int(arg[i])-int('0')<=9 && int(arg[i])-int('0')>=0);//le test verifie que le caractere considere est bien un chiffre.
- if (test)//Si le test est faux, le calcul n est pas fait.
- {
- entier += ( int(arg[i])-int('0') )*e;//
- e *= 10;//e decrit les puissances de 10
- i--;//i decrit la chaine de caractere a l envers
- }
- }
- entier *= signe;//si on a rencontré un '-' avant l entier,alors entier <- -( entier )
- return test;//retourne test pour savoir si la conversion a ete effectuee ou non.
- }
- //arguments sans parametre,qui effectue la saisie pas a pas :
- void arguments()
- {
- char operation;
-
- //Saisie de l operation avec boucle de verification.
- cout << "Entrez l'operation a realiser:";
- cin >> operation;
- while (operation != 'x' && operation != '-' && operation != '/' && operation != '+')
- {
- cout << endl << "Operation non valide.(operations valides: '+' '-' 'x' '/'):";
- cin >> operation;
- }
-
- //Saisie des operandes.
- int operande1,operande2;
- double o1,o2;
- cout << endl << "Entrez le premier operande:";
- cin >> operande1;
-
- cout << endl << "Entrez le second operande:";
- cin >> operande2;
- if (operation != '/')
- calcul(operation,operande1,operande2);//appel a la fonction calcul pour des entiers.
- else
- {
- o1 = operande1;
- o2 = operande2;
- calcul(operation,o1,o2);//appel a la fonction calcul sur des doubles(division)
- }
-
- }
-
- //Arguments avec un parametre qui effectue l operation inverse ou qui affiche l aide:
- void arguments(string stringOperande2)
- {
- double operande2;
- const double un = 1;
- if (conversion(stringOperande2,operande2))
- calcul('/',un,operande2);
- else {//affichage de l aide
- cout << endl << "calcul:usage:" ;
- cout << endl << "Aide" ;
- cout << endl << " calcul --help";
- cout << endl << " calcul -?";
- cout << endl << "Calculs (en entier sauf pour la division et l inverse)";
- cout << endl << " calcul + n1 n2";
- cout << endl << " calcul - n1 n2";
- cout << endl << " calcul x n1 n2";
- cout << endl << " calcul / n1 n2";
- cout << endl << " calcul n (inverse de n)";
- }
- }
- //Arguments avec trois parametres qui effectue l operation demandee:
- void arguments(string sOp,string sO1,string sO2)
- {
- //Recuperation de l operation depuis le premier argument:
- char op;
- double operande1, operande2;
- int op1,op2;
- bool test;
- if (sOp.length() ==1 && (sOp[0] == '+'||sOp[0] == '-'||sOp[0] == 'x'||sOp[0] == '/'))
- {
- op = sOp[0];
- //Recuperation des operandes grace a la fonction conversion:
- test = (conversion(sO1,operande1) && conversion(sO2,operande2));
- if (test)
- {
- if (op == '/')
- calcul(op,operande1,operande2);
- else if (op != '/')
- {
- op1=operande1;
- op2=operande2;
- calcul(op,op1,op2);
- }
- }
- else cerr << "Erreur dans les operandes.Tapez calcul -? pour voir l usage correct.";
- }
- else cerr << "Erreur dans le premier argument.Tapez calcul -? pour voir l usage correct.";
- }
#include <iostream>
#include <string.h>
#include <cstdlib>
using namespace std;
//Prototypes des fonctions:
int calcul(char,int,int);
double calcul(char,double,double);
bool conversion(string,double&);
void arguments();
void arguments(string);
void arguments(string,string,string);
//Fonction principale:
int main(int argc, char *argv[])
{
string nomProg;
nomProg = argv[0];
switch (argc)
{
case 1 : arguments();break;
case 2 : arguments(argv[1]);break;
case 4 : arguments(argv[1],argv[2],argv[3]);break;
default : cerr << nomProg << " : Mauvais nombre d arguments" << endl;
}
}
//Definition des fonctions:
//calcul qui prend en parametre l operation demandee, les operandes,et qui effectue l operation.
int calcul(char operation, int operande1,int operande2)
{
int result;
switch (operation)//Effectue l operation:
{
case 'x' : result= (operande1 * operande2);break;
case '-' : result= (operande1 - operande2);break;
case '+' : result= (operande1 + operande2);break;
}
//affichage du resultat:
cout << endl << "Le resultat de " << operande1 << " " << operation << " " << operande2 << " est " << result << endl;
//Cette fonction retourne le resultat de l operation si necessaire.
return result;
}
//calcul(double,double) qui fait de meme pour la division.
double calcul(char operation, double dividende, double diviseur)
{
double result;
if(diviseur != 0)
result = (dividende / diviseur);
else {//cas de la division par 0: sort de calcul en renvoyant 1,2345(valeur arbitraire)
cerr << "Attention,division par 0 interdite,operation fausse!";
return 1.2345;
}
cout << endl << "Le resultat de " << dividende << " " << operation << " " << diviseur << " est " << result << endl;
return result;
}
bool conversion(string arg,double& entier)
{
int i = (arg.length()-1),signe = 1,debut = 0,e = 1;
bool test = 1;
//dans le cas ou un argument est negatif:
if (arg[0] == '-')
{
signe = -1;//signe devient -1
debut = 1;//et debut devient 1 (dans la boucle suivante,le premier caractere,etant '-' ne sera pas testé).
}
entier = 0;//initialisation de entier a 0.
while (i >= debut && test == 1)
{
test =(int(arg[i])-int('0')<=9 && int(arg[i])-int('0')>=0);//le test verifie que le caractere considere est bien un chiffre.
if (test)//Si le test est faux, le calcul n est pas fait.
{
entier += ( int(arg[i])-int('0') )*e;//
e *= 10;//e decrit les puissances de 10
i--;//i decrit la chaine de caractere a l envers
}
}
entier *= signe;//si on a rencontré un '-' avant l entier,alors entier <- -( entier )
return test;//retourne test pour savoir si la conversion a ete effectuee ou non.
}
//arguments sans parametre,qui effectue la saisie pas a pas :
void arguments()
{
char operation;
//Saisie de l operation avec boucle de verification.
cout << "Entrez l'operation a realiser:";
cin >> operation;
while (operation != 'x' && operation != '-' && operation != '/' && operation != '+')
{
cout << endl << "Operation non valide.(operations valides: '+' '-' 'x' '/'):";
cin >> operation;
}
//Saisie des operandes.
int operande1,operande2;
double o1,o2;
cout << endl << "Entrez le premier operande:";
cin >> operande1;
cout << endl << "Entrez le second operande:";
cin >> operande2;
if (operation != '/')
calcul(operation,operande1,operande2);//appel a la fonction calcul pour des entiers.
else
{
o1 = operande1;
o2 = operande2;
calcul(operation,o1,o2);//appel a la fonction calcul sur des doubles(division)
}
}
//Arguments avec un parametre qui effectue l operation inverse ou qui affiche l aide:
void arguments(string stringOperande2)
{
double operande2;
const double un = 1;
if (conversion(stringOperande2,operande2))
calcul('/',un,operande2);
else {//affichage de l aide
cout << endl << "calcul:usage:" ;
cout << endl << "Aide" ;
cout << endl << " calcul --help";
cout << endl << " calcul -?";
cout << endl << "Calculs (en entier sauf pour la division et l inverse)";
cout << endl << " calcul + n1 n2";
cout << endl << " calcul - n1 n2";
cout << endl << " calcul x n1 n2";
cout << endl << " calcul / n1 n2";
cout << endl << " calcul n (inverse de n)";
}
}
//Arguments avec trois parametres qui effectue l operation demandee:
void arguments(string sOp,string sO1,string sO2)
{
//Recuperation de l operation depuis le premier argument:
char op;
double operande1, operande2;
int op1,op2;
bool test;
if (sOp.length() ==1 && (sOp[0] == '+'||sOp[0] == '-'||sOp[0] == 'x'||sOp[0] == '/'))
{
op = sOp[0];
//Recuperation des operandes grace a la fonction conversion:
test = (conversion(sO1,operande1) && conversion(sO2,operande2));
if (test)
{
if (op == '/')
calcul(op,operande1,operande2);
else if (op != '/')
{
op1=operande1;
op2=operande2;
calcul(op,op1,op2);
}
}
else cerr << "Erreur dans les operandes.Tapez calcul -? pour voir l usage correct.";
}
else cerr << "Erreur dans le premier argument.Tapez calcul -? pour voir l usage correct.";
}
Conclusion
Tous vos commentaires seront les bienvenus !(surtout les plus méchants hihi) p.s. ne sachant ou la mettre étant donné que mettre un programme réalisant l addition, la soustraction,la multiplication et la division dans math & algorithme me semblait éxagéré, je l ai mis dans divers .
Sources de la même categorie
Commentaires et avis
|
Comparez les prix Nouvelle version
|