Pomagajte mi najti problem

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;

)

)

 

Welcome to EDABoard.com

Sponsor

Back
Top