Modulaarisessa ohjelmoinnissa jaetaan ohjelma osiin (moduuleihin), jotka ovat yksinkertaisia ja lyhyitä.



Samankaltaiset tiedostot
C-kielessä taulukko on joukko peräkkäisiä muistipaikkoja, jotka kaikki pystyvät tallettamaan samaa tyyppiä olevaa tietoa.

Tietueet. Tietueiden määrittely

Koottu lause; { ja } -merkkien väliin kirjoitetut lauseet muodostavat lohkon, jonka sisällä lauseet suoritetaan peräkkäin.

Operaattoreiden ylikuormitus. Operaattoreiden kuormitus. Operaattoreiden kuormitus. Operaattoreista. Kuormituksesta

Sisällys. 1. Omat operaatiot. Yleistä operaatioista. Yleistä operaatioista

1. Omat operaatiot 1.1

Muistin käyttö. Muistin käyttö. Muistin käyttö. Muistin käyttö. Muistin käyttö. Muistin käyttö. Muistin käyttö C-ohjelmassa

Tutoriaaliläsnäoloista

Merkkijono määritellään kuten muutkin taulukot, mutta tilaa on varattava yksi ylimääräinen paikka lopetusmerkille:

Loppukurssin järjestelyt C:n edistyneet piirteet

Loppukurssin järjestelyt

Metodit. Metodien määrittely. Metodin parametrit ja paluuarvo. Metodien suorittaminen eli kutsuminen. Metodien kuormittaminen

Ohjelmoinnin perusteet Y Python

Ohjelmassa muuttujalla on nimi ja arvo. Kääntäjä ja linkkeri varaavat muistilohkon, jonne muuttujan arvo talletetaan.

Java-kielen perusteet

Osoitin ja viittaus C++:ssa

Ohjelmoinnin perusteet Y Python

Ohjausrakenteet. Valinta:

C-ohjelma. C-ohjelma. C-ohjelma. C-ohjelma. C-ohjelma. C-ohjelma. Operaatioiden suoritusjärjestys

Tietotyypit ja operaattorit

C-kieli mahdollistaa hyvin tiiviin ja samalla sekavan tavan esittää asioita, kuitenkin hyvän ohjelman tulisi olla mahdollisimman helppolukuinen ja

815338A Ohjelmointikielten periaatteet Harjoitus 5 Vastaukset

815338A Ohjelmointikielten periaatteet Harjoitus 3 vastaukset

Ohjelmoinnin peruskurssi Y1

815338A Ohjelmointikielten periaatteet Harjoitus 2 vastaukset

Lyhyt kertaus osoittimista

815338A Ohjelmointikielten periaatteet Harjoitus 4 vastaukset

Tähtitieteen käytännön menetelmiä Kevät 2009 Luento 4: Ohjelmointi, skriptaus ja Python

Luennon sisältö Tyypit int, char, float, double signed, unsigned short, long Vakiot const Rakenteet if, for, while, switch, do-while Syöttö ja tulostu

Muuttujien roolit Kiintoarvo cin >> r;

Metropolia ammattikorkeakoulu TI00AA : Ohjelmointi Kotitehtävät 3 opettaja: Pasi Ranne

Ohjelmointitaito (ict1td002, 12 op) Kevät Java-ohjelmoinnin alkeita. Tietokoneohjelma. Raine Kauppinen

Pythonin alkeet Syksy 2010 Pythonin perusteet: Ohjelmointi, skriptaus ja Python

ITKP102 Ohjelmointi 1 (6 op)

Jakso 4 Aliohjelmien toteutus

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Tietorakenteet (syksy 2013)

#include <stdio.h> // io-toiminnot. //#define KM_MAILISSA int main( ){

ITKP102 Ohjelmointi 1 (6 op)

2. C-kieli ja ongelmanratkaisu

if-lauseen yksinkertaisin muoto on sellainen, missä tietyt lauseet joko suoritetaan tai jätetään suorittamatta.

