Scala teine praktikum
Näiteülesanded
Uurida mutable.Buffer signatuuri ja kirjutada järgnevasse programmi meetod lisaArvud(a: Int, b: Int)
, mis lisab puhvrisse xs
arvud a
-st kuni b
-ni (a
ja b
kaasa arvatud).
1 2 3 4 5 6 7 8 9 10 11 |
object H 1 { val xs = mutable.Buffer[Int]() def main(args : Array[String]) : Unit = { for (x <- 1 to 20 ) xs + = x for (x <- xs) printf( "%d\n" , x) } } |
Lisada eelmisesse programmi meetod summa()
, mis tühjendab puhvri ning tagastab puhvris olnud arvude summa.
Kirjutada meeotd summa(xs: Seq[Int]): Int
, mis tagastab järjendi summa.
Lisaks kirjuta summa
variant, mis võtab suvalise arvu Int
argumente ja
samuti tagastab nende summa.
1 2 3 4 5 6 7 8 9 |
object H 3 { def summa(xs : Seq[Int]) : Int = ??? def summa 2 (x : Int*) : Int = ??? def main(args : Array[String]) : Unit = { //printf("Summa on %d\n", summa(Seq(1,2,3,4,5,6))) //printf("Summa on %d\n", summa2(1,2,3,4,5,6)) } } |
Kirjuta meetod tryki
, mis trükib välja palgatabeli formaadis "<nimi>: <palk>" nii, et iga kirje tuleb eraldi reale.
1 2 3 4 5 6 7 |
object H 4 { def main(args : Array[String]) : Unit = { val palgad = Map( "Jüri" -> 140 , "Peeter" -> 30 , "Jaana" -> 90 , "Mirjam" -> 180 , "Paul" -> 70 ) //tryki(palgad) } } |
Harjutusülesanded
Ülesanne 1
Kirjutada meetod poord
, mis võtab argumendiks täisarvud a
ja m
ja tagastab a
pöördelemendi mooduli m
järgi, kui see
eksisteerib, ja –1
vastasel korral. Arvu a
pöördelemendiks mooduli m
järgi nimetatakse täisarvu b
, mille korral korrutis ab
annab m
-ga jagades jäägi 1
. Võib eeldada, et argumendid a
ja m
on positiivsed, ning kasutada naiivset tsükliga algoritmi, mis tugineb faktile, et kui pöördelement leidub, siis leidub pöördelement moodulist väiksemate naturaalarvude seas.
1 2 3 4 5 6 7 8 |
object Programm 1 { def poord(a : Int, m : Int) : Int = ??? def main(args : Array[String]) : Unit = { printf( "poord(%d,%d) = %d\n" , 3 , 4 , poord( 3 , 4 )) } } |
Ülesanne 2
Defineerida meetod lookup, mis implementeerib seoste järjendist otsimise. Sobiva väärtuse mitteleidmisel tagastada -1
. (Sõne ja täisarvu paari tüüp on (String, Int).)
1 2 3 4 5 6 7 8 |
object Programm 2 { def lookup(alist : Seq[(String, Int)], a : String) : Int = ??? def main(args : Array[String]) : Unit = { val alist = Seq(( "kala" , 12 ), ( "maja" , 3 ), ( "saba" , 1 ), ( "pala" , 2 )) printf( "pala = %d\n" , lookup(alist, "pala" )) // trükib: pala = 2 } } |
Ülesanne 3
Muuda jägnevat programmi nii, et see tõepoolest arvude keskmise väärtuse välja arvutaks.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
object Programm 3 { def printSeq (s : Seq[Int]) : Unit = { var i = 0 for (i <- s){ printf( "%d\n" , i) } } def main(args : Array[String]) : Unit = { printf( "Tere Päevast!\n" ) val x = Seq( 3 , 2 , 1 ) val y = 0.0 printf( "Arvude:\n" ) printSeq(x) printf( "keskmine väärtus on %f\n" , y) } } |
Ülesanne 4
Lõpetada järgneva RPN-kalkulaator implementatsioon. Töötama peab liitmine, lahutamine, korrutamine ja jagamine. 2*(3+4)
tuleb sisestada kui 2 3 4 + *
(vaata: https://en.wikipedia.org/wiki/Reverse_Polish_notation)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
object Programm 4 { val stack = mutable.Stack[Double]() def liida() = { stack.push(stack.pop+stack.pop) } def dialoog() : Unit = { val inps = StdIn.readLine.split( "[ ]+" ) for (inp <- inps) { if (inp == "+" ) { liida() } else try { stack.push(inp.toDouble) } catch { case e : java.lang.NumberFormatException = > printf( "Viga! Proovi uuesti!\n" ) } } } def main(args : Array[String]) : Unit = { dialoog() printf( "Vastus: %.2f\n" , stack.top) } } |
Ülesanne 5
Sõbralik ettevõtja Kersti võttis suveürituste jaoks tööle viis
koolilast, kes on kõvasti vaeva näinud. Aga kokku on lepitud nii, et palk makstakse välja hoopis laste vanematele --- niisiis tuleb ühe pere laste palgad liita. Kersti on jõudnud laste palgad juba üles kirjutada, kuid tal on vaja veel implementeerida meetod palgaSumma
, mis teise argumendis olevate nimede järgi just nende laste palkade summa leiab. (Kersti tahab kirjutada seda for-tsükkliga!)
Vii lõpuni Kersti programmi implementeerimine!
1 2 3 4 5 6 7 8 9 10 11 12 |
object Programm 7 { def palgaSumma(m : Map[String, Int], ys : Seq[String]) : Int = ??? def main(args : Array[String]) : Unit = { val palgad = Map( "Jüri" -> 140 , "Peeter" -> 30 , "Jaana" -> 90 , "Mirjam" -> 180 , "Paul" -> 70 ) printf( "Jüri palk on: %d\n" , palgad( "Jüri" )) printf( "Summa: %d\n" , palgaSumma(palgad, Seq( "Paul" , "Jaana" ))) } } |