[C++] Van string naar werkelijk berekening?

Pagina: 1
Acties:

  • Neptunus
  • Registratie: Januari 2001
  • Laatst online: 13-11-2025
hallo,

ik ben op zoek naar een oplossing om van een string expressie naar een berekening te gaan.

Stel je voor je hebt de String (a+b)/c
Het programma wat ik aan het maken ben vraagt al nestje naar de waarden van a, b en c. Hier worden dan objecten van gemaakt met waarden. Maar om de berekening uit te voeren moet er iets gebeuren als. ( a.geefWaarde()+b.geefWaarde() ) / c.geefWaarde() = antwoord. Hierna kan ik natuurlijk het antwoord printen. die a,b en c zijn objecten met complexe getallen. De expressie ( a.geefWaarde()+b.geefWaarde() ) / c.geefWaarde() = antwoord werkt los prima. Maar het is de bedoeling dat de gebruiker gewoon kan zeggen bij de invoer (a+b)/c. Hierna wordt hij gevraagd naar de waardes van a,b en c Hierna moet dan de werkelijke berekening gemaakt worden en afgedrukt worden.

Ben benieuwt naar de mogelijk oplossingen.

  • Domokoen
  • Registratie: Januari 2003
  • Laatst online: 10:48
Zoek eens op google naar stack equation parsing. Of lees een boek over datastructuren, daar zit dit meestal wel in.

  • Neptunus
  • Registratie: Januari 2001
  • Laatst online: 13-11-2025
Mr.Chinchilla schreef op dinsdag 01 maart 2005 @ 16:34:
Zoek eens op google naar stack equation parsing. Of lees een boek over datastructuren, daar zit dit meestal wel in.
Heb even rond gekeken zoals je had gezegt en ben wel een stapje verder.

als je bv (3+(5+8))*(2+4) = 96 wilt berekenen kan je dat via een stack uitschrijven als 3 5 8 + + 24 + *

hier uit volgt dan in de stack het volgende:

code:
1
2
3
4
5
3 5 8 +  +   2  4  +    *    > tussen de nummer en tekens een enter zeg maar!
--------------------------------------
      8         4
  5 5 13     2  2  6
3 3 3 3  16 16 16 16 96

Maar hoe je dit nu moet vertallen in een programma?

[ Voor 5% gewijzigd door Neptunus op 01-03-2005 17:07 ]


  • Cloud
  • Registratie: November 2001
  • Laatst online: 08-05 14:53

Cloud

FP ProMod

Ex-moderatie mobster

Je hebt een stack waarop je de getallen stapelt die ingevoerd worden. Bij iedere operator, zoals een + of - teken, pak je de laatste 2 waarden van de stack, en voer je de berekening uit, waarna je de uitkomst weer op de stack zet.
Dit alles kan op een aantal verschillende manieren geïmplementeerd worden, ik zou zeggen experimenteer wat, tis niet al te moeilijk :)

Never attribute to malice that which can be adequately explained by stupidity. - Robert J. Hanlon
60% of the time, it works all the time. - Brian Fantana


  • schoene
  • Registratie: Maart 2003
  • Laatst online: 09:43
Kijk anders eens naar http://sourceforge.net/projects/sccalc/:
een opensource calculator.
Het is in C#, en het gebruikt geen variabelen, maar de werkwijze is er wel
duidelijk

  • leuk_he
  • Registratie: Augustus 2000
  • Laatst online: 06-05 23:54

leuk_he

1. Controleer de kabel!

ik ken het als infix naar postfix conversie. En dat kun je ook goed googlen


[google=infix postfix]
http://www.qiksearch.com/articles/cs/infix-postfix/

Need more data. We want your specs. Ik ben ook maar dom. anders: forum, ff reggen, ff topic maken
En als je een oplossing hebt gevonden laat het ook ujb ff in dit topic horen.


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-04 22:08
Is ook een voorbeeld in Stroustrup TC++PL

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • Neptunus
  • Registratie: Januari 2001
  • Laatst online: 13-11-2025
