Helsingin yliopisto / tietojenkäsittelytieteen laitos / Ohjelmointitekniikka (Scala) / © Arto Wikla 2016

Ohjelmointitekniikka (Scala): harjoitukset 4

Sivu julkaistu 11.4.2016.

Jos käytät Scalan rakenteita, joita ei ole vielä luennoilla käsitelty, kommentoi ohjelmasi kunnolla! Varaudu myös selittämään, miten olet ohjelmoinut ja mitä ohjelmatekstisi tarkoittaa!

  1. Mitä seuraavat ohjelmat tulostavat? Mistä on kysymys? Miten kaikki oikein käy?
    1. val lista = for (i <- 1 to 5; j <- i to 5; if i*j%2 != 0) yield(i*j)
      lista.foreach(println)
      
    2. val l = List(1,2,3,4,5)
      val m = Array(5,6,7,8,9)
      var a = 0; var b = 0
      l.foreach(x => {m(b)+=x; b+=1})
      m.foreach(println _)
      
    3. val a=1; val b=2; val c=3;
      { val b=4; val c=5;
        { val c=6;
          println(a +"/"+ b +"/"+ c);
        }
        println(a +"/"+ b +"/"+ c);
      }
      println(a +"/"+ b +"/"+ c)
      
    4. Tee seuraavalle funktiolle Curry-muunnos funktiona g:
      def f(n: String, i: Int)  {println(n + ": " + i)}
      
      Selitä, mistä on kysymys ja anna myös esimerkit f:n ja g:n kutsusta.

    1. Toteuta pieni ja yksinkertainen – ehkäpä lapsille tarkoitettu – algoritminen ohjelmointikieli, jossa operaationimet ovat suomeksi. Kielessä on operaatiot:
      • lue lukee kokonaisluvun
      • kirjoita(arvo) kirjoittaa minkä tahansa arvon
      • jos (ehto) {lause tai lausejono} ehdollinen lause
      • toista(lkm) {lause tai lausejono} lkm-kertainen toisto
      • toistaEhdolla (ehto) {lause tai lausejono} alkuehtoinen toistolause

      Kielen käyttäjälle opetetaan lisäksi muuttujan määrittely, sijoitusoperaatioita ja loogisia vertailuja. Ainoa aloittelijalle opetettava tietotyyppi on kokonaisluku. Tulostamista varten myös merkkijonokatenaatiot on syytä opettaa. Esimerkki alla havainnollistaa ohjelmointia tällä aloittelijakielellä.

      Kieli toteutetaan ainokaisen funktioina, jotka saadaan käyttöön käännösyksikköön import-ilmauksella. Jos ainokaisen nimi on vaikkapa Kieli, ilmauksen muoto on import Kieli._. Tarvittava(-t), class-tiedostot sijoitetaan samaan hakemistoon sovelluksen kanssa

      Tässä tehtävässä on siis tarkoitus käyttää Scalan tekniikoita kontrolliabstraktioiden rakenteluun, ei ohjelmoida kääntäjää tai tulkkia! Jos intoa riittää, voit toki täydentää kieltä haluamallasi tavalla.

      Ohjelmointiesimerkki:

      import Kieli._
      
      // Ohjelmointiesimerkki:
      
      jos (1<2) {kirjoita("kissa")}   // Aaltosulkeet ovat pakolliset!
      
      kirjoita(1+2)
      kirjoita(1<2)
      
      kirjoita("Montako onnittelua?")
      var onLkm = lue
      toista (onLkm) {kirjoita("Onnea!")}
      
      var lkm = 6
      toistaEhdolla (lkm > 0) {kirjoita(lkm); lkm -= 1}
      
      kirjoita("Mihin saakka tutkitaan lukujen parillisuutta?")
      var montako = lue
      
      lkm = 1
      toistaEhdolla (lkm <= montako) {
        jos (lkm % 2 == 0) {
          kirjoita(lkm + " on parillinen")
        }
        lkm += 1
      }
      
      kirjoita("Lasketaan lukujen summa a:sta b:hen:")
      kirjoita("Anna a")
      var a = lue
      kirjoita("Anna b")
      var b = lue
      
      jos (a>b) {
        var apu = a
        a = b
        b = apu
      }
      var summa = 0
      var laskuri = a
      toistaEhdolla (laskuri <= b) {
        summa += laskuri
        laskuri += 1
      }
      kirjoita("Lukujen summa " + a + " ... " + b + " on " + summa)
      

    2. Edellisessä tehtävässä toteutettiin pieni pieni sovelluskohtainen kieli (DSL, Domain-specific language, ks. Wiki-artikkeli) aloittelevalle algoritmiselle ohjelmoijalle. Suunnittele DSL henkilölle, joka tuottaa video- tai audiotallenteita. Kielen avulla on tarkoitus tehdä vaivatta aikalaskelmia, taltioiden sisällysluetteloja ("track list"), yms.

      Kielen ominaisuuksia:

      • Keskeinen tietotyyppi on kolmansien harjoitusten tehtävän 1a MinSek-luokka.
      • Taltio ja Tallenne ovat keskeiset luokat: Tallenteella on kesto ja nimi. Taltio sisältää nolla tai useampia Tallenteita
      • Kun Taltio tulostetaan, saadaan seuraavan tyylinen tuloste
          0:00 Laa, laa, laulukappale
          3:52 Soo, soo soittojuttu
          7:32 Kissanviikset pakkasessa huurtuu
         10:11 Noo oonkos tullut keesäää
         14:07 Joo joutui armas aaiikaa
         
         Kokonaiskesto 17:36
        
      • Tallenne-olioita voi lisätä Taltio-olioon ja poistaa Taltio-oliosta.
      • Ohjelma voi käsitellä useita Taltioita
      • Kehittele halusi mukaan lisää piirteitä kieleen.

  2. Tämän tehtävän tehtävänä on perehtyä javamaisen, imperatiivisen olio-ohjelmoinnin peruspuuhailuihin: Kurssimateriaalin luvun 12 lopussa hahmoteltiin pieni esimerkki eläinten hoitoon liittyvistä luokista ja piirretyypeistä. Täydennä esimerkkiä seuraavin tavoin: