2.2.11 Esimerkkiohjelma painonvartija

Kirjoitetaan ohjelma, jolla saadaan lasketuksi henkilölle ihannepaino. Alkuvaiheessa ohjelma on yksinkertainen, eikä se ota huomioon henkilön ikää, ruumiinrakennetta tai sukupuolta.

/* *********************************************************
PAINO1.CPP
  Lasketaan ihannepaino.
  Käytetään arvoja: pituus 175.5 cm
                    paino 90.0 kg
                    suhdeluku 100.0
********************************************************* */

#include <iostream.h>

int main(void)
{
  double ihanne, erotus; // esitellään liukulukumuuttujat

  ihanne = 175.5 - 100.0; // lasketaan ihannepaino
  erotus = 90.0 - ihanne; // lasketaan ihannepainon ja todellisen
                          //  painon erotus
  cout << "Pituutesi     175.5 cm\n"; // tulostetaan tiedot
  cout << "Painosi        90.0 kg\n";
  cout << "Ihannepainosi  " << ihanne << " kg\n";
  cout << "Erotus         " << erotus << " kg\n";

  return 0;
}

Ohjelma toimii moitteettomasti ja antaa tulostuksen

Pituutesi     175.5 cm
Painosi        90.0 kg
Ihannepainosi  75.5 kg
Erotus         14.5 kg

Olkoonkin, että ohjelma hoitaa ihannepainon laskemisen varsin mallikkaasti, on kriittisyyteen aihetta. Jos käyttäjä (tässä tapauksessa ohjelmoija, sillä muut eivät osaa käyttää ko. ohjelmaa) sattuu kirjoittamaan jonkin vakion (pituus, paino) arvon väärin, ei ohjelma tulosta tietenkään oikeaa ratkaisua. Virheen havaitseminen ja löytäminen ohjelmassa olevasta numeroviidakosta saattaa kuitenkin olla hankalaa ja viedä aikaa.

Jos lisäksi määriteltyjä vakioiden arvoja haluttaisiin muuttaa, esimerkiksi henkilön paino 91.5:ksi (joulun jälkeen), olisi ohjelmasta etsittävä jokainen painon esiintymä ja huolehdittava sen korjaamisesta. Yleensä asia hoituu editorien etsi ja korvaa -komennolla (Find & Replace), mutta numeroiden korvaaminen on melko vaarallista, esimerkiksi korvattaessa 5.0 tekstillä 3.0 muuttuisivat mm. luvut 15.0 luvuiksi 13.0.

Ohjelmasta saadaan joustavampi ja toiminnaltaan varmempi määrittelemällä ihannepainon laskennassa esiintyvät vakioiden arvot symbolisiksi vakioiksi direktiivin #define avulla.

/* *********************************************************
PAINO2.CPP
  Lasketaan ihannepaino.
  Käytetään symbolisia vakioita.
********************************************************* */

#include <iostream.h>

/* Määritellään laskemisessa tarvittavat vakiot.
   Huomaa isot kirjaimet.                        */
#define PITUUS 175.5
#define PAINO 90.0
#define SUHDELUKU 100.0

int main(void)
{
  double ihanne, erotus;

  ihanne = PITUUS - SUHDELUKU;
  erotus = PAINO - ihanne;

  cout << "Pituutesi      " << PITUUS << " cm\n";
  cout << "Painosi        " << PAINO << " kg\n";
  cout << "Ihannepainosi  " << ihanne << " kg\n";
  cout << "Erotus         " << erotus << " kg\n";

  return 0;
}

Nyt aikaan saatu versio ohjelmasta on jo huomattavasti elegantimpi ja selkeämpi lukea. Etuna voidaan myös mainita se, että näppäilyvirheet on helpompi havaita ja laskukaavan oikeellisuus helpompi todeta kuin aiemmassa versiossa.

Ongelmana nykyisessä ohjelmassa on, että joka kerta henkilön pituuden tai painon vaihtuessa pitää koodi korjata käsin ja kääntää uudelleen, eli itse asiassa jokaiselle pituus-paino -mahdollisuudelle pitäisi tehdä oma ohjelmansa. Tässähän ei ole mitään järkeä.

On aika miettiä seuraavaa ohjelman kehitysaskelta. Voitaisiin haluta, että ohjelma kysyy ajon aikana käyttäjältä tarvittavat tiedot. Näin päästään hieman yleiskäyttöisempään ohjelmaan. Jotta voimme rakentaa seuraavan kehitysvaiheen ohjelmalle, tarkastellaan ensin syöttöä ja tulostusta tarkemmin.