Tälle sivulle on koottu joukko Ohjelmoinnin perusteita Java-kielellä -kurssimateriaalini esimerkkejä Scala-kielellä ohjelmoituna. Koska esimerkit on muokattu suoraan Java-versioista, ne eivät missään nimessä edusta Scalan käyttöä tyylikkäimmillään! Tämän sivun esimerkkien rinnalla kannattaa katsella kyseistä Java-kurssimateriaalia. Kappalenumerointi ja -otsikointi ovat samat.
println("Hoi maailma!")
object HoiB { def main(args: Array[String]) = { println("Hoi maailma!") } }
object HoiC extends Application { println("Hoi maailma!") }
#!/usr/bin/env scala !# println("Hoi maailma!")
var lkm=1 var kpl=100 var pituus=1.1 var leveys=2.2 var korkeus=3.3 lkm = kpl- 10 * (kpl-8) pituus = leveys * korkeus + pituus * lkm lkm = 5 korkeus = 5 kpl = lkm/2 // arvo on 2 leveys = korkeus/2 // arvo on 2.5 lkm = 17%3 // arvo on 2Mesim.scala
val alku = "kissa" val loppu = "vie" var koko = "" koko = alku + loppu // "kissavie" koko = alku + " " + loppu // "kissa vie" koko = alku + " " + loppu +"!" // "kissa vie!"KateKoe.scala
val jono = "kissa" var tulos = "" tulos = jono + 100 println(tulos) tulos = jono + 100 + 1000 // ! println(tulos) tulos = 100 + jono println(tulos) tulos = 100 + 1000 + jono // ! println(tulos)
val i = readLine println(i)Viisas.scala
println("Mikä on nimesi?") val syottörivi = readLine println("Mitä kokonaislukua ajattelet?") val kokonaisluku = readInt println("Mitä desimaalilukua ajattelet?") val desimaaliluku = readDouble print ("Tiedän, että nimesi on "+syottörivi) println(" ja että ajattelit lukuja " + kokonaisluku+" ja "+ desimaaliluku+".") println("Enkö olekin viisas!")KolmeKarvo.scala
println("\n **** Keskiarvo-ohjelma ****\n") print("Anna 1. luku: ") val luku1 = readDouble print("Anna 2. luku: ") val luku2 = readDouble print("Anna 3. luku: ") val luku3 = readDouble val summa = luku1 + luku2 + luku3 val karvo = summa/3 println("Lukujen keskiarvo on " + karvo)
for (i <- 0 until 6) // arvot 0, ..., 5 println(i) for (i <- 0 to 5) // myös arvot 0, ..., 5 println(i) for (i <- 0 to 2) for (j <- 0 to 1) println(i+" "+j) var i=0 while (i<6) { // arvot 0, ..., 5 println(i) i += 1 } i=0 // määritelty jo edellä do { println(i) // arvot 0, ..., 5 i += 1 } while (i<6)Tuplatw.scala
println("Lukujen tuplausohjelma, nolla lopettaa") var luku = readInt while (luku != 0) { println("Tuplana: "+luku*2) luku = readInt } println("Siinä ne olivat.")Pariton.scala
var luku = 0 var parillinen = false do { println("Anna pariton luku!") luku = readInt parillinen = (luku%2 == 0); if (parillinen) println("Eihän "+luku+" ole pariton ...") } while (parillinen) println("Hienoa, "+luku+" on pariton!")
var lukujenLkm = 0 var lkmOk = true var luku = 0.0 var lukujenSumma = 0.0 var lukujenKarvo = 0.0 println("\n**** Keskiarvon laskenta ****\n"); // Monenko luvun keskiarvo lasketaan // (tarkistetaan, että määrä ei ole negatiivinen): do { print("Monenko luvun keskiarvo lasketaan? "); lukujenLkm = readInt lkmOk = (lukujenLkm >= 0) // nollakin kelpaa! if (!lkmOk) println("Virhe: negatiivinen ei kelpaa!"); } while (!lkmOk); // Lukujen summan laskenta: for (monesko <- 1 to lukujenLkm) { print("Anna "+monesko+". luku: "); luku = readDouble; lukujenSumma += luku; } // Keskiarvon tulostus (estetään 0:lla jakaminen): if (lukujenLkm == 0) println("\nEi lukuja, ei keskiarvoa.\n"); else { lukujenKarvo = lukujenSumma/lukujenLkm; println("\nKeskiarvo on "+lukujenKarvo+".\n"); }
var lukujenLkm = 0 var luku = 0.0 var lukujenSumma = 0.0 var lukujenKarvo = 0.0 println("\n**** Keskiarvon laskenta ****\n"); // Käyttöohjeen tulostus: println("Syötä luvut, joiden keskiarvon haluat laskea!\n"+ "Negatiivinen luku ilmoittaa lukujen loppuvan.\n") // Lukujen summan laskenta: luku = readDouble // 1. luku (voi olla jo loppumerkki!) while (luku >= 0) { lukujenSumma += luku lukujenLkm += 1 luku = readDouble // seuraava luku tai loppumerkki } // Keskiarvon tulostus (estetään 0:lla jakaminen): if (lukujenLkm == 0) println("\nEi lukuja, ei keskiarvoa.\n") else { lukujenKarvo = lukujenSumma/lukujenLkm println("\nKeskiarvo on "+lukujenKarvo+".\n") }
var lukujenLkm = 0 var jatkuu = "" var luku = 0.0 var lukujenSumma = 0.0 var lukujenKarvo = 0.0 println("\n**** Keskiarvon laskenta ****\n"); // Lukujen summan laskenta: do { println("Onko vielä lukuja? (kyllä/ei)"); jatkuu = readLine if (jatkuu == "kyllä") { // TOIMIIKS TÄÄ TOSIAAN??? println("Anna " + (lukujenLkm + 1) + ". luku"); luku = readDouble lukujenSumma += luku; lukujenLkm += 1; } } while (jatkuu == "kyllä"); // Keskiarvon tulostus (estetään 0:lla jakaminen): if (lukujenLkm == 0) println("\nEi lukuja, ei keskiarvoa.\n") else { lukujenKarvo = lukujenSumma/lukujenLkm println("\nKeskiarvo on "+lukujenKarvo+".\n") }
println("Anna kokonaisluku.") try { val luku = readInt println("Annoit luvun " + luku) } catch { case ex: Exception => println("Et syöttänyt kokonaislukua!") }Tarkista2.scala
var luku = 0 var kunnonLuku = false do { println("Anna kokonaisluku."); try { val luku = readInt println("Annoit luvun " + luku) kunnonLuku = true } catch { case ex: Exception => { println("Et syöttänyt kokonaislukua!") println("Yritä uudelleen!") } } } while (!kunnonLuku)SuurinSyottoluku.scala
var syöttöluku = 0 var toistaiseksiSuurin = 0; // muuttuu aina, jos on lukuja println("************************************************\n" + "* Ohjelma syöttölukujen maksimiarvon etsintään *\n" + "* Nolla päättää syötteet. *\n" + "* Anna luvut! *\n" + "************************************************\n"); syöttöluku = readInt toistaiseksiSuurin = syöttöluku while (syöttöluku != 0) { if (syöttöluku > toistaiseksiSuurin) toistaiseksiSuurin = syöttöluku syöttöluku = readInt } if (toistaiseksiSuurin == 0) println("Ei lukuja!") else println("Suurin luku oli " + toistaiseksiSuurin)
def tulostaHip = println("Hip heijjaa!") def tulostaHoh = println("Hoh hoijjaa!") def tulostaSuperHip() { println("------------"); tulostaHip tulostaHip tulostaHip println("------------") } println("Nyt se alkaa:") tulostaHip tulostaHoh tulostaHip tulostaHip tulostaHoh tulostaSuperHip println("Tähän se loppui.")TulostaHuudahdus.scala
def tulostaHuudahdus(viesti:String, kertaa:Int) = { for (i <- 1 to kertaa) println(viesti) } tulostaHuudahdus("Hip heijjaa!", 2)KahdenKarvo.scala
def tulosta2Karvo(luku1:Double, luku2:Double) = val summa = luku1 + luku2 val karvo = summa/2 println("Lukujen "+luku1+" ja "+luku2+ " keskiarvo on "+karvo+".") } tulosta2Karvo(1, 2) tulosta2Karvo(-30.2, 1.2) tulosta2Karvo(-1, 1) tulosta2Karvo(3.14, 123.1)KahdenKarvoFun.scala
def laske2Karvo(luku1:Double, luku2:Double) = { val summa = luku1 + luku2; val karvo = summa/2; karvo } var a = laske2Karvo(1, 2) println(a) a = laske2Karvo(-30.2, 1.2) println(a); println(laske2Karvo(-1, 1)) println(laske2Karvo(3.14, 123.1)) println(laske2Karvo(2, laske2Karvo(3,4)))Itse.scala
def itseisArvo(luku:Int) = if (luku < 0) -luku else luku var a = itseisArvo(3) println(a) a = itseisArvo(-34) println(a) println(itseisArvo(-2987))Korostuksia.scala
def osoitteleJono(teksti:String) = "------> "+teksti+" <------" var kissa = "Missu" var s = "" s = osoitteleJono(kissa) println(s) println(osoitteleJono("hiiohei")) println(osoitteleJono("A")+osoitteleJono("B")) println(osoitteleJono(osoitteleJono("AW")))Tarkistus.scala
def oikeinko(i:Int) = i>0 && i%2==0 && i!=274 && i!=666 var sluku = 0 do { println("Syötä kunnon luku!") sluku = readInt } while (!oikeinko(sluku)); println("Vihdoin kunnon luku: "+sluku)Nelio.scala
object Kirjasto { def tulostaNelio() = println("neliö") def tulostaNelio(luku:Int) = println(luku*luku) def tulostaNelio(luku:Double) = println(luku*luku) def tulostaNelio(i:Int, j:Int) = for (a <- 1 to i) { for (b <- 1 to j) print("*") println() } } Kirjasto.tulostaNelio() Kirjasto.tulostaNelio(12) Kirjasto.tulostaNelio(3.14) Kirjasto.tulostaNelio(4, 6)
class Kuulaskuri { private var kuu=1 // sallitut arvot 1,..12 // ----- aksessorit: ----------- def moneskoKuu = kuu def seuraavaKuu { kuu += 1 if (kuu == 13) kuu = 1 } } //--------------------------------------------- var tämäKuu: Kuulaskuri = null var tuoKuu = new Kuulaskuri // käydään läpi 27 kuukautta: println("Kaksikymmentäseitsemän kuukautta:"); for (i <- 1 to 27) { print(tuoKuu.moneskoKuu + " ") tuoKuu.seuraavaKuu } println() // kopioidaan viite, ei oliota: tämäKuu = tuoKuu println("tuoKuun:n arvo on nyt "+tuoKuu.moneskoKuu) println("tämäKuun:n arvo on nyt "+tämäKuu.moneskoKuu) // edetään seuraavaan kuukauteen, myös tuoKuu etenee, // koska muuttujat viittaavat SAMAAN olioon: tämäKuu.seuraavaKuu println("tuoKuun:n arvo on nyt "+tuoKuu.moneskoKuu) println("tämäKuun:n arvo on nyt "+tämäKuu.moneskoKuu) // luodaan kaksi uutta Kuulaskuri-oliota, vanhaan ei jää // enää viitteitä, se jää roskienkerääjän hoideltavaksi: tämäKuu = new Kuulaskuri tuoKuu = new Kuulaskuri // edistetään tämäKuu:n osoittamaa oliota kahdesti: tämäKuu.seuraavaKuu tämäKuu.seuraavaKuu // tulostetaan 15 peräkkäistä kuukauden numeroa MOLEMMISTA // olioista: println("Viisitoista kuukautta rinnakkain:") for (i <- 1 to 15) { println(tämäKuu.moneskoKuu+"\t" + tuoKuu.moneskoKuu); tämäKuu.seuraavaKuu tuoKuu.seuraavaKuu }
class Pikkuvarasto (private var määrä: double, val tuote: String) { def this() = this(0.0, "(nimetön)") // parametriton konstruktori oletusarvoin def paljonkoOn = määrä // aksessori on tehtävä koska määrä on private! def vieVarastoon(paljonko: double) = if (paljonko > 0) määrä += paljonko def otaVarastosta(paljonko: double) = if (paljonko <= 0) 0.0 else if (paljonko <= määrä) {määrä -= paljonko; paljonko;} else {val saatiin = määrä; määrä = 0; saatiin;} override def toString = "("+tuote+": "+määrä+")" def summa(toinen: Pikkuvarasto) = new Pikkuvarasto(määrä + toinen.määrä, tuote + toinen.tuote); } //------ kokeilua ------------ val mehua = new Pikkuvarasto(10, "Mehu") val olutta = new Pikkuvarasto(123.4, "Olut") val bensaa = new Pikkuvarasto(90.1, "Bensa") println(mehua); println(olutta); println(bensaa) val a = new Pikkuvarasto(); println(a) val b = mehua; println("" + b + mehua) b vieVarastoon(25); println("" + b + mehua) println("Muuttuja bensaa:" + bensaa + ", määrä=" + bensaa.paljonkoOn + ", nimi=" + bensaa.tuote) println(bensaa) bensaa.vieVarastoon(27.4); println(bensaa) bensaa.vieVarastoon(-34.1); println(bensaa) println(olutta) var saatiin: double = olutta.otaVarastosta(10.2) println("Saatiin " + saatiin + ", tilanne: "+olutta) saatiin = olutta.otaVarastosta(-78.8) println("Saatiin " + saatiin + ", tilanne: "+olutta) saatiin = olutta.otaVarastosta(175.5) println("Saatiin " + saatiin + ", tilanne: "+olutta) olutta.vieVarastoon(432.1) val c = mehua.summa(olutta) println("" + mehua + olutta + c) var d = c.summa(bensaa); println("" + c + bensaa + d) d = d.summa(bensaa.summa(mehua)); println(d)
// Pikkuvaraston määritelmä kopioitu tännekin ... def lueVarasto() = { println("Tuotteen nimi?") val nimi = readLine var sisalto = 0.0; do { println("Tuotteen määrä? (ei-negatiivinen)"); sisalto = readDouble } while (sisalto < 0) new Pikkuvarasto(sisalto, nimi) // HUOM: viite! } println("Luodaanpa varasto!") val varasto = lueVarasto() println("Varasto on: " + varasto)
var vastaus = "" do { print("Anna ensimmäinen merkkijono: ") val eka = readLine print("Anna toinen merkkijono : ") val toka = readLine if (eka < toka) println("Esimmäinen on ennen toista."); else if (eka == toka) println("Jonot ovat samat."); else // eka > toka println("Toinen on ennen ensimmäistä."); println("\nHaluatko jatkaa? (enter jatkaa, kaikki muu lopettaa)"); vastaus = readLine } while (vastaus == "")Kissako.scala
println("Syötä rivi. Etsin siltä kissaa.") val syöttorivi = readLine if (syöttorivi contains "kissa") println("Jossakin kohdassa syöttörivillä on kissa!") else println("Rivi on kissaton.")
val luku = new Array[Int](10) // luetaan 10 lukua: for (i <- 0 until luku.length) { println("Anna luku "+(i+1)) luku(i) = readInt } // tulostetaan luvut käänteisessä järjestyksessä: println("Luvut lopusta alkuun:") for (i <- 0 until luku.length reverse) println(luku(i))
var lukumäärä = 0 do { println("Montako lukua käännetään? (Vähintään yksi!)"); lukumäärä = readInt } while (lukumäärä < 1); val luku = new Array[Int](lukumäärä) // Huom: luettu arvo! // Loppuosa ohjelmasta säilyy aivan ennallaan! for (i <- 0 until luku.length) { println("Anna luku "+(i+1)) luku(i) = readInt } // tulostetaan luvut käänteisessä järjestyksessä: println("Luvut lopusta alkuun:") for (i <- 0 until luku.length reverse) println(luku(i))
val matriisi = new Array[Array[Int]](2, 3) for (rivi <- 0 until matriisi.length) for (sarake <- 0 until matriisi(rivi).length) { println("Anna alkio "+rivi+", "+sarake) matriisi(rivi)(sarake) = readInt } // kerrotaan alkiot 7:llä: for (rivi <- 0 until matriisi.length) for (sarake <- 0 until matriisi(rivi).length)) matriisi(rivi)(sarake) *= 7; // operaatio '*='kertoo! // tulostetaan matriisi: println("Seitsemällä kerrottuna:"); for (rivi <- 0 until matriisi.length) { for (sarake <- 0 until matriisi(rivi).length)) print(matriisi(rivi)(sarake)+"\t") println() } // lasketaan alkioiden summa: var summa = 0; for (rivi <- matriisi) // nyt tarvitaan vain alkioiden arvot! for (alkio <- rivi) summa = summa + alkio println("Alkioiden summa on " + summa + ".")
def hae(taulu: Array[Int], haettava:Int): Int = { for (i <- 0 until taulu.length) if (taulu(i) == haettava) return i // tärppäsi, lopetetaan samantien -1; // päästiin loppuun eikä löytynyt } // testipääohjelma val a = new Array[Int](5) a(0)=40; a(1)=20; a(2)=50; a(3)=10; a(4)=30 println(hae(a, 10)) println(hae(a, 20)) println(hae(a, 30)) println(hae(a, 40)) println(hae(a, 50)) println(hae(a, 60))
def binHae(taulu: Array[Int], haettava:Int): Int = { var vasen = 0 var oikea = taulu.length-1 var keski = 0 while (vasen <= oikea) { keski = (vasen+oikea)/2 if (haettava == taulu(keski)) return keski // löytyi ja lopetetaan! if (haettava < taulu(keski)) oikea = keski-1 else vasen = keski+1 } -1 // hakualue tuli tyhjäksi eikä löytynyt } // testipääohjelma val a = new Array[Int](5) a(0)=10; a(1)=20; a(2)=30; a(3)=40; a(4)=50 println(binHae(a, 5)) println(binHae(a, 10)) println(binHae(a, 20)) println(binHae(a, 30)) println(binHae(a, 35)) println(binHae(a, 40)) println(binHae(a, 50)) println(binHae(a, 60))
def vaihtoJarjesta(taulu: Array[Int]) = { for (i <- 0 until taulu.length-1) for (j <- i+1 until taulu.length) if (taulu(i) > taulu(j)) { // onko järjestys väärä? val apu = taulu(i) taulu(i) = taulu(j) taulu(j) = apu } } // testipääohjelma val a = new Array[Int](5) a(0)=40; a(1)=20; a(2)=50; a(3)=10; a(4)=30 for (arvo <- a) print(arvo+" ") println vaihtoJarjesta(a) for (arvo <- a) print(arvo+" ") println
def kuplaJarjesta(taulu: Array[Int]) = { for (i <- 1 to taulu.length reverse) for (j <- 0 until i-1) if (taulu(j) > taulu(j+1)) { // onko järjestys väärä? val apu = taulu(j) taulu(j) = taulu(j+1) taulu(j+1) = apu } } // testipääohjelma val a = new Array[Int](5) a(0)=40; a(1)=20; a(2)=50; a(3)=10; a(4)=30 for (arvo <- a) print(arvo+" ") println kuplaJarjesta(a) for (arvo <- a) print(arvo+" ") println
def lisaysJarjesta(taulu: Array[Int]) = { for (i <- 1 until taulu.length) { val apu = taulu(i) var j = i while (j > 0 && taulu(j-1) > apu) { taulu(j) = taulu(j-1) j -= 1 } taulu(j) = apu } } // testipääohjelma val a = new Array[Int](5) a(0)=40; a(1)=20; a(2)=50; a(3)=10; a(4)=30 for (arvo <- a) print(arvo+" ") println lisaysJarjesta(a) for (arvo <- a) print(arvo+" ") println
class AlaspainLaskureita(kpl:Int) { // tietorakenne ja konstruointi: private val laskurit: Array[Int] = if (kpl<=1) new Array[Int](1) else new Array[Int](kpl) for (i <- 0 until laskurit.length) laskurit(i) = 100 def seuraava(n:Int):Int = { if (n<0 || n>=laskurit.length) return -1 val arvo = laskurit(n) if (laskurit(n)>0) laskurit(n) -= 1 return arvo } } // testiohjelma: val a = new AlaspainLaskureita(10) val b = new AlaspainLaskureita(-10) // vähentyminen: println(a.seuraava(3)) println(a.seuraava(3)) println(a.seuraava(3)) // virheellinen alkio: println(a.seuraava(12)) // loppuuko väheneminen: for (i <- 0 until 98) a.seuraava(7) println(a.seuraava(7)) println(a.seuraava(7)) println(a.seuraava(7)) println(a.seuraava(7)) // tuliko yhden mittaiseksi väärästä konstruoinnista: println(b.seuraava(0)) println(b.seuraava(0)) println(b.seuraava(1))