Loogisia operaatioita - esimerkkejä Tänään on lämmin päivä ja perjantai Eilen satoi ja oli keskiviikko tai tänään on tiistai. On perjantai ja kello on yli 13 Ei ole tiistai tai ei sada. Ei pidä paikkaansa, että on tiistai tai sataa Laura on tytön nimi tai Saara on pojan nimi On tiistai tai kello on yli 11 tai kuu on juustoa. Luokkatilassa on yli 50 oppilasta tai ei ole tiistai Ei ole totta, että ensi vuonna on joulu tai taivas on vihreä Ei ole niin, että tänään sataa lunta tai on torstai. Huomenna on perjantai tai tänään on tiistai Huomenna on torstai tai huomenna ei ole torstai Huomenna on perjantai ja tänään on perjantai Ei ole niin, että huomenna on perjantai tai tänään on perjantai 1 T0004 Olli Hämäläinen www.evtek.fi Operaatioiden suoritusjärjestys ++ ja - - muuttujan jäljessä esim. i++ ++ ja - - muuttujan edellä, + ja (etumerkki) esim. - -i, -a * / % kerto- ja jakolasku, jakojäännös a%b + ja yhteen- ja vähennyslasku a+b-c < > <= >= epäyhtälövertailut a<b, c>=d ==!= yhtäsuuruusvertailut a == b && looginen ja a && b looginen tai a b = += -= /= %= sijoitusoperaatiot a+=b, pilkkuoperaattori (peräkkäissuoritus) int a=1, b=2; 2 T0004 Olli Hämäläinen www.evtek.fi Ehtolause if - else ehtolauseella on kaksi muotoa: (1) if (ehto) lause; (2) if (ehto) lause1; else lause2; Huom! Lause voi olla yksinkertainen lause tai koottu lause (lohko) eli koostua useasta yksinkertaisesta lauseesta, jotka ovat aaltosuluissa. Huom! Toisin kuin joissain muissain ohjelmointikielissä C-kielen ehtolauseessa ei ole then-sanaa Ehtolause if - else - esimerkki if (luku<raja_arvo) printf( Luku jää alle rajan ); printf ( Pitäisikö sitä kasvattaa? ); vertaa: if (luku<raja_arvo) printf( Luku jää alle rajan ); printf( Pitäisikö sitä kasvattaa? ); 3 T0004 Olli Hämäläinen www.evtek.fi 4 T0004 Olli Hämäläinen www.evtek.fi Valinta usean vaihtoehdon perusteella if-else rakennetta voidaan käyttää useamman vaihtoehdon tapauksessa seuraavasti: if (ehto1) lause1; else if (ehto2) lause2; else if (ehto3) lause3; else if (ehto4) lause4; else lause5; C-kielessä else viittaa aina lähimpään edelliseen samalla tasolla olevaan if:iin. while-toistolause while (ehto) lause; tavallisimmin lause on lohko eli koottu lause toiminta: lausetta suoritetaan niin kauan kun ehto on tosi (nollasta poikkeava), jos ehto on alunperin epätosi (0) lausetta ei suoriteta yhtään kertaa jotta while-lauseen suoritus joskus päättyisi, on ehdon ehto arvon muututtava jollain lauseen suorituskerralla epätodeksi 5 T0004 Olli Hämäläinen www.evtek.fi 6 T0004 Olli Hämäläinen www.evtek.fi 1
while-toistolause, esimerkki scanf( %d,&luku); while (luku < 100) kirjoita (luku * luku); luku=luku + 1; vertaa: luku=50; while (luku < 100) kirjoita (luku * luku); luku=luku - 1; Kirjastofunktio printf saadaan käyttöön kirjastosta stdio.h lisäämäällä ohjelman alkuun tulostaa tietoa kuvaruudulle halutulla tavalla muotoiltuna 7 T0004 Olli Hämäläinen www.evtek.fi 8 T0004 Olli Hämäläinen www.evtek.fi Kirjastofunktio printf printf(muotoilumerkkijono,muuttujalista); muotoilumerkkijonossa annetaan vakiotekstit, muuttujien paikat tekstissä ja haluttu muuttujan esitysmuoto muuttujalistassa luetellaan tulostettavat muuttujat siinä järjestyksessä kuin niille on varattu paikat muotoilumerkkijonossa Kirjastofunktio printf - esimerkkejä printf( Moikka vaan! ); tulostaa kuvaruudulle tekstin Moikka vaan! printf( Tänään satoi %d mm, sademaara); tulostaa kuvaruudulle tekstin (jos muuttujalla sademaara on arvo 12) Tänään satoi 12 mm printf( Luku1=%d ja luku2=%d,luku1,luku2); tulostaa kuvaruudulle lukujen arvot selitystekstein. 9 T0004 Olli Hämäläinen www.evtek.fi 10 T0004 Olli Hämäläinen www.evtek.fi Muotoilumääreet int %d tai %i long %ld tai %li float %f double %f char %c Muotoilumääreessä voidaan %-merkin jälkeen antaa haluttu tulostuskentän leveys ja %f:n tapauksessa desimaalien määrä, esim. %8d, %5.2f. Miinusmerkki aiheuttaa kohdistamisen vasemmalle, esim. %-5d, %-8.1f. Erikoismerkit ja -toiminnot \n rivinvaihto (new line) \t tabulointimerkki \a hälytys (alarm, bell) \r rivin alkuun (carriage return, vaunun palautus ) \b peruutus (edeltävän merkin poisto, backspace) \f sivunvaihto (form feed) \ooo \xhh oktaalilukua ooo vastaava merkki heksadesimaalilukua hh vastaava merkki 11 T0004 Olli Hämäläinen www.evtek.fi 12 T0004 Olli Hämäläinen www.evtek.fi 2
Kirjastofunktio scanf saadaan käyttöön kirjastosta stdio.h scanf(muotoilumerkkijono,osoitelista); funktiolla luetaan tietoa syöttöriviltä yhdelle tai useammalle muuttujalle soveltuu parhaiten numeeristen muuttujien arvojen kukemiseen Kirjastofunktio scanf muotoilumerkkijonossa annetaan muuttujien paikat syötteessä ja muuttujan esitysmuoto osoitelistassa luetellaan tulostettavat muuttujat vasrustettuna &-merkillä siinä järjestyksessä kuin niille on varattu paikat muotoilumerkkijonossa muotoilumääreet ovat lähes samat kuin printffunktiossa (määre %lf double-tyypille, ei leveysmäärityksiä) 13 T0004 Olli Hämäläinen www.evtek.fi 14 T0004 Olli Hämäläinen www.evtek.fi /*Esimerkki 6.2 (Silander) Ohjelma pyytää kokonaisluvun, ottaa vastaan ja tulostaa sen: */ void main(void) printf ("Anna kokonaisluku: "); scanf ("%d", &luku); printf ("Annoit luvun %d",luku); Kirjastofunktiot gets ja sscanf eli lukeminen puskurin kautta funktiot saadaan käyttöön kirjastosta stdio.h gets(puskuri); sscanf(puskuri,muotoilumerkkijono, osoitelista); gets-funktiolla luetaan syöttörivi kerralla puskuriin (merkkitaulukkoon, esim. char puskuri[128]) sscanf-funktiolla luetaan kuten scanf funktiolla, mutta puskurista, joka annetaan 1. parametrina 15 T0004 Olli Hämäläinen www.evtek.fi 16 T0004 Olli Hämäläinen www.evtek.fi /* Esimerkki 6.3 (Silander) */ void main (void) char merkki; char puskuri[128]; printf ("Anna luku: "); gets (puskuri); sscanf (puskuri,"%d", &luku); /* Esimerkki jatkuu */ printf ("Anna merkki"); gets (puskuri); sscanf (puskuri,"%c", &merkki); printf ("Annoit luvun %d ja merkin %c", luku, merkki); 17 T0004 Olli Hämäläinen www.evtek.fi 18 T0004 Olli Hämäläinen www.evtek.fi 3
/*Esimerkki vertaa edelliseen! */ void main (void) char merkki; printf ("Anna luku: "); scanf ( %d", &luku); printf ("Anna merkki"); scanf ("%c", &merkki); printf ("Annoit luvun %d ja merkin %c", luku, merkki); 19 T0004 Olli Hämäläinen www.evtek.fi kun yhteenkuuluvia, samantyyppisiä ja samanlaisia tietoja käsitellään samalla tavalla,voidaan yksittäisten yksinkertaisten muuttujien sijaan käyttää taulukkomuuttujaa tietoihin viitataan samalla tunnuksella (nimellä) ja ne erotetaan toisistaan indeksin avulla yksittäistä taulukossa olevaa tietoa kutsutaan taulukon alkioksi taulukon koko on vakio, joka on ilmoitettava määrittelyn yhteydessä taulukon indeksointi alkaa aina arvosta 0 20 T0004 Olli Hämäläinen www.evtek.fi - esimerkki int luku[10]; määrittelee 10 alkiota käsittävän taulukon, jossa on alkiot luku[0],luku[1],luku[2],luku[3], luku[4],luku[5],luku[6],luku[7],luku[8], luku[9] taulukon alkioita voidaan käyttää operaatioissa aivan kuten yksinkertaisia muuttujia: luku[5] = a + luku[i]/n; indeksinä voidaan käyttää muuttujaa tai vakiota - esimerkki Vaaleissa on 99 ehdokasta. Tuloslaskentaa varten on laadittava ohjelma, joka lukee ehdokkaiden numeroita (2-99), kunnes annetaan negatiivinen arvo. Hylätty äänestyslippu syötetään arvona 0. Määritellään ohjelmaan kokonaislukutaulukko ehdokas, johon kootaan äänimääriä ja liukulukutaulukko osuus, johon lasketaan kunkin ehdokkaan osuus annetuista äänistä. Lopuksi tiedot tulostetaan. 21 T0004 Olli Hämäläinen www.evtek.fi 22 T0004 Olli Hämäläinen www.evtek.fi int main (void) int ehdokas[100] = 0; float osuus[100] = 0.0f; int numero = 1; int summa = 0; /* lukuvaihe */ while (numero >= 0&& numero <100) scanf( %d,&numero); if ((numero==0) (numero >=2 && numero<100)) ehdokas[numero]++; summa++; 23 T0004 Olli Hämäläinen www.evtek.fi /* osuuksien laskenta */ numero = 0; while (numero < 100) osuus[numero] = 100*ehdokas[numero]/summa; numero++; /* seuraavaksi tulosten kirjoittaminen */ printf( Yhteenveto annetuista äänistä\n ; 24 T0004 Olli Hämäläinen www.evtek.fi 4
numero = 2; while (numero < 100) printf( Ehdokkaan %d äänimäärä %d (%f)%%\n, numero, ehdokas[numero], osuus[numero]); numero++; printf ( Hylättyjä ääniä oli %d (%f)%%)\n, ehdokas[0], osuus[0]); printf ( Ääniä annettiin kaikkiaan %d \n, summa); return 0; 25 T0004 Olli Hämäläinen www.evtek.fi 5