Alkuarvot ja tyyppimuunnokset (1/5) Alkuarvot ja tyyppimuunnokset (2/5) Alkuarvot ja tyyppimuunnokset (3/5)

Perusteet. Pasi Sarolahti Aalto University School of Electrical Engineering. C-ohjelmointi Kevät Pasi Sarolahti

Ohjelmassa on käytettävä funktiota laskeparkkimaksu laskemaan kunkin asiakkaan maksu. Funktio floor pyöristää luvun lähimmäksi kokonaisluvuksi.

Tiedostot. Tiedostot. Tiedostot. Tiedostot. Tiedostot. Tiedostot

Perusteet. Pasi Sarolahti Aalto University School of Electrical Engineering. C-ohjelmointi Kevät Pasi Sarolahti

Java-kielen perusteet

Luvuilla laskeminen. Esim. 1 Laske

Harjoitus 1 -- Ratkaisut

Luento 4 Aliohjelmien toteutus

Metodien tekeminen Javalla

Aliohjelmatyypit (2) Jakso 4 Aliohjelmien toteutus

Rakenne. C-ohjelmointi: Tietorakenteita ja tyyppejä. Tyyppimuunnoksia aritmeettisten tyyppien välillä. Tyyppimuunnokset. & (bitti and) Bittioperaatiot

Ohjelmoinnin peruskurssi Y1

Moduli 5: Kehittyneitä piirteitä

1. luento. Ohjelmointi (C) T0004 Syksy luento. 1. luento. 1. luento. 1. luento. kurssin sisältö ja tavoitteet työmuodot.

Ohjelmoinnin perusteet Y Python

Java-kielen perusteita

Tietorakenteet ja algoritmit syksy Laskuharjoitus 1

Rakenteiset tietotyypit Moniulotteiset taulukot

Luennon sisältö. C-kurssi kevät Tasokokeen kohta 1: Taulukon järjestäminen. Tasokokeen kohta 2. Tasokokeen kohta 2. Tasokokeen kohta 3

C-kurssi kevät Luennon sisältö

Ohjelmointitaito (ict1td002, 12 op) Kevät Java-ohjelmoinnin alkeita. Tietokoneohjelma. Raine Kauppinen

C-ohjelmointi, syksy Modulaarinen ohjelmointi. Luento C-ohjelmointi Syksy

// // whiledemov1.c // #include <stdio.h> int main(void){ int luku1 = -1; int luku2 = -1;

Harjoitus 3 -- Ratkaisut

11. Javan toistorakenteet 11.1

IDL - proseduurit. ATK tähtitieteessä. IDL - proseduurit

Modulaarinen ohjelmointi

Ohjelmoinnin perusteet Y Python

ATK tähtitieteessä. Osa 3 - IDL proseduurit ja rakenteet. 18. syyskuuta 2014

Jakso 4 Aliohjelmien toteutus

Harjoitustyö: virtuaalikone

tietueet eri tyyppisiä tietoja saman muuttujan arvoiksi

Johdatus ohjelmointiin / Lausekielinen ohjelmointi 1 & 2

Kirjoita oma versio funktioista strcpy ja strcat, jotka saavat parametrinaan kaksi merkkiosoitinta.

Sisällys. 16. Ohjelmoinnin tekniikkaa. Aritmetiikkaa toisin merkiten. Aritmetiikkaa toisin merkiten

Osa. Listaus 2.1. HELLO.CPP esittelee C++ -ohjelman osat. 14: #include <iostream.h> 15: 16: int main() 17: {

16. Ohjelmoinnin tekniikkaa 16.1

Ohjelmoinnin peruskurssi Y1

Luokka Murtoluku uudelleen. Kirjoitetaan luokka Murtoluku uudelleen niin, että murtolukujen sieventäminen on mahdollista.

Olion elinikä. Olion luominen. Olion tuhoutuminen. Olion tuhoutuminen. Kissa rontti = null; rontti = new Kissa();

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin perusteet Y Python

