Avatar billede r.hegaard Nybegynder
12. november 2002 - 19:19 Der 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 ??
Avatar billede arne_v Ekspert
12. november 2002 - 19:25 #1
(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.
Avatar billede morten_s Nybegynder
12. november 2002 - 19:28 #2
Så får du brug for et komponent som kan parse din formelstreng, det kan du finde her:

http://www.bitsoft.com/general/download.asp?lang=en

download:
Expression Evaluator v1.4 for Delphi (14 kb)
Avatar billede morten_s Nybegynder
12. november 2002 - 19:29 #3
Hov det var et svar;-)
Avatar billede r.hegaard Nybegynder
12. november 2002 - 19:30 #4
Arne_v > Jeg er ikke helt med på hvad du mener.....han du ikke uddybe det lidt mere ??
Avatar billede morten_s Nybegynder
12. november 2002 - 19:30 #5
http://www.bitsoft.com/pub/freestuff/delphi/exprev14.zip

Eller direkte ved at trykke på linket ovenover
Avatar billede morten_s Nybegynder
12. november 2002 - 19:31 #6
Det som Arne v mener er allerede skrevet i den komponent som jeg henviser til
Avatar billede arne_v Ekspert
12. november 2002 - 19:42 #7
Nu lyder det som der er noget som allerede
er lavet.

Men det kan jo altid være interessant at lave
det selv for at lære noget.

Det er dog lidt omfattende. Du skal nok op på
500-1000 linier.

Som sagt består processen af 3 dele. Er der en
af delene som du vil have uddybet eller er
det alle 3 dele ?
Avatar billede arne_v Ekspert
12. november 2002 - 19:47 #8
"Introduction to Computer Science" af Nance og
Naps har iøvrigt et afsnit om problemet med
eksempel-kode i Pascal !
Avatar billede arne_v Ekspert
12. november 2002 - 19:54 #9
F.eks. #3 laves simplet v.h.a. en stak.

Vi har 34 34 + 4 2 / 3 * - og en tom stak.

Vi tager de 34 og smider på stakken - stak: 34

Vi tager de 34 og smider på stakken - stak: 34 34

Vi tager + og snupper 2 tal fra stakken og smider resultatet
tilbage på stakken - stak: 68

Vi tager de 4 og smider på stakken - stak: 4 68

Vi tager de 2 og smider på stakken - stak: 2 4 68

Vi tager / og snupper 2 tal fra stakken og smider resultatet
tilbage på stakken - stak: 2 68

Vi tager de 3 og smider på stakken - stak: 3 2 68

Vi tager * og snupper 2 tal fra stakken og smider resultatet
tilbage på stakken - stak: 6 68

Vi tager - og snupper 2 tal fra stakken og smider resultatet
tilbage på stakken - stak: 62
Avatar billede r.hegaard Nybegynder
12. november 2002 - 20:36 #10
arne_v > Jeg forstår desværre ikke hvad du mener med det ovenstående.....
Avatar billede arne_v Ekspert
12. november 2002 - 20:52 #11
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.
Avatar billede r.hegaard Nybegynder
12. november 2002 - 21:01 #12
Jeg kan ikke lige overskue det, jeg vil kigge mere grundigt på det senere.....
Avatar billede arne_v Ekspert
12. november 2002 - 21:05 #13
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.

Og det var jo kun det sidste ud af 3 trin.
Avatar billede borrisholt Novice
13. november 2002 - 10:27 #14
På borrisholt.com ligger der en færdig lommeregner der kan !

Jens B
Avatar billede benson Nybegynder
20. november 2002 - 12:30 #15
Poly funktionen i Math unit'n er vel også interessant ?
Avatar billede r.hegaard Nybegynder
20. november 2002 - 12:42 #16
benson > Kender den ikke.....hvad kan den ??
Avatar billede benson Nybegynder
20. november 2002 - 13:21 #17
Den kan f.eks:

Function Poly(X: Extended; const Coefficients: array of Double): Extended;

Eksempel: Poly(x, [ 3.0, -2.0, 1.0]) er det samme som x2 - 2x + 3.

Du skal dog erstatte x med den værdi du ønsker beregnet for !

Hvis du vil lave den med dynamiske parametre skal du oprette et array eks:

ABarray = array[0..4] of double

og sa parse den til poly funktionen eks.

ABarray[0]=34
ABarray[1]=3
ABarray[2]=-1
ABarray[3]=0
ABarray[4]=4

Svarer til en formel: 4·x^4+0·x^3-1·x^2+3·x+34

det smide du i funktionen

ABvalue=Poly(3,ABarray)

Hjælper det noget ?

Benson
Avatar billede benson Nybegynder
20. november 2002 - 13:22 #18
PS : ABvalue=Poly(3,ABarray) giver dig værdien for x=3
Avatar billede arne_v Ekspert
20. november 2002 - 15:51 #19
r.hegaard - har du fået noget du kan bruge ?
Avatar billede r.hegaard Nybegynder
19. januar 2003 - 15:06 #20
borrisholt > Hvor på borrisholt.com finder jeg den lommeregner der kan regne med udtryk ??
Avatar billede stoney Nybegynder
19. januar 2003 - 15:42 #21
Brug den morten_s har anbefalet.

Her er et eks.

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;

Stoney
Avatar billede r.hegaard Nybegynder
25. januar 2003 - 17:35 #22
Tak for hjælpen...
Avatar billede r.hegaard Nybegynder
11. april 2003 - 08:51 #23
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 ??
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester