hele ideen i en sådan lommeregner er at om formulerer regnestykket fra infix (almindelig notation, f.eks. 3 + 5*2) til postfix( her vil regnestykket se således ud: 5 2 * 3 +), prefix notation kan også bruges, du har således en liste med tal og operatorer, denne løber du så bare igennem, og hver gang du støder på et tal, så tilføjer du det til en liste (stak), og når du så støder på en operator tager du de 2 sidst tilføjede (de skal også fjernes fra listen), udfører operationen på disse, og tilføjer resultatet til listen. Når regnestykket er løbet er der, hvis regne er korrekt formateret, kun et tal i listen, nemlig facit.
hele problemet ligger så i at konvertere en infix notation til postfix.
kigger vi på regne hierakiet (kun de 4 regnearter) så har vi at:
+ og - //lag1
* og / //lag2
da vi skal gange og dividere før + og -, og både før og efter et + eller - må være * og /, så laver 3 funktioner:
void behandelLag1()
void behandelLag2()
void bahandelTal()
den sidste benyttes til at smide tallene ind.
jeg læser her regnestykket bagfra, bare så du ved det
bahandelLag1 virker således:
behandelLag2();//vi behandler da alt inden første
sålænge vi ikke har behandlet regnestykket færdigt, og det vi behandler ikke er en startparentes, så gør vi følgende:
hvis vi i regnestykket er kommet til enten plus eller
minus,gør vi følgende:
gem den operator vi var kommet til.
gør så det er det næste element i vores regnestykke vi
skal til at bearbejde.
behandelLag2();
tilføj den gemte operator til vores postfix liste.
det behandelLag1.
så kommer behandelLag2:
behandelTal();
hvis regnestykket ikke er tomt og det enten en * eller / operator vi er kommet til, gør:
gem den operator vi var kommet til.
gør så det er det næste element i vores regnestykke vi
skal til at bearbejde.
behandelTal();
tilføj den gemte operator til vores postfix liste.
det behandelLag2.
så kommer vi til den sidste, behandelTal:
hvis elementet i regnestykket vi er kommet til er et tal, tilføj det da til postfixlisten.
hvis elementet er en slutparantes, gør da:
gå videre til næste element i regnestykket.
behandelLag1();
gå videre til næste element i regnestykket (så vi ikke får start parentesen med, og det hele går i stå)
det var algoritmen, den kan nemt udvides til potensopløftning, BehandelLag2 kopieres da bare, og kaldes behandelLag3, og operatorerne udskiftes, og kaldene til behandelTal i funktionen behandelLag2 udskiftes med kald til behandelLag3 istedet.
det er en fed algoritme, her er et eksempel på en kørsel hos mig:
3*6+144/(15-3)
3 15 - 144 / 6 3 * +
30
først kommer mit regnestykke, så kommer maskinens omskrivning til postfix, og endeligt facit.
Jeg håber det kan give lidt inspiration, du skal være velkommen til at spørge igen.
mvh.
//Troels