Toiminnallisuuden toistaminen
Learning objectives
- Tutustut käsitteeseen toistolause.
- Osaat kirjoittaa toistolauseita, joissa toistojen määrä on ennalta rajattu.
- Osaat kirjoittaa toistolauseita, joissa toistojen määrä ei ole ennalta rajattu.
- Opit kirjoittamaan ohjelmia, joissa on toistuvaa toiminnallisuutta.
Tietokoneen supertaidot: toiminnallisuuden toistaminen
Olemme tähän mennessä oppineet kirjoittamaan ja lukemaan, käsittelemään muuttujia sekä laskemaan, ja toteuttamaan ohjelmia, jotka sisältävät vaihtoehtoista toiminnallisuutta. Näillä taidoilla pystyy tekemään jo hyvin laajojakin ohjelmia.
Monta kertaa saman asian tekevä ohjelma, kuten vaikkapa monta lukua summan laskemiseen käytettävä ohjelma sisältää nykyisillä taidoillamme melko paljon toisteista toiminnallisuutta tai copy-pastettua koodia.
Tarkastellaan tilannetta alla olevan esimerkin kautta. Alla oleva ohjelma kysyy käyttäjältä neljä lukua ja tulostaa niiden summan.
import 'dart:io';
main() {
var summa = 0;
print('Syötä luku');
var luku = int.parse(stdin.readLineSync()!);
summa = summa + luku;
print('Syötä luku');
luku = int.parse(stdin.readLineSync()!);
summa = summa + luku;
print('Syötä luku');
luku = int.parse(stdin.readLineSync()!);
summa = summa + luku;
print('Syötä luku');
luku = int.parse(stdin.readLineSync()!);
summa = summa + luku;
print('Syötettyjen lukujen summa on $summa');
}
Huomaamme ohjelmassa toisteisuutta. Alla oleva luvun kysymiseen ja luvun summaan lisäämiseen käytettävä osa toistuu lähdekoodissa monta kertaa.
print('Syötä luku');
luku = int.parse(stdin.readLineSync()!);
summa = summa + luku;
Tutustutaan seuraavaksi toistolauseeseen. Toistolause (loop) on rakenne, jonka avulla määritellään ohjelmakoodia, jota toistetaan kunnes jokin tietty ehto täyttyy. Toistolauseet jaetaan kahteen kategoriaan niiden päättymisen perusteella: (1) toistolauseet, joissa toistojen määrä on rajattu, ja (2) toistolauseet, joiden toistomäärällä ei ole ylärajaa.
Toistolause mahdollistaa ohjelman osan (lohkon) uudelleen ja uudelleen suorittamisen. Toistolauseissa on tyypillisesti ehto, jonka perusteella päätetään jatketaanko toistolauseen lohkon suoritusta, vai siirrytäänkö toistolausetta seuraavaan lähdekoodiin.
Rajatun määrän toistoja sisältävät toistolauseet
Rajattu määrä toistokertoja toteutetaan for
-toistolauseen avulla. Alla olevassa esimerkissä lasketaan lukujen 0..9 summa ja tulostetaan se.
program output
Lukujen 0...9 summa on 45.
Toistolause for
koostuu kolmesta osasta sekä toistettavan lähdekoodin sisältävästä lohkosta. Toistolauseen osa var i = 0;
alustaa toistolauseen toistokertojen laskemiseen käytetyn muuttujan nimeltä i
. Toistolauseen osa i < 10;
määrittelee toistokertojen rajausehdon. Kun toistolauseen suoritus pääsee lohkon loppuun, toistolause aloitetaan alusta mikäli ehdossa määritelty lauseke i < 10;
evaluoituu todeksi. Toistolauseen osa i++
määrittelee mitä toistolauseen alustuksessa määritellylle muuttujalle i
tehdään toistolauseen lopussa -- i++
kasvattaa muuttujan i
arvoa yhdellä.
Kun ohjelman suoritus siirtyy for-toistolauseeseen, ensin alustetaan toistomuuttuja. Tämän jälkeen tarkastellaan rajausehdon, jonka perusteella päätetään jatketaanko toistolauseen suoritusta. Mikäli rajausehto evaluoituu epätodeksi, siirrytään toistolausetta seuraavaan lauseeseen. Mikäli evaluaation tulos on totta, siirrytään suorittamaan toistolauseen lohkoon määriteltävää lähdekoodia. Kun toistolauseen lohkon lähdekoodi on suoritettu, käsitellään toistomuuttujan muutos, jonka jälkeen siirrytään uudelleen rajausehdon tarkasteluun. Ohjelman suoritus jatkuu, riippuen rajausehdon evaluaatiosta, joko toistolausetta seuraavaan lähdekoodiin tai toistolauseen lohkoon.
Edellä olevassa esimerkissä toistolauseen lisäksi ohjelman alussa määritellään muuttuja summa
, joka pitää kirjaa syötettyjen lukujen summasta. Mikäli muuttuja summa
määriteltäisiin toistolauseeseen kuuluvassa lohkossa, se alustettaisiin uudestaan jokaisen toistokierroksen alussa, eikä muuttuja olisi olemassa lohkon jälkeen.
YouTube-video
Tämä sivusto käyttää YouTube-videoita. Lue lisätietoja YouTube-videoiden käytöstä YouTuben Terms of Service-sivulla. Salli YouTube-videoiden näyttäminen, jotta voit katsoa videoita.
Question not found or loading of the question is still in progress.
Toistolauseen alustuksen (esim var i = 0;
), rajausehdon (esim i < 10;
), sekä alustetun muuttujan muutoksen (esim i++
) voi määritellä käytännössä millä tahansa tavalla. Alla olevassa esimerkissä tulostetaan luvun 2 potenssit lukuun 256 asti.
main() {
for (var i = 1; i <= 256; i = i * 2) {
print('$i');
}
}
program output
1 2 4 8 16 32 64 128 256
main() {
for (var i = 5; i >= 0; i--) {
print('$i');
}
}
program output
5 4 3 2 1 0
Toistolausetta for
käyttämällä aiemmin tarkasteltu neljän luvun summan laskeva ohjelma on suoraviivaisempi toteuttaa. Alla olevassa esimerkissä luvun lukemiseen ja luvun summaamiseen liittyvä lähdekoodi esiintyy vain kerran. Se suoritetaan kuitenkin neljä kertaa, sillä se on neljä kertaa suoritettavan toistolauseen sisällä.
Yllä olevassa esimerkissä lukujen summan laskemiseen käytetty ohjelma kysyy aina neljä lukua. Voimme vaikuttaa luettavien lukujen lukumäärään muokkaamalla toistolauseen toistoehtoa sopivasti. Alla olevassa esimerkissä käyttäjältä kysytään luettavien lukujen lukumäärä, jonka jälkeen luvut luetaan.
Nyt ohjelma lukee käyttäjän määrittelemän määrän lukuja.
program output
Kuinka monta lukua luetaan? 3 Syötä luku. 12 Syötä luku. 18 Syötä luku. 12 Syötettyjen lukujen summa on 42
program output
Kuinka monta lukua luetaan? 2 Syötä luku. 18 Syötä luku. 21 Syötettyjen lukujen summa on 39
Ikuisesti jatkuvat toistolauseet
Edellä kuvattu for
-toistolause sopii tilanteisiin, missä toistokertojen määrä on ennalta rajattu. Tarkastellaan seuraavaksi toistolausetta, jota käytetään mikäli toistokertojen määrä ei ole ennalta tiedossa.
Toistolauseet, joiden toistojen määrällä ei ole ylärajaa, noudattavat while - true - break
-rakennetta. Toistolause määritellään avainsanalla while
(jatka kunnes), johon yhdistetään avainsana true
, jolloin lause on muotoa jatka ikuisesti. Toistolauseesta poistumista kontrolloidaan erillisellä avainsanalla break
-- kun ohjelman suoritus kohtaa toistolauseen lohkossa avainsanan break
, toistolauseen suoritus keskeytetään ja suoritus siirtyy toistolausetta seuraavaan lauseeseen. Tällaisen while - true - break
-toistolauseen rakenne on seuraava.
Toistolause, joka on toteutettu while - true - break, suorittaa siihen kuuluvaa lohkoa alusta loppuun yhä uudestaan ja uudestaan. Ohjelman suoritus siirtyy toistolausetta seuraavaan lähdekoodiin kun toistolauseen lohkossa suoritetaan break-komento.
Lähdekoodina tällainen ohjelma näyttää esimerkiksi seuraavalta.
Yllä oleva ohjelma kysyy käyttäjältä lukuja kunnes käyttäjä syöttää luvun 0. Tämän jälkeen ohjelma tulostaa syötettyjen lukujen summan. Ohjelman esimerkkisuoritus voi olla vaikkapa seuraavanlainen.
program output
Syötä luku. 3 Syötä luku. 4 Syötä luku. -1 Syötä luku. 9 Syötä luku. 0 Syötettyjen lukujen summa on 15.
Yhteenvetona toistolauseen osat ovat seuraavat.
- Rajattoman määrän toistokertoja mahdollistava toistolause määritellään muodossa while (true), jota seuraa aaltosuluilla rajattu toistettava lohko.
- Toistolauseen lohkon sisällä on määriteltynä toistettava toiminnallisuus, joka tässä tapauksessa on luvun lukeminen käyttäjältä, luvun tarkastaminen, ja luvun lisääminen summaan.
- Mikäli toistolauseen suorituksessa päädytään avainsanaan break (tässä mikäli käyttäjä syöttää luvun 0), toistolauseen suoritus päättyy ja ohjelman suoritus siirtyy toistolausetta seuraavaan lauseeseen.
Ikuinen toistolause
Edellä kuvatulla while
-toistolauseella voidaan luoda toistolause, jonka suoritus ei pääty koskaan. Alla oleva ohjelma tulostaa merkkijonoa Ikuinen toistolause!
yhä uudestaan ja uudestaan.
main() {
while (true) {
print('Ikuinen toistolause!');
}
}
Huom! Ohjelman suoritus ei pääty koskaan. Mikäli yllä olevan kaltaista ohjelmaa kokeilee selainympäristössä, voi sen kokeilu johtaa siihen, että selain menee jumiin. Tällöin selainikkuna täytyy sulkea ja avata uudestaan.
Mikäli haluat kokeilla ikuista toistolausetta, kannattaa avata sitä varten uusi selainikkuna, jonka voit myöhemmin sitten sulkea.
Question not found or loading of the question is still in progress.
Komennon break
lisäksi toistolauseiden suoritukseen voidaan vaikuttaa komennolla continue
. Komento continue
siirtää toistolauseen suorituksen takaisin toistolauseen alkuun.
While - true - break -rakennetta noudattavassa toistolauseessa voi käyttää ohjelman suorituksen toistolausetta seuraavaan lauseeseen siirtävän break-komennon lisäksi continue-komentoa. Kun continue-komento suoritetaan, ohjelman suoritus palaa toistolauseen alkuun.
Alla olevassa esimerkissä on toteutettuna ohjelma, joka kysyy käyttäjältä syötteitä kunnes käyttäjä syöttää luvun 0. Kaikki nollaa pienemmät eli negatiiviset luvut jätetään huomiotta, tai toisin sanoen, kun käyttäjä syöttää negatiivisen luvun, toistolauseen suoritus päätyy toistolauseen sisällä continue
-komentoon ja siitä takaisin toistolauseen alkuun. Kun toistolauseen suoritus päättyy (eli käyttäjä syöttää luvun 0), ohjelma tulostaa nollaa suurempien syötettyjen lukujen summan.
Alla on esimerkki ohjelman suorituksesta.
program output
Syötä luku. 3 Syötä luku. 4 Syötä luku. -1 Syötä luku. 9 Syötä luku. 0 Positiivisten lukujen summa on 16.
Toistolauseet yhdessä
Joskus ohjelmissa tarvitaan kumpaakin toistolausetta. Alla olevassa ohjelmassa käyttäjältä kysytään positiivista lukua. Mikäli käyttäjä ei syötä positiivista lukua, lukua kysytään uudestaan. Tämän jälkeen tulostetaan kaikki luvut käyttäjän syöttämästä luvusta nollaan.
program output
Syötä positiivinen luku. -3 Epäkelpo luku: -3 Syötä positiivinen luku. 0 Epäkelpo luku: 0 Syötä positiivinen luku. 5 Syötit luvun 5. Tulostetaan luvut luvusta 5 lukuun 0. 5 4 3 2 1 0
Hi! Please help us improve the course!
Please consider the following statements and questions regarding this part of the course. We use your answers for improving the course.
I can see how the assignments and materials fit in with what I am supposed to learn.
I find most of what I learned so far interesting.
I am certain that I can learn the taught skills and knowledge.
I find that I would benefit from having explicit deadlines.
I feel overwhelmed by the amount of work.
I try out the examples outlined in the materials.
I feel that the assignments are too difficult.
I feel that I've been systematic and organized in my studying.
How many hours (estimated with a precision of half an hour) did you spend reading the material and completing the assignments for this part? (use a dot as the decimal separator, e.g 8.5)
How would you improve the material or assignments?