Problème fonction c++

dannydouby Messages postés 139 Date d'inscription   Statut Membre Dernière intervention   -  
Gigatrappeur Messages postés 226 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,
j'ai créé u petit programme tout simple qui permet de faire différent calculs. Chaque calculs s'éfectues dans une fonction séparer. Le seul problème c'est qu'il faut que je fasse des if...else pour vérifier si la fonction que j'ai entrée manuellement est la. Je veux comme ceci:

#include <iostream>
using namespace std;

double add(double add_a, double add_b){
    return add_a + add_b;
}

double mult(double mult_a, double mult_b){
    return mult_a * mult_b;
}

double minu(double minu_a, double minu_b){
    return minu_a - minu_b;
}

double divi(double divi_a, double divi_b){
    return divi_a / divi_b;
}

double val(double& val_a, double& val_b){
    cout << "Valeur a:";
    cin >> val_a;
    cout << "Valeur b:";
    cin >> val_b;
}

int main(){
    while(true){
        string fonction;
        cout << "Quel operation voulez-vous effectuer: ";
        cin >> fonction;
        double val_a, val_b;
        
        if(la_fonction_est_entrer){
            val(val_a, val_b);
            va_chercher_la_fonction_correspondante;
            cout << resultat;
        }else{
            erreur;
        }
    }

    return 0;
}


Mon code présentement:
#include <iostream>
using namespace std;

double add(double add_a, double add_b){
    return add_a + add_b;
}

double mult(double mult_a, double mult_b){
    return mult_a * mult_b;
}

double minu(double minu_a, double minu_b){
    return minu_a - minu_b;
}

double divi(double divi_a, double divi_b){
    return divi_a / divi_b;
}

double val(double& val_a, double& val_b){
    cout << "Valeur a:";
    cin >> val_a;
    cout << "Valeur b:";
    cin >> val_b;
}

int main(){
    while(true){
        string fonction;
        cout << "Quel operation voulez-vous effectuer: ";
        cin >> fonction;
        double val_a, val_b;
        if(fonction == "add"){
            val(val_a, val_b);
            cout << add(val_a, val_b) << "\n";
        }else if(fonction == "mult"){
            val(val_a, val_b);
            cout << mult(val_a, val_b) << "\n";
        }else if(fonction == "minu"){
            val(val_a, val_b);
            cout << minu(val_a, val_b) << "\n";
        }else if(fonction == "divi"){
            val(val_a, val_b);
            cout << divi(val_a, val_b) << "\n";
        }else{
            cout << "Operation impossible.\n";
        }
    }

    return 0;
}



Merci de m'aider.

A voir également:

4 réponses

Gigatrappeur Messages postés 226 Date d'inscription   Statut Membre Dernière intervention   25
 
Comme ce que j'ai écrit n'a pas l'air d'être clair, je vais développer.
typedef double (*ptrFonction)(double,double);

double add(double add_a, double add_b){
    return add_a + add_b;
}

double mult(double mult_a, double mult_b){
    return mult_a * mult_b;
}

int main() {
    std::map<std::string, ptrFonction> listFunction;
    listFunction["add"] = add;
    listFunction["mult"] = mult;
    ...
    cin >> fonction;
    std::map<std::string, ptrFonction>::iterator iter;
    iter = listFunction.find(fonction);
    if (iter != listFunction.end())
        cout << ((*iter).second)(val_a, val_b) << endl;
    else
        cout << fonction << " introuvalbe !" << endl;
}

1
Gigatrappeur Messages postés 226 Date d'inscription   Statut Membre Dernière intervention   25
 
Bonjour,

Tu pourrais faire une table de correspondance qui pour une chaine, contient ta fonction.
Exemple :
cin >> fonction;
listeFonction[fonction]();
Par contre cela demande un niveau assez haut en C/C++ pour faire ça.

Tu aurais utilisé un autre langage, je t'aurais dit, utilise la réflexion. Mais je crois que cela n'existe pas en C++

Cordialement,
Gigatrappeur
0
JwTdd
 
Salut, ça va être difficile de se débarrasser des if mais si tu veux juste rendre plus lisible tu peux par exemple faire:
#include <iostream>
using namespace std;

double megafonction(double operande_a, double operande_b, string operateur){

	if(operateur == "add") return(operande_a + operande_b);
	else if (operateur == "mult") return(operande_a * operande_b);
	else if (operateur == "minu") return(operande_a - operande_b);
	else if (operateur == "divi") return(operande_a / operande_b);
	return 0;
}


bool val(double& val_a, double& val_b){
    cout << "Valeur a:";
    cin >> val_a;
    cout << "Valeur b:";
    cin >> val_b;
    return 1;
}

int main(){
    while(true){
        string fonction;
        cout << "Quel operation voulez-vous effectuer: ";
        cin >> fonction;
        double val_a, val_b;

        if(fonction=="add"||fonction=="mult"||fonction=="minu"||fonction=="divi"){
            val(val_a, val_b);
            cout << megafonction(val_a, val_b, fonction)<<endl;
        }else{
            cout << "operation non connue"<<endl;
        }
    }

    return 0;

}


ça ne fait que déplacer le problème mais au moins tu n'auras pas à réécrire les ifs si tu dois les utiliser ailleurs....
0
dannydouby Messages postés 139 Date d'inscription   Statut Membre Dernière intervention   6
 
en effet... mais je ne sais toujours pas comment régler mon prob
0