Teine Scala kodutöö
Implementeerida Poola kuju (mitte RPN) kalkulaator.
Tulemus peab olema selline, et kutsudes käsurealt välja argumendiga '+ * 2 3 4'
vastab programm "Vastus: 10\n".
a) Kirjuta meetodid loe
, liida
, lahuta
, korruta
ja jaga
.
Kõik meetodid, mis tuleb kirjtada, on kujul
def f(xs: Seq[String]): (Double, Seq[String]) = ???
Sisse võetakse järjestus Seq[String] kujul ja väljastatakse paar mille esimene kompnent 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ärjestue saba.
Kui tegemist pole operaatoriga, eeldame et see on ujukoma arvu
kujul --- tagastame selle paaris koos järjestuse sabaga.
Näiteks:
loe(Seq("*","2","3","4")) tagastab (6.0, Seq("4"))
loe(Seq("2","3","4")) tagastab (2.0, Seq("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(Seq("2","3","4")) tagastab (6.0, Seq("4"))
loe(Seq("2","4","5")) tagastab (2.0, Seq("4", "5"))
b) Lisa veaolukordade haldus. Veast peab teatama nii
juhtudel kui argumente on puudu, üle või on sisestatud
tundmatu operaator. (Vihje: sys.exit()
sulgeb programmi)
object Calc { def main(args: Array[String]): Unit = { val xs = args(0).split(" ") // teeb "+ 2 4"-st järjestuse Seq("+","2","4") // ... } }