pomôžte mi nájsť problém

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;

)

)

 

Welcome to EDABoard.com

Sponsor

Back
Top