Miniräknare som hanterar prioritetsregler

Permalänk

Miniräknare som hanterar prioritetsregler

Hejsan, jag har fått i uppgift att göra en avancerad miniräknare som kan hantera hela uttryck på en gång, som t.ex. 148+5*4^2/3.

Jag har ingen aning hur jag ska lösa detta problem men har försökt att ta reda på lite och har kommit underfund med att detta löses bäst med hjälp av en stack och pusha de olika operanderna och operatorerna på stacken. Men har inte lyckats hitta någon bra förklaring på hur man ska göra detta på ett bra sätt.

Är det någon som har någon bra länk till hur man gör detta eller som skulle kunna förklara lite närmare hur man bygger en algoritm som klarar av det.

Permalänk
Medlem

Vi vet inte ens vilket språk du använder. Men jag antar PHP?

Visa signatur

| Fractal Design R4 White | Intel I5 6600k@4Ghz| Asus Z170-A | MSI GTX 970 @1425Mhz | Corsair 16GB DDR4 2133mhz | Samsung 840 250GB | Corsair 650Watt nätagg |

https://soundcloud.com/symbolofficial

Permalänk
Hedersmedlem

Ja du skulle kunna använda http://en.wikipedia.org/wiki/Shunting-yard_algorithm (som jag inte satt mig in i), den arbetar stackbaserat. Står att man kan få ut ett abstrakt syntaxträd, vilket nedanstående också leder fram till.

Det man gör är att göra lite lexikal analys, sedan syntaktisk analys och sist lite semantisk analys.
På wikipedia bör du läsa igenom hela sektionen om Programming languages (och undersektionen "overview of the process") när det gäller parsning.
Följ även wikilänkarna som finns i texten där för att lära dig mer.

För en sådan här enkel sak som att evaluera litet matematiskt uttryck kan du skriva koden själv, behöver nog inte använda verktyg för att genera koden.

Ska du koda det här i ett objektorienterat språk kan du börja med att skapa en klass kallad Token. Underklasser till denna kan vara Literal (sådan lagrar siffror), PlusSymbol, MinusSymbol, AsteriskSymbol, SlashSymbol, CaretSymbol.
Notera att klassnamnen ovan inte beskriver vad det gör. T.ex. Caret (^) beskrivs bara som en symbol, vi har i det här stadiet ingen aning om vad den gör.
Skriv en funktion som generar en lista av underobjekt till Token. När du läser tecken för tecken måste du lägga sakerna på minnet. Man vill t.ex. inte ha tre stycken Token för talet 346 utan den ska lagra dessa och skapa en Literal (som har ett fält som lagrar talet 346). De andra behöver inte den här behandlingen (t.ex. ++ bildar inget speciellt). Tänk på att inte bygga in regler i det här staget. Tokenizern ska gladeligen ta strängen 44+*/2^+ och mata tillbaka
[Literal (44), PlusSymbol, PlusSymbol, AsteriskSymbol, SlashSymbol, Literal (2), CaretSymbol, PlusSymbol].

Nu är det sent och jag slutar skriva. Börja med det här du.

Visa signatur

Forumregler | Feedbackforumet | Något som behöver modereras? Tryck på Anmäl inlägget och ge en anledning, någon moderator kommer granska inlägget och göra (egen) bedömning
"Fate. Protects fools, little children and ships named Enterprise." - Riker - ST:TNG

Permalänk
Medlem

Här är en rätt bra beskrivande video: http://www.youtube.com/watch?v=zOjsfgkWg6E

Visa signatur
Permalänk
Medlem
Skrivet av xxstaticz:

Hejsan, jag har fått i uppgift att göra en avancerad miniräknare som kan hantera hela uttryck på en gång, som t.ex. 148+5*4^2/3.

Jag har ingen aning hur jag ska lösa detta problem men har försökt att ta reda på lite och har kommit underfund med att detta löses bäst med hjälp av en stack och pusha de olika operanderna och operatorerna på stacken. Men har inte lyckats hitta någon bra förklaring på hur man ska göra detta på ett bra sätt.

Är det någon som har någon bra länk till hur man gör detta eller som skulle kunna förklara lite närmare hur man bygger en algoritm som klarar av det.

Det är svårt att veta vilken nivå du ligger på nu och vilket språk du använder. Om du gör det helt från scratch och inte är bekväm med programmering så rekommenderar jag att börja enkelt först så du förstår hur det fungerar. Börja med addition och subtraktion. Resultat och uträkningar kan man praktiskt jämföra med exempelvis wolframalpha eller google om inte de teoretiska reglerna ger tillräckligt kött på benen för logiken/reglerna. Aqualize skrev annars en bra start till hur du börjar lösa problemet (tummen upp).

Om du bara är ute efter att lösa uträkningen så finns det "fulingar" i de flera språk för att få till en "dynamic math expression evaluation".

Visa signatur

ηλί, ηλί, λαμά σαβαχθανί!?

Permalänk
Medlem

http://sv.wikipedia.org/wiki/J%C3%A4rnv%C3%A4gsalgoritmen samma som aqualize länkade fast på svenska. Dock inte lika utförlig.

Visa signatur

| Ryzen 5800x | Asus prime x470 pro | Asus rtx 3080 tuf oc | Gskill 32gb 3,6ghz | Dell S2721DGFA | Asus MG279Q |

Permalänk

Jag använder mig av java då det är de språk jag känner mig mest hemma vid. Jag har läst länkarna och börjar få en förståelse för hur man ska hantera evaluering av sådana uttryck. Tack för hjälpen och jag återkommer med eventuella frågor om jag stöter på ett problem

Skickades från m.sweclockers.com