Ylös Edellinen Seuraava Otsikkosivu Hakemisto Sisällys

8.5.5 Ketjutettu kutsu

Koska funktio- aliohjelma palauttaa valmiiksi arvon, voitaisiin Matka_a3.java:n pääohjelma kirjoittaa myös muodossa:

	  public static void main(String[] args) {
	    double matka_mm;
	    ohjeet();
	    matka_mm = Syotto.kysy_int("Anna matka  millimetreinä",0);
	    tulosta_matka(mittakaava_muunnos(matka_mm));
	  } 

Funktioita käytetään silloin, kun aliohjelman tehtävänä on palauttaa vain yksi täsmällinen arvo. Math- luokan funktioita ovat:

	abs, acos, asin, atan, atan2, ceil, cos, exp, floor, IEEEremainder, log, max, min, pow, random, rint, round, sin, sqrt, tan, toDegrees, toRadians 

Funktioita käytetään kuten matematiikassa on totuttu:

	double alpha = 1.32, a = 4, b=3;
	double c = Math.sqrt(a*a+b*b) + Math.asin((Math.sin(alpha)+0.2)/2.0); 

kysy_matka ja kysy_mittakaava voitaisiin kirjoittaa myös funktioiksi, ja tällöin niitä voitaisiin kutsua esim. seuraavasti:

	matka_km = kysy_matka()*kysy_mittakaava()/MM_KM; 

Vaarana olisi kuitenkin se, ettei voida olla aivan varmoja kumpiko funktiosta kysy_matka vai kysy_mittakaava suoritettaisiin ensin ja tämä saattaisi aiheuttaa joissakin tilanteissa yllätyksiä.

Tämän vuoksi pyrimmekin kirjoittamaan funktioiksi vain sellaiset aliohjelmat, jotka palauttavat täsmälleen yhden arvon ja jotka eivät ota muuta informaatiota ympäristöstä kuin sen mitä niille parametrinä välitetään. Eli tavoitteena on se, että funktioiden kutsuminen lausekkeen osana olisi turvallista. Tämä ei valitettavasti ole aina Javassa mahdollista, koska Javan aliohjelmakutsuista puuttuu muissa kielissä oleva muuttujaparametrin välitys (Pascal: var, C: osoitin *, C++ referenssi &).

Muissa kielissä aliohjelmat kirjoitamme siten, että arvot palautetaan osoitteen avulla. Hyvin yleinen C- tapa on kuitenkin palauttaa tällaisenkin aliohjelman onnistumista kuvaava arvo funktion nimessä (vrt. esim. scanf C-kielessä).

Tehtävä 8.10 Math-luokka

Katso SDK:n dokumenteista kunkin Math- luokan funktion parametrien määrä ja tyyppi sekä se mitä kukin todella tekee.

Tehtävä 8.11 Funktiot

Kirjoita edellä mainitut kysy_matka ja kysy_mittakaava nimessään arvon palauttavina funktioina.

Tehtävä 8.12 Ympyrän ala ja pallon tilavuus

Kirjoita funktiot, jotka palauttavat r- säteisen ympyrän pinta- alan ja r- säteisen pallon tilavuuden.
Kirjoita pääohjelma, jossa pinta- ala ja tilavuus - funktiot testataan.

Tehtävä 8.13 Pääohjelma yhtenä funktiokutsuna

Jatka edellä mainittua ketjuttamista siten, että koko pääohjelma on vain yksi lauseke ( ohjeet- kutsu saa olla oma rivinsä jos haluat). Tosin tämä on C-hakkerismia eikä mikään tavoite helposti luettavalta ohjelmalta. Itse asiassa hyvä kääntäjä tekee automaattisesti tämän kaltaista optimointia (mitä muka voitiin säästää?).

Ylös Edellinen Seuraava Otsikkosivu Hakemisto Sisällys