Ik heb onderstaande code vonden op internet. Deze was eerst alleen om van infix naar postfix notatie te gaan. Ik heb het even iets aangepast zodat ik een de expressie kan evalueren. Nu gaat het evalueren nog niet helemaal goed. Regel 132 is de oorzaag. Ik wou graag de expressie bijhouden in een string (string.h) en niet ik een char array. Ik ben al de heleavond bezig geweest om het foutje er uit te grijgen. Alleen zijn mijn ideeën een beetje op, op het moment. Misschien pak ik het al helemaal verkeerd aan vanaf het begin. Ik hoop dat iemand mij een handig tip kan geven.

C++:
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
#include <iostream>
#include <string>
#include <stack>
#include <math>
using namespace std;

stack<int> OperatorStack;

void Convert(const string & Infix, string & Postfix);

bool IsOperand(char ch);

bool TakesPrecedence(char OperatorA, char OperatorB);

int Evaluate (string Postfix);
int Calculate (int op1, char opr, int op2);

int main(void)
   {
   char Reply;

   do
      {
      string Infix, Postfix;   // local to this loop

      cout << "Enter an infix expression (e.g. (1+2)/4^2, with no spaces):"
         << endl;
      cin >> Infix;

      Convert(Infix, Postfix);
      cout << "The equivalent postfix expression is:" << endl
         << Postfix << endl;
     int ans = Evaluate ( Postfix ) ;
        cout << "The Answer of Expression .......................... : " << ans ;



      cout << endl << "Do another (y/n)? ";
      cin >> Reply;
      }
   while (tolower(Reply) == 'y');

   return 0;
   }


/* Given:  ch   A character.
   Task:   To determine whether ch represents an operand (here understood
           to be a single letter or digit).
   Return: In the function name: true, if ch is an operand, false otherwise.
*/
bool IsOperand(char ch){
   if (ch >= '0' && ch <= '9'){     //((ch >= 'a') && (ch <= 'z')) ||
      return true;                  //((ch >= 'A') && (ch <= 'Z')) ||
   } else {
      return false;
   }
}
/* Given:  OperatorA    A character representing an operator or parenthesis.
           OperatorB    A character representing an operator or parenthesis.
   Task:   To determine whether OperatorA takes precedence over OperatorB.
   Return: In the function name: true, if OperatorA takes precedence over
           OperatorB.
*/
bool TakesPrecedence(char OperatorA, char OperatorB){
   if (OperatorA == '(')
      return false;
   else if (OperatorB == '(')
      return false;
   else if (OperatorB == ')')
      return true;
   else if ((OperatorA == '^') && (OperatorB == '^'))
      return false;
   else if (OperatorA == '^')
      return true;
   else if (OperatorB == '^')
      return false;
   else if ((OperatorA == '*') || (OperatorA == '/'))
      return true;
   else if ((OperatorB == '*') || (OperatorB == '/'))
      return false;
   else
      return true;
}


/* Given:  Infix    A string representing an infix expression (no spaces).
   Task:   To find the postfix equivalent of this expression.
   Return: Postfix  A string holding this postfix equivalent.
*/
void Convert(const string & Infix, string & Postfix)
   {

   char TopSymbol, Symbol;
   unsigned int k;

   for (k = 0; k < Infix.size(); k++)
      {
      Symbol = Infix[k];
      if (IsOperand(Symbol))
         Postfix = Postfix + Symbol;
      else
         {
         while ((! OperatorStack.empty()) &&
            (TakesPrecedence(OperatorStack.top(), Symbol)))
            {
            TopSymbol = OperatorStack.top();
            OperatorStack.pop();
            Postfix = Postfix + TopSymbol;
            }
         if ((! OperatorStack.empty()) && (Symbol == ')'))
            OperatorStack.pop();   // discard matching (
         else
            OperatorStack.push((int)Symbol);
         }
      }

   while (! OperatorStack.empty())
      {
      TopSymbol = OperatorStack.top();
      OperatorStack.pop();
      Postfix = Postfix + TopSymbol;
      }
}

