1.2.4 Aliohjelmat (alialgoritmit)

Aliohjelmilla voidaan usein tarkentaa ja täsmentää alkuperäisessä algoritmissa annettua ohjetta. Edellä esitetyssä valintalajittelun algoritmissa törmättiin uuteen osaongelmaan, korttien vertailuun. Osaongelma voidaan ratkaista useammallakin eri tavalla täysin itsenäisesti alkuperäisestä ongelmasta riippumatta, joten aluksi voidaan alkuperäisen ongelman ratkaisussa tyytyä puhumaan vertailusta välittämättä siitä, kuinka se käytännössä tapahtuu. Sitten, kun alkuperäinen ongelma on kokonaisuudessaan ratkaistu, voidaan keskittyä osaongelman ratkaisuun.

Jos ongelman ratkaisussa törmätään sellaiseen osaongelmaan, jota ratkaisun kokonaisuuden kirjoitushetkellä ei osata tai jostain syystä pystytä ratkaisemaan, voidaan osaongelma huomioida kirjoitettavassa kokonaisuudessa kirjoittamalla tällä haavaa ratkaisemattomaan paikkaan aliohjelman kutsu. Kun myöhemmin osaongelmaan löytyy ratkaisu, voidaan se liittää jälkikäteen muutoin valmiiseen ratkaisuun kirjoittamalla se aliohjelmaksi.

Aliohjelmien avulla voidaan ongelman ratkaisusta eristää kerta toisensa jälkeen samankaltaisena toistuvia toimenpidesarjoja. Kirjoittamalla tällaiset toimenpidesarjat aliohjelmiksi vältytään turhalta ohjeiden toistamiselta ja toisaalta saadaan ongelman ratkaisu selkeämmin hahmotettavaksi, kun jonkin yksityiskohdan ratkaisu jätetään aliohjelmalle, johon voidaan tarvittaessa viitata.

Aliohjelmat voidaan usein muokata niin yleisiksi, että ne ovat käyttökelpoisia alkuperäisen tehtävän ulkopuolellakin. Tästä on oivallisena esimerkkinä aiemmin itsenäisenä ongelmana ratkaistu valintalajittelu. Aliohjelmia voidaan usein kirjastoida, jolloin niistä muodostetaan paketteja, jotka haluttaessa voidaan sisällyttää luotavaan ohjelmaan. Tällöin voidaan kertaalleen kirjoitettua aliohjelmaa hyödyntää useaan otteeseen.

Kirjoita suomenkielinen algoritmi, jolla tilastoidaan tekstistä sanojen ja lauseiden määrä. Löytyykö luomastasi ratkaisumallista osia, jotka toistavat itseään? Pystytkö löytämään ratkaisustasi osakokonaisuuksia, joista kannattaisi luoda omat alialgoritmit?

Alialgoritmien erottaminen ohjelmasta mahdollistaa ratkaisun joustavan muuntamisen. Mikäli tehtävässä useasti toistuvaan osaongelmaan keksitään aivan uudenlainen ratkaisu, ei varsinaista ongelman ratkaisualgoritmia tarvitse muuttaa. Tällöin riittää, että muutetaan vain osaongelman ratkaisevaa alialgoritmia.

Eräs tapa hyödyntää alialgoritmeja liittyy siihen, että algoritmin kirjoitushetkellä kenties avoinna oleva osa algoritmin toiminnasta voidaan ohittaa kokonaisuutta suunniteltaessa kirjoittamalla tarvittavan toiminteen tilalle alialgoritmin kutsu. Tällöin kokonaisuus voidaan hahmotella välittämättä siitä, miten jokin hankala yksityiskohta toteutetaan. Avoimiksi jääneet yksityiskohdat voidaan paikata myöhemmin joko itse tai ne voidaan jopa toimittaa jonkun muun ratkaistaviksi.

1.2.4.1 Funktioaliohjelma

Aliohjelmat voidaan jakaa kahteen ryhmään sen mukaan, miten ne kommunikoivat ympäristönsä kanssa. Mikäli aliohjelman tarkoitus on tuottaa annetuista lähtötiedoista ("raaka-aineista") yksi tulos (yksi "tuote"), puhutaan funktioaliohjelmasta. Tällöin funktion määrittely ja sen merkitys on hyvin lähellä matemaattisen funktion käsitettä.

Funktioaliohjelman voidaan kuvitella olevan yhdellä sanalla lausuttu yksiselitteinen vastaus esitettyyn kysymykseen. Näin ollen funktioaliohjelma voisi olla aliohjelma, joka päättelee syöttötietona annettavasta vuosiluvusta, onko se karkausvuosi (vastaus joko kyllä tai ei). Samoin funktioaliohjelma voisi olla vaikka aliohjelma, jonka tehtävä on laskea arvio jarrutusmatkalle, kun syöttötietoina annetaan auton nopeus, massa ja tieto keliolosuhteista (kuiva/märkä tie, jäätikkö, nastarenkaat, tms.). Tällöin aliohjelman vastaus on yksinkertaisesti jarrutukseen tarvittava metrimäärä.

1.2.4.2 Proseduurialiohjelma

Mikäli aliohjelman tehtävä on pikemminkin käsitellä laajemmin jo olemassa olevaa tietoa, voidaan puhua proseduurialiohjelmasta. Proseduurialiohjelma kommunikoi muun ohjelmaympäristön kanssa parametriensa välityksellä. Aliohjelman käynnistyessä parametrit toimivat syöttötietona ja aliohjelman lopussa ne välittävät aliohjelmassa niihin tehdyt muutokset kutsuvalle ohjelmayksikölle. Proseduurialiohjelmaan ei välttämättä liity funktioaliohjelmalle tyypillistä kysymyksen asettelua.

Tyypillinen proseduurialiohjelma on jo edellä esiintynyt valintalajittelu, jonka tehtävä on järjestää lähtötietona annettu joukko alkioita. Aliohjelma saa tällöin parametrinaan epäjärjestyksessä olevan joukon alkioita, jotka aliohjelma lajittelee ja palauttaa joukon takaisin järjestettynä.

Jako kahteen aliohjelmaluokkaan on kuitenkin hieman teoreettinen ja pahimmillaan keinotekoinen, sillä usein aliohjelmat ovat jonkinasteisia risteytyksiä funktioista ja proseduureista.