rpn kalkulator
TRANSCRIPT
-
8/14/2019 RPN Kalkulator
1/13
1
Kalkulator-ving
Reverse Polish Notation-basert kalkulator
-
8/14/2019 RPN Kalkulator
2/13
2
Reverse Polish Notation (RPN)
RPN er en mte gi inn operander ogoperatorer til en kalkulator, med noenfordeler
en trenger ikke parenteser den er fleksibel i bruk
den er enkel implementere
Grunnid
operander gis inn frst oglagres p en skalt stack(norsk: stabel)
nr en operator gis inn, tas operandene(bort) fra toppen av stacken,beregningen utfres og resultatet legges(tilbake) p toppen av stacken
Input Stack (toppen til
hyre)
1.0 {1.0}
2.0 {1.0, 2.0}
+ {3.0}
-
8/14/2019 RPN Kalkulator
3/13
3
Eksempler
1 + (2 * 3)
1.0 {1.0}
2.0 {1.0, 2.0}
3.0 {1.0, 2.0, 3.0}
* {1.0, 6.0}
+ {7.0}
(1 + 2) * 3
1.0 {1.0}
2.0 {1.0, 2.0}
+ {3.0}
3.0 {3.0, 3.0}
* {9.0}
-
8/14/2019 RPN Kalkulator
4/13
4
Operasjoner
Matematiske operatorer Unre operatorer eller funksjoner, som kvadratrot, sinus
og cosinus, tar bort n operand og legger n verdi tilbake
p toppen
Binre operatorer, som +, -, *, /, tar bort to operander og
legger n verdi tilbake p toppen
Konstanter, som pi og e, fungerer som funksjoner uten
argumenter, dvs. de legges bare p toppen
Spesielle operasjoner dup: dupliserer det verste elementet
pop: fjerner det verste elementet
swap: bytter om de to verste elementene
1.0 {1.0}
2.0 {1.0, 2.0}
dup {1.0, 2.0, 2.0}
pop {1.0, 2.0}
swap {2.0, 1.0}
-
8/14/2019 RPN Kalkulator
5/13
5
vingskonstruksjon
Koden deles i to klasser: ArgumentStack: administrerer stacken med verdier
en global variabel som inneholder double-verdiene
noen globale metoder/funksjoner, som hndterer stacken:
push, peek, og pop print-metoden skriver ut stackinnholdet
Calc: hndterer brukerinput, implementerer operasjoner og kaller
ArgumentStack-metoder underveis
hjelpemetoder: performOperation, handleInput og
splitAndHandleInput hovedprogram: main-metoden leser brukerinput, utfrer operasjonene
og printer ut stack-innholdet
-
8/14/2019 RPN Kalkulator
6/13
6
ArgumentStack
ArgumentStack: hndterer stacken med verdier en global variabel inneholder double-verdiene
static double[] arguments
en rekke globale metoder/funksjoner, som endrer stacken
push legger double-argumentet p toppen av stacken
peek returnerer verste verdi p stacken, uten endre den
pop fjerner n verdi fra stacken og returnerer denne
hjelpemetode for skrive ut: print(prefix, separator, suffix)
Sprsml:
Hvordan implementerer vi stack-operasjoner, nr tabeller kan ikke kanendre lengde?
Tenk notatark med en variabel som peker p en tabellen: Hva skjer nr
verdier pushes og popes?
-
8/14/2019 RPN Kalkulator
7/13
7
ArgumentStack-metoder
push(double v) legger v p toppen av stacken
peek(double d) returnerer den verste verdien
eller d, dersom stacken er tom
pop(double d) fjerner verdien p toppen avstacken og returnerer den. Dersom stacken er tom
returneres d.
print(prefix, separator, suffix) skriver frst ut
prefix, deretter alle stackverdiene fra bunn til topp
adskilt med separator, og s suffix til slutt. All
utskrift skjer til System.out.
-
8/14/2019 RPN Kalkulator
8/13
8
Calc-metoder
performOperation(char op) - utfrer operasjonen for op. Lovlige op-verdier er +, -, *, /, , (dup), . (pop) og ~ (swap). Metoden
m kalle ndvendige metoder i ArgumentStack-klassen.
handleInput(String input) Dersom frste tegn i input er et siffer, s
tolkes input som en verdi som skal pushes p stacken. Alternativt er
det en operasjon som skal utfres. splitAndHandleInput(String input) input er en sekvens med
verdier og operasjoner adskilt med mellomrom, som hndteres fra
venstre mot hyre.
hovedprogrammetskal lese linjer fra System.in og avslutte nr en tom
linje leses. Hver linje hndteres med splitAndHandleInput og stackenskrives s ut p passende format. Som en ekstraoppgave kan dere ogs
hndtere args-elementene vha. splitAndHandleInput.
-
8/14/2019 RPN Kalkulator
9/13
9
Sttte for Turtle Graphics
Turtle Graphics-kommandoer kan ses p som operasjonersom fjerner operander, uten legge noe resultat tilbake.
Flgende operasjoner skal stttes f (forward): fjerner en operand n og flytter skilpadda n steg fremover
t (turn): fjerner en operand n og dreier skilpadda n grader u (up): lfter blyanten
d (up): senker blyanten
h (home): nullstiller posisjon og retning
c (color): fjerner 4 operander r(d), g(rnn), b(l) og a(lpha/transparens) og setter
fargen til en farge sammensatt av disse verdiene
w (width): fjerner en operand w og setter bredden til denne verdien
Eksempel: 20 f 90 t 20 f 90 t 20 f 90 t 20 f
tegner en firkant og resulterer i en tom stack
-
8/14/2019 RPN Kalkulator
10/13
10
Hendige metoder 1
System.arraycopy(src, srcstart, dest, deststart, len) kopierer lenelementer fra src til dest. Uthentingen av elementer starter p indeks srcstart(i src) og de legges fra deststart (i dest) og utover.
int[] enToTre = {1, 2, 3};int[] treFireFem = {3, 4, 5};System.arraycopy(enToTre, 1, treFireFem, 0, 2);
// n er treFireFem lik {2, 3, 5}
Integer.valueOf (s)/ Double.valueOf (s) gjr om s til en int/double
Integer.valueOf(1) => 1 Double.valueOf(1.0) => 1.0 Double.valueOf(2) => 2.0
Character.isDigit(c) returnerer true hvis c er et siffer (0-9), eller false om cikke er et siffer
Character.isDigit(8) => true Character.isDigit(H) => false
Character.toLowerCase(c)/toUpperCase(c) gjr om til liten/stor bokstav Character.toLowerCase(H) => h Character.toUpperCase(h) => H Character.toLowerCase(8) => 8
String.toLowerCase()/toUpperCase() gjr om til sm/store bokstaver Hallvard.toLowerCase(Hallvard) => hallvard Hallvard.toUpperCase(Hallvard) => Hallvard
-
8/14/2019 RPN Kalkulator
11/13
11
Hendige metoder 2
String.length() returnerer antall tegn i Stringen Hallvard.length() => 8
String.charAt(pos) returnerer Stringen sitttegn nr. pos.
Hallvard.charAt(7) => d
String.indexOf(c)/lastIndexOf(c) returnererposisjonen til frste/siste forekomst av charen c
Hallvard.indexOf(l) => 2 Hallvard.lastIndexOf(l) => 3
String.indexOf(s)/lastIndexOf(s) returnererposisjonen til frste/siste forekomst av del-Stringen s.
Hallvard.indexOf(al) => 1 Hallvard.lastIndexOf(lv) => 3
-
8/14/2019 RPN Kalkulator
12/13
12
Hendige metoder 3
String.substring(start) returnerer del-Stringen medtegnene fra og med start og til og med siste tegn
Hallvard.substring(4) => vard
String.substring(start, slutt) returnerer del-Stringenmed tegnene fra og med start og til (men ikke med) slutt
Hallvard.substring(2, 4) => ll String.trim() returnerer en String med de samme
tegnene som originalen, bortsett fra at alle mellomromforan og bak er fjernet
Hallvard .trim() => Hallvard
String.split(sep) tenk p Stringen som bestende avdel-Stringer adskilt med sep. Metoden returnerer del-Stringene i en String-tabell, alts uten sepene.
Hallvard:foreleser:TDT4100.split(:) => {Hallvard, foreleser, TDT4100}
-
8/14/2019 RPN Kalkulator
13/13
13
Scanner-objekter
java.util.Scanner Scanner = new Scanner(System.in) gir deg et objektsom hjelper deg lese input fra brukeren Scanner.hasNextLine() gir true, dersom det er mer input tilgjengelig Scanner.nextLine() gir deg neste input-linje
Typisk lkke for innlesing av tekstlinjer:
// lag en Scanner som leser fra konsolletjava.util.Scanner sc = new java.util.Scanner(System.in);while (sc.hasNextLine ()) {
// les neste linje og fjern blanke tegn frst og sistString s = sc.nextLine().trim();// avslutt dersom linja er tomif (s.length() == 0) {
break;}
}