int Evaluate (string postfix){
    unsigned int i;

    for (i = 0; i < postfix.size(); i++){
        char ch = postfix[i] ;
        char ch1[10] ;
        strcpy ( ch1 , &postfix [i] );
        cout<<"waarde ch1 [postfix["<<i<<"]]: "<<ch<<endl;
        //cout <<endl<< atoi ( ch1) ;
        if ( IsOperand ( ch ) == true ){
            OperatorStack.push(atoi(ch1));
            cout<<"isOperand: "<<atoi(ch1)<<endl;
        }else{
            int op2 = OperatorStack.top();
            OperatorStack.pop();
            int op1 = OperatorStack.top();
            OperatorStack.pop();
            int ans = Calculate ( op1, ch, op2 ) ;
            //cout << ans << endl ;
            OperatorStack.push(ans);
        }
    }
    int ans = OperatorStack.top();
    return ans ;
}

int Calculate (int op1, char opr, int op2){
    cout<<op1<<" "<<opr<<" "<<op2<<endl;
     int ans ;
     switch ( opr )
     {
         case '+' :  ans = op1 + op2 ; break ;
         case '-' :  ans = op1 - op2 ; break ;
         case '*' :  ans = op1 * op2 ; break ;
         case '/' :  ans = op1 / op2 ; break ;
         case '^' :  ans = pow(op1, op2) ;
     }
     return ans ;
}

[ Voor 29% gewijzigd door Neptunus op 03-03-2005 04:24 ]


  • Semyon
  • Registratie: April 2001
  • Laatst online: 10-05 23:09
Ik zou het nou juist weer niet eerst naar postfix omzetten. Dat is verspilde moeite, want terwijl je dat aan het doen bent ben je toch alle regels voor volgorde aan het parsen, als je dat dan toch doet, dan kan je ook gelijk de getallen wel meenemen.

Ik zou dus even een simpel context vrij grammatica'tje in elkaar zetten.
Code lijkt veel, maar het is veel knip en plak werk :)

Als je dan ook met constantes wilt rekenen, moet je die voodat je hieraan begint even een string search op de namen van je constantes zoeken en dan die vervangen door je waardes. Of als je het echt volgens het boekje wilt doen haal je die op in N (RuleN).

C++:
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
#include <iostream>
#include <string>
using namespace std; 

/* This simple grammar without left recursion gives us our rules:
   S -> A-S | A        A=Add
   A -> D+A | D        D=Divide
   D -> M/D | M        M=Multiply
   M -> P*M | P        P=Power
   P -> N^P | N        N=Number
   N -> (S) | float */

int RuleS(char *ParseString,float *result); 
int RuleA(char *ParseString,float *result); 
int RuleD(char *ParseString,float *result); 
int RuleM(char *ParseString,float *result); 
int RuleP(char *ParseString,float *result); 
int RuleN(char *ParseString,float *result); 

/* All rule function have as in what is left to parse
   in result the inmediate result is stored
   return is how many characters are read or -1 on syntax error
*/

int main(void)
{
   char *expression=(char *)malloc(1024);
   cin >> expression;
   float answer;
   if ((charcount > 0) && (*(expression+charcount)=='\0')) {
     cout << answer << "\n";
   } else {
     cout << "Syntax error\n";
   }
   return 0;
}

// Subtract Rule

int RuleS(char *ParseString,float *result)
{
  float operant1;
  float operant2;
  int totalcharcount=0;
  int charcount=RuleA(ParseString,&operant1);
  totalcharcount+=charcount;
  if (charcount < 0) return -1; // pass up error
  if (*(ParseString+charcount)=='-') {
    charcount=RuleS(ParseString+totalcharcount+1,&operant2);
    if (charcount < 0) return -1; // pass up error
    totalcharcount+=charcount+1;
    *result=operant1-operant2;
  } else {
    *result=operant1;
  }
  return totalcharcount;
}

// Add Rule

int RuleA(char *ParseString,float *result)
{
  float operant1;
  float operant2;
  int totalcharcount=0;
  int charcount=RuleD(ParseString,&operant1);
  totalcharcount+=charcount;
  if (charcount < 0) return -1; // pass up error
  if (*(ParseString+charcount)=='+') {
      charcount=RuleA(ParseString+totalcharcount+1,&operant2);
      if (charcount < 0) return -1; // pass up error
      totalcharcount+=charcount+1;
      *result=operant1+operant2;
    } else {
      *result=operant1;
    }
  return totalcharcount;
}

// Divide Rule