Moduli 4: Moniulotteiset taulukot & Bittioperaatiot

17. Javan omat luokat 17.1

\+jokin merkki tarkoittaa erikoismerkkiä; \n = uusi rivi.

Javan perusteet. Ohjelman tehtävät: tietojen syöttö, lukeminen prosessointi, halutun informaation tulostaminen tulostus tiedon varastointi

AS C-ohjelmoinnin peruskurssi 2013: C-kieli käytännössä ja erot Pythoniin

ITKP102 Ohjelmointi 1 (6 op)

13 Operaattoreiden ylimäärittelyjä

Tietorakenteet ja algoritmit

Ohjelmoinnin peruskurssi Y1

12. Javan toistorakenteet 12.1

Ohjelmoinnin perusteet Y Python

Aliohjelmatyypit (2) Jakso 4 Aliohjelmien toteutus

5.6. C-kielen perusteet, osa 6/8, Taulukko , pva, kuvat jma

C-kurssi syksy ltö. Luennon sisält. Luento 2: tyypit, rakenteet, makrot Tyypit. signed, unsigned short,, long Vakiot const Rakenteet

Transkriptio:

3. Funktiot Modulaarisessa ohjelmoinnissa jaetaan ohjelma osiin (moduuleihin), jotka ovat yksinkertaisia ja lyhyitä. Modulaarisuudella pyritään parantamaan ohjelman ymmärrettävyyttä, testattavuutta sekä ylläpidettävyyttä. Funktio ryhmittää ohjelmalauseet yhdeksi ohjelmayksiköksi. Funktio suorittaa jonkin tarkasti rajatun tehtävän. 46

Kaksi tasoa: Valmiit kirjastofunktiot, esim. printf() ja scanf() Ohjelmoijan itsensä kirjoittamat funktiot. Funktiot aktivoidaan suorittamalla funktion kutsu, joka on tavallinen C-kielen suoritettava lause: fnimi(); Funktion kutsu aloittaa funktion fnimi() ohjelmalauseiden suorituksen Kun funktion sisältämät lauseet on suoritettu, palataan takaisin siihen ohjelmaan, josta funktiota kutsutaan ja suoritetaan funktion kutsua seuraava lause. 47

lause1; lause2; fnimi(); lause4; flause1; flause2; flause3; Funktion kutsussa sulkeet ovat pakolliset, niiden avulla kääntäjä osaa päätellä että kyseessä on funktio, eikä tavallinen muuttuja. 48

Funktio täytyy määritellä ennenkuin sitä voidaan kutsua. Yleinen muoto yksinkertaistettuna on: funktion otsikko{ paikallisten muuttujien määrittelyt; suoritettavat lauseet; return arvo; } Funktio määritellään otsikkorivin ja lauselohkon avulla ( { ja }-merkkien välissä olevat lauseet). Otsikkorivillä ilmoitetaan funktion tyyppi, nimi ja parametrit. Funktion tyyppi ilmoittaa funktion palauttaman arvon tyypin, jos funktio ei palauta mitään niin tyyppinä on void. 49

Tyyppimäärite void esittää näennäistä tyyppiä, johon ei kuulu mitään arvoja. Parametrit ilmoitetaan sulkujen sisällä. Parametrejä voi olla yksi tai useampi, jokaisesta ilmoitetaan erikseen tyyppi ja nimi. Jos parametrejä ei ole käytetään tyyppinä void. 50

Funktion paikalliset muuttujat ovat käytettävissä vain funktion sisällä ja vain funktion suorituksen ajan. Suoritettavat lauseet käyttäytyvät kuten main()-funktiossakin. Funktiot on esiteltävä, jos funktioiden määrittelyt sijaitsevat main()-ohjelman perässä tai jossakin toisessa tiedostossa. Funktion esittelyä kutsutaan myös funktion prototyypiksi. Funktion prototyyppi kirjoitetaan ohjelmatiedoston alkuun esikääntäjän direktiivien jälkeen ennen main()-funktiota. Funktion esittelyssä käytetään funktion otsikko-osaa, jonka perään kirjoitetaan puolipiste. 51

