Tämä kurssi on jo päättynyt.
Et voi palauttaa tätä tehtävää

Palauttaaksesi tehtäviä sinun pitää rekisteröityä ja ilmoittautua kurssin etusivulla.

Tehtävä 21

3 pistettä

Yksinkertainen tapa soittaa Jaakko kulta on tässä. Kokeile.

val jaakkoKulta = "f-g-a-f-f-g-a-f-a-hb->c---<a-hb->c---cdc<hba-f->cdc<hba-f-f-c-f---f-c-f---"
play(jaakkoKulta)

Tuo soittaa kappaleen yhdellä soittimella yksiäänisesti. Kuitenkin Jaakko kulta esitetään usein moniäänisesti kaanonissa: kukin ääni aloittaa melodian hieman eri aikaan, ja äänet menevät osin päällekkäin. Kaanon-esitystä kuvaavan merkkijonon voi muodostaa vaikutuksettomalla funktiolla kaanon, joka on määritelty seuraavasti.

  • Sille annetaan ensimmäiseksi parametriksi merkkijono, joka sisältää jonkin melodian.

  • Sille annetaan toiseksi parametriksi viittaus kokonaislukuja sisältävään puskuriin, jossa on lueteltuna soittimien numeroita.

  • Kolmanneksi ja viimeiseksi parametriksi annetaan kokonaisluku, joka määrää viiveen, jonka kukin ääni "odottaa" aloittamistaan edellisen äänen aloitettua.

  • Funktio palauttaa merkkijonon, joka kuvaa moniäänisen kaanonversion annetusta melodiasta siten, että äänet soitetaan toisen parametrin luettelemilla soittimilla. (Tällaisen merkkijonon voi sitten antaa play-funktiolle soitettavaksi.)

Tässä melkein valmis esimerkkikoodi, jolla yllä kuvailtua kaanon-funktiota voi käyttää:

val jaakkoKulta = "f-g-a-f-f-g-a-f-a-hb->c---<a-hb->c---cdc<hba-f->cdc<hba-f-f-c-f---f-c-f---"
val soittimet = Buffer(4, 1, 74, 19)
play(???)

Millainen kaanon-funktion kutsu pitäisi kirjoittaa play-funktion parametrilausekkeeksi kolmen kysymysmerkin paikalle, jotta kaanonissa soisi tuo melodia noilla soittimilla ja viiveellä 8?

Kokeile REPLissä ja kirjoita pyydetty lauseke myös tähän alle. (Vain se kysymysmerkit korvaava lauseke, ei koko soittokäskyä eikä sitä pitkää merkkijonoa, jonka kaanon-funktio palauttaa.) Käytä yllä määriteltyjä muuttujia.

Voit kokeilla kaanon-funktion kutsumista muutenkin.

3 pistettä

Harjoittele vielä funktion kutsumista ja puskuriin osoittavan viittauksen käyttämistä parametrina.

Kokeile o1-pakkauksen funktiota sensuroi. Anna sille kaksi parametria:

  1. sensuroitava merkkijono "Sylvi sentään! Voi herttinen! Mikä tavaton se oli? Oi, hyvä Sylvi!"

  2. viittaus puskuriin (Buffer), jossa on kolme kirosanamerkkijonoa "herttinen", "Sylvi" ja "tavaton".

Minkä tekstin tämä funktiokutsu palauttaa?

Voit ratkaista tehtävän esimerkiksi näin: Luo ensin puskuriin viittaava muuttuja. Välitä sitten sensuroi-funktiolle parametreiksi sensuroitava merkkijono literaalina sekä viittaus luomasi muuttujan osoittamaan puskuriin.

Edellisen kysymyksen koodista voi olla apua. Muutkin ratkaisutavat ovat mahdollisia ja sallittuja.

Kirjoita merkkijonot täsmälleen yllä olevassa muodossa. Voit kopioida vastauksen tulosteesta, niin menee merkilleen oikein.

1 piste

Luvussa 1.4 esiteltiin tapa upottaa merkkijonon sisään arvoja käyttäen s-kirjainta ja dollarimerkkiä. Koetetaan nyt tuota tekniikkaa ja funktiokutsuja yhdessä.

Seuraavien kolmen koodinpätkän pitäisi kunkin tulostaa luku ja sen neliöjuuri. Mitkä niistä toimivat? Arvioi itse ja kokeile REPLissä.

(Alla oletetaan, että import scala.math.* on annettu.)

val luku = 123.4
val juuri = sqrt(luku)
println(s"Luvun $luku neliöjuuri on $juuri.")
val luku = 123.4
println(s"Luvun $luku neliöjuuri on ${sqrt(luku)}.")
val luku = 123.4
println(s"Luvun $luku neliöjuuri on $sqrt(luku).")

Mikä seuraavista pitää paikkansa?

Palautusta lähetetään...

Ansaitut pisteet

0 / 7

Tehtävän tiedot

Tehtäväkategoria
Pisteytetty
Palautuksesi
0 / 5
Määräaika
keskiviikko 14.9.2022 18:00
Myöhästyneiden palautuksien määräaika
lauantai 15.4.2023 12:00 (-100%)
Ryhmäkoko
1-2
Palauttaneita opiskelijoita yhteensä
995