IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Discussion :

Évaluer une expression arithmétique

  1. #1
    Membre à l'essai
    Inscrit en
    Mai 2010
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 10
    Points : 10
    Points
    10
    Par défaut Évaluer une expression arithmétique
    Depuis un QLabel, je récupère une QString de la forme 123+56*8 et je voudrais calculer cette expression pour l'afficher dans le QLabel en question (genre calculette).

    Si je fais QString::number(123+56*8) en 'dur' cela fonctionne, mais si je passe la variable ligne obtenue en faisant :
    QString ligne= ui->label_Affiche->text();

    cela ne fonctionne pas, c'est un peu normal car QString::number attend un int (dans mon cas)

    Je débute en Qt et en C++ d'où mon problème.

    Peut-être y a-t-il une façon de faire cela que je ne connais pas ?

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 23
    Points : 16
    Points
    16
    Par défaut
    Salut,
    je suis comme toi je débute.
    mais puisque personne ne répond et que j'ai une petite idée de ce qu'il faut faire...

    il existe dans la classe QString une fonction toInt() qui transforme un QString en int.

    ton problème ici, c'est que ton expression (123+12*56) contient des caractères qui ne sont pas des int ('+','*',etc.).

    il faudrait donc que tu crées une fonction qui récupère les différents int de ton expression(123, 12 et 56) et qui applique les opérations attendues.

    je pense qu'il faut que cette fonction "lise" les caractère du QString 1 à 1 jusqu'à un opérateur.

    là tu stockes le début de cette chaîne de caractères dans un QString (ou un int grâce à toInt() )

    tu stockes aussi l'opérateur dans un autre QString.

    tu lis encore jusqu'à un autre opérateur ou la fin de ton expression.
    tu restockes.
    là tu devrais avoir 2 int et un opérateur, tu peux calculer qqchose.

    évidemment ça ne tient pas compte des priorités. ici 123+12*56 donnerait :
    (123+12)*56 au lieu de 123 +(12*56).
    faire une calculatrice s'apparente un peu à faire un compilateur.



    j'espère avoir aidé un peu.


    edit : il y a peu-etre quelquechose de plus simple.
    regarde ici : http://www.developpez.net/forums/d91...arsing-string/

  3. #3
    Membre à l'essai
    Inscrit en
    Mai 2010
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 10
    Points : 10
    Points
    10
    Par défaut
    Merci pour l'aide : j'en étais arrivé à peu près à la même proposition.

    Ce qui m'a intrigué, c'est que lorsque j'écris directement :
    QString::number(123+56*8) cela me donne bien le résultat attendu, mais si j'essaye de passer une variable issue du contenu du QLabel, je n'y arrive pas.

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 23
    Points : 16
    Points
    16
    Par défaut
    c'est normal :

    la fonction number() prend un int en paramètre.
    si tu essaies de lui passer un QString ça va pas marcher.

    quand tu fais QString::number(123+56*8), l'expression entre parenthèses est calculée, puis transformée en QString.
    en revanche si tu récupères une variable de Qlabel à l'aide de la fonction text(), tu obtiendras un QString.

    donc :

    QLabel mon_label;
    mon_label.setText(QString::number(12*3));
    // mon_label.text() vaut "36" et non pas 36.

    ce que tu peux essayer c'est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    QLabel mon_label;
    mon_label.setText("123+56*12+25");
    QString expression = mon_label.text();   // expression vaut "123+56*12+25"
    QStringList tab = expression.split("+"); //création de tab[0],tab[1],tab[2]
                                             //où tab[0] = "123", tab[1] = "56*12", tab[2] = "25"
    int a=QString::toInt(tab[0]),b=QString::toInt(tab[2]); //a vaut 123 et b vaut 25
    comme tu vois avec split() tu peux découper ton QString autour des caractères que tu veux.
    reste à utiliser ça correctement pour respecter l'ordre de priorité des opérations

  5. #5
    Membre à l'essai
    Inscrit en
    Mai 2010
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 10
    Points : 10
    Points
    10
    Par défaut
    Merci pour l'aide apportée, cela m'a été utile

  6. #6
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Salut, en générale, on génère un arbre à partie de l'expression que l'on exploite pour calculer le résultat.

    Une autres solution, pour des opérations simple, est d'utiliser QtScript qui te calculera directement le résultat.

  7. #7
    Membre à l'essai
    Inscrit en
    Mai 2010
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 10
    Points : 10
    Points
    10
    Par défaut
    Finalement j'ai choisi la méthode avec QScript :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    QString ligne= ui->label_Affiche->text(); //on récupère le contenu de l'afficheur (QLabel)
        QScriptEngine calculateur; //On crée un QScriptEngine
        QScriptValue resultat = calculateur.evaluate(ligne); //On passe la ligne de l'afficheur (QString)
        ligne = QString::number( resultat.toNumber()); //On transforme le résultat en QString
        ui->label_Affiche->setText(ligne);
    Ça fonctionne même si je ne comprends pas trop comment j'ai fait pour l'avant dernière ligne

  8. #8
    Responsable Qt & Livres


    Avatar de dourouc05
    Homme Profil pro
    Ingénieur de recherche
    Inscrit en
    Août 2008
    Messages
    26 667
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur de recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2008
    Messages : 26 667
    Points : 188 678
    Points
    188 678
    Par défaut
    Tu prends l'expression que tu veux évaluer, tu en demandes le résultat sous forme de nombre, puis tu demandes à QString de prendre ce nombre et de le mettre sous forme de chaîne de caractères. Je ne vois pas que dire de plus de cette ligne.

  9. #9
    Membre à l'essai
    Inscrit en
    Mai 2010
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 10
    Points : 10
    Points
    10
    Par défaut
    Merci pour tout, ça va tout comme je veux !

    Merci pour le temps passé à aider un grand et vieux débutant

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. évaluer une expression mathématique
    Par aminems dans le forum C++
    Réponses: 4
    Dernier message: 27/05/2008, 00h41
  2. Réponses: 8
    Dernier message: 15/05/2007, 11h02
  3. Réponses: 1
    Dernier message: 09/12/2006, 10h13
  4. Evaluation d'une expression arithmétique
    Par MysticKhal_0 dans le forum Algorithmes et structures de données
    Réponses: 9
    Dernier message: 10/03/2006, 18h25
  5. [C#] Comment évaluer une expression ?
    Par bart64 dans le forum C#
    Réponses: 3
    Dernier message: 11/01/2006, 15h46

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo