A
anglin1024
Guest
Code:
/ *
A Simple uttrykk evaluator som bruker Infix til postfix notevisning
å vurdere et uttrykk.
Likevel har feil som må fast!
V.0.2 -> For å kunne håndtere operatør anomalies som:
-7 *- 4 og 2 * (-5 6)
* /# include <iostream>
# include <sstream>
# include <string>
# include <stack>
# include <vector>
# include <math.h>
# define PI 3.14159265bruker namespace std;
/ / funksjon declarations
void Konverter (const string & Infix, streng & Postfix);
bool IsOperand (char ch);
bool TakesPrecedence (char OperatorA, char OperatorB);/ * Min funksjoner jeg har lagt * /
string Change_me (string);
string Insert_comma (string);
bool Check_valid (string);
double eval (string []);
void Neste (string);int main ()
(char Svar;gjøre
(
string Infix, Postfix; / / lokale til dette loopdomstol << "\ n Angi uttrykk med ingen mellomrom! \ n \ n";
domstol << "f.eks (4 2) * 3 / 2" <<endl;
domstol << "Ukjent variabler som 'en' og 'x' er ikke tillatt: \ n \ n>>";
CIN>> Infix;if (Check_valid (Infix) == true)
(string temp;
temp = Change_me (Infix);
/ / domstol <<temp;
/ / cin.get ();Konverter (temp, Postfix);domstol << "Den tilsvarende postfix uttrykket:" <<endl
<<Insert_comma (Postfix);string hold;
hold = Insert_comma (Postfix);domstol << "\ n \ nDe Svaret er:";
Neste (hold);domstol <<endl << "\ Angre en annen (J / N)?";
CIN>> Svar;
)
ellers
(
domstol <<"*** Syntaksfeil *** \ n ";
domstol <<endl << "Gjør en annen (J / N)?";
CIN>> Svar) while (tolower (Svar) == "y");return 0;
)/ * Gitt: Ka karakter.
Oppgave: å finne ut om ka representerer en operand (her forstått
å være et enkelt bokstav eller siffer).
Returadresse: I funksjon navn: sant, hvis ka er en operand, false ellers.
* /
bool IsOperand (char ch)
(
if (((x> = 'A') & & (x <= 'z')) | |
((x> = 'A') & & (x <= 'Z')) | |
((x> ='0 ') & & (x <='9')))
return true;
ellers
return false;
)/ * Gitt: OperatorA et tegn representerer en operatør eller parentes.
OperatorB et tegn som representerer en operatør eller parentes.
Oppgave: å finne ut om OperatorA tar foran OperatorB.
Returadresse: I funksjon navn: sant, hvis OperatorA tar foran
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;
ellers
return true/ * Gitt: Infix En streng som representerer en Infix uttrykk (ingen mellomrom).
Oppgave: å finne postfix tilsvarer dette uttrykket.
Retur: Postfix En streng holde denne postfix tilsvarende.
* /
void Konverter (const string & Infix, streng & Postfix)
(
stabelen <char> OperatorStack;
char TopSymbol, Symbol;
int k;for (k = 0; k <Infix.size (); k )
(
Symbol = Infix [k];
if (IsOperand (symbol))
Postfix = Postfix Symbol;
ellers
(
while ((! OperatorStack.empty ()) & &
(TakesPrecedence (OperatorStack.top (), Symbol)))
(
TopSymbol = OperatorStack.top ();
OperatorStack.pop ();
Postfix = Postfix TopSymbol;
)
if ((! OperatorStack.empty ()) & & (Symbol ==')'))
OperatorStack.pop (); / / forkaste søkeord (
ellers
OperatorStack.push (Symbol);
)
)while (! OperatorStack.empty ())
(
TopSymbol = OperatorStack.top ();
OperatorStack.pop ();
Postfix = Postfix TopSymbol;
)
)
/*---------------------------------------------
Min funksjon er nødvendig for å tokenise uttrykket--------------------------------------------*/string Change_me (string my_string)
(for (int i = 0; i <my_string.length (); i )
(
if (isdigit (my_string)! = 0)
(
if (isdigit (my_string [i 1]) == 0)
(
my_string.insert (i 1, "v");
/ / v er bare et tilfeldig utvalg
/ / det kan være andre brev
/ / men det må være en bokstav)
)
)
/ / Changed -7 *- 7 saken
for (int i = 0; i <my_string.length (); i )
(
if (my_string =='-')
(
if ((my_string [i-1]! = 'v')&&( my_string [i-1 ]!=')'))
(
my_string.replace (i, 1, "y");
)
)
)return my_string;
)/*-----------------------------------------
Min funksjon er nødvendig for å tokenise uttrykk
-----------------------------------------*/
string Insert_comma (string my_string)
(
for (int i = 0; i <my_string.length (); i )
(
if ((my_string =='*')||
(my_string =='-')||
(my_string =='/')||
(my_string ==' ')||
(my_string =='^')||
(my_string == 'c'))
(
my_string.insert (i 1, ",");
/ / Sett inn et komma etter alle
/ / funnet operatører
)
else if (my_string == 'v')
(
my_string.replace (i, 1 ,",");
/ / erstatte v med komma
/ / for klarhet
)
)
/ / Changed
for (int i = 0; i <my_string.length (); i )
(
if (my_string == "y")
(
my_string.replace (i, 1 ,"-");
)
)
return my_string;
)/*-----------------------------------------
Min funksjon for å sjekke at ingen variabler
ble angitt
-----------------------------------------*/
bool Check_valid (string my_string)
(
/ / Changed kontrollere at etterfølgende ' ', '-'
/ / skilter ikke finnes
for (int i = 0; i <my_string.length (); i )
(
if ((my_string ==' ')||( my_string =='-'))
(
if ((my_string [i 1 ]==' ')||( my_string [i 1 ]=='-'))
(
return false;
)
)
)string array = "0123456789 -*/()^ c";int count = 0;
for (int i = 0; i <my_string.length (); i )
(
for (int j = 0; j <array.length (); j )
(
if (my_string == array [j])
(
count ;
)
)
)if (count == my_string.length ())
(
return true;
)
ellers
(
return false;
))/*-----------------------------------
Min funksjon til å evaluere
postfix uttrykk
----------------------------------*/void Neste (string my_string)
(
vektoren <string> array;
string tempy;int comma_count = 0;
for (int a = 0; a <my_string.length (); en )
(
if (my_string [a ]==',')
(
comma_count ;
)
)/ / Evaluer tokenene bruker "," som skilletegn
while (my_string.find (",", 0)! = string:: npos)
(
/ / løftes fra FAQ
/ / does strengen har et komma i den?
size_t pos = my_string.find (",", 0);
tempy = my_string.substr (0, pos);
my_string.erase (0, pos 1);
array.push_back (tempy); / / lagre i vektoren
)/ / array.push_back (my_string); / / siste token er helt alenestabelen <string> my_stack; / / initialise stabel
string temp [100];
string ch;for (int i = 0; i <comma_count; i )
(string s;
s = array; / / gjøre det lettere å leseif ((s !=" ")&&
(s !="*")&&
(s !="-")&&
(s !="/")&&
(s !="^")&&
(s! = "c"))
(
my_stack.push (s);
/ / push tall på stakken
)
else / / dvs. hvis det oppstår en operatør
(
my_stack.push (s); / / push operatør på stakken
temp [0] = my_stack.top ();// store verdier
my_stack.pop (); / / slette fra bunkentemp [1] = my_stack.top ();// store verdier
my_stack.pop ();// slette fra bunkentemp [2] = my_stack.top ();// store verdier
my_stack.pop ();// slette fra bunkendouble z;
z = eval (temp);
ostringstream outs; / / erklære en utgang streng strømmen.
outs <<z; / / Konverter verdien i en streng.
ch = outs.str ();my_stack.push (ch)
)
domstol <<ch;
cin.get ();
)
/*------------------------------
Min funksjon for å gjøre regnestykket:
Konverterer streng å dobbeltsjekke
deretter tilbake til strengen
------------------------------*/
double eval (string temp [])
(
string a, b, c;
a = temp [2], b = temp [0]; c = temp [1];
double x, y, z, t;
istringstream moduler inse;
ins.str (a); inse.str (c);
ins>> x;
inse>> y;if (b ==" ")
(
z = x y;
return z;
)
else if (b =="-")
(
z = x - y;
return z;
)
else if (b =="*")
(
z = x * y;
return z;
)
else if (b =="/")
(
z = x / y;
return z;
)
else if (b =="^")
(
z = POW (x, y);
return z;
)
else if (b == "c")
(
t = cos (x * PI/180);
z = y t;
return z;
)
)
/ *
A Simple uttrykk evaluator som bruker Infix til postfix notevisning
å vurdere et uttrykk.
Likevel har feil som må fast!
V.0.2 -> For å kunne håndtere operatør anomalies som:
-7 *- 4 og 2 * (-5 6)
* /# include <iostream>
# include <sstream>
# include <string>
# include <stack>
# include <vector>
# include <math.h>
# define PI 3.14159265bruker namespace std;
/ / funksjon declarations
void Konverter (const string & Infix, streng & Postfix);
bool IsOperand (char ch);
bool TakesPrecedence (char OperatorA, char OperatorB);/ * Min funksjoner jeg har lagt * /
string Change_me (string);
string Insert_comma (string);
bool Check_valid (string);
double eval (string []);
void Neste (string);int main ()
(char Svar;gjøre
(
string Infix, Postfix; / / lokale til dette loopdomstol << "\ n Angi uttrykk med ingen mellomrom! \ n \ n";
domstol << "f.eks (4 2) * 3 / 2" <<endl;
domstol << "Ukjent variabler som 'en' og 'x' er ikke tillatt: \ n \ n>>";
CIN>> Infix;if (Check_valid (Infix) == true)
(string temp;
temp = Change_me (Infix);
/ / domstol <<temp;
/ / cin.get ();Konverter (temp, Postfix);domstol << "Den tilsvarende postfix uttrykket:" <<endl
<<Insert_comma (Postfix);string hold;
hold = Insert_comma (Postfix);domstol << "\ n \ nDe Svaret er:";
Neste (hold);domstol <<endl << "\ Angre en annen (J / N)?";
CIN>> Svar;
)
ellers
(
domstol <<"*** Syntaksfeil *** \ n ";
domstol <<endl << "Gjør en annen (J / N)?";
CIN>> Svar) while (tolower (Svar) == "y");return 0;
)/ * Gitt: Ka karakter.
Oppgave: å finne ut om ka representerer en operand (her forstått
å være et enkelt bokstav eller siffer).
Returadresse: I funksjon navn: sant, hvis ka er en operand, false ellers.
* /
bool IsOperand (char ch)
(
if (((x> = 'A') & & (x <= 'z')) | |
((x> = 'A') & & (x <= 'Z')) | |
((x> ='0 ') & & (x <='9')))
return true;
ellers
return false;
)/ * Gitt: OperatorA et tegn representerer en operatør eller parentes.
OperatorB et tegn som representerer en operatør eller parentes.
Oppgave: å finne ut om OperatorA tar foran OperatorB.
Returadresse: I funksjon navn: sant, hvis OperatorA tar foran
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;
ellers
return true/ * Gitt: Infix En streng som representerer en Infix uttrykk (ingen mellomrom).
Oppgave: å finne postfix tilsvarer dette uttrykket.
Retur: Postfix En streng holde denne postfix tilsvarende.
* /
void Konverter (const string & Infix, streng & Postfix)
(
stabelen <char> OperatorStack;
char TopSymbol, Symbol;
int k;for (k = 0; k <Infix.size (); k )
(
Symbol = Infix [k];
if (IsOperand (symbol))
Postfix = Postfix Symbol;
ellers
(
while ((! OperatorStack.empty ()) & &
(TakesPrecedence (OperatorStack.top (), Symbol)))
(
TopSymbol = OperatorStack.top ();
OperatorStack.pop ();
Postfix = Postfix TopSymbol;
)
if ((! OperatorStack.empty ()) & & (Symbol ==')'))
OperatorStack.pop (); / / forkaste søkeord (
ellers
OperatorStack.push (Symbol);
)
)while (! OperatorStack.empty ())
(
TopSymbol = OperatorStack.top ();
OperatorStack.pop ();
Postfix = Postfix TopSymbol;
)
)
/*---------------------------------------------
Min funksjon er nødvendig for å tokenise uttrykket--------------------------------------------*/string Change_me (string my_string)
(for (int i = 0; i <my_string.length (); i )
(
if (isdigit (my_string)! = 0)
(
if (isdigit (my_string [i 1]) == 0)
(
my_string.insert (i 1, "v");
/ / v er bare et tilfeldig utvalg
/ / det kan være andre brev
/ / men det må være en bokstav)
)
)
/ / Changed -7 *- 7 saken
for (int i = 0; i <my_string.length (); i )
(
if (my_string =='-')
(
if ((my_string [i-1]! = 'v')&&( my_string [i-1 ]!=')'))
(
my_string.replace (i, 1, "y");
)
)
)return my_string;
)/*-----------------------------------------
Min funksjon er nødvendig for å tokenise uttrykk
-----------------------------------------*/
string Insert_comma (string my_string)
(
for (int i = 0; i <my_string.length (); i )
(
if ((my_string =='*')||
(my_string =='-')||
(my_string =='/')||
(my_string ==' ')||
(my_string =='^')||
(my_string == 'c'))
(
my_string.insert (i 1, ",");
/ / Sett inn et komma etter alle
/ / funnet operatører
)
else if (my_string == 'v')
(
my_string.replace (i, 1 ,",");
/ / erstatte v med komma
/ / for klarhet
)
)
/ / Changed
for (int i = 0; i <my_string.length (); i )
(
if (my_string == "y")
(
my_string.replace (i, 1 ,"-");
)
)
return my_string;
)/*-----------------------------------------
Min funksjon for å sjekke at ingen variabler
ble angitt
-----------------------------------------*/
bool Check_valid (string my_string)
(
/ / Changed kontrollere at etterfølgende ' ', '-'
/ / skilter ikke finnes
for (int i = 0; i <my_string.length (); i )
(
if ((my_string ==' ')||( my_string =='-'))
(
if ((my_string [i 1 ]==' ')||( my_string [i 1 ]=='-'))
(
return false;
)
)
)string array = "0123456789 -*/()^ c";int count = 0;
for (int i = 0; i <my_string.length (); i )
(
for (int j = 0; j <array.length (); j )
(
if (my_string == array [j])
(
count ;
)
)
)if (count == my_string.length ())
(
return true;
)
ellers
(
return false;
))/*-----------------------------------
Min funksjon til å evaluere
postfix uttrykk
----------------------------------*/void Neste (string my_string)
(
vektoren <string> array;
string tempy;int comma_count = 0;
for (int a = 0; a <my_string.length (); en )
(
if (my_string [a ]==',')
(
comma_count ;
)
)/ / Evaluer tokenene bruker "," som skilletegn
while (my_string.find (",", 0)! = string:: npos)
(
/ / løftes fra FAQ
/ / does strengen har et komma i den?
size_t pos = my_string.find (",", 0);
tempy = my_string.substr (0, pos);
my_string.erase (0, pos 1);
array.push_back (tempy); / / lagre i vektoren
)/ / array.push_back (my_string); / / siste token er helt alenestabelen <string> my_stack; / / initialise stabel
string temp [100];
string ch;for (int i = 0; i <comma_count; i )
(string s;
s = array; / / gjøre det lettere å leseif ((s !=" ")&&
(s !="*")&&
(s !="-")&&
(s !="/")&&
(s !="^")&&
(s! = "c"))
(
my_stack.push (s);
/ / push tall på stakken
)
else / / dvs. hvis det oppstår en operatør
(
my_stack.push (s); / / push operatør på stakken
temp [0] = my_stack.top ();// store verdier
my_stack.pop (); / / slette fra bunkentemp [1] = my_stack.top ();// store verdier
my_stack.pop ();// slette fra bunkentemp [2] = my_stack.top ();// store verdier
my_stack.pop ();// slette fra bunkendouble z;
z = eval (temp);
ostringstream outs; / / erklære en utgang streng strømmen.
outs <<z; / / Konverter verdien i en streng.
ch = outs.str ();my_stack.push (ch)
)
domstol <<ch;
cin.get ();
)
/*------------------------------
Min funksjon for å gjøre regnestykket:
Konverterer streng å dobbeltsjekke
deretter tilbake til strengen
------------------------------*/
double eval (string temp [])
(
string a, b, c;
a = temp [2], b = temp [0]; c = temp [1];
double x, y, z, t;
istringstream moduler inse;
ins.str (a); inse.str (c);
ins>> x;
inse>> y;if (b ==" ")
(
z = x y;
return z;
)
else if (b =="-")
(
z = x - y;
return z;
)
else if (b =="*")
(
z = x * y;
return z;
)
else if (b =="/")
(
z = x / y;
return z;
)
else if (b =="^")
(
z = POW (x, y);
return z;
)
else if (b == "c")
(
t = cos (x * PI/180);
z = y t;
return z;
)
)