12. november 2002 - 19:19Der er
21 kommentarer og 2 løsninger
Regne med udtryk
Hvis man f.eks. har udtrykket "34+34-4/2*3" til at stå i en Edit box, findes der en simpel så en simpel måde at beregne udrtykket på ??? Eller hvis der står "34x^2+3", findes der så en simpel måde at erstatte x med en variabel ??
(muligvis findes der et smart bibliotek til det - det ved jeg ikke)
Men det er en klassisk beregnings-opgave.
Metoden er følgende: 1) du konverterer strengen til en rækkefølge af binære tal og operatorer "34+34-4/2*3" => 34 + 34 - 4 / 2 * 3 2) du konverterer fra infix til postfix 34 + 34 - 4 / 2 * 3 => 34 34 + 4 2 / 3 * - 3) du evaluerer udtrykket via en stak
Varaible er også nemt at håndtere på den måde, du skal bare have 3 typer: konstanter, variable og operatorer. Og så skal variablene hentes fra en symbol tabel.
Gør følgende lille Pascal eksempel det lidt klarere:
program test(input,output);
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('resuly=',res); end.
Hvis du selv vil til at lave den slags, så skal du bruge tid til at studere problemet og nok læse lidt om det. Det tager meget lægere tid end bare at downloade noget færdigt kode.
Men kan man lide at programmere kan man hygge sig i mange timer med det.
procedure TForm1.Button1Click(Sender: TObject); begin with MathParser1 do begin ParseString := edit1.text; Parse; if not ParseError then showmessage(FloatToStrF(ParseValue, ffGeneral, 15, 2)) else Showmessage('Ups, noget gik galt'); end; end;
Jeg har brugt MathParser en del, men er stødt ind i et problem. Når jeg skal udregne 3*(-20)^2, så melder den fejl. Det kan ikke udregne negative tal i potens, hvorfor ikke ??
Synes godt om
Ny brugerNybegynder
Din løsning...
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.