Esittelyjen avulla kääntäjä tutkii vastaavatko funktioiden kutsut ja määrittelyt toisiaan. parametrien määrä, järjestys ja tyypit Esimerkkifunktio, joka "simuloi" kissaa: /* kissasimulaattori */ void naukaise( void ) { printf("miau\n"); } Funktiota kutsuttaisiin. naukaise(); 52

Esimerkkiohjelma, jossa käytetään hyväksi kissa-funktiota. /* kissasimulaattori */ #include <stdio.h> void naukaise(void); /* funktion protyyppi, eli esittely */ int main(void) { /* kissa naukaisee */ naukaise(); return(0); } /* main loppuu tähän */ /* funktion naukaise määrittely eli toteutus */ void naukaise(void) { printf("miau\n"); } 53

Funktion parametrit Parametrien avulla funktiolle välitetään tietoa sen ulkopuolelta ja parametrejä käytetään funktiossa kuten paikallisia muuttujia. Parametrit eroavat paikallisista muuttujista siinä, että niille annetaan alkuarvo funktion ulkopuolelta eli funktion kutsussa. Kuten paikalliset muuttujat eivät parametritkään ole käytettävissä funktion ulkopuolella (ne eivät "näy" funktion ulkopuolelle). Eri funktioissa voi olla saman nimisiä muuttujia ja parametrejä, mutta ne ovat toisistaan täysin riippumattomia. 54

Funktion otsikkossa (sekä esittelyssä että määrittelyssä) esiteltäviä parametrejä kutsutaan muodollisiksi parametreiksi. Funktion kutsussa annetut parametrit ovat todellisia parametrejä. Funktiota kutsuttaessa kopioidaan todellisen parametrien arvot funktion määrittelyssä vastaavassa kohdassa sijaitsevien muodollisten parametrien arvoiksi. Todellisten ja muodollisten parametrien tyyppien täytyy vastata toisiaan (joissakin tilanteissa C:ssä tehdään ns. automaattisia tyypin-muunnoksia ). Todellisten ja muodollisten parametrien nimien ei tarvitse olla samoja. Todellisena parametrina voi olla muuttujan tunnus, vakio, lauseke tai funktionkutsu. 55

Arvon palauttavat funktiot Funktiosta palataan takaisin kutsuvaan ohjelmaan: funktion viimeisen lauseen suorittamisen jälkeen ja/tai return-lauseella Jos funktion on palautettava arvo käytetään return-lausetta, jonka perään kirjoitetaan palautettava arvo. Palautettavan arvon tyypin on oltava funktion otsikossa esiteltyä tyyppiä. Funktiossa voidaan käyttää tyhjää return-lausetta, jos funktio ei palauta mitään ( funktion tyyppi on tällöin void ). 56

Yleensä funktiossa on vain yksi return-lause, mutta mikään ei estä käyttämästä useampaakin (joista vain yksi suoritetaan!). Usean return-lauseen käyttö ei ole suositeltava tapa, koska se saattaa vaikeuttaa ohjelman lukemista ja ylläpitoa. 57

Esimerkki: /* Funktio laskee kertoman n! esiehto: n on kokonaisluku ja suurempi tai yhtäsuuri kuin 0 */ int kertoma(int n){ int i, tulo = 1; for(i = 0; i <= n; i = i + 1){ tulo = tulo * i; } } return ( tulo ); /* palauttaa luvun n kertoman */ 58

funktion otsikossa ilmoitetaan palautettavan arvon tietotyyppi funktio ei tulosta arvoaan, vaan palauttaa sen return-lauseella Funktion kommentti kertoo kaiken, mitä funktiosta pitää tietää, jotta funktiota voi käyttää. mitä funktio tekee mitä sille pitää antaa syöttietoina mikä on syötettävien tietojen tyyppi esiehto kertoo, mitä pitää olla totta ennenkuin funktiota voidaan kutsua Esimerkkiohjelma, joka käyttää edellä esiteltyä kertoma-funktiota. 59

