Avatar billede stefmeister Nybegynder
15. marts 2004 - 19:19 Der 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.

Hvis I forstår?


/stefmeister
Avatar billede arne_v Ekspert
15. marts 2004 - 19:24 #1
Der er forskellige muligheder.

Standard måden er:
  - konverter fra streng til symbolsk infix
  - konverter fra symbolsk infix til symbolsk postfix
  - evaluer symbolsk postfix

En del arbejde !

:-)
Avatar billede stefmeister Nybegynder
15. marts 2004 - 19:30 #2
kan du komme med nogle eksempler?
Avatar billede arne_v Ekspert
15. marts 2004 - 19:33 #3
Jeg har kun noget kode i Pascal til den sidsten pind.
Avatar billede arne_v Ekspert
15. marts 2004 - 19:33 #4
program expression_evaluation(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('result=',res);
end.
Avatar billede arne_v Ekspert
15. marts 2004 - 19:35 #5
Men de første 2 pinde er ikke så svære at kode.

'a+b*2' skal konverteres til a+b*2 i symbolsk form (se koden ovenfor)

så skal a+b*2 konverteres til ab2*+
Avatar billede stefmeister Nybegynder
15. marts 2004 - 19:58 #6
hmm... det forstår jeg ikke møjt af...!
Avatar billede arne_v Ekspert
15. marts 2004 - 20:02 #7
Beklager, men det er altså ikke helt simpelt at lave på den rigtige måde.

Du kan evt. hapse noget eksisterende kode.

http://www.efg2.com/Lab/Library/Delphi/MathFunctions/Parsers.htm
http://www.torry.net/expressions.htm
Avatar billede stefmeister Nybegynder
15. marts 2004 - 20:07 #8
hmm forstår ikke rigtig noget af det..
Avatar billede stoney Nybegynder
15. marts 2004 - 21:08 #9
Avatar billede stefmeister Nybegynder
15. marts 2004 - 21:39 #10
hvordan virker den... den skriver at den mangler TMathParser
Avatar billede hrc Mester
16. marts 2004 - 01:47 #11
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 ;-)
Avatar billede hrc Mester
16. marts 2004 - 01:51 #12
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*
Avatar billede arne_v Ekspert
16. marts 2004 - 07:43 #13
postfix er det samme som RPN !

Og du mener også ab2*+ ikke ab+2* fordi du vil have a+(b*2) ikke (a+b)*2
Avatar billede hrc Mester
16. marts 2004 - 10:52 #14
Korrekt.
Avatar billede stefmeister Nybegynder
17. marts 2004 - 17:54 #15
hmm giver op... lukker!
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