2. Scala kodutöö
Moodle'ist leiad ka lahendusfaili malli Kt2.scala
.
Implementeerida Poola kuju (mitte RPN) kalkulaator.
Tulemus peab olema selline, et kutsudes käsurealt välja argumentidega + * 2 3 4
vastab programm "Vastus: 10".
a) Kirjuta meetodid loe
, liida
, lahuta
, korruta
ja jaga
Kõik meetodid, mis tuleb kirjutada, on kujul
def f(xs: List[String]): (Double, List[String]) = ???
Sisse võetakse järjestus List[String] kujul ja väljastatakse paar mille esimene komponent on väärtus ja teine komponent ülejäänud avaldis.
Meetod loe
: vaatab järjestuse esimest sümbolit,
kui see on "+", "-", "*" või "/" siis kutsub välja vastava
meetodi --- argumendiks anda järjestuse saba.
Kui tegemist pole operaatoriga, eeldame et see on ujukoma arvu
kujul --- tagastame selle paaris koos järjestuse sabaga.
Näiteks:
loe(List("*","2","3","4")) tagastab (6.0, List("4"))
loe(List("2","3","4")) tagastab (2.0, List("3", "4"))
Operaatorite meetodid (näiteks liida
): meetodiga loe(xs)
lugeda sisse (x,r1)
, siis loe(r1)
lugeda (y,r2)
, nüüd
tagastada (x+y, r2)
.
Näiteks:
korruta(List("2","3","4")) tagastab (6.0, List("4"))
loe(List("2","4","5")) tagastab (2.0, List("4", "5"))
b) Implementeeri meetod arvuta
See peaks kutsuma meetodit loe
ja selle kaudu kontrollib Moodle'i automaatkontroll lahendust.
c) Lisa veaolukordade haldus
Veast peab teatama nii juhtudel kui argumente on puudu, üle või on sisestatud
tundmatu operaator. Vea korral tuleb visata erind Viga
.
object PnCalc { class Viga(message: String) extends RuntimeException(message) def arvuta(xs: List[String]): Double = { ??? } def main(args: Array[String]): Unit = { val xs = args.toList val vastus = arvuta(xs) printf("Vastus: %f\n", vastus) } }