#include <stdio.h> /* funktion kertoma prototyyppi, eli esittely */ int kertoma ( int n ); /* Pääfunktio, joka kutsuu funktiota kertoma */ int main ( void ) { int num, tulos; printf ("Anna kokonaisluku väliltä 0-10 > "); scanf ("%d", &num ); /* tarkastetaan luvun arvo ennen funktion kutsumista */ if ( num >= 0 ) { tulos = kertoma ( num ); printf ("Luvun %d kertoma on %d\n", num, tulos ); } else { printf ("Luvun tulee olla positiivinen!"); } return ( 0 ); } /* main päättyy */ 60

/* Funktion kertoma määrittely eli toteutus Funktio laskee kertoman n! esiehto: n on kokonaisluku ja suurempi tai yhtäsuuri kuin 0 */ int kertoma ( int n ) { int i, tulo = 1; for ( i = 1; i <= n; i = i + 1 ) { tulo = tulo * i; } } return ( tulo ); /* palauttaa luvun n kertoman */ 61

On myös mahdollista määritellä loogisia funktioita, joissa kokonaisluvut vastaavat loogisia arvoja tosi ja epätosi. /* Funktio, joka ilmoittaa onko argumenttina annettu kokonaisluku parillinen. Funktio palauttaa arvon true (1) jos luku on parillinen, muuten funktio palauttaa arvon false (0) */ bool parillinen(int luku){ bool vastaus; vastaus = ((num % 2) == 0); } return(vastaus); 62

Käyttö ehtolausekkeena int x; printf( Anna kokonaisluku ); scanf( %d, &x); if(parillinen(x)) printf("luku on parillinen!"); Usean funktion kutsuminen lauseessa: tulos = kertoma(n) / (kertoma(r) * kertoma(n - r)); 63

Funktioiden tiedonvälitys Funktion ja sitä kutsuvan ohjelman osan välinen tiedonsiirto näkyy funktion otsikossa, funktiolle ei pitäisi välittää tietoa ns. globaalien muuttujien avulla. Funktiolle välitetään aina vain kopio todellisen parametrin arvosta. Jos funktion halutaan muuttavan kutsuvassa ohjelmassa olevan muuttujan arvoa, välitetään todellisena parametrina muuttujan osoite (oikeastaan kopio osoitteen arvosta). Kun parametrin arvo on muuttujan osoite käytetään nimeä osoiteparametri, muussa tapauksessa on kyseessä arvoparametri. 64

Funktion ja sitä kutsuvan ohjelman väliseen tiedonsiirto on kaksi tapaa: arvoparametri ja return-lause osoiteparametri Lisäksi näiden eri variaatiot 65

Funktiot ja osoiteparametrit Funktio voi palauttaa return-lauseella korkeintaan yhden arvon. Jos funktion on palautettava useita arvoja, käytetään osoite-parametreja välittämään tietoa ulos funktiosta. Esimerkki funktiosta, joka palauttaa parametrina annetun reaaliluvun etumerkin, kokonaisosan ja desimaaliosan. 66

#include <stdio.h> #include <math.h> /* erota -funktion esittely */ void erota(double num, char *merkkio, int *kokoaiso, double *desio); int main(void){ double luku, desimaaliosa; char etumerkki; int kokonaisosa; printf(" Anna reaaliluku >"); scanf("%lf", &luku ); erota (luku, &etumerkki, &kokonaisosa, &desimaaliosa); printf("luvun %.4lf osat\ etumerkki: %c\n", luku, etumerkki ); printf("kokonaisosa: %d\n", kokonaisosa); printf("desimaaliosa: %.4lf\n", desimaaliosa); return ( 0 ); } /* main */ 67

