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.
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.
object MaksaArved {
class Arve {
var summa = 0d
var toode = ""
var makstud = false
}
def maksta(as: List[Arve]): Double = {
as.foldLeft(???)(???)
}
def main(args: Array[String]): Unit = {
val a1 = new Arve; a1.toode = "A";
a1.summa = 10; a1.makstud = false
val a2 = new Arve; a2.toode = "B";
a2.summa = 22; a2.makstud = true
val a3 = new Arve; a3.toode = "B";
a3.summa = 22; a3.makstud = false
val a4 = new Arve; a4.toode = "A";
a4.summa = 10; a4.makstud = false
assert(maksta(List(a1, a2, a3, a4)) == 42)
assert(maksta(List(a1, a2, a3)) == 32)
assert(maksta(List(a1, a2, a4)) == 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.
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.
object Transponeerimine {
val m1 = 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(m1)
println()
prindiMaatriks(transponeeri(m1))
}
}
Implementeeritav funktsioon peab kasutama etteantud mustrisobitust ja rekursiooni. S.t. ära kasuta siin standardteegi meetodit transpose.