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

Ohjelmointitekniikka (Scala): harjoitukset 2

Sivu julkaistu 23.3.2016

Kokoelmia ja olioita. Käytä mahdollisuuksien mukaan lukujen 2-5 tekniikoita. Varaudu myös selittämään, miten olet ohjelmoinut ja mitä ohjelmatekstisi tarkoittaa!

    1. Laadi havainnollisia pikku esimerkkejä seuraavien listaoperaatioiden käytöstä: counts, exists, filter, forall, foreach, map ja filterNot.
      (Korjattu 4.4.: remove oli vanhentunut, se on korvattu samaa tarkoittavalla funktiolla filterNot.)

    2. Tee yksinkertainen "kielenkäännösohjelma", joka ensin lukee tekstitiedostosta sanapareja – jokainen sana on yksin omalla rivillään, parittomilla riveillä alkukielellä, parillisilla kohdekielellä. Sitten ohjelma tarjoaa palvelun yksittäisten sanojen kääntämiseksi. Käytä assosiaatiolistaa Map.

      Suoritusesimerkki (käyttäjän rivit kursiivilla):

      $ scala kaantaja italiaksi.txt
      Sanat opittu! (tyhjä kysymysrivi lopettaa)
      kissa
      gatto
      kaikki
      tutti
      koiru
      VIRHE: En tunne sanaa koiru
      koira
      cane
      
      $
      
      

    1. Sekuntilaskuri tuntee sekunnit, minuutit ja tunteja vuorokauden verran. Laskuri voi vain edetä. Kun sekunnit ylittävät arvon 59 yhdellä, minuutit kasvavat ja sekunnit nollataan. Kun minuutit ylittävät arvon 59 yhdellä, tunnit kasvavat ja minuutit nollataan. Kun laskuri ylittää arvon 23:59:59 (23 tuntia, 59 minuuttia, 59 sekuntia), aloitetaan uudelleen arvosta 0:0:0. Laskuri siis laskee: 0:0:0, 0:0:1, ..., 0:0:59, 0:1:0, 0:1:1, 0:1:2, ..., 0:59:57, 0:59:58, 0:59:59, 1:0:0, 1:0:1,..., 23:59:58, 23:59:59, 0:0:0. Toteuta luokka Sekuntilaskuri:
      • new Sekuntilaskuri luo sekuntilaskurin, jonka alkuarvo on 0:0:0 (konstruktori)
      • Sekuntilaskuri luo sekuntilaskurin, jonka alkuarvo on 0:0:0 (factory-metodi)
      • getSekunnit: Int palauttaa arvonaan sekuntien määrän
      • getMinuutit: Int palauttaa arvonaan minuuttien määrän
      • getTunnit: Int palauttaa arvonaan tuntien määrän
      • lisaaSekunti: Unit lisää sekuntien määrää yhdellä ja tarvittaessa kasvattaa myös minuutteja ja tunteja
      • toString tuottaa merkkiesityksen tyyliin "14:7:53"

      Laadi erillinen pääohjelmaluokka Sekuntilaskuri-luokan esittelyyn.

    2. Kompleksiluvut voidaan ilmaista reaalilukupareina.. Merkitään z1 = (x1, y1), z2 = (x2, y2) ja z = (x, y).

      Aritmetiikkaa:

      • Summa: z1 + z2 = ((x1 + x2), (y1 + y2))
      • Vastaluku: -z = (-x, -y)
      • Erotus: z1 - z2 = z1 + (-z2)
      • Tulo: z1 * z2 = ((x1 * x2 - y1 * y2), (x1 * y2 + x2 * y1))
      • Käänteisluku: z-1 = 1/z = ((x/(x2+y2)), (-y/(x2+y2)))
      • Osamäärä: z1 / z2 = z1 * (z2-1)

      Toteuta muuttumattomat ("immutaabelit") kompleksiluvut luokkana, jossa on ainakin kompleksilukuoperaatiot + , -, * ja / (mieluummin nuo kaikki yllä luetellut) sekä toString. Tulostusasu on tyyliä 5.16+2.97i, -5.1-9.978i, 3.141592653589793+2.718281828459045i, jne. Anna esimerkkejä luokan käytöstä.

  1. Laadi lyhyt kirjallinen muistilista luokkien ohjelmoinnista henkilölle, joka pelastautuu Javasta Scalaan. Kirjoituksen laajuudeksi riittää "A4-arkin koko". Esitystapa voi olla luettelomainen: ranskalaisia viivoja, numeroituja kohtia, tms.
    (Kaikki eivät ehkä pidä tällaisten kirjallisten raporttien laadinnasta, mutta on hyvä muistaa, että akateemiseen ammattiin valmistuva henkilö miltei varmasti joutuu työtehtävissään laatimaan raportteja, ohjeistuksia, esitteitä yms. Joku IT-päällikkö tms. saattaisi hyvinkin joutua laatimaan juuri tämän tehtävän tapaisen ohjeistuksen alaisilleen. ;-)