/* erota-funktio saa erottaa in-parametrina saamansa reaaliluvun osiinsa. num: in, erotettava reaaliluku *merkkio: out, etumerkki *kokonaiso: out, kokonaisosa *desio: out, desimaaliosa */ void erota(double num, char *merkkio,int *kokonaiso, double *desio ){ double n; /* paikallinen muuttuja */ if ( num < 0 ) *merkkio = '-'; else if ( num == 0 ) *merkkio = ' ' ; else *merkkio = '+'; n = fabs(num); /* luvun n itseisarvo */ *kokonaiso = floor(n); /* kokonaisosa */ *desio = n - *kokonaiso; /* desimaaliosa */ }/* erota */ 68

main-funktion parametrit main()-funktiolle voidaan välittää tietoja kutsuttaessa ns. komentoriviparametrien avulla. Komentoriviparametrit kirjoitetaan ohjelman nimen perään, kun ohjelma käynnistetään komentoriviltä. Käyttöjärjestelmä välittää mitkä tahansa komentoriviparametrit ladattavalle ohjelmalle. 69

Ohjelma, joka tulostaa saamansa komentoriviparametrit: int main (int argc, char * argv[]){ int laskuri; printf("parametrien lukumäärä: %d\n", argc ); for ( laskuri = 0; laskuri < argc; laskuri++) { printf("parametri %d on %s\n", laskuri, *(argv+laskuri) ); } } return ( 0 ); 70

Ensimmäisen parametri argc kertoo kokonaislukuna annettujen parametrien lukumäärän. Toinen parametri argv[] on osoitin merkkijonotaulukkoon, jonne kaikki parametrit on talletettu syöttöjärjestyksessä. Ensimmäisen merkkijonotaulukon alkion sisältönä on aina suoritettavan ohjelman koko hakemistopolku. 71

Talletusluokat (Storage classes) C-kielessä on erilaisia talletusluokkia (muistimääreitä), jotka vaikuttavat muuttujien ja funktioiden näkyvyyteen ja elinikään. 1. auto Funktioiden muodollisille parametreille ja paikallisille muuttujille varataan tilaa automaattisesti ja näiden muuttujien käyttämä tila vapautetaan automaattisesti, kun funktion suoritus päättyy. 72

2. extern Funktioille voidaan joissakin tilanteissa välittää tietoa muuttujien avulla, jotka on määritelty kaikkien funktioiden ulkopuolella ns. globaalit muuttujat. Globaali muuttuja "näkyy" kaikissa funktioissa, jotka on määritelty globaalin muuttujan määrittelyn jälkeen. Globaaleille muuttujille varataan tilaa koko ohjelman suorituksen ajaksi. Globaalin muuttujan näkyminen voidaan peittää funktiossa määrittelemällä uusi samanniminen paikallinen muuttuja. Kaikki funktioiden nimet ovat tyyppiä extern, eli funktioiden nimet nimet ovat globaaleja. 73

Globaalien muuttujien käyttö ei ole vaaratonta, esimerkiksi ohjelmoijalla on tarkoitus käyttää paikallista muuttujaa, jolla on sama nimi kuin globaalilla muuttujalla. Kaikki paikalliseen muuttujaan kohdistuvat toimenpiteet suoritetaan globaaliin muuttujaan, josta seuraa melko varmasti virhetilanne, joka voi olla vaikea havaita. 74

Esimerkkiohjelma: #include <stdio.h> int a = 1, b = 2, c = 3; /* globaaleja muuttujia */ int summa(void); /* funktion prototyyppi */ int main ( void ) { printf("%3d\n", summa()); printf("%3d%3d%3d\n", a, b, c ); return (0 ); } /* funktion summa määrittely */ int summa ( void ) { int b, c; /*paikalliset b ja c,globaalit b ja c peittyvät*/ a = b = c = 4; return ( a + b + c ); } 75

Globaalin muuttujan määrittelyssä ei käytetä sanaa extern, muuttujaa esiteltäessä. Sanalla extern kerrotaan kääntäjälle "etsi esiteltävän muuttujan määrittely muualta joko tästä tai toisesta tiedostosta". Esimerkiksi jos edellinen ohjelma kirjoitettaisiin kahteen eri tiedostoon. 76

