A
anglin1024
Guest
Koda:
/ *
A Simple izražanja ocenjevalec, ki uporabi Vplivajo na postfix Znakovnik
za oceno izražanja.
Še žuželke, ki morajo biti fiksne!
V.0.2 -> Za ravnanje izvajalca anomalije, kot so:
-7 *- 4 in 2 * (-5 6)
* /# vključujejo <iostream>
# vključujejo <sstream>
# vključujejo <string>
# vključujejo <stack>
# vključujejo <vector>
# vključujejo <math.h>
# define PI 3.14159265uporabo namespace STD;
/ / funkcija izjave
neveljaven Convert (const string & Vsadek, string & postfix);
bool IsOperand (char ch);
bool TakesPrecedence (char Operatora, char OperatorB);/ * Moje naloge sem doda * /
string Change_me (string);
string Insert_comma (string);
bool Check_valid (string);
dvojno Eval (string []);
Naslednji neveljaven (string);int Main ()
(char odgovor;narediti
(
string Vsadek, postfix; / / lokalne zanke s temsodišče << "\ n Vpišite vaš izraz, s št presledkov! \ n \ n";
sodišče << "npr (4 2) * 3 / 2" <<endl;
sodišče << "Unknown spremenljivke, kot so" a "in" x "ni dovoljeno: \ n \ n>>";
cin>> Vsadek;if (Check_valid (Vsadek) == true)
(string temp;
temp = Change_me (Vsadek);
/ / sodišče <<temp;
/ / cin.get ();Pretvarjanje (temp, postfix);sodišče << "Protivrednost postfix izraz je:" <<endl
<<Insert_comma (postfix);string držite;
drži = Insert_comma (postfix);sodišče << "\ n \ nThe odgovor:";
Naslednja (držite);sodišče <<endl << "\ nAli drugo (Y / N)?";
cin>> odgovor;
)
še
(
sodišče <<"*** syntax error *** \ n ";
sodišče <<endl << "Ali drugo (Y / N)?";
cin>> odgovor
) hkrati (tolower (odgovor) == 'y');vrnitev 0;
)/ * Ker: ch A značaja.
Naloga: Če želite ugotoviti, ali ch predstavlja operanda (tukaj razumeti
da je ena črka ali števka).
Nazaj: V funkcijo ime: true, če je ch operanda, false sicer.
* /
bool IsOperand (char ch)
(
if (((ch> = 'a') & & (ch <= 'z')) | |
((ch> = 'A') & & (ch <= 'Z')) | |
((ch> ='0 ') & & (ch <='9')))
return true;
še
return false;
)/ * Ker: Operatora A značaja predstavlja operator ali oklepajev.
OperatorB znak predstavlja operator ali oklepajev.
Naloga: Če želite ugotoviti, ali Operatora prevlada nad OperatorB.
Nazaj: V funkcijo ime: true, če Operatora prevlada nad
OperatorB.
* /
bool TakesPrecedence (char Operatora, char OperatorB)
(
if (Operatora == '(')
return false;
drugje, če (OperatorB == '(')
return false;
drugje, če (OperatorB == ")")
return true;
drugega if ((Operatora == '^') & & (OperatorB =='^'))
return false;
drugje, če (Operatora == '^')
return true;
drugje, če (OperatorB == '^')
return false;
drugega if ((Operatora == '*') | | (Operatora =='/'))
return true;
drugega if ((OperatorB == '*') | | (OperatorB =='/'))
return false;
še
return true
/ * Ker: Vsadek A string predstavlja Vsadek izražanja (brez presledkov).
Naloga: Če želite poiskati postfix ekvivalent ta izraz.
Nazaj: postfix A string gospodarstvu to postfix enakovredne.
* /
neveljaven Convert (const string & Vsadek, string & postfix)
(
odvodnikom <char> OperatorStack;
char TopSymbol, simbolov;
int k;for (k = 0; K <Infix.size (), K )
(
Symbol = Zasidrati [k];
if (IsOperand (Symbol))
Postfix postfix = simbol;
še
(
medtem ko ((! OperatorStack.empty ()) & &
(TakesPrecedence (OperatorStack.top (), Symbol)))
(
TopSymbol = OperatorStack.top ();
OperatorStack.pop ();
Postfix = postfix TopSymbol;
)
if ((! OperatorStack.empty ()) & & (Symbol ==')'))
OperatorStack.pop (); / / zavreči ujemanja (
še
OperatorStack.push (Symbol);
)
)medtem ko je (! OperatorStack.empty ())
(
TopSymbol = OperatorStack.top ();
OperatorStack.pop ();
Postfix = postfix TopSymbol;
)
)
/*---------------------------------------------
Moje funkcije, potrebne za tokenise izraz--------------------------------------------*/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, "proti");
/ / v je samo poljubno izbiro
/ / to lahko katera koli druga črka
/ / vendar pa mora biti DOPISA)
)
)
/ / Changed -7 *- 7 primera
for (int i = 0; i <my_string.length (); i )
(
if (my_string =='-')
(
if ((my_string [i-1]! = "proti')&&( my_string [i-1 ]!=')'))
(
my_string.replace (i, 1, "Y");
)
)
)vrnitev my_string;
)/*-----------------------------------------
Moja funkcija potrebna za izraz tokenise
-----------------------------------------*/
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, ",");
/ / Insert a comma po vseh
/ / najti izvajalcev
)
drugje, če (my_string == 'v')
(
my_string.replace (i, 1 ,",");
/ / nadomestitev proti z vejicami
/ / zaradi jasnosti
)
)
/ / Changed
for (int i = 0; i <my_string.length (); i )
(
if (my_string == 'y')
(
my_string.replace (i, 1 ,"-");
)
)
vrnitev my_string;
)/*-----------------------------------------
Moja naloga je preveriti, da ne spremenljivke
so bili vneseni
-----------------------------------------*/
bool Check_valid (string my_string)
(
/ / Changed preverite, zaporedna ' ', '-'
/ / znaki ne obstajajo
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 niz = "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 == niz [j])
(
count ;
)
)
)if (count == my_string.length ())
(
return true;
)
še
(
return false;
))/*-----------------------------------
Moja funkcija na dejansko ocenijo
postfix izražanja
----------------------------------*/Naslednji neveljaven (string my_string)
(
vektor <string> niz;
string tempy;int comma_count = 0;
for (int a = 0; a <my_string.length (); a )
(
if (my_string [a ]==',')
(
comma_count ;
)
)/ / Ocenite žetoni z uporabo "," kot razdjeljnik
medtem ko (my_string.find (",", 0)! = string:: NPO)
(
/ / odpravili iz FAQ
/ / ne niza so vejico v to?
size_t pos = my_string.find (",", 0);
tempy = my_string.substr (0, pos);
my_string.erase (0, pos 1);
array.push_back (tempy); / / shranimo v vektor
)/ / array.push_back (my_string); / / zadnji znak je vse samoodvodnikom <string> my_stack; / / Initialise Dimnjak
string temp [100];
string ch;for (int i = 0; i <comma_count; i )
(string s;
s = array; / / razumljivostif ((e !=" ")&&
(e !="*")&&
(e !="-")&&
(e !="/")&&
(e !="^")&&
(e! = "c"))
(
my_stack.push (-ov);
/ / push številke na stack
)
drug / / to je če naleti na operator
(
my_stack.push (-ov); / / push operater na stack
temp [0] = my_stack.top ();// hranite vrednost
my_stack.pop (); / / brisanje iz dimnikatemp [1] = my_stack.top ();// hranite vrednost
my_stack.pop ();// izbrisati iz dimnikatemp [2] = my_stack.top ();// hranite vrednost
my_stack.pop ();// izbrisati iz dimnikaz dvojno;
z = Eval (temp);
ostringstream outs; / / Ugotovi izhodno string toka.
outs <<z; / / vrednost pretvorimo v niz.
ch = outs.str ();my_stack.push (ch)
)
sodišče <<ch;
cin.get ();
)
/*------------------------------
Moja naloga je narediti matematiko:
Pretvori niz dvojno
potem nazaj v string
------------------------------*/
dvojno Eval (string temp [])
(
string a, b, c;
a = temp [2]; b = temp [0]; c = temp [1];
dvojno x, y, z, t;
istringstream ins, inse;
ins.str (a); inse.str (c);
ins>> x;
inse>> y;if (b ==" ")
(
z = x y;
vrnitvi z;
)
drugje, če (b =="-")
(
z = x - y;
vrnitvi z;
)
drugje, če (b =="*")
(
z = x * y;
vrnitvi z;
)
drugje, če (b =="/")
(
z = x / y;
vrnitvi z;
)
drugje, če (b =="^")
(
z = POW (x, y);
vrnitvi z;
)
drugega if (b == "c")
(
t = cos (x * PI/180);
y z = t;
vrnitvi z;
)
)
/ *
A Simple izražanja ocenjevalec, ki uporabi Vplivajo na postfix Znakovnik
za oceno izražanja.
Še žuželke, ki morajo biti fiksne!
V.0.2 -> Za ravnanje izvajalca anomalije, kot so:
-7 *- 4 in 2 * (-5 6)
* /# vključujejo <iostream>
# vključujejo <sstream>
# vključujejo <string>
# vključujejo <stack>
# vključujejo <vector>
# vključujejo <math.h>
# define PI 3.14159265uporabo namespace STD;
/ / funkcija izjave
neveljaven Convert (const string & Vsadek, string & postfix);
bool IsOperand (char ch);
bool TakesPrecedence (char Operatora, char OperatorB);/ * Moje naloge sem doda * /
string Change_me (string);
string Insert_comma (string);
bool Check_valid (string);
dvojno Eval (string []);
Naslednji neveljaven (string);int Main ()
(char odgovor;narediti
(
string Vsadek, postfix; / / lokalne zanke s temsodišče << "\ n Vpišite vaš izraz, s št presledkov! \ n \ n";
sodišče << "npr (4 2) * 3 / 2" <<endl;
sodišče << "Unknown spremenljivke, kot so" a "in" x "ni dovoljeno: \ n \ n>>";
cin>> Vsadek;if (Check_valid (Vsadek) == true)
(string temp;
temp = Change_me (Vsadek);
/ / sodišče <<temp;
/ / cin.get ();Pretvarjanje (temp, postfix);sodišče << "Protivrednost postfix izraz je:" <<endl
<<Insert_comma (postfix);string držite;
drži = Insert_comma (postfix);sodišče << "\ n \ nThe odgovor:";
Naslednja (držite);sodišče <<endl << "\ nAli drugo (Y / N)?";
cin>> odgovor;
)
še
(
sodišče <<"*** syntax error *** \ n ";
sodišče <<endl << "Ali drugo (Y / N)?";
cin>> odgovor
)/ * Ker: ch A značaja.
Naloga: Če želite ugotoviti, ali ch predstavlja operanda (tukaj razumeti
da je ena črka ali števka).
Nazaj: V funkcijo ime: true, če je ch operanda, false sicer.
* /
bool IsOperand (char ch)
(
if (((ch> = 'a') & & (ch <= 'z')) | |
((ch> = 'A') & & (ch <= 'Z')) | |
((ch> ='0 ') & & (ch <='9')))
return true;
še
return false;
)/ * Ker: Operatora A značaja predstavlja operator ali oklepajev.
OperatorB znak predstavlja operator ali oklepajev.
Naloga: Če želite ugotoviti, ali Operatora prevlada nad OperatorB.
Nazaj: V funkcijo ime: true, če Operatora prevlada nad
OperatorB.
* /
bool TakesPrecedence (char Operatora, char OperatorB)
(
if (Operatora == '(')
return false;
drugje, če (OperatorB == '(')
return false;
drugje, če (OperatorB == ")")
return true;
drugega if ((Operatora == '^') & & (OperatorB =='^'))
return false;
drugje, če (Operatora == '^')
return true;
drugje, če (OperatorB == '^')
return false;
drugega if ((Operatora == '*') | | (Operatora =='/'))
return true;
drugega if ((OperatorB == '*') | | (OperatorB =='/'))
return false;
še
return true
Naloga: Če želite poiskati postfix ekvivalent ta izraz.
Nazaj: postfix A string gospodarstvu to postfix enakovredne.
* /
neveljaven Convert (const string & Vsadek, string & postfix)
(
odvodnikom <char> OperatorStack;
char TopSymbol, simbolov;
int k;for (k = 0; K <Infix.size (), K )
(
Symbol = Zasidrati [k];
if (IsOperand (Symbol))
Postfix postfix = simbol;
še
(
medtem ko ((! OperatorStack.empty ()) & &
(TakesPrecedence (OperatorStack.top (), Symbol)))
(
TopSymbol = OperatorStack.top ();
OperatorStack.pop ();
Postfix = postfix TopSymbol;
)
if ((! OperatorStack.empty ()) & & (Symbol ==')'))
OperatorStack.pop (); / / zavreči ujemanja (
še
OperatorStack.push (Symbol);
)
)medtem ko je (! OperatorStack.empty ())
(
TopSymbol = OperatorStack.top ();
OperatorStack.pop ();
Postfix = postfix TopSymbol;
)
)
/*---------------------------------------------
Moje funkcije, potrebne za tokenise izraz--------------------------------------------*/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, "proti");
/ / v je samo poljubno izbiro
/ / to lahko katera koli druga črka
/ / vendar pa mora biti DOPISA)
)
)
/ / Changed -7 *- 7 primera
for (int i = 0; i <my_string.length (); i )
(
if (my_string =='-')
(
if ((my_string [i-1]! = "proti')&&( my_string [i-1 ]!=')'))
(
my_string.replace (i, 1, "Y");
)
)
)vrnitev my_string;
)/*-----------------------------------------
Moja funkcija potrebna za izraz tokenise
-----------------------------------------*/
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, ",");
/ / Insert a comma po vseh
/ / najti izvajalcev
)
drugje, če (my_string == 'v')
(
my_string.replace (i, 1 ,",");
/ / nadomestitev proti z vejicami
/ / zaradi jasnosti
)
)
/ / Changed
for (int i = 0; i <my_string.length (); i )
(
if (my_string == 'y')
(
my_string.replace (i, 1 ,"-");
)
)
vrnitev my_string;
)/*-----------------------------------------
Moja naloga je preveriti, da ne spremenljivke
so bili vneseni
-----------------------------------------*/
bool Check_valid (string my_string)
(
/ / Changed preverite, zaporedna ' ', '-'
/ / znaki ne obstajajo
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 niz = "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 == niz [j])
(
count ;
)
)
)if (count == my_string.length ())
(
return true;
)
še
(
return false;
))/*-----------------------------------
Moja funkcija na dejansko ocenijo
postfix izražanja
----------------------------------*/Naslednji neveljaven (string my_string)
(
vektor <string> niz;
string tempy;int comma_count = 0;
for (int a = 0; a <my_string.length (); a )
(
if (my_string [a ]==',')
(
comma_count ;
)
)/ / Ocenite žetoni z uporabo "," kot razdjeljnik
medtem ko (my_string.find (",", 0)! = string:: NPO)
(
/ / odpravili iz FAQ
/ / ne niza so vejico v to?
size_t pos = my_string.find (",", 0);
tempy = my_string.substr (0, pos);
my_string.erase (0, pos 1);
array.push_back (tempy); / / shranimo v vektor
)/ / array.push_back (my_string); / / zadnji znak je vse samoodvodnikom <string> my_stack; / / Initialise Dimnjak
string temp [100];
string ch;for (int i = 0; i <comma_count; i )
(string s;
s = array; / / razumljivostif ((e !=" ")&&
(e !="*")&&
(e !="-")&&
(e !="/")&&
(e !="^")&&
(e! = "c"))
(
my_stack.push (-ov);
/ / push številke na stack
)
drug / / to je če naleti na operator
(
my_stack.push (-ov); / / push operater na stack
temp [0] = my_stack.top ();// hranite vrednost
my_stack.pop (); / / brisanje iz dimnikatemp [1] = my_stack.top ();// hranite vrednost
my_stack.pop ();// izbrisati iz dimnikatemp [2] = my_stack.top ();// hranite vrednost
my_stack.pop ();// izbrisati iz dimnikaz dvojno;
z = Eval (temp);
ostringstream outs; / / Ugotovi izhodno string toka.
outs <<z; / / vrednost pretvorimo v niz.
ch = outs.str ();my_stack.push (ch)
)
sodišče <<ch;
cin.get ();
)
/*------------------------------
Moja naloga je narediti matematiko:
Pretvori niz dvojno
potem nazaj v string
------------------------------*/
dvojno Eval (string temp [])
(
string a, b, c;
a = temp [2]; b = temp [0]; c = temp [1];
dvojno x, y, z, t;
istringstream ins, inse;
ins.str (a); inse.str (c);
ins>> x;
inse>> y;if (b ==" ")
(
z = x y;
vrnitvi z;
)
drugje, če (b =="-")
(
z = x - y;
vrnitvi z;
)
drugje, če (b =="*")
(
z = x * y;
vrnitvi z;
)
drugje, če (b =="/")
(
z = x / y;
vrnitvi z;
)
drugje, če (b =="^")
(
z = POW (x, y);
vrnitvi z;
)
drugega if (b == "c")
(
t = cos (x * PI/180);
y z = t;
vrnitvi z;
)
)