hjelpe meg å finne problemet

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;

)

)

 

Welcome to EDABoard.com

Sponsor

Back
Top