rpn kalkulator

Upload: hallvard

Post on 30-May-2018

223 views

Category:

Documents


0 download

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;}

    }