tiedosto file1.c: #include <stdio.h> int a = 1, b = 2, c = 3; /* globaaleja muuttujia */ int summa ( void ); /* funktion prototyyppi */ int main ( void ) { printf("%3d\n", summa( ) ); printf("%3d%3d%3d\n", a, b, c ); } return (0 ); 77

tiedosto file2.c: /* funktion summa määrittely */ int summa ( void ) { extern int a; /* etsi a:n määrittely muualta */ int b, c; /*paikalliset c ja b, globaalit b ja c peittyvät*/ a = b = c = 4; } return ( a + b + c ); 78

3. register register-muistimääreellä kerrotaan kääntäjälle, että jos vain on mahdollista niin muuttujalle varataan tila koneen keskusyksikön rekistereistä, eikä keskusmuistista. Tarkoituksena on tehostaa ohjelman suoritusta. Määre on vain ehdotus kääntäjälle, jos rekistereitä ei ole joutilaana, varataan muuttujalle tilaa normaalisti keskusmuistista. 79

Tyypillisiä ehdokkaita ovat silmukkalaskurit ja funktioiden parametrit, esimerkiksi: { } register int i; for(i = 0; i < LIMIT; i++){... } Lohkosta poistuminen vapauttaa muuttujan i. Jos muuttujan määrittelyssä jätetään tyyppi ilmoittamatta, mutta talletusluokka ilmoitetaan, on tyyppi oletusarvoisesti int. 80

