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

SL & STL C++ Discussion :

Comment faire pour ça?


Sujet :

SL & STL C++

  1. #21
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par loufoque Voir le message
    En même temps c'est pas comme si la grammaire était compliquée...
    Ni comme si le sujet n'avait jamais ete traite.

  2. #22
    Membre confirmé
    Inscrit en
    Mars 2006
    Messages
    113
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 113
    Par défaut
    Oui Jean-Marc, j'avais vu votre code... Je le gardais sous le coude...

    Je vais essayer de m'y mettre aujourd'hui, mais le C++ m'a toujours rebuté...

  3. #23
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 103
    Par défaut
    Citation Envoyé par z980x Voir le message
    Je vais essayer de m'y mettre aujourd'hui, mais le C++ m'a toujours rebuté...
    Au fait, tu as combien de temps pour faire ce projet ?

    2 heures, 2 jours, 2 semaines, 2 mois, 2 ans ?

    )jack(

  4. #24
    Membre confirmé
    Inscrit en
    Mars 2006
    Messages
    113
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 113
    Par défaut
    Maintenant, deux petites semaines... J'ai trouvé un algo sur le net, je vais essayer de l'implémenter... J'ai réfléchi à ça hier soir...

    Là, j'ai cours dans une heure, j'ai pas envie de me lancer dedans... Mais.... Il y a de l'espoir !

  5. #25
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 103
    Par défaut
    Citation Envoyé par loufoque Voir le message
    Par le lexer. Ensuite tu fais le parser, puis tu affiches ton arbre.
    C'est simple comme bonjour.
    Je dirais même plus: élémentaire !

    Citation Envoyé par Nogane Voir le message
    Bonjour,
    Je pense que l'idée de base est de définir une grammaire qui te permette de créer un arbre a partir de tes formule.
    A partir de cette arbre tu pourra ensuite générer le code LISP.

    Pour rentrer plus dans les détail, l'idée c'est que tes opérateurs deviennes des nœud de ton arbre, et les variables et valeurs numériques deviennent des feuilles. Bien sur il faut traiter les instruction entre parenthèse en premier, et respecter la priorité des opérateurs mathématique.

    Par exemple:
    X + (Z – Y)

    Devient:
    ...+
    ./...\
    X.....-
    ...../...\
    ....Z.....Y

    Après il n'y a plus qu'a faire l'opération inverse pour reconstruire l'équivalent en LISP.
    Jusque là, je suis complètement d'accord (lexer pour reconnaître les tokens (nombres, variables, opérateurs), puis parser pour créer l'arbre).

    Je pense que pour cette étape il vaux mieux mètre un maximum de parenthèse, pour de pas avoir a s'inquiéter de la priorité des opérateur en LISP.(Mais on as peut être pas le choix? J'ai jamais codé en LISP...)
    Effectivement, on n'a pas le choix!

    Comme il n'existe pas de notion de priorité en lisp, il n'y a pas besoin de mettre le maximum de parenthèses (comme en C, par exemple), mais juste celles qu'il faut!

    Chaque fois que tu as un sous-arbre avec un opérateur / une fonction en racine et une liste ordonnée d'arguments (qui sont eux-mêmes des sous-arbres ou des feuilles (c'est-à-dire des variables ou des nombres)), pour le transformer en lisp, il suffit de mettre une parenthèse ouvrante, le nom de la fonction, puis, séparés par des espaces, les arguments (selon un processus évidemment récursif) et une parenthèse fermante. C'est un genre de notation polonaise ou préfixée.

    En résumé:
    expr ::= (fonction arg1 ... argn)
    fonction ::= symbole
    arg ::= nombre | variable | expr

    Voila, j'espère que ça te mettra un peu sur la voie.
    Bis !

    )jack(

  6. #26
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 103
    Par défaut
    Citation Envoyé par z980x Voir le message
    Maintenant, deux petites semaines... J'ai trouvé un algo sur le net, je vais essayer de l'implémenter... J'ai réfléchi à ça hier soir...

    Là, j'ai cours dans une heure, j'ai pas envie de me lancer dedans... Mais.... Il y a de l'espoir !
    2 semaines à temps complet ! (temps étudiant = 20h/j)

    Bon courage !

    )jack(

  7. #27
    Membre confirmé
    Inscrit en
    Mars 2006
    Messages
    113
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 113
    Par défaut
    Citation Envoyé par jack-ft Voir le message
    2 semaines à temps complet ! (temps étudiant = 20h/j)

    Bon courage !

    )jack(

    Non... Etudiant en échange aux Etats-Unis:
    Pour être considéré en full-time student:
    9h en graduate / semaine
    12h en undergraduate. / semaine

    Comme je suis en Master 1, je suis encore considéré en Undergraduate.
    (Bon, par contre, énormément de taf à la maison, je suis sur 4 projets en même temps, dont un avec de l'assembleur et l'analyse de la pile mémoire qui me.... bien comme il faut...)

    Pour ce qui est du programme, j'ai suivi cet algo:
    http://www.dreamincode.net/forums/in...e=post&id=8286

    Pour l'instant, ça a l'air de marcher, mais je n'ai pas encore du tout géré les parenthèses...

    Quelqu'un pourrait m'aider pour ça???

    Le code est attaché... Ne critiquez pas, svp, la programmation, en C++, je fais n'importe quoi... (Genre tout stocker en string ou vector)...


    Code main.cpp : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
     
    /*
     * main.cpp
     *
     *  Created on: 29 janv. 2009
     *      Author: Philippe
     */
     
    #include "main.h"
    using namespace std;
     
    bool isOperator(string op)
    {
    	bool temp = false;
    	for(int i = 0; i < nbOper; i++)
    	{
    		if(op == listOperators[i])
    			temp = true;
    	}
    	return temp;
    }
     
    bool isVariable(string var)
    {
    	bool temp = false;
    	for(int i = 0; i < nbVar; i++)
    	{
    		if(var == listVariables[i])
    			temp = true;
    	}
    	return temp;
    }
     
    bool isNumber(string var)
    {
    	if(var == "0" || var == "1" || var == "2" || var == "3" || var == "4" || var == "5"
    		|| var == "6" || var == "7" || var == "8" || var == "9")
    		return true;
    	else
    		return false;
    }
     
    void showVectorStr(vector<string> vec)
    {
    	for(unsigned int i(0);i<vec.size();++i)
    	{
    	    cout << vec[i] << " ";
    	}
    }
     
    void showVectorInt(vector<int> vec)
    {
    	for(unsigned int i(0);i<vec.size();++i)
    	{
    	    cout << vec[i] << " ";
    	}
    }
     
    void scanString(string strInput)
    {
    	for(unsigned int i(0); i < strInput.length(); i++)
    	{
     
    		string read = strInput.substr(i,1);
     
    		if(read == " ")
    		{
    			//Space... Don't do anything.
    		}
    		else if(isOperator(read))
    		{
    			operatorFromInput.push_back(read);
    			indexOpFromInput.push_back(i);
    		}
    		else if(isVariable(read))
    		{
    			varsFromInput.push_back(read);
    			indexVarFromInput.push_back(i);
    		}
    		else if(isNumber(read))
    		{
    			string nbTemp = "";
    			int j = i;
    			while(isNumber(strInput.substr(i,1)))
    			{
    				nbTemp += strInput.substr(i,1);
    				i++;
    			}
    			varsFromInput.push_back(nbTemp);
    			indexVarFromInput.push_back(j);
     
    		}
    		else
    		{
    			if(isalpha(read[0]))
    			{
    				cout << "Unknown variable name " << read[0] << endl;
    			}
    			else
    			{
    				cout << "Unknown operator " << read[0] << endl;
    			}
    		}
    	}
    }
     
    int getPriority(string op)
    {
    	if(op == "=")
    		return 1;
    	if(op == "-" || op == "+")
    		return 2;
    	if(op == "*" || op == "/")
    		return 3;
    	if(op == "(")
    		return 9; // Pour l'instnat seulement. apres sans doute 2
     
    	return 9;
    }
     
    int getLowestPriorityIndex(vector<string> vect)
    {
    	int lowestPrio = 7;
    	int index = 0;
     
    	for(unsigned int i(0); i < vect.size(); i++)
    	{
    	    if(getPriority(vect.at(i)) < lowestPrio)
    	    {
    	    	lowestPrio = getPriority(vect.at(i));
    	    	index = i;
    	    }
    	}
    	return index;
    }
     
    void insertInTree(tref &root, string ope, int index)
    {
        tref newStuff;
        newStuff = new cell;
     
    	// First treat the very first insertion
    	if(root == NULL)
    	{
    		newStuff->value = ope;
    		newStuff->index = index;
    		newStuff->left = NULL;
    		newStuff->right = NULL;
    		root = newStuff;
    	}
    	else
    	{
    		if(index < (root->index))
    			insertInTree(root->left, ope, index);
    		else
    			insertInTree(root->right, ope, index);
    	}
    }
     
    void buildTree()
    {
     
    	root = NULL;
     
    	int lowestPriority;
    	while(!operatorFromInput.empty())
    	{
    		lowestPriority = getLowestPriorityIndex(operatorFromInput);
    		//Parcourir vecteur pour prendre priorité minimum
    		string ope = operatorFromInput.at(lowestPriority);
    		//cout << "ope: " << ope << endl;
    		//Prendre son index
    		//Appeler constuction arbre avec ce vecteur et son index
    		insertInTree(root, ope, indexOpFromInput.at(lowestPriority));
    		//cout << "Insertion OK: " << ope << " => " << indexOpFromInput.at(lowestPriority) << endl;
    		//retirer cet operateur
     
    		operatorFromInput.erase((operatorFromInput.begin())+lowestPriority);
    		//retirer son index.
    		indexOpFromInput.erase((indexOpFromInput.begin())+lowestPriority);
    	}
    	//Faire pareil pour variables.
    	while(!varsFromInput.empty())
    	{
    		insertInTree(root, varsFromInput.at(0), indexVarFromInput.at(0));
    		varsFromInput.erase(varsFromInput.begin());
    		indexVarFromInput.erase(indexVarFromInput.begin());
    	}
     
    }
     
    void NLR(tref root)
    {
        if(root != NULL)
        {
            cout << root->value << " ";
            NLR(root->left);
            cout << " ";
            NLR(root->right);
            cout << " ";
        }
    }
     
    int main(int argc, char **argv)
    {
    	string str = "";
    	do
    	{
    		cout << "Expression: " << endl;
    		getline(cin, str);
    		if(str != "QUIT")
    		{
    			scanString(str);
    			cout << "operateurs:" << endl;
    			showVectorStr(operatorFromInput);
    			cout << endl;
    //			cout << "index operateurs:" << endl;
    //			showVectorInt(indexOpFromInput);
    //			cout << endl;
    //
    //			cout << "var et chiffres:" << endl;
    //			showVectorStr(varsFromInput);
    //			cout << endl;
    //			cout << "index var et chiffres:" << endl;
    //			showVectorInt(indexVarFromInput);
    //			cout << endl;
    			buildTree();
    			NLR(root);
    		}
    	}while(str != "QUIT");
    }
    Code main.h : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
     
    /*
     * main.h
     *
     *  Created on: 21 janv. 2009
     *      Author: Philippe
     */
     
    #ifndef MAIN_H_
    #define MAIN_H_
    #include <string>
    #include <iostream>
    #include <vector>
    using namespace std;
     
    int nbOper = 7;
    string listOperators[] = {"=","+","-","*","/","(",")"};
    vector<string> operatorFromInput; // Vector for all the operators of the input
    vector<int> indexOpFromInput; // Vector for the index of the operator of the input
     
    int nbVar = 3;
    string listVariables[] = {"X","Y","Z"};
    vector<string> varsFromInput; // Vector for all the numbers and variables of the input
    vector<int> indexVarFromInput; // Vector for the index of numbers and variables of the input.
     
    typedef struct cell* tref;
    typedef struct cell
    {
        string value;
        tref left;
        tref right;
        int index;
    } tnode;
     
    tref root = NULL;
     
    void scanString(string);
    bool isOperator(string);
    bool isVariable(string);
    bool isNumber(string);
     
    int getPriority(string);
    int getLowestPriorityIndex(vector<string>);
    void insertInTree(tref &, string, int);
    void NLR(tref);
     
    #endif /* MAIN_H_ */
    Merci !

    Philippe

  8. #28
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 103
    Par défaut
    Citation Envoyé par z980x Voir le message
    Pour l'instant, ça a l'air de marcher, mais je n'ai pas encore du tout géré les parenthèses...

    Quelqu'un pourrait m'aider pour ça???

    Philippe
    Gérer les parenthèses en entrée ou en sortie ?

    Si c'est en entrée, lorsque tu rencontres une '(', il suffit de considérer que tu ouvres l'analyse d'une nouvelle expression (en espérant que ton code est suffisamment réentrant!) jusqu'à trouver une ')' et tu retournes l'arbre généré comme sous-arbre pour l'arbre englobant.

    Si c'est en sortie, j'ai tout dit dans mon post précédent.

    )jack(

Discussions similaires

  1. comment faire pour qu'une application soit toujours visible ?
    Par goldbar dans le forum Langages de programmation
    Réponses: 2
    Dernier message: 28/03/2004, 14h35
  2. Réponses: 7
    Dernier message: 13/12/2003, 14h09
  3. comment faire pour developper des prog en win32
    Par rhodan51 dans le forum Autres éditeurs
    Réponses: 11
    Dernier message: 09/11/2003, 19h39
  4. Comment faire pour mettre l'ecran en veille ?
    Par March' dans le forum MFC
    Réponses: 6
    Dernier message: 29/08/2002, 14h25
  5. Comment faire pour créer un bitmap
    Par GliGli dans le forum C++Builder
    Réponses: 2
    Dernier message: 24/04/2002, 15h41

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