Faire des calculs simple demandé par l'utilisateur.

madshell Messages postés 59 Date d'inscription dimanche 29 avril 2007 Statut Membre Dernière intervention 21 août 2007 - 13 juin 2007 à 16:34
kevindu77270 Messages postés 3 Date d'inscription mercredi 7 novembre 2007 Statut Membre Dernière intervention 20 mars 2010 - 4 avril 2009 à 23:10
Bonjour,
Je suis en train de créer un robot msn qui réponds à l'utilisateur et j'aimerais qu'il calcul lorsqu'on lui demande :
5 + 5 (par exemple)

Voici comment se présente en général mon code :

                else if
                (
                   msg.IndexOf("1") > -1 || msg.IndexOf("2") > -1 || msg.IndexOf("3") > -1
                || msg.IndexOf("3") > -1 || msg.IndexOf("4") > -1 || msg.IndexOf("5") > -1
                || msg.IndexOf("6") > -1 || msg.IndexOf("7") > -1 || msg.IndexOf("8") > -1
                || msg.IndexOf("9") > -1 || msg.IndexOf("0") > -1
                )
                {
               session.send("resultat du calcul mais je sais pas comment procéder");
                }

Je cherche le moyen de procéder sachant que s'il detecte des chiffres, il faut qu'il supprime toutes les lettres, mais aussi qu'il repère les opérateurs mais je ne vois pas comment faire.
Une âme généreuse pourrais t-elle me fournir un peu d'aide ?
Merci d'avance.

7 réponses

cs_niky Messages postés 168 Date d'inscription jeudi 28 juin 2001 Statut Membre Dernière intervention 18 octobre 2008 7
13 juin 2007 à 17:53
Salut,

Ton post me rappelle mes cours sur les machines de Turing et la compilation... c'était affreux

Premièrement, je dirais que pour conserver uniquement une expression au sein d'un texte (C'est à dire transformer "Combien font 5 + 5 ?" en "5 + 5"), tu devrais utiliser les expressions régulières (un super site sur les regex : http://www.regular-expressions.info/).

Ensuite, il faut savoir si tu veux prendre en compte la priorité des opérateurs ou pas.
Si tu ne prends pas en compte la priorité, il suffit de lire la chaîne caractère par caractère et de faire les opérations dans l'ordre (sachant que dans le parcours, tu vas alterner la recherche d'un nombre et d'un opérateur).
Si tu prends en compte la priorité, c'est plus embêtant. Il faut transformer ta chaîne en un arbre binaire ou en notation préfixée (ce qui, dans la pratique revient au même). Mais en utilisant une pile ou une petite récursion, on s'en sort très bien.

Une petite recherche sur l'évaluation des expressions arithmétiques devrait pouvoir te sauver

Il n'y a rien sur csharpfr à ce sujet ?
0
cs_niky Messages postés 168 Date d'inscription jeudi 28 juin 2001 Statut Membre Dernière intervention 18 octobre 2008 7
13 juin 2007 à 18:08
Un petit bout de code qui devrait est capable (... enfin je crois, je l'ai pas testé) d'évaluer une expression très rudimentaire :
Supporte 4 opérateurs. Prise en compte uniquement des nombres entiers. Pas de parenthèsage. Pas de respect de la priorité des opérateurs.

double Evaluer(string expression)
{
    double resultat = 0.0;    int op 0; // 0 addition, 1 = soustraction, 2 = multiplication, 3 = division
   
    int nombreCourant = 0;
   
    foreach (char c in expression)
    {
        if (c == ' ') // Ignore les espaces
           continue;
   
        switch (c)
        {
           case '+':
              resultat = Calculer(resultat, op, nombreCourant);              nombreCourant signe 0;
              op = 0;
               break;
           case '-':
              resultat = Calculer(resultat, op, nombreCourant);              nombreCourant signe 0;
              op = 1;
               break;
           case '*':
              resultat = Calculer(resultat, op, nombreCourant);              nombreCourant signe 0;
              op = 2;
               break;
           case '/':
              resultat = Calculer(resultat, op, nombreCourant);              nombreCourant signe 0;
              op = 3;
              break;
           default:
                if (c >= '0' && c <= '9')
                  nombreCourant = nombreCourant * 10 + (c - '0');
               else
                   throw new Exception();
              break;
        }

    }
}

double Calculer(double res, int op, double value)
{
    switch (op)
    {
        case 0:
            return res + value;
        case 1:
            return res - value;
        case 2:
            return res * value;
        case 3:
            return res / value;
        default:
            throw new Exception();
    }
}

Même si c'est pas très juste, ça devrait te donner une idée de la manière de procéder.
0
madshell Messages postés 59 Date d'inscription dimanche 29 avril 2007 Statut Membre Dernière intervention 21 août 2007 7
13 juin 2007 à 18:14
Aie aie aie, c'est bien compliqué tout ça ! Je ne pense pas utiliser les priorités de calcul, c'est juste pour montrer à l'utilisateur qu'il s'est faire 2 + 2 ou 65 + 5.
0
madshell Messages postés 59 Date d'inscription dimanche 29 avril 2007 Statut Membre Dernière intervention 21 août 2007 7
13 juin 2007 à 18:21
Ah désolé j'avais pas encore vu ton code niky. Oui ça va surement m'être utile merci. Par contre où se place mon opération de dépard dans tout ça ? Je débute moi !
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_niky Messages postés 168 Date d'inscription jeudi 28 juin 2001 Statut Membre Dernière intervention 18 octobre 2008 7
13 juin 2007 à 18:38
Qu'est-ce que tu entends par opérateur de départ ?
Pour évaluer 65 + 5, tu fais :
double resultat = Evaluer("65 + 5")

Note sur le code :
1) RemplacernombreCourant signe 0;
par
nombreCourant = 0;

2) A la fin de la fonction évaluer, il faut ajouter
return Calculer(resultat, op, nombreCourant);
0
madshell Messages postés 59 Date d'inscription dimanche 29 avril 2007 Statut Membre Dernière intervention 21 août 2007 7
14 juin 2007 à 11:32
Ok merci.
0
kevindu77270 Messages postés 3 Date d'inscription mercredi 7 novembre 2007 Statut Membre Dernière intervention 20 mars 2010
4 avril 2009 à 23:10
Bonsoir,

Je sais ce topic est vieux, mais je débute dans la programmation de robot msn et je voudrais faire calculette sur le robot pour 4 + 8 ou 512 + 785.
Je suis débutant et ne comprend pas très bien ou inséré ce code dans ma source du robot.

Je vous remercie de votre aide.
(Adresse du robot : kebot@live.fr)
0