1. Scala kodutöö
Moodle'ist leiad ka lahendusfaili malli Kt1.scala
.
1. ülesanne (0.5p)
Korduvate elementidega listi tuvastamine. Kirjuta (näiteks kasutades mustrisobitust ja rekursiooni) meetod korduvad
, mis tagastab true
parajasti siis kui listis leidub korduvaid elemente. Arvesta sellega, et korduvad elemendid ei pruugi olla listis järjest.
1 2 3 4 5 6 7 8 9 10 11 12 |
object Korduvad { def korduvad(l : List[Int]) : Boolean = ??? def main(args : Array[String]) : Unit = { assert(!korduvad(List())) assert(!korduvad(List( 1 , 2 , 3 , 4 ))) assert(!korduvad(List( 1 , 2 , 3 , 4 , 5 ))) assert(korduvad(List( 1 , 1 ))) assert(korduvad(List( 1 , 2 , 3 , 4 , 4 ))) assert(korduvad(List( 1 , 4 , 2 , 3 , 4 ))) } } |
2. ülesanne (0.5p)
Kasutades foldLeft
, kirjuta meetod maksta
, mis tagastab argumendiks saadud arvete hulgast mittemakstud arvete kogusumma.
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 27 |
object MaksaArved { class Arve { var summa = 0 d var toode = "" var makstud = false } def maksta(as : List[Arve]) : Double = { as.foldLeft(???)(???) } def main(args : Array[String]) : Unit = { val a 1 = new Arve; a 1 .toode = "A" ; a 1 .summa = 10 ; a 1 .makstud = false val a 2 = new Arve; a 2 .toode = "B" ; a 2 .summa = 22 ; a 2 .makstud = true val a 3 = new Arve; a 3 .toode = "B" ; a 3 .summa = 22 ; a 3 .makstud = false val a 4 = new Arve; a 4 .toode = "A" ; a 4 .summa = 10 ; a 4 .makstud = false assert(maksta(List(a 1 , a 2 , a 3 , a 4 )) == 42 ) assert(maksta(List(a 1 , a 2 , a 3 )) == 32 ) assert(maksta(List(a 1 , a 2 , a 4 )) == 20 ) assert(maksta(List()) == 0 ) } } |
3. ülesanne (0.5p)
Kirjuta meetod kontrolliKontot
, mis kontrollib, kas konto tehingute jooksul pole kunagi mindud miinusesse rohkem kui 1000 ühikut. Pane tähele et konto avatakse tühjalt.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
object Krediidikontroll { type Raha = Int type KontoAjalugu = List[Raha] // Kui palju võib võlgu minna: def krediit : Raha = 1000 def kontrolliKontot(konto : KontoAjalugu) : Boolean = ??? def main(args : Array[String]) : Unit = { assert(kontrolliKontot(List( 10 ,- 5 , 20 ))) assert(kontrolliKontot(List(- 1000 ))) assert(kontrolliKontot(List(- 1000 ))) // kontrolliKontot kutsed peaksid olema sõltumatud assert(!kontrolliKontot(List(- 1000 ,- 1 ))) assert(!kontrolliKontot(List( 10 ,- 1000 , 10 ,- 30 , 10000 ))) } } |
4. ülesanne (0.5p)
Tõlgi Haskelli funktsioon transpose
Scalasse, meetodiks transponeeri
.
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 27 |
object Transponeerimine { val m 1 = List(List( 1 , 2 , 3 ), List( 11 , 12 , 13 ), List( 21 , 22 , 23 )) def prindiMaatriks(xss : List[List[Int]]) : Unit = { for (xs <- xss) { for (x <- xs) { printf( "%3d" , x) } println() } } // Haskellis on järgneva funktsiooni nimi 'transpose'. // tr :: [[a]] -> [[a]] // tr [] = [] // tr ([] : xss) = tr xss // tr ((x:xs) : xss) = (x : map head xss]) : tr (xs : map tail xss) def transponeeri(m : List[List[Int]]) : List[List[Int]] = ??? def main(args : Array[String]) : Unit = { prindiMaatriks(m 1 ) println() prindiMaatriks(transponeeri(m 1 )) } } |
Implementeeritav funktsioon peab kasutama etteantud mustrisobitust ja rekursiooni. S.t. ära kasuta siin standardteegi meetodit transpose
.