int RuleD(char *ParseString,float *result) 
{
  float operant1;
  float operant2;
  int totalcharcount=0;
  int charcount=RuleM(ParseString,&operant1);
  totalcharcount+=charcount;
  if (charcount < 0) return -1; // pass up error
  if (*(ParseString+charcount)=='/') {
    charcount=RuleD(ParseString+totalcharcount+1,&operant2);
    if (charcount < 0) return -1; // pass up error
    totalcharcount+=charcount+1;
    *result=operant1+operant2;
  } else {
    *result=operant1;
  }
  return totalcharcount;
}

// Multiply Rule

int RuleM(char *ParseString,float *result) 
{
  float operant1;
  float operant2;

  int totalcharcount=0;
  int charcount=RuleP(ParseString,&operant1);
  totalcharcount+=charcount;
  if (charcount < 0) return -1; // pass up error
  if (*(ParseString+charcount)=='*') {
    charcount=RuleM(ParseString+totalcharcount+1,&operant2);
    if (charcount < 0) return -1; // pass up error
    totalcharcount+=charcount+1;
    *result=operant1*operant2;
  } else {
    *result=operant1;
  }
  return totalcharcount;
}

// Power Rule

int RuleP(char *ParseString,float *result) 
{
  float operant1;
  float operant2;

  int totalcharcount=0;
  int charcount=RuleN(ParseString,&operant1);
  totalcharcount+=charcount;
  if (charcount < 0) return -1; // pass up error
  if (*(ParseString+charcount)=='^') {
    charcount=RuleP(ParseString+totalcharcount+1,&operant2);
    if (charcount < 0) return -1; // pass up error
    totalcharcount+=charcount+1;
    *result=pow(operant1,operant2);
   } else {
    *result=operant1;
   }
  return totalcharcount;
}

// Parse Numerical or brackets

int RuleN(char *ParseString,float *result) 
{
  *result=0;
  int charcount=0;
  if (*ParseString=='('){
    charcount=RuleS(ParseString+1,result);
    if (charcount < 0) return -1;
    if (*(ParseString+1+charcount)!=')') {
       cout << "Mising closing bracket\n";
       return -1;
    }
    return charcount+2;
  }
  while ((*(ParseString+charcount)>='0') && (*(ParseString+charcount)<='9')) { 
    *result*=10;
    *result+=*(ParseString+charcount)-'0';
    charcount++;
  }
  if (*(ParseString+charcount)=='.') {
    charcount++;
    int Base=1;
    while ((*(ParseString+charcount)>='0') && (*(ParseString+charcount)<='9')) {
 
      Base*=10;
      *result+=((float)(*(ParseString+charcount)-'0'))/(float)Base;
      charcount++;
    }
  }
  if (charcount==0) {
    cout << "Syntax error\n";
    return -1;
  }
  return charcount;
}


code:
1
2
3
4
5
6
7
8
9
10
$ g++ SimpleGrammar.cpp -o SimpleGrammar
$ ./SimpleGrammar
2*3+3*2 
12
$ ./SimpleGrammar
2^8-1
255
$ ./SimpleGrammar
2^0.5*(3-1)^0.5
2


zoals je ziet netje Meneer van Dale wacht de volgordes in je grammatica bepalen wat eerst bindt.

[ Voor 5% gewijzigd door Semyon op 03-03-2005 06:55 ]

Only when it is dark enough, can you see the stars


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-04 22:08
Neptunus schreef op donderdag 03 maart 2005 @ 02:36:
Ik heb onderstaande code vonden op internet. Deze was eerst alleen om van infix naar postfix notatie te gaan. Ik heb het even iets aangepast zodat ik een de expressie kan evalueren. Nu gaat het evalueren nog niet helemaal goed. Regel 132 is de oorzaag. Ik wou graag de expressie bijhouden in een string (string.h) en niet ik een char array.

