Ylös Edellinen Seuraava Otsikkosivu Hakemisto Sisällys

8.5.2 Funktiot ja parametrit

Voisimme jatkaa pääohjelman selkeyttämistä. Tavoite voisi olla aluksi vaikkapa kirjoittaa pääohjelma muotoon:

	  ohjeet();
	  kysy_matka(&matka_mm);
	  matka_km = mittakaava_muunnos(matka_mm);
	  tulosta_matka(matka_km);
	  return 0; 

Tällainen pääohjelma tuskin tarvitsisi paljoakaan kommentteja.

Edellä on käytetty neljän eri tyypin aliohjelmia (funktioita)

8.
ohjeet();- parametritön aliohjelma
2.
kysy_matka(&matka_mm); - aliohjelma joka palauttaa tuloksen parametrissään (vrt. esim. scanf).
3.
mittakaava_muunnos(matka_mm); - funktio, joka palauttaa tuloksen nimessään
4.
tulosta_matka(matka_km); - aliohjelma, jolle vain viedään arvo, mutta mitään arvoa ei palauteta

Valmis ohjelma, jossa myös aliohjelmat on esitelty, näyttäisi seuraavalta (rivien numerointi on myöhemmin esitettävää pöytätestiä varten):

c-muut\matka_a2.cpp - erilaisia funktioita

	// matka_a2.cpp
	// Ohjelmalla lasketaan mittakaavamuunnoksia 1:200000 kartalta
	// Vesa Lappalainen 4.1.1997
	#include <iostream.h>
	
	const double MITTAKAAVA = 200000.0;
	const double MM_KM      = 1000.0*1000.0;
	
	void ohjeet(void)
	{
	  cout << "Lasken 1:" << MITTAKAAVA 
	       << " kartalta millimetreinä mitatun matkan\n";
	  cout << "kilometreinä luonnossa.\n";
	}
	
	void kysy_matka(int *pMatka_mm)
	{
	  int mm;
	  cout << "Anna matka millimetreinä>";
	  cin >> mm;
	  *pMatka_mm = mm;
	}
	
	double mittakaava_muunnos(int matka_mm)
	{
	  return matka_mm*MITTAKAAVA/MM_KM;
	}
	
	void tulosta_matka(double matka_km)
	{
	  cout << "Matka on luonnossa "<< matka_km << " km." << endl;
	}
	
	
	int main(void)
	{
	  int    matka_mm;
	  double matka_km;
	
	  ohjeet();
	  kysy_matka(&matka_mm);
	  matka_km = mittakaava_muunnos(matka_mm);
	  tulosta_matka(matka_km);
	  return 0;
	}

Edellä olevasta huomataan, että aliohjelmat jotka eivät palauta mitään arvoa nimessään, esitellään void- tyyppisiksi.

mittakaava_muunnos on reaaliluvun palauttava funktio, joten se esitellään double - tyyppiseksi.

Seuraavaksi pöytätestaamme ohjelmamme toiminnan:


main
kysy_matka
mi..muunnos
tulosta

lause
matka_mm
matka_km
pMatka_mm
mm
matka_mm
tulos
matka_km
tulostus
40 ohjeet()
??
??






9-13 cout<<







Lasken 1:200000
41 kysy_mat


&matka_mm





16-18 int m



??




19 cout <<







Anna matka ...
20 cin>>mm



352




21 *pMatka
352

<==o





42 matka_km




352



26 return





70.4


42 matka_km

70.4






43 tulosta






70.4

29-31 cout<







Matka on luo..
44 return 0;








Mikäli kukin aliohjelma olisi testattu erikseen, riittäisi meille pelkkä pääohjelman testi:


main

lause
matka_mm
matka_km
tulostus
40 ohjeet()
??
??
Lasken 1:200000
41 kysy_mat
352

Anna matka ..
42 matka_km

70.4

43 tulosta


Matka on luo..
44 return 0;



Tämä on testaustapa, johon tulisi pyrkiä. Isossa ohjelmassa ei ole enää mitään järkeä testata sitä jokainen aliohjelma kerrallaan. Koodiin liitettyjen aliohjelmien tulee olla testattuja kukin erillisinä ja lopullinen testi on vain viimeisimmän mallin mukainen!

Tehtävä 8.62 matka_a2.c

Kirjoita matka_a2.cpp:stä C- versio (tietovirrat => printf/scanf)


Ylös Edellinen Seuraava Otsikkosivu Hakemisto Sisällys