Problème fonction c++

Fermé
dannydouby Messages postés 139 Date d'inscription dimanche 7 juin 2009 Statut Membre Dernière intervention 1 juin 2013 - 8 mai 2013 à 22:03
Gigatrappeur Messages postés 226 Date d'inscription lundi 6 mai 2013 Statut Membre Dernière intervention 3 juillet 2014 - 13 mai 2013 à 09:50
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 lundi 6 mai 2013 Statut Membre Dernière intervention 3 juillet 2014 25
13 mai 2013 à 09:50
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 lundi 6 mai 2013 Statut Membre Dernière intervention 3 juillet 2014 25
8 mai 2013 à 23:27
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
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 dimanche 7 juin 2009 Statut Membre Dernière intervention 1 juin 2013 6
12 mai 2013 à 07:12
en effet... mais je ne sais toujours pas comment régler mon prob
0