C++:
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
//  132 is hier ergens
int Evaluate (string postfix){
    unsigned int i;

    for (i = 0; i < postfix.size(); i++){
        char ch = postfix[i] ;
        char ch1[10] ;
        strcpy ( ch1 , &postfix [i] );
        cout<<"waarde ch1 [postfix["<<i<<"]]: "<<ch<<endl;
        //cout <<endl<< atoi ( ch1) ;
        if ( IsOperand ( ch ) == true ){
            OperatorStack.push(atoi(ch1));
            cout<<"isOperand: "<<atoi(ch1)<<endl;
        }else{
            int op2 = OperatorStack.top();
            OperatorStack.pop();
            int op1 = OperatorStack.top();
            OperatorStack.pop();
            int ans = Calculate ( op1, ch, op2 ) ;
            //cout << ans << endl ;
            OperatorStack.push(ans);
        }
    }
    int ans = OperatorStack.top();
    return ans ;
}
Simpel gezegd, dit is gepruts. Ten eerste is &postfix[i] het adres van 1 karakter, niet van een C string (dat zou postfix.c_str( )+i moeten zijn - &[i] is niet null-terminated ). Belangrijker, ik snap geen hout van wat je nou probeert te bereiken. Je kopieert stings van onbekende lengte in een beperkte buffer, gebruikt karakters uit postfix meer dan eens, gebruikt om een of andere duistere reden atoi( ), etc.

Schrijf eens een specificatie en wat testcases, en herimplementeer deze functie dan (zelf).

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • Neptunus
  • Registratie: Januari 2001
  • Laatst online: 13-11-2025
Semyon schreef op donderdag 03 maart 2005 @ 06:53:
Ik zou het nou juist weer niet eerst naar postfix omzetten. Dat is verspilde moeite, want terwijl je dat aan het doen bent ben je toch alle regels voor volgorde aan het parsen, als je dat dan toch doet, dan kan je ook gelijk de getallen wel meenemen.

Ik zou dus even een simpel context vrij grammatica'tje in elkaar zetten.
Code lijkt veel, maar het is veel knip en plak werk :)

Als je dan ook met constantes wilt rekenen, moet je die voodat je hieraan begint even een string search op de namen van je constantes zoeken en dan die vervangen door je waardes. Of als je het echt volgens het boekje wilt doen haal je die op in N (RuleN).


code:
1
2
3
4
5
6
7
8
9
10
$ g++ SimpleGrammar.cpp -o SimpleGrammar
$ ./SimpleGrammar
2*3+3*2 
12
$ ./SimpleGrammar
2^8-1
255
$ ./SimpleGrammar
2^0.5*(3-1)^0.5
2


zoals je ziet netje Meneer van Dale wacht de volgordes in je grammatica bepalen wat eerst bindt.
Ik wou je code in compileren maar krijg een error dat hij in de main charcount niet kent. Nu heb ik dit zelf proberen op te lossen. Maar Krijg het niet voor elkaar. Jij zelf geeft een mooie uitvroeg weer in de post. Ik zou deze graag zelf willen proberen. Zou jij mij kunnen vertellen waar dat nu aan ligt?

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 10-05 12:29

Creepy

Tactical Espionage Splatterer

Neptunus schreef op donderdag 03 maart 2005 @ 11:44:
[...]
Ik wou je code in compileren maar krijg een error dat hij in de main charcount niet kent. Nu heb ik dit zelf proberen op te lossen. Maar Krijg het niet voor elkaar. Jij zelf geeft een mooie uitvroeg weer in de post. Ik zou deze graag zelf willen proberen. Zou jij mij kunnen vertellen waar dat nu aan ligt?
Nu wordt het wel heel erg je handje vasthouden. Je moet met een beetje C/C++ kennis echt wel in staat zijn om z'n compiler error zelf op te lossen.

Wat heb je nu precies al zelf geprobeerd om die error op te lossen? We gaan er hier vanuit dat je eerst zal actief bezig bent geweest met het oplossen van eventuele problemen EN (!) dat je aangeeft wat je hebt geprobeerd.

Daarnaast is je eigenlijke topic ook niet helemaal je van het. Bekijk P&W FAQ - De "quickstart" zodat je ziet wat we eigenlijk van een topicstart verwachten.

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • Semyon
  • Registratie: April 2001
  • Laatst online: 10-05 23:09
Neptunus schreef op donderdag 03 maart 2005 @ 11:44:
[...]


Ik wou je code in compileren maar krijg een error dat hij in de main charcount niet kent. Nu heb ik dit zelf proberen op te lossen. Maar Krijg het niet voor elkaar. Jij zelf geeft een mooie uitvroeg weer in de post. Ik zou deze graag zelf willen proberen. Zou jij mij kunnen vertellen waar dat nu aan ligt?
Oeps er is een regel weggevallen om een of andere reden

