15. marts 2004 - 19:19Der er
14 kommentarer og 1 løsning
udregne formel
Hej...
Jeg er igang med at lave et program der kan regne diverse ting ud, brugeren skal blot indtaste en formel. Men hvordan får jeg mit program til at behandle en tekst, f.eks. "a+b*2" som om at jeg bruger variabler altså så Label1.Caption := FloatToStr(a+b*2); Sådan som den gør nu så skriver den bare a+b*2 hvis jeg starter den...
det skal lige siges at brugeren kan indtaste variabler altså f.eks. a=2 og b=4.
type etype = (econstant,eplus,eminus,emul,ediv); e = record typ : etype; val : integer; end;
var elm : array [1..9] of e; stack : array[1..100] of integer; top,i,res : integer;
begin elm[1].typ := econstant; elm[1].val := 34; elm[2].typ := econstant; elm[2].val := 34; elm[3].typ := eplus; elm[4].typ := econstant; elm[4].val := 4; elm[5].typ := econstant; elm[5].val := 2; elm[6].typ := ediv; elm[7].typ := econstant; elm[7].val := 3; elm[8].typ := emul; elm[9].typ := eminus; top := 0; for i := 1 to 9 do begin case elm[i].typ of econstant : begin top := top + 1; stack[top] := elm[i].val; end; eplus : begin res := stack[top-1] + stack[top]; stack[top-1] := res; top := top - 1; end; eminus : begin res := stack[top-1] - stack[top]; stack[top-1] := res; top := top - 1; end; emul : begin res := stack[top-1] * stack[top]; stack[top-1] := res; top := top - 1; end; ediv : begin res := stack[top-1] div stack[top]; stack[top-1] := res; top := top - 1; end; end; end; res := stack[1]; writeln('result=',res); end.
Jeg er vokset op med HP's regnere og her hersker RPN (Reverse Polish Notation -> Omvendt Polsk notation). Hvis du vil lave en let implementering af en regnemaskine, så er det RPN du skal bruge.
Metoden er simpel stakbrug: Skal du f.eks. lægge 2 tal sammen så taster man 2,4+. Det smarte er, at tallene er placeret på en stak og når der kommer en operator (her +), så henter den så mange værdier som den skal bruge (2) (kommaet er i denne sammenhæng ikke en operator men en separator) og skriver resultatet i stedet for disse (6).
Mit indslag løser ikke din opgave, andet at du måske kan bruge TStack til den, men jeg slår altid gerne et slag for RPN ;-)
Nu har jeg kigget lidt på ArneV's kodning - og det minder ret meget om RPN og selvom jeg ikke er helt med på hvorfor a+b*2 bliver ab2*+, så skal det nok passe. Med RPN ser regestykket sådan ud: a,b+2*
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.