4. static static-määrettä käytetään kahdessa eri tarkoituksessa. Paikalliset muuttujat säilyttävät arvonsa kun samaan lohkoon tullaan uudestaan, toisin kuin automaattisten muuttujien kohdalla. Esimerkiksi funktio, joka toimii eri tavalla riippuen montako kertaa sitä on kutsuttu. void teejotakin ( void ) { static int lkm = 0; lkm++; if ( lkm % 2 == 0)... /* tee jotakin */ else... /* tee jotakin muuta */ 81

lauseessa static int lkm = 0; alustetaan muuttujalle lkm arvo 0 vain funktion teejotakin ensimmäisellä suorituskerralla. static -määreen käyttö globaalien nimien yhteydessä antaa mahdollisuuden rajoittaa muuttujien ja funktioiden "näkyvyyttä". Näkyvyys rajataan vain sen tiedoston loppuun, jossa muuttuja tai funktio on määritelty ts. muuttujat eivät näy funktioissa, jotka on esitelty ennen muuttujan määrittelyä eikä funktioissa, jotka on määritelty eri tiedostoissa. 82

Esimerkiksi: void funktioyksi(void) {... /* muuttuja v ei ole käytettävissä */ } static int v; /* static external v */ void funktiokaksi ( void ) {... /* v:tä voidaan käyttää täällä */ } 83

Myöskin funktion näkyminen voidaan rajoittaa esim: static int funktiog(void); /* prototyyppi */ void funktiof(void){ /* funktion määrittely */... /*funktiog() "näkyy" täällä, mutta ei muissa tiedostoissa*/ } static int funktiog(void){... } 84

C-kielessä globaalit ja staattiset muuttujat alustetaan automaattisesti nollaksi ellei ohjelmoija anna niille alkuarvoja. Automaattisia ja rekisterimuuttujia ei alusteta automaattisesti. 85

Funktiokirjastot C-kielessä on valmiiksi määriteltyä funktioita, jotka on koottu funktiokirjastoihin, jotka on jaettu useisiin pienempiin ryhmiin. Funktiokirjastot otetaan käyttöön #include-komennolla kirjoittamalla komennon perään tarvittavan otsikkotiedoston nimi kulmasulkeissa. #include <stdio.h> Otsikkotiedosto sisältää funktioiden määrittelyt. Kulmasulkeet ilmoittavat kääntäjälle, että sisältö sijaitsee standardikirjasto-hakemistossa. C:n standardikirjasto koostuu 15 otsikkotiedostosta. 86

Otsikkotiedosto assert.h ctype.h locale.h math.h setjmp.h signal.h stdarg.h stdbool.h stddef.h stdio.h stdlib.h string.h time.h Kuvaus ohjelmien diagnostiikkatoimintoja merkkien testausfunktioita maa- ja kieli-informaatiota tarjoavia funktioita matemaattiset funktiot mahdollistaa ohjelman kulun muuttamisen funktioilla poikkeustilanteiden käsittelyfunktiot muuttuja-argumenttien käsittelymakroja loogisen tietotyypin määrittelyt tietotyyppien ja makrojen määrittelyitä syöttö- ja tulostusfunktioita erilaisia hyötyfunktioita merkkijonojen käsittelyfunktiot päivänmäärä- ja aikafunktioita 87

Matemaattiset funktiot. Funktio Kuvaus abs () kokonaislukumuuttujan itseisarvo fabs() reaalilukumuuttujan itseisarvo sin() luvun sini cos() luvun kosini tan() luvun tangentti asin() luvun arcussini acos()... atan()... log() luonnollinen logaritmi log10() 10-kantainen logaritmi exp() eksponenttifunktio sqrt() neliöjuuri pow() luvun korotus potenssiin 88

Aika- ja päivänmääräfunktiot Otsikkotiedostossa time.h määritellään funktioita, joilla käsitellään aikaa ja päivänmäärää. Funktioiden avulla voidaan käyttöjärjestelmältä kysyä aika ja päivänmäärä, sekä muuntaa aikamuotoja. Useissa ympäristöissä päivänmäärä ja aika ilmaistaan sekunteina, joka on kulunut päivänmäärästä 1.1.1970. Funktio stime() time() asctime() clock() kuvaus asettaa ajan ja päivänmäärän palauttaa ajan aikana (GMT) muuntaa ajan muodosta toiseen palauttaa kuluneen prosessoriajan 89

Tiedostossa stdlib.h on useita hyötyfunktioita, joista alla muutamia yleisimmin käytettyjä Funktio rand() srand() exit() abort() mallaoc() realloc() free() system() qsort() kuvaus Palauttaa satunnaisluvun Alustaa satunnaislukugeneraattorin ohjelman keskeytys (yleensä virhetilanteessa ) ohjelman epänormaali keskeytys muistin allokointi vapauttaa muistia palauttaa allokoidun muistin järjestelmälle suorittaa käyttöjärjestelmätoiminnon lajittelee taulukon, quicksort-algoritmia käyttäen 90

Merkkienkäsittelyfunktiot Funktio isalpha() iscntrl() ispunct() isspace() isupper() islower() tolower() toupper() kuvaus onko merkki aakkonen onko merkki ohjausmerkki onko merkki välimerkki onko merkki välilyönti onko merkki iso kirjain onko merkki pieni kirjain muuttaa kirjaimen pieneksi kirjaimeksi muuttaa merkin isoksi kirjaimeksi 91

Yhteenveto: return-lause päättää funktion suorituksen ja palauttaa kontrollin kutsuvalle ympäristölle. Jos return-lause sisältää lausekkeen, lasketaan lausekkeen arvo ja sen arvo palautetaan kutsujalle. Funktion prototyyppi kertoo kääntäjälle funktiolle välitettävien parametrien tyypin ja lukumäärän sekä funktion palauttaman arvon tyypin. Jos funktiolle ei välitetä parametreja käytetään sanaa void. Jos funktio ei palauta mitään käytetään sanaa void. Funktiolle välitetään parametrina aina kopio todellisen parametrin arvosta, joka voi olla joko muutujan sisältö tai sen osoite. Välitettävän tiedon tyypin ja järjestyksen täytyy vastata funktion prototyypissä ja määrittelyssä ilmoitettua tyyppiä ja järjestystä. 92