C++:
1
   int charcount=RuleS(expression,&answer);


Dit na regel 29 invoeren, zodat regel 30 regel 31 wordt.

Only when it is dark enough, can you see the stars


  • Neptunus
  • Registratie: Januari 2001
  • Laatst online: 13-11-2025
Nou het is gelukt. Ik zal niet alle code posten. Maar de stukken die andere mensen mischien nog kunnen gebruiken als voorbeeld wel.

Stuk wat de expressie ophaald. Voor mij wat het alleen nodig om x,y en z op de halen.
C++:
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
//dit is het deel van de methode die ik gebruik om de 
//expressie op te halen en moet te zetten naar postfix
    cout<<"\nGeef de expressie in (ENTER = verwerken):"<<endl;
    char invoer;
    cin.get(invoer);
    while(invoer != '\n'){
        infix += invoer;
        //Kijken of er een R,C of L ingevoert moet gaan worden
        if(invoer == 'x' && booleanX == False){
            booleanX = True;
        }
        if(invoer == 'y' && booleanY== False){
            booleanY = True;
        }
        if(invoer == 'Z' && booleanZ == False){
            booleanX = True;
        }
        cin.get(invoer);
    }

    stack<char> operatorStack;
    char topTeken, teken;
    unsigned int k;

    for (k = 0; k < infix.size(); k++){
        teken = infix[k];
        if (isOperand(teken)){
            postfix = postfix + teken;
        } else {
            while ((! operatorStack.empty()) && (voorrangsRegels(operatorStack.top(), teken))){
                topTeken = operatorStack.top();
                operatorStack.pop();
                postfix = postfix + topTeken;
            }
            if ((! operatorStack.empty()) && (teken == ')')){
                operatorStack.pop();   // discard matching (
            } else {
            operatorStack.push(teken);
            }
        }
    }

    while (! operatorStack.empty()){
        topTeken = operatorStack.top();
        operatorStack.pop();
        postfix = postfix + topTeken;
    }
    //cout<<"infix: "<<infix<<endl;
    //cout<<"postfix: "<<postfix<<endl;
    this->strict(postfix);
}



Onderstaande code gebruik ik moet de postfix expressie te evalueren.
C++:
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
void Lezer::strict(string postfix){
    stack< Impedantie > stack;
    unsigned int k;
    char teken;
    for (k = 0; k < postfix.size(); k++){
        teken = postfix[k];
        if(isOperand(teken)){
            switch(teken){
                case 'X':
                    stack.push(x.geefComplex());
                    break;
                case 'Y':
                    stack.push(y.geefComplex());
                    break;
                case 'Z':
                    stack.push(z.geefComplex());
                    break;
                default :
                    break;
            }
        } else {
            Impedantie imp1 = stack.top();
            stack.pop();

            Impedantie imp2 = stack.top();
            stack.pop();

            Impedantie imp3 = berekenen (imp1, teken, imp2);
            stack.push(imp3);
        }
    }
    Impedantie antwoord = stack.top();

    cout<<"Het antwoord is: "<<antwoord<<endl;
}

Boolean Lezer::isOperand (char teken ){
    return (teken == 'X' || teken == 'Y' || teken == 'Z') ? True : False ;
}

Boolean Lezer::voorrangsRegels(char OperatorA, char OperatorB){
    if (OperatorA == '(')
        return False;
    else if (OperatorB == '(')
        return False;
    else if (OperatorB == ')')
        return True;
    else if ((OperatorA == '^') && (OperatorB == '^'))
        return False;
    else if (OperatorA == '^')
        return True;
    else if (OperatorB == '^')
        return False;
    else if ((OperatorA == '*') || (OperatorA == '/'))
        return True;
    else if ((OperatorB == '*') || (OperatorB == '/'))
        return False;
    else
    return True;
}

[ Voor 9% gewijzigd door Neptunus op 03-03-2005 23:52 ]


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-04 22:08
Andere mensen kunnen misschien beter de code uit de Adobe Open Source Software Library gebruiken.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein

Pagina: 1