previous next Up Title Contents Index

Esimerkki 2

scanf()- ja sscanf()-funktioihin liittyy molempiin paluuarvo, joka ilmaisee, kuinka monta syötettä funktio onnistui ottamaan vastaan.

Jos esimerkiksi funktion avulla yritetään lukea kaksi kokonaislukua ja lukujen vastaanottaminen onnistuu, paluuarvona on 2. Funktio palauttaa arvon 0 tai -1, ellei se onnistu ottamaan vastaan ainoatakaan syöttötietoa oikein. Virheellisiä tilanteita ovat esimerkiksi ne, joissa käyttäjä syöttää kirjaimia, kun ohjelmassa yritetään lukea kokonaislukuja.

Seuraavassa ohjelmassa funktio ottaa vastaan syötetyn liukuluvun ja tarkistaa, että se on numeerinen ja sallituissa rajoissa. Funktiolle välitetään parametreina sallitun lukualueen rajat.

    #include <stdio.h>

    /* GLOBAALIT VAKIOT *******************/

    #define PIENIN 0.0
    #define SUURIN 20.0

    /* FUNKTIOIDEN PROTOTYYPIT ***********/

    float ota_vastaan_luku_valilta ( float ala,  float yla );

    /* PÄÄOHJELMA ************************/

    void main (void)
    {
        int i;
        float pisteet, summa = 0.0; 

        for (i=1; i<=5; i++) 
        {
            printf ("Anna tuomarin %d pisteet: ",i);
            pisteet = ota_vastaan_luku_valilta( PIENIN,SUURIN);
            summa += pisteet;
        }
        printf ("Pisteiden summa on %.1f",summa);
    }
    /* FUNKTIOIDEN MÄÄRITTELYT ***********/

    float ota_vastaan_luku_valilta (float ala, float yla)
    {
        float luku;
        char rivi[128];
        int input_lkm;
        gets (rivi);
        input_lkm = sscanf (rivi,"%f",&luku);
        while ( input_lkm <1|| luku < ala || luku > yla) 
        {
            printf ("Luvun on oltava välillä%.1f- %.1f.", ala,yla);
            printf (" Anna uudelleen: ");
            gets (rivi);
            input_lkm = sscanf (rivi,"%f",&luku);
        }
        return luku;
    }


Pääohjelmasta on saatu selkeä, koska virhetarkistukset on voitu piilottaa erilliseen funktioon ja pääohjelmassa näkyy ainoastaan sen looginen toiminta.

Tässä toteutuu TOP-DOWN-ajattelu: ongelmat siirretään ratkaistaviksi aliohjelmiin eli erillisiin funktioihin. Juuri näin ohjelmia tulisi suunnitella ja toteuttaa.

previous next Up Title Contents Index