1.2.6 Toistorakenteet

Usein toimenpiteiden suorituksessa on osia, joita tulee tarvittaessa toistaa. Mikäli toimintaohjeet kirjoitetaan täysin suoraviivaisesti, tulee eteen ongelma toimenpiteen toistojen määrän suhteen. Esimerkkinä vaikkapa pöydän pinnan hiominen: yksi santapaperin pyyhkäisy tuskin riittää pahasti kolhiintuneelle pinnalle, kun taas jo valmiiksi sileälle pinnalle yksikin pyyhkäisy on liikaa. Toisaalta tuntuu turhalta ruveta kirjoittamaan erillisiä hiomisohjeita pöydälle, jonka pintaa pitää hioa 50, 1276, 3, 24 tai 23456 hipaisun verran.

Jotta ohjelma kykenisi suorittamaan toistoja hallitusti, tarvitaan toistorakenteita, joissa määriteltyä toimenpidettä uusitaan annettujen ohjeiden mukaisesti.

1.2.6.1 Suljettu silmukka

Suljettu silmukka on käyttökelpoinen silloin, kun etukäteen on tiedossa, kuinka monta kertaa toimenpide halutaan suorittaa. Suljetun silmukan suoritusaika on tällöin suoraan laskettavissa, kunhan tiedetään yksittäisen silmukan aika.

Esimerkkinä suljetusta silmukasta saa luvan toimia kutsujen järjestäjän painajainen, kutsukorttien lähettäminen:

kuljeta sormea vieraslistan ensimmäisestä nimestä viimeiseen
  kirjoita kohdalla olevan henkilön osoite kirjekuoreen
  laita kutsukortti kirjekuoreen
  sulje kuori
postita kaikki kuoret

Lohkokaavioesityksessä ei ole valmista toistosilmukan "kuviota", vaan silmukka toteutetaan esimerkiksi seuraavasti:

Silmukka

Tällöin jokaista kutsuvieraslistan jäsentä kohti suoritetaan erikseen edellä olevan silmukan rungossa mainitut toimenpiteet. Toistojen määrä on tässä tapauksessa etukäteen määrätty, se riippuu kulloinkin käsiteltävän kutsuvieraslistan pituudesta, itse silmukan sisältö ei muutu, oli vieraita 7 tai 125.

Suljettu silmukka esiintyy myös aiemmin esitetyssä valintalajittelussa, jossa käydään läpi lajiteltava joukko. Itse asiassa algoritmissa on kaksi sisäkkäistä silmukkaa: sisemmässä silmukassa käydään läpi jäljellä olevat alkiot ja verrataan niitä erillään olevaan alkioon; ulommassa silmukassa kullakin kierroksella tulee yksi uusi alkio järjestettyjen joukkoon.

1.2.6.2 Avoin silmukka

Avoin silmukka eroaa suljetusta siten, että toistokertojen määrä ei ole etukäteen kiinnitetty, vaan se riippuu silmukassa tehtävien toimenpiteiden vaikutuksesta. Avoimen silmukan suoritusaikaa ei näin ollen voida mitenkään tietää etukäteen.

Esimerkkinä avoimesta silmukasta olkoon paidan pesu:

niin kauan kuin (paidassa on tahroja) tee seuraavaa
  pese paita pesuaineella
  kuivata paita

Ero suljettuun silmukkaan nähden piilee siinä, että etukäteen ei todellakaan tiedetä, tuleeko paita yhdellä pesulla puhtaaksi. Itse asiassa avoin silmukka mahdollistaa senkin tapauksen, että silmukan varsinaista runkoa ei suoriteta lainkaan (mikäli paidassa ei alun alkaenkaan ole tahroja) ja toisaalta sen, että toimenpidettä voidaan joutua toistamaan huomattavan monta kertaa (tahra, joka ei lähde kuin kulumalla).

Silmukka

Erityisen tarkkana on oltava siitä, että avoimen silmukan suorituslauseiden on jollain tavalla oltava yhteydessä silmukan suoritusehtoon, muutoin on vaarana joutua niin sanotusti ikuiseen silmukkaan. Esimerkiksi pyykinpesualgoritmi

niin kauan kuin (pyykkipäivä on lauantai) tee seuraavaa
  pese paita pesuaineella
  kuivata paita

saattaisi olla kauhistus pyykkäreille, joilla pyykkipäivä sattuu olemaan lauantai, sillä paidan pesu ja kuivatus eivät ole missään tekemisissä silmukkaa yllä pitävän ehdon kanssa. Toisaalta ne pyykkärit, joilla pyykkipäivä on perjantai, olisivat aika rähjäisiä...

1.2.6.3 Puoliavoin silmukka

Puoliavoin silmukka on kahden edellä mainitun silmukan risteytys. Tällöin on etukäteen tiedossa se, kuinka monta kertaa pahimmillaan toimenpidettä joudutaan toistamaan, mutta toisaalta toimenpidesarjassa on mainittu ehtoja, joiden täyttyessä silmukan suoritus voidaan lopettaa.

Puoliavointa silmukkaa voidaan hyödyntää esimerkiksi kirjanpitäjän painajaisen, virheellisen kirjauksen, metsästyksessä tositekasasta:

aloita tositekasan päällimmäisestä ja käy läpi kaikki tositteet
  vertaa tositteen markkamäärää ja kirjattua markkamäärää
  jos erilaiset, korjaa virhe ja lopeta silmukka

Pahimmassa tapauksessa (= tosielämässä) yllä olevassa silmukassa joudutaan kahlaamaan kaikki tositteet läpi, ennen kuin virheellinen kirjaus löytyy. Toisaalta on aivan yhtä hyvin mahdollista, että virhe löytyisi heti ensimmäisen tarkistettavan luvun kohdalta.