Arvutiteaduse instituut
  1. Kursused
  2. 2019/20 sügis
  3. Programmeerimiskeeled (MTAT.03.006)
EN
Logi sisse

Programmeerimiskeeled 2019/20 sügis

  • Info
  • Õppekava
  • Moodle
  • Loengud & Praksid
  • Lisamaterjalid
  • Küsi abi! (Fleep)

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).

object H1 {
  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.

object H3 {
  def summa(xs: Seq[Int]): Int = ???
  def summa2(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.

object H4 {
  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.

object Programm1 {
  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).)

object Programm2 {
  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.

object Programm3 {
  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)

object Programm4 {
  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!

object Programm7 {
 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")))
  }
}
  • Arvutiteaduse instituut
  • Loodus- ja täppisteaduste valdkond
  • Tartu Ülikool
Tehniliste probleemide või küsimuste korral kirjuta:

Kursuse sisu ja korralduslike küsimustega pöörduge kursuse korraldajate poole.
Õppematerjalide varalised autoriõigused kuuluvad Tartu Ülikoolile. Õppematerjalide kasutamine on lubatud autoriõiguse seaduses ettenähtud teose vaba kasutamise eesmärkidel ja tingimustel. Õppematerjalide kasutamisel on kasutaja kohustatud viitama õppematerjalide autorile.
Õppematerjalide kasutamine muudel eesmärkidel on lubatud ainult Tartu Ülikooli eelneval kirjalikul nõusolekul.
Courses’i keskkonna kasutustingimused