A
anglin1024
Guest
Kód:
/ *
A jednoduchá vyjadrenie hodnotiteľa, ktorý využíva Infixová na postfix notation
na vyhodnotenie výrazu.
Má stále chyby, ktoré musia byť pevné!
V.0.2 -> Chcete spracovať prevádzkovateľ anomálie, ako sú:
-7 *- 4 a 2 * (-5 6)
* /# Include <iostream>
# Include <sstream>
# Include <string>
# Include <stack>
# Include <vector>
# Include <math.h>
# Define PI 3.14159265použitím namespace std;
/ / Funkcie vyhlásenie
void Konvertova (const & Infixová reťazec, reťazec & Postfix);
bool IsOperand (char ch);
bool TakesPrecedence (char Operatora, char OperatorB);/ * Moja funkcia jsem pridanú * /
Change_me reťazec (string);
Insert_comma reťazec (string);
bool Check_valid (string);
dvojlôžková Eval (string []);
Ďalšie void (string);int main ()
(Odpovedať char;robiť
(
Reťazec Infixová, Postfix, / / miestna slučkaSúd << "\ n Zadajte výraz bez medzier! \ N \ n";
Súd << ", napríklad (4 2) * 3 / 2" <<Endl;
Súd << "neznáme premenné, ako je 'a' a 'x' nie sú povolené: \ n \ n>>";
cin>> Infixová;if (Check_valid (Infixová) == true)
(Reťazec temp;
temp = Change_me (Infixová);
/ / Súd <<temp;
/ / Cin.get ();Premeniť (temp, Postfix);Súd << "Rovnocenné postfixovou prejavu:" <<Endl
<<Insert_comma (Postfix);Reťazec hold;
držať = Insert_comma (Postfix);Súd << "\ n \ nThe odpoveď je:";
Ďalšie (hold);Súd <<Endl << "\ NDO iné (y / n)?"
cin>> Odpovedať;
)
iné
(
Súd <<"*** Syntaktická chyba *** \ n ";
Súd <<Endl << "Do iného (y / n)?"
cin>> Odpovedať
) While (tolower (Odpoveď) == 'y');return 0;
)/ * Vzhľadom k tomu: CH A charakter.
Úloha: zistiť, či ch predstavuje operande (tu chápaná
je jediné písmeno alebo číslicu).
Návrat: Vo funkcii meno: true, ak ch je operand, falošné inak.
* /
bool IsOperand (char ch)
(
if (((ch> = 'a') & & (ch <= 'z')) | |
((ch> = 'A') & & (ch <= 'Z')) | |
((ch> ='0 ') & & (ch <='9')))
return true;
iné
return false;
)/ * Vzhľadom k tomu: Operatora A znak zastupujúci prevádzkovateľa alebo zátvorky.
A OperatorB znak zastupujúci prevádzkovateľa alebo zátvorky.
Úloha: zistiť, či Operatora je nadriadená OperatorB.
Návrat: Vo funkcii meno: true, ak Operatora je nadriadená
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;
iné
return true
/ * Vzhľadom k tomu: Infixová Reťazec predstavujúce Infixová výraz (bez medzier).
Úloha: Ak chcete nájsť postfixovou ekvivalent tohto výrazu.
Návrat: Postfix Reťazec zorganizovať túto postfixovou ekvivalent.
* /
void Konvertova (const & Infixová reťazec, reťazec & Postfix)
(
zásobník <char> OperatorStack;
char TopSymbol, symbol;
int k;for (k = 0, k <Infix.size (); k )
(
Symbol = Infixová [k];
if (IsOperand (Symbol))
Postfix Postfix = symbol;
iné
(
while ((! OperatorStack.empty ()) & &
(TakesPrecedence (OperatorStack.top (), Symbol)))
(
TopSymbol = OperatorStack.top ();
OperatorStack.pop ();
Postfixová = Postfix TopSymbol;
)
if ((! OperatorStack.empty ()) & & (symbol ==')'))
OperatorStack.pop (); / / zbaviť zhody (
iné
OperatorStack.push (symbol);
)
)while (! OperatorStack.empty ())
(
TopSymbol = OperatorStack.top ();
OperatorStack.pop ();
Postfixová = Postfix TopSymbol;
)
)
/*---------------------------------------------
Moja funkcie potrebné k tokenise výraz--------------------------------------------*/Change_me reťazec (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 je ľubovoľný výber
/ / By to mohlo byť akékoľvek iné písmeno
/ / Ale to má byť LISTU)
)
)
/ / Zmenený -7 *- 7 prípade
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");
)
)
)návrat my_string;
)/*-----------------------------------------
Moja funkcie potrebné na vyjadrenie tokenise
-----------------------------------------*/
Insert_comma reťazec (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, ",");
/ / Vloží čiarka po všetkom
/ / Nájdené operátorov
)
else if (my_string == 'V')
(
my_string.replace (i, 1 ,",");
/ / Nahradí v. s čiarkou
/ / Pre prehľadnosť
)
)
/ / Zmenený
for (int i = 0; i <my_string.length (); i )
(
if (my_string == 'y')
(
my_string.replace (i, 1 ,"-");
)
)
návrat my_string;
)/*-----------------------------------------
Moja funkcia pre kontrolu, že žiadne ukazovatele
boli zapísané
-----------------------------------------*/
bool Check_valid (string my_string)
(
/ / Inak overiť, že po sebe idúce ' ', '-'
/ / Príznaky neexistujú
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;
)
)
)Reťazec 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 (hrabě == my_string.length ())
(
return true;
)
iné
(
return false;
))/*-----------------------------------
Moja funkcia skutočne hodnotiť
postfix výraz
----------------------------------*/Ďalšie void (string my_string)
(
vektor <string> array;
Reťazec tempo;int comma_count = 0;
for (int a = 0, a <my_string.length (); a )
(
if (my_string [a ]==',')
(
comma_count ;
)
)/ / Ohodnotiť žetónom použitie "," ako oddeľovač
while (my_string.find (",", 0)! = reťazec:: neziskové organizácie)
(
/ / Zruší od FAQ
/ / Robí reťazce majú čiarka v ňom?
size_t pos = my_string.find (",", 0);
tempom = my_string.substr (0, pos);
my_string.erase (0, pos 1);
array.push_back (tempo); / / uložiť vo vektorovom
)/ / Array.push_back (my_string); / / posledný známka je sámzásobník <string> my_stack; / / inicializova zásobník
Reťazec temp [100];
Reťazec ch;for (int i = 0; i <comma_count, i )
(Reťazec s;
y = array; / / zrozumiteľnosťif ((y !=" ")&&
(s !="*")&&
(s !="-")&&
(s !="/")&&
(s !="^")&&
(s! = "c"))
(
my_stack.push (s);
/ / Push čísla do komína
)
inde / / tj v prípade, že narazia na operátora
(
my_stack.push (s); / / push operátor do zásobníka
temp [0] = my_stack.top ();// ukladať hodnoty
my_stack.pop (); / / vymazať z komínatemp [1] = my_stack.top ();// ukladať hodnoty
my_stack.pop ();// vymazať z komínatemp [2] = my_stack.top ();// ukladať hodnoty
my_stack.pop ();// vymazať z komínadvojlôžková z;
z = eval (temp);
ostringstream náklonom; / / určiť výstupný reťazec prúdu.
náklonom <<z; / / Prenesie hodnotu na reťazec.
ch = outs.str ();my_stack.push (ch)
)
Súd <<ch;
cin.get ();
)
/*------------------------------
Moja funkcia urobiť math:
Konvertuje reťazec na dvojnásobok
potom späť na reťazec
------------------------------*/
dvojlôžková Eval (string temp [])
(
reťazec a, b, c;
a = temp [2], b = temp [0], c = temp [1];
dvojlôžková x, y, z, t;
istringstream ins, inse;
ins.str (a); inse.str (c);
ins>> x;
inse>> y;if (b ==" ")
(
z = x y;
návrat z;
)
else if (b =="-")
(
z = x - y;
návrat z;
)
else if (b =="*")
(
z = x * y;
návrat z;
)
else if (b =="/")
(
z = x / y;
návrat z;
)
else if (b =="^")
(
z = pow (x, y);
návrat z;
)
else if (b == "c")
(
t = cos (x * PI/180);
z = y t;
návrat z;
)
)
/ *
A jednoduchá vyjadrenie hodnotiteľa, ktorý využíva Infixová na postfix notation
na vyhodnotenie výrazu.
Má stále chyby, ktoré musia byť pevné!
V.0.2 -> Chcete spracovať prevádzkovateľ anomálie, ako sú:
-7 *- 4 a 2 * (-5 6)
* /# Include <iostream>
# Include <sstream>
# Include <string>
# Include <stack>
# Include <vector>
# Include <math.h>
# Define PI 3.14159265použitím namespace std;
/ / Funkcie vyhlásenie
void Konvertova (const & Infixová reťazec, reťazec & Postfix);
bool IsOperand (char ch);
bool TakesPrecedence (char Operatora, char OperatorB);/ * Moja funkcia jsem pridanú * /
Change_me reťazec (string);
Insert_comma reťazec (string);
bool Check_valid (string);
dvojlôžková Eval (string []);
Ďalšie void (string);int main ()
(Odpovedať char;robiť
(
Reťazec Infixová, Postfix, / / miestna slučkaSúd << "\ n Zadajte výraz bez medzier! \ N \ n";
Súd << ", napríklad (4 2) * 3 / 2" <<Endl;
Súd << "neznáme premenné, ako je 'a' a 'x' nie sú povolené: \ n \ n>>";
cin>> Infixová;if (Check_valid (Infixová) == true)
(Reťazec temp;
temp = Change_me (Infixová);
/ / Súd <<temp;
/ / Cin.get ();Premeniť (temp, Postfix);Súd << "Rovnocenné postfixovou prejavu:" <<Endl
<<Insert_comma (Postfix);Reťazec hold;
držať = Insert_comma (Postfix);Súd << "\ n \ nThe odpoveď je:";
Ďalšie (hold);Súd <<Endl << "\ NDO iné (y / n)?"
cin>> Odpovedať;
)
iné
(
Súd <<"*** Syntaktická chyba *** \ n ";
Súd <<Endl << "Do iného (y / n)?"
cin>> Odpovedať
)/ * Vzhľadom k tomu: CH A charakter.
Úloha: zistiť, či ch predstavuje operande (tu chápaná
je jediné písmeno alebo číslicu).
Návrat: Vo funkcii meno: true, ak ch je operand, falošné inak.
* /
bool IsOperand (char ch)
(
if (((ch> = 'a') & & (ch <= 'z')) | |
((ch> = 'A') & & (ch <= 'Z')) | |
((ch> ='0 ') & & (ch <='9')))
return true;
iné
return false;
)/ * Vzhľadom k tomu: Operatora A znak zastupujúci prevádzkovateľa alebo zátvorky.
A OperatorB znak zastupujúci prevádzkovateľa alebo zátvorky.
Úloha: zistiť, či Operatora je nadriadená OperatorB.
Návrat: Vo funkcii meno: true, ak Operatora je nadriadená
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;
iné
return true
Úloha: Ak chcete nájsť postfixovou ekvivalent tohto výrazu.
Návrat: Postfix Reťazec zorganizovať túto postfixovou ekvivalent.
* /
void Konvertova (const & Infixová reťazec, reťazec & Postfix)
(
zásobník <char> OperatorStack;
char TopSymbol, symbol;
int k;for (k = 0, k <Infix.size (); k )
(
Symbol = Infixová [k];
if (IsOperand (Symbol))
Postfix Postfix = symbol;
iné
(
while ((! OperatorStack.empty ()) & &
(TakesPrecedence (OperatorStack.top (), Symbol)))
(
TopSymbol = OperatorStack.top ();
OperatorStack.pop ();
Postfixová = Postfix TopSymbol;
)
if ((! OperatorStack.empty ()) & & (symbol ==')'))
OperatorStack.pop (); / / zbaviť zhody (
iné
OperatorStack.push (symbol);
)
)while (! OperatorStack.empty ())
(
TopSymbol = OperatorStack.top ();
OperatorStack.pop ();
Postfixová = Postfix TopSymbol;
)
)
/*---------------------------------------------
Moja funkcie potrebné k tokenise výraz--------------------------------------------*/Change_me reťazec (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 je ľubovoľný výber
/ / By to mohlo byť akékoľvek iné písmeno
/ / Ale to má byť LISTU)
)
)
/ / Zmenený -7 *- 7 prípade
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");
)
)
)návrat my_string;
)/*-----------------------------------------
Moja funkcie potrebné na vyjadrenie tokenise
-----------------------------------------*/
Insert_comma reťazec (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, ",");
/ / Vloží čiarka po všetkom
/ / Nájdené operátorov
)
else if (my_string == 'V')
(
my_string.replace (i, 1 ,",");
/ / Nahradí v. s čiarkou
/ / Pre prehľadnosť
)
)
/ / Zmenený
for (int i = 0; i <my_string.length (); i )
(
if (my_string == 'y')
(
my_string.replace (i, 1 ,"-");
)
)
návrat my_string;
)/*-----------------------------------------
Moja funkcia pre kontrolu, že žiadne ukazovatele
boli zapísané
-----------------------------------------*/
bool Check_valid (string my_string)
(
/ / Inak overiť, že po sebe idúce ' ', '-'
/ / Príznaky neexistujú
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;
)
)
)Reťazec 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 (hrabě == my_string.length ())
(
return true;
)
iné
(
return false;
))/*-----------------------------------
Moja funkcia skutočne hodnotiť
postfix výraz
----------------------------------*/Ďalšie void (string my_string)
(
vektor <string> array;
Reťazec tempo;int comma_count = 0;
for (int a = 0, a <my_string.length (); a )
(
if (my_string [a ]==',')
(
comma_count ;
)
)/ / Ohodnotiť žetónom použitie "," ako oddeľovač
while (my_string.find (",", 0)! = reťazec:: neziskové organizácie)
(
/ / Zruší od FAQ
/ / Robí reťazce majú čiarka v ňom?
size_t pos = my_string.find (",", 0);
tempom = my_string.substr (0, pos);
my_string.erase (0, pos 1);
array.push_back (tempo); / / uložiť vo vektorovom
)/ / Array.push_back (my_string); / / posledný známka je sámzásobník <string> my_stack; / / inicializova zásobník
Reťazec temp [100];
Reťazec ch;for (int i = 0; i <comma_count, i )
(Reťazec s;
y = array; / / zrozumiteľnosťif ((y !=" ")&&
(s !="*")&&
(s !="-")&&
(s !="/")&&
(s !="^")&&
(s! = "c"))
(
my_stack.push (s);
/ / Push čísla do komína
)
inde / / tj v prípade, že narazia na operátora
(
my_stack.push (s); / / push operátor do zásobníka
temp [0] = my_stack.top ();// ukladať hodnoty
my_stack.pop (); / / vymazať z komínatemp [1] = my_stack.top ();// ukladať hodnoty
my_stack.pop ();// vymazať z komínatemp [2] = my_stack.top ();// ukladať hodnoty
my_stack.pop ();// vymazať z komínadvojlôžková z;
z = eval (temp);
ostringstream náklonom; / / určiť výstupný reťazec prúdu.
náklonom <<z; / / Prenesie hodnotu na reťazec.
ch = outs.str ();my_stack.push (ch)
)
Súd <<ch;
cin.get ();
)
/*------------------------------
Moja funkcia urobiť math:
Konvertuje reťazec na dvojnásobok
potom späť na reťazec
------------------------------*/
dvojlôžková Eval (string temp [])
(
reťazec a, b, c;
a = temp [2], b = temp [0], c = temp [1];
dvojlôžková x, y, z, t;
istringstream ins, inse;
ins.str (a); inse.str (c);
ins>> x;
inse>> y;if (b ==" ")
(
z = x y;
návrat z;
)
else if (b =="-")
(
z = x - y;
návrat z;
)
else if (b =="*")
(
z = x * y;
návrat z;
)
else if (b =="/")
(
z = x / y;
návrat z;
)
else if (b =="^")
(
z = pow (x, y);
návrat z;
)
else if (b == "c")
(
t = cos (x * PI/180);
z = y t;
návrat z;
)
)