1.2.5 Valintarakenteet

Kaikissa ongelman ratkaisuissa tulee varautua erityistilanteisiin, jolloin vallitsevista olosuhteista on pääteltävä, mitä toimenpiteitä on suoritettava. Valintarakenteilla pyritään tunnistamaan ohjelman suorituksen aikana muuttuvia olosuhteita ja valitsemaan hallitusti olosuhteisiin nähden oikeat suoritettavat lauseet.

1.2.5.1 Ehtolause

Usein algoritmeja suunnitellessa törmätään tilanteisiin, joissa jokin algoritmin osa on tarpeellinen vain joissain tietyissä olosuhteissa. Mikäli tällaista erityistilannetta ei tunnisteta, kostautuu se vähintäänkin tehottomuutena, sillä tällöin algoritmin osa suoritetaan, vaikkei välitöntä tarvetta ole. Joskus taas erityistilanteen huomiotta jättäminen saattaa johtaa vakaviinkin virhetilanteisiin.

Olosuhteet tunnistava algoritmi voidaan rakentaa ehtolauseen avulla. Tällöin tilanteesta tai olosuhteista riippuva algoritmin osa voidaan kirjoittaa ehtolauseen osaksi. Ehtolause on yksinkertaisimmillaan muotoa

jos (ehto) on voimassa niin suorita
  lauseryhmä

missä ehto on looginen lauseke, joka määrää, millä ehdoin mainittu lauseryhmä suoritetaan. Mainittu lauseryhmä on joko kokoelma lauseita tai kaikkein yksinkertaisimmillaan yksittäinen lause.

Ehtolauseella voidaan mahdollistaa jokin toimenpide ja estää samalla kyseisen toimenpiteen suoritus, mikäli olosuhteet eivät ole sen suoritukselle otolliset:

jos (vuodenaika on talvi) niin
  kaiva sukset esille ja mene hiihtelemään

Usein toiminta jakaantuu kahtia sen mukaan, onko jokin tietty olosuhde tai tilanne olemassa vaiko ei. Tällöin algoritmissa voidaan käyttää ehtolauseen täydellistä muotoa, jolloin vältytään kahden erillisen ehtolauseen kirjoittamiselta: Lause

jos (ehto) on voimassa niin suorita
  lauseryhmä1
muutoin suorita
  lauseryhmä2

olisi toteutettavissa myös kahdella erillisellä jos-lauseella (silloin kun lauseryhmä1 ei muuta ehtoa):

jos (ehto) on voimassa niin suorita
  lauseryhmä1
jos ei(ehto) on voimassa niin suorita
  lauseryhmä2

Täydellisessä ehtolauseessa voidaan suorittaa olosuhteiden niin salliessa haluttu toimenpide ja toisaalta varautua siihen, että kyseinen toimenpide ei ole olosuhteisiin nähden mielekäs:

jos (vuodenaika on talvi) niin
  kaiva sukset esille ja mene hiihtelemään
muutoin
  puuhastele muuta ja odottele, kunnes talvi saapuu

Ohjelman toimintaa voidaan kuvata sanallisen kuvauksen lisäksi ns. lohkokaavioilla. Esimerkiksi yllä oleva ehtolause näyttäisi seuraavalta lohkokaavioesityksenä:

Lohkokaavio

Jos ehtolauseen testaamalla ominaisuudella on useampi toisensa poissulkeva vaihtoehto, voidaan ne kaikki koota yhdeksi ketjutetuksi ehtolauseeksi. Tällöin saavutetaan se etu, että yhden ehdon toteutuessa muita ehtoja ei turhaan tarkastella. Ketjutettu ehtolause on muotoa

jos (ehto1) on voimassa niin suorita
  lauseryhmä1
muutoin jos (ehto2) on voimassa niin suorita
  lauseryhmä2
muutoin jos (ehto3) on voimassa niin suorita
...
muutoin suorita
  lauseryhmäN

Vaikkapa vuodenaika tarjoaa meille esimerkin ominaisuudesta, jolla on useampi toisensa poissulkeva vaihtoehto:

jos (vuodenaika on kesä) niin 
  mene rannalle ottamaan aurinkoa ja nauti lomasta
muutoin jos (vuodenaika on syksy) niin 
  pistä kumisaappaat jalkaan ja mene metsään marjastamaan
muutoin jos (vuodenaika on talvi) niin
  kaiva sukset esille ja mene hiihtelemään
muutoin jos (vuodenaika on kevät) niin
  mene mylläämään puutarha

Vuodenaika

Ehtolauseista voidaan rakentaa mielivaltaisen hierarkisia rakennelmia, sillä myös ehdollisesti suoritettavat lauseryhmät voivat sisältää ehtolauseita. Esimerkiksi vuodenaika voidaan päätellä käyttämällä seuraavaa sisäkkäin rakennettua ehtolausetta:

jos (kuukausi on myöhempi kuin helmi) niin
  jos (kuukausi on myöhempi kuin touko) niin
    jos (kuukausi on myöhempi kuin elo) niin
      jos (kuukausi on myöhempi kuin marras) niin
        vuodenaika on talvi
      muutoin
        vuodenaika on syksy
    muutoin
      vuodenaika on kesä
  muutoin
    vuodenaika on kevät
muutoin
  vuodenaika on talvi

Tämän tyyppinen rakenne on kuitenkin aika vaikeaselkoinen, joten kannattaa pyrkiä yksinkertaisempaan esitykseen.