Valinnat ja päätökset

Koko: px
Aloita esitys sivulta:

Download "Valinnat ja päätökset"

Transkriptio

1 Valinnat ja päätökset 4 Valinnat ja päätökset Päätöksenteko on erittäin tärkeässä asemassa kaikissa ohjelmointikielissä. Jos ohjelman lauseiden suoritusjärjestystä ei voitaisi muuttaa tietojen vertailun perusteella, useimpien ongelmien ratkaiseminen tietokoneohjelmilla olisi mahdotonta. Tässä luvussa käsittelemme, miten C++-ohjelmissa tehdään valintoja ja päätöksiä. Näin voit esimerkiksi tarkistaa ohjelmien syötteiden oikeellisuuden tai kirjoittaa ohjelmia, joiden suoritus riippuu syötetystä tiedosta. Ohjelmasi voivat käsitellä ongelmia, joissa loogiset valinnat ovat välttämättömiä. Luvun aiheita ovat: Miten tietoja vertaillaan Kuinka ohjelman lauseiden suoritusjärjestystä muutetaan vertailun tuloksen perusteella Mitä ovat loogiset operaattorit ja vertailulausekkeet ja kuinka niitä käytetään Miten käsitellään tilanteita, joissa on useita vaihtoehtoja Tiedon vertailu Jotta voimme tehdä päätöksiä, tarvitsemme tavan, jolla voimme vertailla asioita. Kaiken lisäksi olemassa on erityyppisiä vertailuja. Esimerkiksi päätös jos liikennevalo näyttää punaista, pysäytä auto, sisältää yhtäsuuruuden vertailun. Vertaamme liikennevalon näyttämää väriä vertailuväriin, punaiseen, ja jos ne ovat samat, pysäytämme auton. Toisaalta esimerkiksi päätös jos auton nopeus ylittää nopeusrajoituksen, hiljennä vauhtia, sisältää erityyppisen vertailun: vertailemme auton nopeutta voimassa olevaan nopeusrajoitukseen. Molemmat vertailut ovat samanlaisia siinä, että ne molemmat palauttavat toisen kahdesta arvosta: ne ovat joko tosia (true) tai epätosia (false). Vertailut tapahtuvat C++:ssa juuri tällä tavalla. Voimme vertailla arvoja vertailuoperaattoreilla. Käytössä on kuusi perusvertailuoperaattoria: < pienempi kuin <= pienempi tai yhtä suuri kuin > suurempi kuin >= suurempi tai yhtä suuri kuin == yhtäsuuruus!= erisuuruus 111

2 C++ Ohjelmoijan käsikirja! Tässä yhtäsuuruus -vertailuoperaattorissa on kaksi peräkkäistä yhtäsuuruusmerkkiä. Tämä ei ole sama kuin sijoitusoperaattori (=), jossa on vain yksi yhtäsuuruusmerkki. Varsin yleinen virhe on käyttää vain yhtä yhtäsuuruusmerkkiä kahden sijaan, kun vertaillaan yhtäsuuruutta. Kääntäjä ei yleensä anna tästä virheilmoitusta, joten sinun tulee olla erityisen tarkka. Kukin näistä binäärisistä operaattoreista vertailee kahta arvoa ja palauttaa arvon true, jos vertailu on tosi tai arvon false, jos vertailu on epätosi. Arvot true ja false ovat varattuja sanoja C++:ssa. Ne muodostavat myöskin uuden literaalivakion: booleanliteraalin (boolean algebran isän George Boolen mukaan). Sen tyyppi on bool. Jos muunnat arvon true integer-tyyppiseksi, tulos on 1 ja jos muunnat arvon false kokonaisluvuksi, tulos on 0. Voit myös muuntaa numeerisen arvon bool-tyyppiseksi; tällöin nolla on false ja nollasta poikkeava true. Kuten muidenkin perustietotyyppien kohdalla, voit luoda bool-tyyppisen muuttujan booleanarvon tallettamista varten. Esittelet tällaisen aivan samaan tapaan kuin muunkin muuttujan: bool paatos = true; //Esitellään, määritellään ja alustetaan //looginen muuttuja Tämä esittelee ja määrittelee muuttujan paatos boolean-tyyppiseksi ja alustaa siihen alkuarvon true. Vertailuoperaattoreiden käyttö Näemme muutaman yksinkertaisen esimerkin avulla, kuinka vertailuoperaattoreita käytetään. Oletetaan, että käytössämme on kaksi kokonaislukumuuttujaa i ja j, joiden arvot ovat 10 ja -5. Voimme käyttää niitä seuraavanlaisissa vertailulausekkeissa: i > j i!= j j > -8 i <= j + 15 Kaikkien näiden lausekkeiden arvo on true. Huomaa, että viimeisessä lausekkeessa, i <= j + 15, lisäysoperaatio j + 15 suoritetaan ensin, koska + on suoritusjärjestyksessä ennen operaattoria <=. Voit sijoittaa minkä tällaisen lausekkeen tahansa tuloksen bool-tyyppiseen muuttujaan. Esimerkiksi: char ensimmainen = A ; char viimeinen = Z ; Voimme nyt kirjoittaa joitakin esimerkkejä, jotka käyttävät näitä muuttujia. Tarkastellaan seuraavia: ensimmainen < viimeinen E <= ensimmainen ensimmainen!= viimeinen 112

3 Valinnat ja päätökset Ensimmäinen näistä lausekkeista tarkistaa, onko muuttujan ensimmainen arvo, joka on A, pienempi kuin muuttujan viimeinen arvo, joka on Z. Tämä on aina true. Voit tarkastaa tämän ASCII-merkkien kohdalla liitteestä A - isot kirjaimet ovat nousevassa järjestyksessä koodeissa 65-90; 65 kuvaa arvoa A ja 90 arvoa Z. Toisen lausekkeen arvo on false, koska E on suurempi kuin muuttujan ensimmainen arvo. Viimeinen lauseke on true, koska A ei todellakaan ole sama kuin Z. Voimme tulostaa bool-tyyppisiä arvoja aivan samaan tapaan kuin muitakin muuttujia, joten katsotaan esimerkin avulla, miltä ne näyttävät. Kokeile itse - Tietojen vertailu Tämä esimerkki lukee käyttäjältä kaksi char-tyyppistä arvoa, ja tulostaa niiden välisten vertailujen tulokset: // Esimerkki Tietojen vertailu #include <iostream> using namespace std; int main() char ensimmainen = 0; char toinen = 0; // Sisältää ensimmäisen merkin // Sisältää toisen merkin // Luetaan käyttäjältä ensimmäinen merkki cout << "Syötä merkki: "; cin >> ensimmainen; // Luetaan käyttäjältä toinen merkki cout << "Syötä toinen merkki: "; cin >> toinen; cout << "Lausekkeen ensimmainen < toinen arvo on: " << (ensimmainen < toinen) << endl << "Lausekkeen ensimmainen == toinen arvo on: " << (ensimmainen == toinen) return 0; Ohjelman tulostus voisi olla vaikka seuraavaa: Syötä merkki: p Syötä toinen merkki: t Lausekkeen ensimmainen < toinen arvo on: 1 Lausekkeen ensimmainen == toinen arvo on: 0 Kuinka se toimii Syötteen pyytäminen ja lukeminen käyttäjältä on jo tuttua. Tulostamme tuloksen käyttämällä < ja == -operaattoreita lauseessa: 113

4 C++ Ohjelmoijan käsikirja cout << "Lausekkeen ensimmainen < toinen arvo on: " << (ensimmainen < toinen) << endl << "Lausekkeen ensimmainen == toinen arvo on: " << (ensimmainen == toinen) Huomaa, että vertailulausekkeiden ympärillä olevat sulkeet ovat tässä välttämättömät, muutoin kääntäjä ei pysty tulkitsemaan lausetta oikein ja se antaa virheilmoituksen. Lausekkeet vertailevat syötettyjä ensimmäistä ja toista merkkiä. Yllä olevasta tulostuksesta voit nähdä, että arvo true tulostuu lukuna 1 ja arvo false lukuna 0. Jos haluamme tulostaa boolean-arvot sanoina true ja false, voimme käyttää muokkausfunktiota boolalpha. Lisää seuraava lause funktion main() alkuun: cout << boolalpha; Jos käännät ja suoritat esimerkin uudelleen, boolean-arvot tulostuvat sanoilla true ja false. Palataksesi takaisin oletusarvoihin, käytä noboolalpha-muokkausfunktiota. Liukulukuarvojen vertailu Voit luonnollisestikin vertailla myöskin liukulukuja. Tarkastellaan joitakin hieman monimutkaisempia vertailuja. Ensiksi määrittelemme muutaman muuttujan seuraavilla lauseilla: int i = -10; int j = 20; double x = 1.5; double y = -0.25E-10; Katsotaan nyt seuraavia vertailulausekkeita: -1 < y j < (10 - i) 2.0 * x >= (3 + y) Kuten huomaat, voimme käyttää numeerisen arvon palauttavia lausekkeita vertailun operandeina. Koska vertailuoperaattorit ovat kaikki suoritusjärjestyksessä laskuoperaattoreiden jälkeen (katso liite D), yksikään sulkeista ei ole välttämätön, mutta ne tekevät lausekkeesta selkeämmän. Ensimmäisen vertailun tulos on true, koska muuttujan y arvo on hyvin pieni negatiivinen arvo ( ), joka on suurempi kuin -1. Toinen lauseke palauttaa arvon false, koska lausekkeen 10 - i arvo on 20, joka on sama kuin muuttujan j arvo. Kolmas lauseke on true, koska 3 + y on hieman pienempi kuin 3. Voimme käyttää vertailuoperaattoreita kaikkien perustietotyyppien vertailuun, joten nyt tarvitsemme keinon, jolla voimme käyttää vertailun tulosta muuttamaan ohjelman suoritusta. Katsotaanpa tätä heti seuraavaksi. 114

5 Valinnat ja päätökset If-lause Yksiosaisen if-lauseen avulla ohjelmasi voi suorittaa yksittäisen lauseen tai aaltosulkeiden sisällä olevan lohkon, jos vertailun arvo on true. Tätä havainnollistaa viereinen kuva: If(vertailulauseke) Lause; Seuraava lause; Tai If(vertailulauseke) Lause;... Seuraava lause; Ei Vertailu on true Kyllä Lause tai lohko Seuraava lause If-lauseen perässä oleva lause tai lohko suoritetaan vain, jos vertailulausekkeen arvo. on true. Yksinkertainen esimerkki if-lauseesta on char-tyyppisen muuttujan kirjain arvo testaus: if(kirjain == A ) cout << Ensimmäinen aakkosnumeerinen merkki. cout << Tämä lause suoritetaan aina. Jos muuttujan kirjain arvo on A, vertailulausekkeen arvo on true ja lauseet tulostavat: Ensimmäinen aakkosnumeerinen merkki. Tämä lause suoritetaan aina. Jos muuttujan kirjain arvo ei ole A, vain toisen rivin tulostus suoritetaan. Testattava vertailulauseke on sulkeissa heti if-avainsanan perässä. Huomaa puolipisteen sijainti. Se sijoitetaan if-aivainsanaa ja sulkeissa olevaa vertailulauseketta seuraavan lauseen perään. Sulkeissa olevan vertailulausekkeen perässä ei tule olla puolipistettä, koska if ja vertailulauseke liittyvät niitä seuraavaan lauseeseen tai lohkoon. Ne eivät voi olla olemassa sellaisinaan. Huomaa myös, kuinka if-avainsanan perässä oleva lause on sisennetty merkiksi siitä, että se suoritetaan vain, jos vertailulausekkeen arvo on true. Sisennystä ei tarvita ohjelman kääntämistä varten, mutta se helpottaa tunnistamaan if-avainsanan ja siitä riippuvan lauseen. Joskus tällaiset yksinkertaiset if-lauseet kirjoitetaan yhdelle riville: if(kirjain == A ) cout << Ensimmäinen aakkosnumeerinen merkki. Mielestäni if-avainsanaan liittyvä lause tai lohko kannattaa aina kirjoittaa omalle rivilleen; se on selvempi sillä tavalla. 115

6 C++ Ohjelmoijan käsikirja Voimme laajentaa esimerkkiä siten, että se muuttaa muuttujan kirjain arvon, jos se sisältää kirjaimen A : if(kirjain == A ) cout << Ensimmäinen aakkosnumeerinen merkki. kirjain = a ; cout << Tämä lause suoritetaan aina. Lohkossa olevat lauseet suoritetaan vain, jos vertailulausekkeen arvo on true. Ilman aaltosulkeita ainoastaan ensimmäinen lause olisi liitettynä if-lauseeseen, ja muuttujaan kirjain arvon a sijoittava lause suoritettaisiin aina. Huomaa, että lohkon jokaisen lauseen perässä on puolipiste, mutta ei lohkon päättävän aaltosulkeen perässä. Lohkossa voi olla niin monta lausetta kuin haluat, tai jopa sisäkkäisiä lohkoja. Jos muuttuja kirjain sisältää arvon A, se muutetaan arvoksi a sen jälkeen, kun on tulostettu sama viesti kuin aikaisemmassakin esimerkissä. Kumpaakaan lausetta ei suoriteta, jos vertailulausekkeen arvo on false. if-lausetta seuraava lause suoritetaan tietysti aina. Kokeile itse - Päätöksen tekeminen Kokeillaan if-lausetta käytännössä. Voimme tehdä ohjelman, joka tarkistaa, kuuluuko syötetty kokonaisluku haluttuun arvoväliin: // Esimerkki if-lauseen käyttö #include <iostream> using namespace std; int main() cout << "Syötä kokonaisluku väliltä : "; int arvo = 0; cin >> arvo; if(arvo < 50) cout << "Arvo ei ole sallittu - se on pienempi kuin 50." if(arvo > 100) cout << "Arvo ei ole sallittu - se on suurempi kuin 100." cout << "Syötit luvun " << arvo return 0; Tulostus riippuu syötetystä arvosta. Jos arvo on välillä , tulostus näyttää seuraavalta: Syötä kokonaisluku väliltä : 77 Syötit luvun

7 Valinnat ja päätökset Jos arvo on välin ulkopuolella, tulostuu viesti, joka kertoo, että syöte ei ollut halutulla arvovälillä. Jos arvo on alle 50, ohjelma tulostaa: Syötä kokonaisluku väliltä : 27 Arvo ei ole sallittu - se on pienempi kuin 50. Syötit luvun 27 Jos arvo on suurempi kuin 100, ohjelman tulostus on saman tyyppinen: Syötä kokonaisluku väliltä : 270 Arvo ei ole sallittu - se on suurempi kuin 100. Syötit luvun 270 Kuinka se toimii Arvon lukemisen jälkeen ensimmäinen if-lause tarkistaa, onko syötetty arvo alle alarajan 50: if(arvo < 50) cout << "Arvo ei ole sallittu - se on pienempi kuin 50." Tulostuslause suoritetaan vain, jos vertailulausekkeen arvo on true, eli silloin, kun muuttujan arvo arvo on pienempi kuin 50. Seuraava if-lause tarkistaa ylärajan: if(arvo > 100) cout << "Arvo ei ole sallittu - se on suurempi kuin 100." Tulostuslause suoritetaan, jos muuttujan arvo arvo on suurempi kuin 100. Viimeinen tulostuslause suoritetaan aina: cout << "Syötit luvun " << arvo Sisäkkäiset if-lauseet Lause, joka suoritetaan, kun if-lauseen vertailulauseke on true, voi olla myös if-lause. Tällaista lausetta kutsutaan sisäkkäiseksi if-lauseeksi. Sisemmän if-lauseen vertailulauseke testataan vain, jos ulomman if-lauseen vertailulausekkeen arvo on true. Sisempi if-lause voi edelleen sisältää if-lauseen. Voit sijoittaa if-lauseita toisen if-lauseen sisälle niin monta kuin haluat. Kokeile itse - Sisäkkäiset if-lauseet Voimme havainnollistaa sisäkkäisiä if-lauseita esimerkillä, joka testaa, onko näppäimistöltä syötetty merkki kirjain. Vaikka tämä esimerkki on aivan järkevä sisäkkäisten if-lauseiden käyttötilanne, siinä on joitakin oletuksia, joita tulee välttää; huomaatko ongelman? Seuraavassa on esimerkin koodi: // Esimerkki Sisäkkäiset if-lauseet #include <iostream> using namespace std; int main() char kirjain = 0; // Syötteen muuttuja 117

8 C++ Ohjelmoijan käsikirja cout << endl << "Syötä kirjain: "; // Pyydetään syöte cin >> kirjain; // sitten luetaan merkki cout if(kirjain >= 'A') if(kirjain <= 'Z') cout << "Syötit ison kirjaimen." return 0; if(kirjain >= 'a') if(kirjain <= 'z') cout << "Syötit pienen kirjaimen." << endl ; return 0; // Testataan onko 'A' tai suurempi // Testataan onko Z tai pienempi // Testataan onko 'a' tai suurempi // Testataan onko z tai pienempi cout << "Et syöttänyt kirjainta." return 0; Ohjelman tyypillinen tulostus on: Syötä kirjain: H Syötit ison kirjaimen. 118 Kuinka se toimii Ohjelman alussa on tavalliset kommenttirivit ja #include-esikäsittelijäkomento, joka sisällyttää tulostusta/syöttöä tukevan otsikkotiedoston iostream. Varattuaan muistia char-tyyppiselle muuttujalle kirjain ja alustettuaan sen alkuarvoksi nollan, funktio main() pyytää syöttämään kirjaimen. Syöttöä seuraava if-lause tarkistaa, oliko syötetty merkki A tai suurempi: if(kirjain >= 'A') // Testataan onko 'A' tai suurempi if(kirjain <= 'Z') // Testataan onko Z tai pienempi cout << "Syötit ison kirjaimen." return 0; Jos kirjain on suurempi tai yhtä suuri kuin A, suoritetaan sisempi if-lause, joka testaa, onko syöte Z tai pienempi. Jos se on Z tai pienempi, päättelemme, että kyseessä on iso kirjain ja tulostamme viestin. Olemme nyt suorittaneet tarvittavat toimenpiteet, joten suoritamme returnlauseen, joka lopettaa ohjelman suorituksen. Molemmat lauseet ovat aaltosulkeiden sisällä, joten ne molemmat suoritetaan, kun sisemmän if-lauseen vertailulauseke on true.

9 Valinnat ja päätökset Nämä kaksi sisäkkäistä if-lausetta on muodostettu perustuen kahteen oletukseen kirjainten koodeista. Ensimmäinen oletus on se, että kirjaimet A-Z esitetään koodeilla, joissa A :n koodi on minimi ja Z :n maksimi. Toinen oletus on, että isojen kirjainten koodit ovat peräkkäiset, eli muita kuin kirjainmerkkejä ei ole koodien A ja Z välissä. Ei ole järkevää rakentaa tällaisia oletuksia ohjelmiisi. Esimerkiksi EBCDIC-koodauksessa kirjainmerkkien koodit eivät ole peräkkäiset. Hetken päästä näemme, miten voimme välttää tämän rajoituksen. Seuraava if käyttää aivan samanlaista tapaa kuin ensimmäinenkin if-lause ja tarkastaa, onko syötetty merkki pieni kirjain, tulostaa viestin ja suorittaa return-lauseen. Jos tarkastelit ohjelmaa tarkasti, huomasit, että pienen kirjaimen testaavissa if-lauseissa on vain yhdet aaltosulkeet, kun taas ison merkin testaavassa oli kahdet. Molemmat ovat oikein: kuten muistat, C++:ssa if(vertailulauseke)... on itse asiassa yksi lause, joten sitä ei tarvitse sijoittaa aaltosulkeiden sisään. Voit kuitenkin käyttää toisiakin aaltosulkeita, jos se mielestäsi tekee koodista selkeämmän. Viimeisen if-lohkon perässä oleva tulostuslause suoritetaan vain, jos syötetty merkki ei ollut kirjain. Tämän jälkeen suoritetaan return-lause. Kuten huomaat, sisäkkäisten if-lauseiden suhteet ovat varsin selkeät, koska ne on sisennetty. C++:ssa käytetään yleensä sisennystä selventämään ohjelman logiikkaa. Kuten esimerkin alussa mainitsimme, ohjelma havainnollistaa vain, kuinka sisäkkäiset if-lauseet toimivat, mutta se ei ole hyvä tapa testata merkkejä. Standardikirjaston avulla voimme kirjoittaa ohjelman, joka toimii riippumatta merkkien koodauksesta. Katsotaan seuraavaksi, miten teemme tämän. Merkkien koodauksesta riippumaton merkkien käsittely Standardikirjasto sisältää suuren joukon funktioita, joita voit helposti käyttää ohjelmissasi testaamaan erilaisia asioita. Tarkastelemme omien funktioiden kirjoittamista vasta luvussa 8, mutta se ei estä käyttämästä olemassa olevia funktioita. Ennen kuin jatkamme, käsittelemme pikaisesti ideaa siitä, mitä tapahtuu funktioita käytettäessä. Funktio on nimetty, itsenäinen lohko koodia, joka suorittaa tietyn tehtävän. Usein se tarkoittaa sille välitettyjen tietojen käsittelyä ja käsittelyn tuloksen takaisin palauttamista ohjelmalle. Tällaisissa tapauksissa funktio toimii kuten edellisessä luvussa ollut sizeof()-operaattori: välitimme sille tietoa (muuttujan) ja se palautti tuloksen (tämän muuttujan koon). Funktion kutsu näyttää seuraavalta: FunktionNimi(parametri1, parametri2,... ) Riippuen kyseessä olevasta funktiosta, sille voidaan kutsuttaessa välittää ei yhtään, yksi tai useampia arvoja sijoittamalla ne sulkeisiin funktion nimen perään. Tällä tavalla funktiolle välitettyjä arvoja kutsutaan parametreiksi. Kuten kaikilla arvoilla C++:ssa, myös funktiolle välitettävillä parametreillä ja funktion palauttamalla arvolla on tyyppi, joka sinun tulee ottaa huomioon käyttäessäsi funktiota. Sisällyttämällä ohjelmaasi otsikkotiedoston cctype, saat käyttöösi erittäin käyttökelpoisen joukon funktioita, joilla voit testata merkkejä. Jokaisessa niistä välität funktiolle int-tyyppisen muuttujan tai literaalin. Jos välität char-tyyppisen, se muunnetaan automaattisesti int-tyyppiseksi. 119

10 C++ Ohjelmoijan käsikirja Funktio isupper() islower() isalpha() Toiminta Testaa, onko iso kirjain 'A' - 'Z'. Testaa, onko pieni kirjain 'a' - 'z'. Testaa, onko pieni tai iso kirjain. isdigit() Testaa, onko numero 0-9. isxdigit() isalnum() isspace() iscntrl() isprint() isgraph() ispunct() Testaa, onko heksadesimaalinen numero 0-9, 'a' - 'f' tai 'A' - 'F'. Testaa, onko kirjain tai numero (ts. aakkosnumeerinen merkki). Testaa, onko tyhjä merkki, joka voi olla välilyönti, uusi rivi, rivinvaihto, sivun vaihto, sarake- tai rivisarkain. Testaa, onko kontrollimerkki. Testaa, onko tulostettava merkki, eli iso tai pieni kirjain, numero, pistetyyppinen merkki (piste, pilkku jne) tai välilyönti. Testaa, onko graafinen merkki, eli mikä tahansa tulostettava merkki, mutta ei välilyönti. Testaa, onko pistetyyppinen merkki, eli mikä tahansa tulostettava merkki, mutta ei kirjain tai numero. Tällaisia ovat välilyönti ja seuraavat: _ [ ] # ( ) < > % : ;.? * + - / ^ & ~! =, \ " ' Jokainen näistä funktiosta palauttaa int-tyyppiset arvon. Paluuarvo on positiivinen (true), jos merkki oli testattavaa tyyppiä ja 0 (false), jos ei ollut. Saatat ihmetellä, miksi nämä funktiot eivät palauta bool-tyyppistä arvoa. Syynä on se, että nämä funktiot olivat osa standardikirjastoa jo ennen kuin bool-tyyppi lisättiin C++-kieleen. Otsikkotiedosto cctype sisältää myös kaksi funktiota merkkien muuntamiseen isoiksi ja pieniksi. Muunnettava merkki tulee välittää funktioille int-tyyppisenä: tolower() Jos välität ison kirjaimen, vastaava pieni kirjain palautetaan, muuten välittämäsi merkki palautetaan muuttamattomana. toupper() Jos välität pienen kirjaimen, vastaava iso kirjain palautetaan, muuten välittämäsi merkki palautetaan muuttamattomana. Kumpikin näistä funktioista palauttaa int-tyyppisen paluuarvon. Voimme toteuttaa näillä funktioilla edellisen esimerkkimme ilman olettamuksia merkkien koodauksesta. Eri ympäristöjen eri merkkikoodit otetaan aina huomioon standardikirjaston funktioissa, joten meidän ei tarvitse huolehtia niistä. Emme myöskään tarvitse sisäkkäisiä iflauseita, jos käytämme näitä standardikirjaston funktioita, eli koodi on selkeämpää. Kokeile itse - Standardikirjaston merkkimuunnokset 120 Kun kerran muutamme edellistä esimerkkiämme standardikirjaston funktioilla, voimme yhtä hyvin myös laajentaa ohjelmaa ja kokeilla muunnosfunktioita:

11 Valinnat ja päätökset // Esimerkki Standardikirj. merkkien testaus- ja muunnosfunktiot #include <iostream> #include <cctype> // Merkkien testaus ja muunnos using namespace std; int main() char kirjain = 0; // Syötteen muuttuja cout << endl << "Syötä kirjain: "; // Pyydetään syöte cin >> kirjain; // Sitten luetaan merkki cout if(isupper(kirjain)) // Testataan, onko iso kirjain cout << "Syötit ison kirjaimen." cout << "Muuntamalla pieneksi merkiksi saamme " << static_cast<char>(tolower(kirjain)) return 0; if(islower(kirjain)) // Testataan, onko pieni kirjain cout << "Syötit pienen kirjaimen." cout << "Muuntamalla isoksi merkiksi saamme " << static_cast<char>(toupper(kirjain)) return 0; cout << "Et syöttänyt kirjainta." return 0; Ohjelman tyypillinen tulostus on: Syötä kirjain: t Syötit pienen kirjaimen. Muuntamalla isoksi merkiksi saamme T Kuinka se toimii if-lauseet on muutettu käyttämään standardikirjaston funktioita. Emme enää tarvitse sisäkkäisiä if-lauseita, koska aikaisemmin testaamamme kaksi ehtoa on nyt korvattu yhdellä, joko funktiolla isupper() tai islower(). Meitä ei itse asiassa kiinnosta, miten nämä funktiot toimivat. Niitä käyttääksemme meidän tulee vain tietää, mitä ne tekevät, kuinka monta ja minkä tyyppisiä parametrejä niille tulee välittää ja minkä tyyppisen paluuarvon ne palauttavat. Kun meillä on tämä tieto, voimme yksinkertaistaa koodiamme ja tehdä siitä yleiskäyttöisempää. Tämä esimerkkiohjelma toimii riippumatta chartyypin käyttämästä merkkikoodauksesta. 121

12 C++ Ohjelmoijan käsikirja Huomaa, kuinka käytämme muunnosfunktion palauttamaa arvoa tulostuslauseessa - esimerkiksi: cout << "Muuntamalla isoksi merkiksi saamme " << static_cast<char>(toupper(kirjain)) Funktion toupper() palauttama arvo on int-tyyppinen, joten muunnamme sen eksplisiittisesti char-tyyppiseksi ja lähetämme tulostusvirtaan cout. Jos haluaisimme tallettaa palautetun merkin ja poistaa eksplisiittisen tyypinmuunnoksen, voisimme tallettaa sen takaisin alkuperäiseen muuttujaan kirjain: kirjain = toupper(kirjain); Nyt voisimme tulostaa muunnetun merkin käyttämällä tulostuslauseessa muuttujaa kirjain: cout << "Muuntamalla isoksi merkiksi saamme << kirjain Jos tarvitset wchar_t-tyyppisiä merkkejä, voit käyttää otsikkotiedostoa cwctype. Se sisältää versiot tämän tyyppisille merkeille kaikille samoille funktioille kuin on otsikkotiedostossa cctype. Kunkin funktion nimessä on w is -merkkien perässä: iswupper() iswdigit() iswspace() iswgraph() iswlower() iswxdigit() iswcntrl() iswpunct() iswalpha() iswalnum() iswprint() Näille kullekin tulee välittää wchar_t-tyyppinen merkki ja ne kaikki palauttavat int-tyyppisen arvon aivan samaan tapaan, kuin kaikki tyyppiä char käsittelevät funktiotkin. Vastaavasti wchar_t-tyyppiset muunnosfunktiot ovat towlower() ja towupper(). if- -lause Tähän saakka käyttämämme if-lause suorittaa lauseen, jos vertailulausekkeen arvo on true. Tämän jälkeen ohjelman suoritus jatkuu normaalisti. Saattaisi kuitenkin olla, että haluamme suorittaa tietyn lauseen tai lohkon, jos vertailulausekkeen arvo on false. Jotta voimme tehdä tämän, tarvitsemme lisäyksen if-lauseeseen: tietty toiminta suoritetaan, jos vertailulauseke on true ja toinen toiminta suoritetaan, jos vertailulauseke on false. Tämän jälkeen ohjelman suoritus jatkuu normaalisti. Käyttämällä char-tyyppisiä muuttujia, voimme kirjoittaa if- -lauseen, joka ilmoittaa, oliko merkki aakkosnumeerinen: if(isalnum(kirjain)) cout << Se on kirjain tai numero. cout << Se ei ole kirjain eikä numero. 122 Tässä käytetään otsikkotiedoston cctype funktiota isalnum(). Jos muuttuja kirjain sisältää kirjaimen tai numeron, funktio isalnum() palauttaa positiivisen kokonaisluvun. if-lause tulkitsee

13 Valinnat ja päätökset tämän arvoksi true, joten ensimmäinen viesti tulostetaan. Jos kirjain sisältää jotain muuta kuin kirjaimen tai numeron, isalnum() palauttaa arvon 0. Tämän if-lause tulkitsee arvoksi false ja -osan tulostuslause suoritetaan. Kokeile itse - if- Seuraavassa esimerkissä käytämme if- -lausetta. Käytetään tällä kertaa numeerisia arvoja: // Esimerkki if- #include <iostream> using namespace std; int main() long numero = 0; // Syötteen muuttuja cout << "Syötä kokonaisluku (pienempi kuin 2 miljardia: "; cin >> numero; cout if(numero % 2L == 0) // Testataan jakojäännös cout << "Numerosi on parillinen." // Jakojäännös on 0 cout << "Numerosi on pariton." // Jakojäännös on 1 return 0; Ohjelman tyypillinen tulostus näyttää seuraavalta: Syötä kokonaisluku (pienempi kuin 2 miljardia: Numerosi on parillinen. Kuinka se toimii Kun syöte on luettu muuttujaan numero, arvo testataan if-lauseessa ottamalla jakojäännös, kun numero jaetaan ensin kahdella (käyttämällä jakojäännös-operaattoria, jonka tapasimme luvussa 2) ja tarkistamalla onko se 0. Jaettaessa luvulla 2, jakojäännös voi olla vain 1 tai 0 kuten koodissa on kommentoitu. Jos jakojäännös on nolla, if-lauseen vertailulauseke on true ja ensimmäinen tulostuslause suoritetaan. Jos jakojäännös on 1, vertailulauseke on false ja -osan tulostuslause suoritetaan. Kummassakin tapauksessa return-lause päättää ohjelman suorituksen.! Huomaa, että -avainsana kirjoitetaan ilman puolipistettä, aivan kuten lauseen if-osakin. Sisennystä käytetään selventämään lauseiden välisiä suhteita. Näet selvästi, mitkä lauseet suoritetaan, jos vertailulauseke on true ja mitkä, jos se on false. Sinun tulisi aina sisentää ohjelmasi lauseet selventääksesi ohjelman rakennetta. 123

14 C++ Ohjelmoijan käsikirja Seuraavassa on toinen vaihtoehto vertailulausekkeen koodaamiselle. Palauta mieleen, että nollasta poikkeava arvo vastaa arvoa true, jos se muunnetaan bool-tyyppiseksi ja 0 vastaa arvoa false. Voimme näin käyttää jakojäännös-operaattoria suoraan vertailulausekkeena ilman, että sitä vertaillaan erikseen nollaan. if- -lause näyttäisi tällaiselta: if(numero % 2L) // Testataan jakojäännös cout << "Numerosi on pariton." // Jakojäännös on 1 cout << "Numerosi on parillinen." // Jakojäännös on 0 return 0; If- ja -osat tulee tässä vaihtaa keskenään, koska jos muuttujan numero arvo on parillinen, lauseke (numero % 2L == 0) palauttaa arvon true, mutta lauseke (numero % 2L) muunnetaan arvoksi false. Tämä saattaa aluksi tuntua hieman hämmentävältä, mutta muista, että ensimmäinen versio vastaa seuraavaa: Onko totta, että jakojäännös on 0? Kun taas toinen versio vastaa seuraavaa, koska arvo 1 muunnetaan arvoksi true: Onko jakojäännös 1? if- -lause mahdollistaa valinnan kahden eri vaihtoehdon väliltä. Lauseen rakenne havainnollistetaan seuraavassa kaaviossa: Ei Vertailulauseke on true? if( vertailulauseke ) // Lauseet, kun vertailulauseke on true // Lauseet, kun vertailulauseke on false // Seuraava lause Lause tai lohko falsetilanteessa Kyllä Lause tai lohko truetilanteessa Seuraava lause Toinen If- -lauseen lauseista suoritetaan aina. Vuokaavio kertoo lauseiden suoritusjärjestyksen, kun vertailulausekkeen arvo on true tai false. Kuten kaavio kertoo, ja kuten olemme jo aikaisemminkin nähneet, lauseen tilalle voidaan aina sijoittaa lohko. 124

15 Sisäkkäiset if- -lauseet Valinnat ja päätökset Olemme jo nähneet, että voit sijoittaa if-lauseita toisen if-lauseen sisälle. Ja koska sinulla ei ole mitään ennakkoluuloja, voit myös sijoittaa if- -lauseita if-lauseiden sisään, if-lauseita if -lauseiden sisään ja myöskin if- -lauseita toisten if- -lauseiden sisään. Tämä antaa meille runsaasti mahdollisuuksia (sekä myöskin vaaran sekaannuksille), joten katsotaan muutamia esimerkkejä. Tarkastellaan ensiksi esimerkkiä, jossa if-lauseen sisällä on if- -lause: if(kahvia == 'k') if(donitseja == 'k') cout << "Meillä on kahvia ja donitseja." cout << "Meillä on kahvia, mutta ei donitseja." Tässä kahvia ja donitseja ovat char-tyyppisiä muuttujia, joiden arvona voi olla k tai e. Donitsien testi suoritetaan vain, jos kahvien testauksen tulos on true, joten tulostettava viesti on oikea kummassakin tilanteessa. -osa kuuluu donitseja testaavaan if-lauseeseen. Tämä saattaa kuitenkin aiheuttaa sekaannusta. Jos kirjoitamme lähes samaan tapaan kuin edellä, mutta sisennämme väärin, voimme saada väärän kuvan lauseen toiminnasta: if(kahvia == 'k') if(donitseja == 'k') cout << "Meillä on kahvia ja donitseja." //Tämä -osa on sisennetty väärin cout << "Meillä ei ole kahvia..." //Väärin! Tässä virheellinen sisennys saa meidät ajattelemaan, että kyseessä on if-lause if- -lauseen sisällä. Näinhän ei tässä ole. Ensimmäinen viesti on oikein, mutta toinen on väärin. Tämä lause voidaan suorittaa vain, jos kahvin testaus on true, koska -osa kuuluu donitsien testaukseen, ei kahvin testaukseen. Tässä virhe on helppo nähdä, mutta monimutkaisempien ja laajempien ifrakenteiden kohdalla tulee muistaa sääntö siitä, mikä if omistaa minkäkin :n. kuuluu aina lähimmälle edellä olleelle if:lle, joka ei vielä omista -osaa. Tässä piilevä sekaannusvaara tunnetaan nimellä riippuvan :n ongelma. Aina kun joukko if- -lauseita näyttää ohjelmassasi hieman monimutkaiselta, voit käyttää tätä sääntöä tilanteen selvittämiseksi. Kun kirjoitat omia ohjelmiasi, voit aina käyttää aaltosulkeita selvennykseksi. Voimme kirjoittaa edellisen esimerkin uudelleen tällä tavalla (vaikka se ei näin yksinkertaisessa esimerkissä olekaan tarpeellista): if(kahvia == 'k') if(donitseja == 'k') cout << "Meillä on kahvia ja donitseja." 125

16 C++ Ohjelmoijan käsikirja cout << "Meillä on kahvia, mutta ei donitseja." Nyt tilanteen pitäisi olla varsin selvä. kuuluu ehdottomasti donitseja testaavaan iflauseeseen. Sisäkkäiset if-lauseet Nyt kun tiedämme säännöt, if- -lauseeseen sijoitetun if-lauseen ymmärtäminen on helpompaa: if(kahvia == 'k') if(donitseja == 'k') cout << "Meillä on kahvia ja donitseja." if(tee == k ) cout << "Meillä ei ole kahvia, mutta teetä on." 126 Huomaa koodin muotoilu tässä esimerkissä. Kun if-lause sijoitetaan -osaan, voimme kirjoittaa if yhdelle riville. Tätä tapaa käytetään tässä kirjassa. Tässä aaltosulkeet ovat välttämättömät. Jos jätämme ne pois, kuuluu donitseja testaavaan if-lauseeseen. Tämäntapaisessa tilanteessa on helppo unohtaa kirjoittaa ne ja saada aikaan virhetilanne, joka on vaikea löytää. Ohjelma, jossa tällainen virhe on, kääntyy normaalisti, koska koodi on aivan oikein. Ohjelma saattaa jopa toimia oikein tietyissä tilanteissa, mutta ei aina. Jos poistamme aaltosulkeet tästä esimerkistä, saamme oikeat tulokset niin kauan kuin molemmat sekä kahvia että donitseja ovat k. Eli tällöin if(tee == k ) -lausetta ei suoritettaisi koskaan. Lopuksi katsomme vielä if- -lauseeseen sijoitettua if- -lausetta. Tällainen saattaa muodostua varsin sekavaksi, vaikka kyseessä olisikin vain yksi sisäkkäinen if- -lause: if(kahvia == 'k') if(donitseja == 'k') cout << "Meillä on kahvia ja donitseja." cout << "Meillä on kahvia, mutta ei donitseja." if(tee == k ) cout << "Meillä ei ole kahvia, mutta teetä on ja ehkä donitseja..." cout << "Ei kahvia eikä teetä, mutta ehkä donitseja..."

17 Valinnat ja päätökset Tämän esimerkin logiikka ei ole aivan itsestään selvä, vaikka se onkin sisennetty oikein. Aaltosulkeet eivät ole välttämättömät, koska aikaisemmin mainittu sääntö on voimassa, mutta esimerkki näyttää selvemmältä, jos lisäämme ne: if(kahvia == 'k') if(donitseja == 'k') cout << "Meillä on kahvia ja donitseja." cout << "Meillä on kahvia, mutta ei donitseja." if(tee == k ) cout << "Ei ole kahvia, mutta teetä on ja ehkä donitseja..." cout << "Ei kahvia eikä teetä, mutta ehkä donitseja..." Tällaisen logiikan toteuttamiseen on paljon parempiakin tapoja. Jos sijoitat riittävän monta iflausetta sisäkkäin, teet lähes sataprosenttisen varmasti virheen jossakin kohtaa. Seuraavassa osassa on apuja tällaiseen tilanteeseen. Loogiset operaattorit Kuten olemme juuri huomanneet, kahden tai useamman if-lauseen sijoittaminen sisäkkäin on varsin kömpelöä. Käsittelimme edellä vain kahvin ja donitsien olemassaoloa, mutta käytännössä sinun tulee testata huomattavasti monimutkaisempiakin tilanteita. Voit esimerkiksi etsiä henkilöstötiedostosta henkilöä, joka on yli 21 vuotias, mutta alle 35, nainen, jolla on yliopistotutkinto ja joka on naimisissa ja puhuu hindiä ja urdua. Tällaisen testin toteuttaminen vaatisi jo kaikki maailman if-lauseet. C++:n loogiset operaattorit antavat siistin ja yksinkertaisen ratkaisun. Loogisten operaattoreiden avulla voimme yhdistää useita vertailuja yhteen lausekkeeseen, joten voimme käyttää vain yhtä if-lausetta lähes kuinka monimutkaisen tilanteen testaamiseksi. Niitä on vain kolme erilaista: && looginen AND (JA) looginen OR (TAI)! looginen NOT (EI) Kaksi ensimmäistä, && ja, ovat binäärisiä operaattoreita, joiden operandit ovat bool-tyyppisiä ja palauttavat bool-tyyppisen tuloksen. Kolmas operaattori,!, on unaarinen, joten sen ainut operandi on bool-tyyppinen ja palauttaa bool-tyyppisen tuloksen. Käsittelemme ensin miten kutakin näistä käytetään yleisellä tasolla. Tämän jälkeen katsomme esimerkkiä. On tärkeää, että erotat mielessäsi aikaisemmin näkemämme bittioperaattorit, jotka toimivat kokonaislukutyyppisten operandiensa biteillä, ja nämä loogiset operaattorit, joiden operandien tyyppinä on bool. 127

18 C++ Ohjelmoijan käsikirja Looginen AND AND-operaattoria && käytetään, kun on kaksi ehtoa, joiden tulee olla true, jotta tulos on true. Haluat olla esimerkiksi rikas ja terve. Kun käytimme aikaisemmin sisäkkäisiä if-lauseita tarkistamaan, oliko merkki iso merkki, testattavan arvon tuli olla sekä suurempi tai yhtä suuri kuin A ja pienempi tai yhtä suuri kuin Z. Molempien ehtojen tulee olla true, jos kyseessä on iso kirjain. Muutoin tulos on false. Voimme näyttää tämän pienessä taulukossa, jossa ylärivillä ja vasemmassa reunassa ovat operandit: Operandit true false true true false false false false Esimerkissämme, jossa oli char-tyyppinen muuttuja kirjain, voimme korvata kahden iflauseen käytön yhdellä if-lauseella, jossa käytetään &&-operaattoria. if(kirjain >= A && kirjain <= Z ) cout << Iso kirjain. Tulostuslause suoritetaan vain, jos molemmat &&-operaattorilla yhdistetyt ehdot ovat true. Lausekkeessa ei tarvita sulkeita, koska vertailuoperaattorit ovat suoritusjärjestyksessä ennen &&- operaattoria. Voit kuitenkin lisätä sulkeet, jos haluat. Voit siis kirjoittaa lauseen seuraavasti: if((kirjain >= A ) && (kirjain <= Z )) cout << Iso kirjain. Nyt ei ole epäilystäkään, etteikö sulkeiden sisällä olevia vertailulausekkeita suoritettaisi ensin. Looginen OR OR-operaattoria käytetään, kun on kaksi ehtoa ja tuloksen halutaan olevan true, kun toinen tai molemmat niistä ovat true. -operaattorin tulos on false vain silloin, kun molemmat sen operandit ovat false. Kaikki muut kombinaatiot muodostavat tuloksen true. Tämä näkyy seuraavasta taulukosta: Operandit true false true true true false true false 128 Esimerkiksi sinut voidaan luokitella luottokelpoiseksi hakiessasi lainaa pankista, jos tulosi ovat vähintään mk tai sinulla on käteistä mk. Tämä voidaan testata seuraavalla if-lauseella:

19 Valinnat ja päätökset if(tulot >= kateinen >= ) cout << "Totta kai, kuinka paljon tarvitset?" Viesti tulostetaan, kun toinen tai molemmat ehdot ovat true. (Parempi vastaus saattaisi olla Miksi haluat lainata rahaa? On outoa, että pankit lainaavat rahaa vain silloin, kun et sitä tarvitse.) Looginen NOT Kolmannella operaattorilla,!, on yksi true tai false -arvoinen operandi, jonka arvon se kääntää. Eli jos boolean-tyyppisen muuttujan testi arvo on true,!testi on false; jos testi on false,!testi on true. Esimerkiksi, jos muuttujan x arvo on 10, niin lausekkeen!(x > 5) arvo on false, koska x > 5 on true. Voimme käyttää!-operaattoria myöskin lausekkeessa, joka oli Charles Dickensin suosikki:!(tulot > menot) Jos tämä lauseke on true, tuloksena on kurjuus - ainakin sitten, kun pankki peruu luottokorttisi. Kaikkia loogisia operaattoreita voidaan käyttää lausekkeissa, joiden arvo on true tai false. Operandit voivat olla yksittäisestä bool-tyyppisestä muuttujasta monimutkaiseen vertailujen ja loogisten operaattoreiden yhdistelmään. Kokeile itse - Loogisten operaattoreiden yhdistäminen Voit yhdistää ehtolausekkeita ja loogisia operaattoreita aivan kuten haluat. Voimme esimerkiksi tehdä ohjelman, joka päättää, oletko lainakelpoinen: // Esimerkki Loogisten operaattoreiden yhdistäminen #include <iostream> using namespace std; int main() int ika = 0; long tulot = 0; long saldo = 0; // Lainanhakijan ikä // Lainanhakijan tulot // Nykyinen pankkitilin saldo // Luetaan perustiedot cout << endl << "Syötä ikäsi vuosissa: "; cin >> ika; cout << "Syötä vuositulosi markoissa: "; cin >> tulot; 129

20 C++ Ohjelmoijan käsikirja cout << "Mikä on nykyinen pankkitilisi saldo markoissa: "; cin >> saldo; cout // Lainaamme vain yli 21 vuotiaille henkilöille, joiden // vuositulot ovat yli mk tai joilla on pankkitilillä // yli mk, tai molemmat. if(ika >= 21 && (tulot > saldo > )) // OK, saat lainaa - mutta kuinka paljon? // Pienempi kahdesta: 2 * tulot tai puolet tilin saldosta long laina = 0; if(2 * tulot < saldo / 2) laina = 2 * tulot; laina = saldo / 2; // Lainan maksimimäärä cout << "Voit lainata maksimissaan " << laina cout << "Valitamme, et ole lainakelpoinen." return 0; Esimerkin tulostus voi olla seuraavanlainen: Syötä ikäsi vuosissa: 25 Syötä vuositulosi markoissa: Mikä on nykyinen pankkitilisi saldo markoissa: Voit lainata maksimissaan Kuinka se toimii Määrittelemme ensin kolme muuttujaa, joihin talletamme ohjelman tarvitsemat syötteet: int ika = 0; // Lainanhakijan ikä long tulot = 0; // Lainanhakijan tulot long saldo = 0; // Nykyinen pankkitilin saldo Tämän jälkeen luemme arvot, joiden avulla määrittelemme lainakelpoisuuden: cout << endl << "Syötä ikäsi vuosissa: "; cin >> ika; cout << "Syötä vuositulosi markoissa: "; cin >> tulot; 130 cout << "Mikä on nykyinen pankkitilisi saldo markoissa: "; cin >> saldo;

21 Valinnat ja päätökset Näiden perään tuleva if-lause määrittelee, voidaanko laina myöntää: if(ika >= 21 && (tulot > saldo > )) Vertailulauseke vaatii, että hakijan ikä on vähintään 21 ja joko tulot ovat enemmän kuin mk tai pankkitilin saldo on yli mk. Sulkeet lausekkeen (tulot > saldo > ) ympärillä ovat tarpeelliset, jotta ensin suoritetaan OR-operaattori tulo- ja saldoehdoille, jonka tulos sitten on AND-operaattorin toisena operandina. Ilman sulkeita iän testaus yhdistettäisiin AND-operaattorilla tulojen testaukseen, jonka tulos yhdistettäisiin ORoperaattorilla saldon testaukseen. Tämä siitä syystä, että &&-operaattori on suoritusjärjestyksessä -operaattorin edellä, kuten näet liitteestä D. Ilman sulkeita laina myönnettäisiin kaikille, joiden pankkitilin saldo on yli mk, vaikka hakija olisi 8-vuotias! Näinhän ei pitänyt käydä. Jos tämän if-lauseen vertailulausekkeen arvo on true, seuraava lohko suoritetaan: // OK, saat lainaa - mutta kuinka paljon? // Pienempi kahdesta: 2 * tulot tai puolet tilin saldosta long laina = 0; if(2 * tulot < saldo / 2) laina = 2 * tulot; laina = saldo / 2; // Lainan maksimimäärä cout << "Voit lainata maksimissaan " << laina Tässä lohkossa määrittelemme lainan maksimimäärän toisella if-lauseella. Lainan maksimimäärä on pienempi kahdesta seuraavasta: tulot kaksinkertaisena tai puolet tilin saldosta. Luonnollisesti, jos ensimmäisen if-lauseen vertailulausekkeen arvo on false, -osa suoritetaan: cout << "Valitamme, et ole lainakelpoinen." return 0; Kuten näet, tämä tulostaa viestin, että rahaa ei ole nyt saatavilla. Ehto-operaattori Ehto-operaattoria kutsutaan joskus myös kolmiarvoiseksi operaattoriksi, koska sillä on kolme operandia ja se on ainut tällainen operaattori. Se on samankaltainen kuin if- -lause, koska se valitsee kahdesta vaihtoehdosta, riippuen vertailulausekkeen arvosta. if- -lauseen avulla voidaan kuitenkin valita toinen kahdesta lauseesta suoritettavaksi, mutta ehto-operaattorin avulla voidaan valita toinen kahdesta arvosta. Katsotaan selventävää esimerkkiä. 131

22 C++ Ohjelmoijan käsikirja Oletetaan, että meillä on kaksi muuttujaa a ja b, ja haluamme sijoittaa suuremman näistä arvoista kolmanteen muuttujaan c. Voimme tehdä tämän lauseella: c = a > b? a : b; //Sijoita muuttujaan c suurempi a:sta ja b:stä Ehto-operaattorin ensimmäisenä operandina on looginen lauseke, tässä tapauksessa a > b. Jos tämä lauseke on true, toinen operandi - tässä tapauksessa a - valitaan operaation tulokseksi. Jos ensimmäinen operandi on false, kolmas operandi - tässä tapauksessa b - valitaan tulokseksi. Eli ehto-operaattorin tulos on a, jos a on suurempi kuin b, ja b muutoin. Yllä olevassa lauseessa tulos sijoitetaan muuttujaan c. Lause vastaa seuraavanlaista if-lausetta: if(a > b) c = a; c = b; Ehto-operaattoria voidaan käyttää myöskin valittaessa pienempää kahdesta arvosta. Edellisessä esimerkkiohjelmassa käytimme if- -lausetta päättämään lainan määrän, mutta olisimme voineet käyttää myös seuraavaa lausetta: laina = 2 * tulot < saldo / 2? 2 * tulot : saldo / 2; Tämä tuottaa aivan saman tuloksen. Sulkeet eivät ole tarpeelliset, koska ehto-operaattori on suoritusjärjestyksessä muiden tässä lauseessa olevien operaattoreiden jälkeen. Kuten ennenkin, jos tunnet, että sulkeet selventävät lausetta, voit lisätä ne siihen: laina = (2 * tulot < saldo / 2)? (2 * tulot) : (saldo / 2); Ehto-operaattorin, joka yleensä esitetään vain?:-operaattorina, rakenne voidaan kirjoittaa: ehtolauseke? lauseke1 : lauseke2 Jos ehtolauseke on true, tuloksen arvo on lauseke1; jos se on false, tuloksen arvo on lauseke2. Jos ehtolausekkeen arvo on numeerinen, se muunnetaan automaattisesti bool-tyyppiseksi, eli nollasta poikkeava arvo vastaa arvoa true ja nolla vastaa arvoa false. Huomaa, että vain toinen lausekkeista lauseke1 ja lauseke2 lasketaan. Tällä on vaikutusta esimerkiksi seuraavantapaisissa lausekkeissa: a < b? ++i : --i; Jos a on pienempi kuin b, muuttujan i arvoa kasvatetaan. Muuttujan i arvoa vähennetään vain, jos a < b on false. Kokeile itse - Ehto-operaattori tulostuslauseessa 132 Varsin yleinen ehto-operaattorin käyttötilanne on kontrolloida tulostusta riippuen lausekkeen arvosta tai muuttujan arvosta. Voit muuttaa viestiä valitsemalla eri merkkijonon riippuen ehtolausekkeen arvosta.

23 Valinnat ja päätökset // Esimerkki Ehto-operaattori tulostuslauseessa. #include <iostream> using namespace std; int main() int hiiret = 0; int ruskeat = 0; int valkoiset = 0; // Kaikki hiiret // Ruskeat hiiret // Valkoiset hiiret cout << "Kuinka monta ruskeaa hiirtä sinulla on? "; cin >> ruskeat; cout << "Kuinka monta valkoista hiirtä sinulla on? "; cin >> valkoiset; hiiret = ruskeat + valkoiset; cout << "Sinulla on " << hiiret << (hiiret == 1? " hiiri " : " hiirtä ") << "kaikkiaan." return 0; Ohjelman tulostus voisi olla seuraavanlainen: Kuinka monta ruskeaa hiirtä sinulla on? 2 Kuinka monta valkoista hiirtä sinulla on? 3 Sinulla on 5 hiirtä kaikkiaan. Kuinka se toimii Olet jo tavannut aikaisemmin suurimman osan tämän esimerkin operaatioista. Nyt meitä kiinnostaa tulostuslause, joka suoritetaan hiirien lukumäärien syötön jälkeen: cout << "Sinulla on " << hiiret << (hiiret == 1? " hiiri " : " hiirtä ") << "kaikkiaan." Ehto-operaattorin tuloksen arvo on hiiri, jos muuttujan hiiret arvo on 1, ja muutoin sen arvo on hiiriä. Näin voit käyttää samaa tulostuslausetta kaikkien eri hiirien lukumäärien kanssa; yksikkö tai monikko valitaan automaattisesti. Tällaisen rakenteen voit sijoittaa moneen muuhunkin tilanteeseen - kuten valitsemaan on ja ovat välillä tai ylipäätään kaikissa tilanteissa, joissa on binäärinen valinta. Voit jopa yhdistää kaksi ehto-operaattoria, jos haluat valita kolmesta eri vaihtoehdosta: cout << (a < b? a on pienempi kuin b. : (a == b? a on yhtä suuri kuin b. : a on suurempi kuin b. )); 133

24 C++ Ohjelmoijan käsikirja Tämä lause tulostaa yhden kolmesta viestistä riippuen muuttujien a ja b arvoista. Ensimmäisen ehto-operaattorin toinen valinta on toisen ehto-operaattorin tulos. switch-lause Törmäät usein monivalintatilanteeseen, jossa sinun tulisi suorittaa tietyt lauseet useista eri vaihtoehdoista (eli useammasta kuin kahdesta) riippuen kokonaisluvun tai lausekkeen arvosta. Esimerkkitilanteena voisi olla esimerkiksi arpajaiset: ostat numeroidun arpalipun ja hyvällä tuurilla voitat palkinnon. Jos arpalippusi numero on esimerkiksi 147, voitat pääpalkinnon; jos se on 387, voitat toiseksi parhaan palkinnon; lipulla numero 29 voitat kolmanneksi parhaan palkinnon; muut liput eivät voita mitään. Tämäntyyppisiä tilanteita varten on switch-lause. switch-lauseen avulla voit valita useista vaihtoehdoista riippuen annetun lausekkeen arvosta. Vaihtoehdot ovat omissa case-osissaan. Arpajaisesimerkissä olisi neljä case-osaa: yksi kullekin voittonumerolle sekä oletusarvoinen case-osa kaikille häviäville numeroille. Seuraavassa on switch-lause, joka tulostaa viestin riippuen arpalipun numerosta: switch(lipun_numero) case 147: cout << Voitit pääpalkinnon! ; break; case 387: cout << Voitit toiseksi parhaan palkinnon! ; break; case 29: cout << Voitit kolmanneksi parhaan palkinnon! ; break; default: cout << Huono tuuri, ei voittoa. ; switch-lause on vaikeampi selittää kuin käyttää. Eri case-osien valinta suoritetaan switch-sanan perässä sulkeissa olevan kokonaislukulausekkeen arvon perusteella. Lausekkeen arvo voi myöskin olla jotain lueteltua tyyppiä, koska sellaisen arvot voidaan automaattisesti muuntaa kokonaisluvuiksi. Tässä esimerkissä valinta suoritetaan yksinkertaisesti muuttujan lipun_numero arvon perusteella. Sen arvo on luonnollisesti kokonaisluku. Eri valintavaihtoehdot määritellään käyttämällä niin monta case-osaa kuin haluat. case-osan rakenne on seuraava: case casen_arvo: Tätä kutsutaan case-osaksi, koska se nimeää perässä tulevat lauseet. Tietyn case-osan perässä olevat lauseet suoritetaan, jos ehtolausekkeen arvo on sama kuin kyseisen case-osan case_arvo. Kukin case_arvo tulee olla eri, mutta niiden ei tarvitse olla missään järjestyksessä, kuten näit jo edellä olleesta esimerkistäkin. 134

25 Valinnat ja päätökset case_arvo tulee olla vakiotyyppinen kokonaislukulauseke, eli lauseke, jonka kääntäjä voi laskea, joten siinä voidaan käyttää vain literaalivakioita, const-muuttujia tai lueteltuja tyyppejä. Lisäksi kaikkien sijoitettavien literaalivakioiden tulee olla kokonaislukutyyppisiä tai muunnettavissa kokonaisluvuiksi. Esimerkin default-osan lauseet suoritetaan, jos minkään case-osan case_arvo ei vastaa ehtolausekkeen arvoa. default-osa ei ole pakollinen, mutta jos sitä ei ole ja yhtäkään case-osaa ei suoriteta, switch-lause ei tee mitään. Kunkin case-osan lauseiden perässä oleva break-lause on välttämätön. Sen avulla hypätään suoraan switch-lauseen loppuun ja suoritus jatkuu switch-lauseen päättävää aaltosulkua seuraavasta lauseesta. Jos jätät break-lauseen pois tietystä case-osasta, seuraavankin case-osan lauseet suoritetaan. Huomaa, että emme tarvitse break-lausetta viimeisen case-osan (yleensä default-osa) viimeisenä lauseena, koska suoritus poistuu muutenkin switch-lauseesta siitä kohtaa. Huomaa, että switch, case, default ja break ovat kaikki varattuja sanoja. Kokeile itse - switch-lause Tarkastellaan switch-lauseen toimintaa seuraavalla esimerkillä: // Esimerkki switch-lause #include <iostream> using namespace std; int main() int valinta = 0; // Talletetaan valinta cout << endl << "Tässä on elektroninen keittokirjasi." << endl << "Voit valita seuraavista herkullisista ruuista: " << endl << "1 Keitetyt kananmunat" << endl << "2 Paistetut kananmunat" << endl << "3 Munakokkeli" << endl << "4 Munakas" << endl << endl << "Syötä valintasi numero: "; cin >> valinta; switch(valinta) case 1: cout << endl << "Keitä muutamia kananmunia." break; case 2: cout << endl << "Paista muutamia kananmunia." break; case 3: cout << endl << "Tee munokokkeli muutamasta kananmunasta." break; 135

26 C++ Ohjelmoijan käsikirja case 4: cout << endl << "Tee munakas muutamasta kananmunasta." break; default: cout << endl << "Syötit väärän numeron, kokeile raakoja kananmunia." return 0; Kuinka se toimii Sen jälkeen kun valintavaihtoehdot on tulostettu ja valinnan numero on luettu muuttujaan valinta, suoritetaan switch-lause, jonka ehtolausekkeena on yksinkertaisesti muuttuja valinta. switch-lauseen vaihtoehdot ovat kaikki aaltosulkeiden sisällä olevissa case-osissa. Jos ehtolausekkeen arvo vastaa tiettyä case-osaa, tämän case-osan perässä olevat lauseet suoritetaan. Tässä esimerkissä on vain yksi lause ja break-lause kussakin case-osassa, mutta case-osaan voi sijoittaa tarpeellisen määrän lauseita eikä niitä tarvitse sijoittaa aaltosulkeiden sisään. Kunkin case-osan lauseiden perässä oleva break-lause siirtää ohjelman suorituksen switch-lausetta seuraavaan lauseeseen. break ei ole pakollinen, mutta jos et lisää sitä, myös seuraavan case-osan lauseet suoritetaan, mikä ei yleensä ole haluttua. Kokeile tätä poistamalla break-lauseet edellä olleesta esimerkistä. Jos muuttujan valinta arvo ei vastaa mitään case-osaa, suoritetaan default-osa. Jos esimerkissämme ei olisi default-osaa ja muuttujan valinta arvo ei vastaisi mitään case-osaa, switch-lause ei tekisi mitään ja ohjelman suoritus jatkuisi switch-lausetta seuraavasta lauseesta, eli returnlauseesta. Kokeile itse - case-osien yhdistäminen Kuten aikaisemmin mainittiin, case-arvojen tulee olla käännösaikaisia vakioita ja niiden tulee olla erit. Syynä sille, että kaksi case-arvoa ei voi olla samat, on se, että kääntäjä ei tällöin pysty millään päättämään, kumpi case-osa tulisi suorittaa. Kaikilla case-osilla ei kuitenkaan tarvitse olla eri suoritettavat lauseet. Usealla case-osalla voi olla sama toiminta, kuten seuraavassa esimerkissä: // Esimerkki case-osien yhdistäminen #include <iostream> #include <cctype> using namespace std; int main() char kirjain = 0; cout << endl << "Syötä kirjain: "; cin >> kirjain; 136

27 Valinnat ja päätökset if(isalpha(kirjain)) switch(tolower(kirjain)) case 'a': case 'e': case 'i': case 'o': case 'u': cout << endl << "Syötit vokaalin." break; default: cout << endl << "Syötit konsonantin." cout << endl << "Et syöttänyt kirjainta." return 0; Esimerkin tulostus näyttää seuraavalta: Syötä kirjain: E Syötit vokaalin. Kuinka se toimii Tässä esimerkissä käytämme standardikirjaston merkkimuunnosfunktiota switch-lauseessa, jotta saamme selville, oliko syötetty merkki vokaali vai konsonantti. Ensimmäinen if-lause testaa, että kyseessä on todella kirjain eikä muu merkki: if(isalpha(kirjain)) Jos funktion isalpha() palauttama arvo on nollasta poikkeava, switch-lause suoritetaan: switch(tolower(kirjain)) case 'a': case 'e': case 'i': case 'o': case 'u': cout << endl << "Syötit vokaalin." break; default: cout << endl << "Syötit konsonantin." switch-lauseen case-osa valitaan funktion tolower() paluuarvon perusteella. Olisimme voineet käyttää muuttujaa kirjain suoraankin, mutta tällöin meidän olisi tarvinnut määritellä erikseen isot ja pienet vokaalit. Jos funktio tolower() palauttaa arvon, joka vastaa vokaalia, tulostetaan siitä kertova viesti. Muutoin suoritetaan default-osa, joka tulostaa viestin, että syötetty merkki oli konsonantti. 137

28 C++ Ohjelmoijan käsikirja Jos isalpha() palauttaa arvon 0, switch-lausetta ei suoriteta vaan suoritetaan -osa, joka tulostaa viestin, että merkki ei ollut kirjain. Voit yhdistää kirjaimen testauksen pieneksi merkiksi muunnon yhteyteen, mutta se vaatii hieman vippaskonsteja. Voimme kirjoittaa switch-lauseen seuraavasti: switch(tolower(kirjain) * (isalpha(kirjain)!= 0)) case 'a': case 'e': case 'i': case 'o': case 'u': cout << endl << "Syötit vokaalin." break; case 0: cout << endl << "Et syöttänyt kirjainta." break; default: cout << endl << "Syötit konsonantin." //Muunnetaan //pieneksi ja testataan Syynä monimutkaiselle ehtolausekkeelle on siinä, että isalpha() ei palauta bool-tyyppistä paluuarvoa. Jos se palauttaisi, voisimme yksinkertaisesti kirjoittaa (tolower(kirjain) * (isalpha(kirjain), koska tämän arvo olisi 0, kun isalpha() palauttaa arvon false ja muutoin funktion tolower() palauttama pieni kirjain, koska true muunnetaan arvoksi 1. Olemme kuitenkin jo nähneet, että isalpha() palauttaa int-tyyppisen paluuarvon, joka on 0, jos välitit sille kirjaimen ja muutoin positiivinen kokonaisluku, joka ei välttämättä ole 1. Toinen vaihtoehto olisi ollut muuntaa funktion isalpha() palauttama arvo eksplisiittisesti bool-tyyppiseksi. Tällöin lause näyttäisi seuraavalta: switch(tolower(kirjain) * static_cast<bool>(isalpha(kirjain))) case 'a': case 'e': case 'i': case 'o': case 'u': cout << endl << "Syötit vokaalin." break; case 0: cout << endl << "Et syöttänyt kirjainta." break; default: cout << endl << "Syötit konsonantin." 138 Tämä toimii, koska funktion isalpha() palauttama arvo muunnetaan bool-tyyppiseksi ja kääntäjä huolehtii sen muuntamisesta taasen int-tyyppiseksi kertolaskua varten. Eli arvona on lopulta 0 tai 1. Haittana on, että nämä switch-lauseet alkavat olla jo hieman sekavia. Alkuperäinen versio, jossa käytettiin if-lausetta on selvästi selkeintä koodia ja se onkin siitä syystä suositeltavin.

29 Ehdoton hyppykäsky Valinnat ja päätökset if-lauseen avulla voidaan valita haluttu joukko lauseita suoritukseen, riippuen tietystä ehdosta, eli suoritettavat lauseet riippuvat ohjelman tiedosta. Käsittelimme juuri, kuinka voimme switch-lauseella valita kiinteästä joukosta vaihtoehtoja, riippuen kokonaislukulausekkeen arvosta. goto-lause on puolestaan varsin jäykkä: voit hypätä sillä tiettyyn ohjelman lauseeseen ilman ehtoja. Lause, johon halutaan hypätä, tulee merkitä nimiöllä, joka on määritelty tunniste ja johon pätevät aivan samat säännöt kuin muuttujan nimeenkin. Nimiön perässä on kaksoispiste, joka tulee sijoittaa ennen suoritettavaa lausetta. Seuraavassa on esimerkki nimiöstä: OmaNimio: x = 1; Tämän lauseen nimiö on OmaNimio ja hyppykäsky tähän lauseeseen saattaisi näyttää seuraavalta: goto OmaNimio; goto-lauseen käyttöä tulee kuitenkin välttää aina kun se vain on mahdollista. Sillä on tapana muodostaa koodia, jota on erittäin vaikeaa seurata. Huomaa, että goto-lause, joka hyppää muuttujan näkyvyysalueelle, mutta ohittaa muuttujan määrittelyn, saa aikaan kääntäjän virheilmoituksen.! goto-lause on teoreettisesti tarpeeton - se voidaan aina korvata toisella ratkaisutavalla. Suuri joukko ohjelmoijista sanoo, ettei sinun tulisi koskaan käyttää sitä. Minä en allekirjoita tällaista väittämää. Se on laillinen lause ja on olemassa tilanteita, joissa se on järkevä valinta. Suosittelen kuitenkin, että käytät sitä vain, kun siitä on erityistä hyötyä muihin ratkaisutapoihin verrattuna. Valintalauseiden lohkot ja muuttujien näkyvyysalue switch-lauseella on usein oma aaltosulkeiden sisällä oleva lohko, joka sisältää case-osat. iflauseessa on usein myös lohko, joka sisältää suoritettavat lauseet, kun vertailulausekkeen arvo on true. Samaten -osassa voi olla lohko. Sinun tulee muistaa, että nämä lohkot eivät eroa muuttujan näkyvyysalueen suhteen mitenkään muista lohkoista. Kaikki lohkossa määritellyt muuttujat häviävät lohkon päättyessä, joten et voi viitata niihin lohkon ulkopuolelta. Katsotaan seuraavaa varsin mielikuvituksellista esimerkkiä: if(arvo > 0) int muisti = arvo - 1; arvo += 10; // Tämä on olemassa vain tässä lohkossa 139

30 C++ Ohjelmoijan käsikirja int muisti = arvo + 1; // Tämä on olemassa vain tässä lohkossa arvo -= 10; cout << muisti; // Ei käänny! muisti ei ole olemassa Lopussa oleva tulostuslause saa aikaan kääntäjän virheilmoituksen, koska muuttujaa muisti ei ole siinä kohdassa olemassa. Jokaista tietyssä lohkossa määriteltyä muuttujaa voidaan käyttää vain siinä lohkossa, joten jos haluat käyttää lohkossa käsiteltävää muuttujaa myös lohkon ulkopuolella, sinun tulee sijoittaa muuttujan määrittely lohkon ulkopuolelle. Huomaa, että switch-lauseen lohkossa olevat määrittelyt tulee olla saavutettavissa suorituksen aikana ja niiden ohittaminen ei saa olla mahdollista. Seuraava esimerkki havainnollistaa, kuinka switch-lauseeseen voidaan sijoittaa virheellisiä määrittelyitä: int testi = 3; switch(testi) int i = 1; // VIRHE - tätä lausetta ei saavuteta case 1: int j = 2; // OK - voidaan saavuttaa eikä voida ohittaa cout << endl << testi + j; break; int k = 3; case 3: cout << endl << testi; int m = 4; break; // VIRHE - tätä lausetta ei saavuteta // VIRHE - voidaan saavuttaa, mutta voidaan ohittaa default: cout << endl << "Default-osa."; break; int n = 5; // VIRHE - tätä lausetta ei saavuteta Tässä switch-lauseessa vain yksi määrittelyistä - j:n määrittely - on sallittu. Jotta määrittely olisi sallittu, sen tulee olla saavutettavissa normaalissa suorituksessa. Tämä ei pidä paikkaansa muuttujien i, k ja n kohdalla. Myöskään ei saa olla mahdollista tulla muuttujan näkyvyysalueelle ohittaen muuttujan määrittely, kuten on muuttujan m kohdalla. Muuttuja j on näkyvissä vain määrittelykohdastaan lohkon loppuun saakka, joten sitä ei voida ohittaa. 140

31 Yhteenveto Valinnat ja päätökset Tässä luvussa lisäsimme ohjelmiimme päätösten ja valintojen tekemisen. Itse asiassa tunnet nyt kaikki C++:n valintalauseet sekä niiden toiminnan. Luvun aiheita olivat: Kahta arvoa voidaan verrata vertailuoperaattoreilla. Vertailun tuloksena on booltyyppinen arvo, joka voi olla true (tosi) tai false (epätosi). bool-tyyppinen arvo voidaan muuntaa kokonaislukutyyppiseksi - true vastaa arvoa 1 ja false arvoa 0. Numeeriset arvot voidaan muuntaa bool-tyyppisiksi - 0 vastaa arvoa false ja nollasta poikkeavat arvot vastaavat arvoa true. if-lauseen avulla voidaan suorittaa lause tai lauseiden lohko riippuen vertailulausekkeen arvosta. Jos vertailulausekkeen arvo on true, tai nollasta poikkeava, lause tai lauseiden lohko suoritetaan. Jos arvo on false, tai 0, sitä ei suoriteta. if- -lause sisältää lisän tavalliseen if-lauseeseen. -osa suoritetaan, jos vertailulausekkeen arvo on false, tai 0. if- ja if- -lauseita voidaan sijoittaa sisäkkäin. Otsikkotiedosto cctype sisältää standardikirjaston funktioiden määrittelyjä, joilla voidaan luokitella merkkejä ja muuntaa merkkejä pieniksi ja isoiksi. Otsikkotiedosto cwctype sisältää vastaavat määrittelyt wchar_t -tyyppisille merkeille. switch-lauseen avulla voidaan valita kiinteästä joukosta vaihtoehtoja, riippuen kokonaislukulausekkeen arvosta. Ehto-operaattori valitsee kahden arvon väliltä, riippuen lausekkeen arvosta. goto-lauseen avulla voidaan hypätä ehdoitta haluttuun nimettyyn lauseeseen. 141

32 C++ Ohjelmoijan käsikirja Harjoituksia 4.1 Tee ohjelma, joka pyytää käyttäjältä kaksi positiivista kokonaislukua ja testaa, onko suurempi kokonaisluku tasan jaollinen pienemmällä. Sinun tulee tarkistaa, että molemmat syötteet ovat sallittuja (suurempia kuin nolla) sekä päätellä kumpi luvuista on suurempi. 4.2 Tee ohjelma, joka pyytää käyttäjää syöttämään kokonaisluvun väliltä Testaa sisäkkäisten if-lauseiden avulla, että kokonaisluku on tällä arvovälillä. Jos näin on, päättele onko kokonaisluku suurempi, pienempi tai yhtä suuri kuin Tee ohjelma, joka hyväksyy käyttäjältä syötteeksi yhden merkin. Testaa standardikirjaston funktioiden avulla, että se on kirjain - jos se ei ole, tulosta viesti ja lopeta ohjelman suoritus. Varmistuttuasi, että kyseessä on kirjain, tulosta bittioperaattoreiden avulla sen binäärinen koodi. Muista, että voit käyttää maskia testaamaan yhden bitin arvon. Sinun tulee testata kaikki merkin bitit yksi kerrallaan. 4.4 Tee ohjelma, joka pyytää käyttäjää syöttämään rahasumman väliltä $0 - $10 (desimaaliosat on sallittu). Määrittele, kuinka monta 25c, 10c, 5c ja 1c kolikkoa tarvitaan syötetyn summan muodostamiseen. Tulosta tulos näytölle. Huomioi lisäksi, että tulostus on kieliopillisesti oikein (eli, että tulostuu esimerkiksi 1 centti, eikä 1 centtiä, kun tarvitaan vain 1 centti.). 142

33 Valinnat ja päätökset 143

34 144 C++ Ohjelmoijan käsikirja

Ehto- ja toistolauseet

Ehto- ja toistolauseet Ehto- ja toistolauseet 1 Ehto- ja toistolauseet Uutena asiana opetellaan ohjelmointilauseet / rakenteet, jotka mahdollistavat: Päätösten tekemisen ohjelman suorituksen aikana (esim. kyllä/ei) Samoja lauseiden

Lisätiedot

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

Koottu lause; { ja } -merkkien väliin kirjoitetut lauseet muodostavat lohkon, jonka sisällä lauseet suoritetaan peräkkäin. 2. Ohjausrakenteet Ohjausrakenteiden avulla ohjataan ohjelman suoritusta. peräkkäisyys valinta toisto Koottu lause; { ja } -merkkien väliin kirjoitetut lauseet muodostavat lohkon, jonka sisällä lauseet

Lisätiedot

Java-kielen perusteita

Java-kielen perusteita Java-kielen perusteita valintalauseet 1 Johdantoa kontrollirakenteisiin Tähän saakka ohjelmissa on ollut vain peräkkäisyyttä eli lauseet on suoritettu peräkkäin yksi kerrallaan Tarvitsemme myös valintaa

Lisätiedot

Java-kielen perusteet

Java-kielen perusteet Java-kielen perusteet Tunnus, varattu sana, kommentti Muuttuja, alkeistietotyyppi, merkkijono, literaalivakio, nimetty vakio Tiedon merkkipohjainen tulostaminen 1 Tunnus Java tunnus Java-kirjain Java-numero

Lisätiedot

Java-kielen perusteet

Java-kielen perusteet Java-kielen perusteet Tunnus, varattu sana, kommentti Muuttuja, alkeistietotyyppi, merkkijono, Vakio Tiedon merkkipohjainen tulostaminen Ohjelmointi (ict1tx006) Tunnus (5.3) Javan tunnus Java-kirjain Java-numero

Lisätiedot

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python Ohjelmoinnin perusteet Y Python T-106.1208 2.3.2009 T-106.1208 Ohjelmoinnin perusteet Y 2.3.2009 1 / 28 Puhelinluettelo, koodi def lue_puhelinnumerot(): print "Anna lisattavat nimet ja numerot." print

Lisätiedot

Osoitin ja viittaus C++:ssa

Osoitin ja viittaus C++:ssa Osoitin ja viittaus C++:ssa Osoitin yksinkertaiseen tietotyyppiin Osoitin on muuttuja, joka sisältää jonkin toisen samantyyppisen muuttujan osoitteen. Ohessa on esimerkkiohjelma, jossa määritellään kokonaislukumuuttuja

Lisätiedot

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

Alkuarvot ja tyyppimuunnokset (1/5) Alkuarvot ja tyyppimuunnokset (2/5) Alkuarvot ja tyyppimuunnokset (3/5) Alkuarvot ja tyyppimuunnokset (1/5) Aiemmin olemme jo antaneet muuttujille alkuarvoja, esimerkiksi: int luku = 123; Alkuarvon on oltava muuttujan tietotyypin mukainen, esimerkiksi int-muuttujilla kokonaisluku,

Lisätiedot

Python-ohjelmointi Harjoitus 2

Python-ohjelmointi Harjoitus 2 Python-ohjelmointi Harjoitus 2 TAVOITTEET Kerrataan tulostuskomento ja lukumuotoisen muuttujan muuttaminen merkkijonoksi. Opitaan jakojäännös eli modulus, vertailuoperaattorit, ehtorakenne jos, input-komento

Lisätiedot

13. Loogiset operaatiot 13.1

13. Loogiset operaatiot 13.1 13. Loogiset operaatiot 13.1 Sisällys Loogiset operaatiot AND, OR, XOR ja NOT. Operaatioiden ehdollisuus. Bittioperaatiot. Loogiset operaatiot ohjausrakenteissa. Loogiset operaatiot ja laskentajärjestys.

Lisätiedot

Tietotyypit ja operaattorit

Tietotyypit ja operaattorit Tietotyypit ja operaattorit Luennossa tarkastellaan yksinkertaisten tietotyyppien int, double ja char muunnoksia tyypistä toiseen sekä esitellään uusia operaatioita. Numeeriset tietotyypit ja muunnos Merkkitieto

Lisätiedot

Osoittimet. Mikä on osoitin?

Osoittimet. Mikä on osoitin? Osoittimet 7 Osoittimet On aika siirtyä käsittelemään osoittimia, C++:lle elintärkeätä ominaisuutta. Osoittimet ovat tärkeitä, koska ne luovat perustan muistin dynaamiselle varaukselle ja käytölle. Ne

Lisätiedot

12. Javan toistorakenteet 12.1

12. Javan toistorakenteet 12.1 12. Javan toistorakenteet 12.1 Sisällys Yleistä toistorakenteista. Laskurimuuttujat. While-, do-while- ja for-lauseet. Laskuri- ja lippumuuttujat. Tyypillisiä ohjelmointivirheitä. Silmukan rajat asetettu

Lisätiedot

12. Javan toistorakenteet 12.1

12. Javan toistorakenteet 12.1 12. Javan toistorakenteet 12.1 Sisällys Yleistä toistorakenteista. Laskurimuuttujat. While-, do-while- ja for-lauseet. Laskuri- ja lippumuuttujat. Tyypillisiä ohjelmointivirheitä. Silmukan rajat asetettu

Lisätiedot

11. Javan toistorakenteet 11.1

11. Javan toistorakenteet 11.1 11. Javan toistorakenteet 11.1 Sisällys Laskuri- ja lippumuuttujat. Sisäkkäiset silmukat. Tyypillisiä ohjelmointivirheitä: Silmukan rajat asetettu kierroksen verran väärin. Ikuinen silmukka. Silmukoinnin

Lisätiedot

815338A Ohjelmointikielten periaatteet Harjoitus 3 vastaukset

815338A Ohjelmointikielten periaatteet Harjoitus 3 vastaukset 815338A Ohjelmointikielten periaatteet 2015-2016. Harjoitus 3 vastaukset Harjoituksen aiheena ovat imperatiivisten kielten muuttujiin liittyvät kysymykset. Tehtävä 1. Määritä muuttujien max_num, lista,

Lisätiedot

Ohjelman virheet ja poikkeusten käsittely

Ohjelman virheet ja poikkeusten käsittely Ohjelman virheet ja poikkeusten käsittely 17 Ohjelman virheet ja poikkeusten käsittely Poikkeukset ovat tapa ilmoittaa virheistä ja odottamattomista tilanteista C++-ohjelmassasi. Poikkeusten käyttö virheiden

Lisätiedot

Sisällys. 11. Javan toistorakenteet. Laskurimuuttujat. Yleistä

Sisällys. 11. Javan toistorakenteet. Laskurimuuttujat. Yleistä Sisällys 11. Javan toistorakenteet Laskuri- ja lippumuuttujat.. Tyypillisiä ohjelmointivirheitä: Silmukan rajat asetettu kierroksen verran väärin. Ikuinen silmukka. Silmukoinnin lopettaminen break-lauseella.

Lisätiedot

Ohjelmassa henkilön etunimi ja sukunimi luetaan kahteen muuttujaan seuraavasti:

Ohjelmassa henkilön etunimi ja sukunimi luetaan kahteen muuttujaan seuraavasti: 1 (7) Tiedon lukeminen näppäimistöltä Scanner-luokan avulla Miten ohjelma saa käyttöönsä käyttäjän kirjoittamaa tekstiä? Järjestelmässä on olemassa ns. syöttöpuskuri näppäimistöä varten. Syöttöpuskuri

Lisätiedot

Ohjausrakenteet. Valinta:

Ohjausrakenteet. Valinta: Ohjausrakenteet Luento antaa yleiskuvan siitä kuinka ohjelmassa suorittaan vaihtoehtoisia tehtäviä valintarakenteiden avulla ja kuinka samanlaisia ohjelma-askeleita toistetaan toistorakenteiden avulla

Lisätiedot

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python Ohjelmoinnin perusteet Y Python T-106.1208 9.2.2009 T-106.1208 Ohjelmoinnin perusteet Y 9.2.2009 1 / 35 Listat Esimerkki: halutaan kirjoittaa ohjelma, joka lukee käyttäjältä 30 lämpötilaa. Kun lämpötilat

Lisätiedot

Sisällys. 12. Javan toistorakenteet. Yleistä. Laskurimuuttujat

Sisällys. 12. Javan toistorakenteet. Yleistä. Laskurimuuttujat Sisällys 12. Javan toistorakenteet Ylstä toistorakentsta. Laskurimuuttujat. While-, do-while- ja for-lauseet. Laskuri- ja lippumuuttujat. Tyypillisiä ohjelmointivirhtä. Silmukan rajat asetettu kierroksen

Lisätiedot

Kerta 2. Kerta 2 Kerta 3 Kerta 4 Kerta 5. 1. Toteuta Pythonilla seuraava ohjelma:

Kerta 2. Kerta 2 Kerta 3 Kerta 4 Kerta 5. 1. Toteuta Pythonilla seuraava ohjelma: Kerta 2 Kerta 3 Kerta 4 Kerta 5 Kerta 2 1. Toteuta Pythonilla seuraava ohjelma: 2. Tulosta Pythonilla seuraavat luvut allekkain a. 0 10 (eli, näyttää tältä: 0 1 2 3 4 5 6 7 8 9 10 b. 0 100 c. 50 100 3.

Lisätiedot

Kääntäjän virheilmoituksia

Kääntäjän virheilmoituksia OHJ-1101 Ohjelmointi 1e 2008-09 1 Kääntäjän virheilmoituksia Kun progvh2 ohjelma käännetään antaa tutg++ seuraavat virheilmoitukset ja varoitukset: proffa> tutg++ progvh2.cc progvh2.cc:29:13: warning:

Lisätiedot

Ohjelmointi 1 Taulukot ja merkkijonot

Ohjelmointi 1 Taulukot ja merkkijonot Ohjelmointi 1 Taulukot ja merkkijonot Jussi Pohjolainen TAMK Tieto- ja viestintäteknologia Johdanto taulukkoon Jos ohjelmassa käytössä ainoastaan perinteisiä (yksinkertaisia) muuttujia, ohjelmien teko

Lisätiedot

815338A Ohjelmointikielten periaatteet Harjoitus 2 vastaukset

815338A Ohjelmointikielten periaatteet Harjoitus 2 vastaukset 815338A Ohjelmointikielten periaatteet 2015-2016. Harjoitus 2 vastaukset Harjoituksen aiheena on BNF-merkinnän käyttö ja yhteys rekursiivisesti etenevään jäsentäjään. Tehtävä 1. Mitkä ilmaukset seuraava

Lisätiedot

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python Ohjelmoinnin perusteet Y Python T-106.1208 28.2.2011 T-106.1208 Ohjelmoinnin perusteet Y 28.2.2011 1 / 46 Ohjelmointiprojektin vaiheet 1. Määrittely 2. Ohjelman suunnittelu (ohjelman rakenne ja ohjelman

Lisätiedot

Harjoitus 3 (viikko 39)

Harjoitus 3 (viikko 39) Mikäli tehtävissä on jotain epäselvää, laita sähköpostia vastuuopettajalle ([email protected]). Muista nimetä muuttujat hyvin sekä kommentoida ja sisentää koodisi. Vältä liian pitkiä rivejä. Ohjelmointitehtävien

Lisätiedot

ITKP102 Ohjelmointi 1 (6 op)

ITKP102 Ohjelmointi 1 (6 op) ITKP102 Ohjelmointi 1 (6 op) Tentaattori: Antti-Jussi Lakanen 7. huhtikuuta 2017 Vastaa kaikkiin tehtäviin. Tee jokainen tehtävä erilliselle konseptiarkille. Kirjoittamasi luokat, funktiot ja aliohjelmat

Lisätiedot

2. Lisää Java-ohjelmoinnin alkeita. Muuttuja ja viittausmuuttuja (1/4) Muuttuja ja viittausmuuttuja (2/4)

2. Lisää Java-ohjelmoinnin alkeita. Muuttuja ja viittausmuuttuja (1/4) Muuttuja ja viittausmuuttuja (2/4) 2. Lisää Java-ohjelmoinnin alkeita Muuttuja ja viittausmuuttuja Vakio ja literaalivakio Sijoituslause Syötteen lukeminen ja Scanner-luokka 1 Muuttuja ja viittausmuuttuja (1/4) Edellä mainittiin, että String-tietotyyppi

Lisätiedot

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

Perusteet. Pasi Sarolahti Aalto University School of Electrical Engineering. C-ohjelmointi Kevät Pasi Sarolahti C! Perusteet 19.1.2017 Palautteesta (1. kierros toistaiseksi) Toistaiseksi helppoa Miksi vain puolet pisteistä? Vaikeinta oli ohjelmointiympäristön asennus ja käyttö Vaikeaa eroavuudet Pythonin ja C:n

Lisätiedot

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

Perusteet. Pasi Sarolahti Aalto University School of Electrical Engineering. C-ohjelmointi Kevät Pasi Sarolahti C! Perusteet 19.1.2017 Palautteesta (1. kierros toistaiseksi) (Erittäin) helppoa Miksi vain puolet pisteistä? Vaikeinta oli ohjelmointiympäristön asennus ja käyttö Ei selvää että main funktion pitikin

Lisätiedot

13. Loogiset operaatiot 13.1

13. Loogiset operaatiot 13.1 13. Loogiset operaatiot 13.1 Sisällys Loogiset operaatiot AND, OR, XOR ja NOT. Operaatioiden ehdollisuus. Bittioperaatiot. Loogiset operaatiot ohjausrakenteissa. Loogiset operaatiot ja laskentajärjestys.

Lisätiedot

7. Näytölle tulostaminen 7.1

7. Näytölle tulostaminen 7.1 7. Näytölle tulostaminen 7.1 Sisällys System.out.println- ja System.out.print-operaatiot. Tulostus erikoismerkeillä. Edistyneempää tulosteiden muotoilua. 7.2 Tulostusoperaatiot System.out.println-operaatio

Lisätiedot

ITKP102 Ohjelmointi 1 (6 op)

ITKP102 Ohjelmointi 1 (6 op) ITKP102 Ohjelmointi 1 (6 op) Tentaattori: Antti-Jussi Lakanen 20. huhtikuuta 2018 Vastaa kaikkiin tehtäviin. Tee kukin tehtävä omalle konseptiarkille. Noudata ohjelmointitehtävissä kurssin koodauskäytänteitä.

Lisätiedot

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python Ohjelmoinnin perusteet Y Python T-106.1208 20.1.2010 T-106.1208 Ohjelmoinnin perusteet Y 20.1.2010 1 / 40 Arvon pyytäminen käyttäjältä Käyttäjän antaman arvon voi lukea raw_input-käskyllä. Käskyn sulkujen

Lisätiedot

Osa. Toimintojen toteuttaminen ohjelmissa vaatii usein haarautumisia ja silmukoita. Tässä luvussa tutustummekin seuraaviin asioihin:

Osa. Toimintojen toteuttaminen ohjelmissa vaatii usein haarautumisia ja silmukoita. Tässä luvussa tutustummekin seuraaviin asioihin: Osa II 8. oppitunti Kehittynyt ohjel- man kulku Toimintojen toteuttaminen ohjelmissa vaatii usein haarautumisia ja silmukoita. Tässä luvussa tutustummekin seuraaviin asioihin: Mitä silmukat ovat ja kuinka

Lisätiedot

Ohjelmointitaito (ict1td002, 12 op) Kevät 2008. 1. Java-ohjelmoinnin alkeita. Tietokoneohjelma. Raine Kauppinen raine.kauppinen@haaga-helia.

Ohjelmointitaito (ict1td002, 12 op) Kevät 2008. 1. Java-ohjelmoinnin alkeita. Tietokoneohjelma. Raine Kauppinen raine.kauppinen@haaga-helia. Ohjelmointitaito (ict1td002, 12 op) Kevät 2008 Raine Kauppinen [email protected] 1. Java-ohjelmoinnin alkeita Tietokoneohjelma Java-kieli ja Eclipse-ympäristö Java-ohjelma ja ohjelmaluokka

Lisätiedot

11. Javan valintarakenteet 11.1

11. Javan valintarakenteet 11.1 11. Javan valintarakenteet 11.1 Sisällys If- ja if-else-lauseet. Orpo else. Valintaa toisin: switch-lause. 11.2 If-lause Merkitään varatulla sanalla if. Kuvaa yksisuuntaisen päätöksen: rakenteen lauseet

Lisätiedot

4. oppitunti. Ilmaukset ja ohjelmalauseet. Osa

4. oppitunti. Ilmaukset ja ohjelmalauseet. Osa Osa I 4. oppitunti Ilmaukset ja ohjelmalauseet Ohjelma ei todellisuudessa ole mitään muuta kuin joukko komentoja, jotka suoritetaan peräkkäin. Monipuolisuutta ohjelmaan saadaan, kun ohjelmassa haaraudutaan

Lisätiedot

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

Osa. Listaus 2.1. HELLO.CPP esittelee C++ -ohjelman osat. 14: #include <iostream.h> 15: 16: int main() 17: { Osa I 2. oppitunti C++-ohjelman osat Ennen kuin menemme yksityiskohtaisemmin sisälle C++-luokkiin, -muuttujiin jne, katsokaamme ensin, millaisista osista C++-ohjelma koostuu. Tämän tunnin aikana opit seuraavat

Lisätiedot

Zeon PDF Driver Trial

Zeon PDF Driver Trial Matlab-harjoitus 2: Kuvaajien piirto, skriptit ja funktiot. Matlabohjelmoinnin perusteita Numeerinen integrointi trapezoidaalimenetelmällä voidaan tehdä komennolla trapz. Esimerkki: Vaimenevan eksponentiaalin

Lisätiedot

Johdatus Ohjelmointiin

Johdatus Ohjelmointiin Johdatus Ohjelmointiin Syksy 2006 Viikko 2 13.9. - 14.9. Tällä viikolla käsiteltävät asiat Peruskäsitteitä Kiintoarvot Tiedon tulostus Yksinkertaiset laskutoimitukset Muuttujat Tiedon syöttäminen Hyvin

Lisätiedot

Muuttujien roolit Kiintoarvo cin >> r;

Muuttujien roolit Kiintoarvo cin >> r; Muuttujien roolit Muuttujilla on ohjelmissa eräitä tyypillisiä käyttötapoja, joita kutsutaan muuttujien rooleiksi. Esimerkiksi muuttuja, jonka arvoa ei muuteta enää kertaakaan muuttujan alustamisen jälkeen,

Lisätiedot

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin peruskurssi Y1 Ohjelmoinnin peruskurssi Y1 CSE-A1111 21.9.2015 CSE-A1111 Ohjelmoinnin peruskurssi Y1 21.9.2015 1 / 25 Mahdollisuus antaa luentopalautetta Goblinissa vasemmassa reunassa olevassa valikossa on valinta Luentopalaute.

Lisätiedot

12 Mallit (Templates)

12 Mallit (Templates) 12 Mallit (Templates) Malli on määrittely, jota käyttämällä voidaan luoda samankaltaisten aliohjelmien ja luokkien perheitä. Malli on ohje kääntäjälle luoda geneerisestä tyyppiriippumattomasta ohjelmakoodista

Lisätiedot

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python Ohjelmoinnin perusteet Y Python T-106.1208 1.4.2009 T-106.1208 Ohjelmoinnin perusteet Y 1.4.2009 1 / 56 Tentti Ensimmäinen tenttimahdollisuus on pe 8.5. klo 13:00 17:00 päärakennuksessa. Tämän jälkeen

Lisätiedot

14. Hyvä ohjelmointitapa 14.1

14. Hyvä ohjelmointitapa 14.1 14. Hyvä ohjelmointitapa 14.1 Yleistä Ohjelman elinkaari ei tyypillisesti pääty sen toteuttamiseen; ohjelmaa voidaan käyttää ja ylläpitää jopa vuosikymmeniä. Jotta koodin muuttaminen on mahdollista, sen

Lisätiedot

System.out.printf("%d / %d = %.2f%n", ekaluku, tokaluku, osamaara);

System.out.printf(%d / %d = %.2f%n, ekaluku, tokaluku, osamaara); Kysy Karilta tai Kimmolta, jos tehtävissä on jotain epäselvää. Kerro WETOon liittyvät ongelmat suoraan Jormalle sähköpostitse ([email protected]). Muista nimetä muuttujat hyvin sekä kommentoida ja

Lisätiedot

815338A Ohjelmointikielten periaatteet Harjoitus 4 vastaukset

815338A Ohjelmointikielten periaatteet Harjoitus 4 vastaukset 815338A Ohjelmointikielten periaatteet 2015-2016. Harjoitus 4 vastaukset Harjoituksen aiheena ovat imperatiivisten kielten lauseisiin, lausekkeisiin ja aliohjelmiin liittyvät kysymykset. Tehtävä 1. Mitä

Lisätiedot

ITKP102 Ohjelmointi 1 (6 op)

ITKP102 Ohjelmointi 1 (6 op) ITKP102 Ohjelmointi 1 (6 op) Tentaattori: Antti-Jussi Lakanen 22. huhtikuuta 2016 Vastaa kaikkiin tehtäviin. Tee jokainen tehtävä erilliselle konseptiarkille! Kirjoittamasi luokat, funktiot ja aliohjelmat

Lisätiedot

ITKP102 Ohjelmointi 1 (6 op)

ITKP102 Ohjelmointi 1 (6 op) ITKP102 Ohjelmointi 1 (6 op) Tentaattori: Antti-Jussi Lakanen 12. huhtikuuta 2019 Tee kukin tehtävä omalle konseptiarkille. Noudata ohjelmointitehtävissä kurssin koodauskäytänteitä. Yksi A4-kokoinen lunttilappu

Lisätiedot

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin peruskurssi Y1 Ohjelmoinnin peruskurssi Y1 CSE-A1111 30.9.2015 CSE-A1111 Ohjelmoinnin peruskurssi Y1 30.9.2015 1 / 27 Mahdollisuus antaa luentopalautetta Goblinissa vasemmassa reunassa olevassa valikossa on valinta Luentopalaute.

Lisätiedot

Lauseet. Ehdollinen lause. Tämän osan sisältö. Ehdollinen lause. Esimerkkejä. Yksinkertainen ehto. Lohkosulut ja sisennys. Ehdollinen lause if

Lauseet. Ehdollinen lause. Tämän osan sisältö. Ehdollinen lause. Esimerkkejä. Yksinkertainen ehto. Lohkosulut ja sisennys. Ehdollinen lause if 3 Lauseet Lue kirjasta s. 54-84 Tämän osan sisältö Ehdollinen lause if Looginen lauseke vertailut AND-operaattori &&, & OR-operaattori, NOT-operaattori! Valintalause switch Toistolauseet while for do while

Lisätiedot

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python Ohjelmoinnin perusteet Y Python T-106.1208 7.2.2011 T-106.1208 Ohjelmoinnin perusteet Y 7.2.2011 1 / 39 Kännykkäpalautetteen antajia kaivataan edelleen! Ilmoittaudu mukaan lähettämällä ilmainen tekstiviesti

Lisätiedot

Sisällys. 3. Muuttujat ja operaatiot. Muuttujat ja operaatiot. Muuttujat. Operaatiot. Imperatiivinen laskenta. Muuttujat. Esimerkkejä: Operaattorit.

Sisällys. 3. Muuttujat ja operaatiot. Muuttujat ja operaatiot. Muuttujat. Operaatiot. Imperatiivinen laskenta. Muuttujat. Esimerkkejä: Operaattorit. 3. Muuttujat ja operaatiot Sisällys Imperatiivinen laskenta. Muuttujat. Nimi ja arvo. Muuttujan nimeäminen. Muuttujan tyyppi.. Operandit. Arvon sijoitus muuttujaan. Aritmeettiset operaattorit. Arvojen

Lisätiedot

Perustietotyypit ja laskutoimitukset

Perustietotyypit ja laskutoimitukset Perustietotyypit ja laskutoimitukset 2 Perustietotyypit ja laskutoimitukset Tässä luvussa käsittelemme C++:n perustietotyyppejä, varsinkin sellaisia kuin sinä mitä todennäköisemmin tulet käyttämään omissa

Lisätiedot

13. Hyvä ohjelmointitapa (osa 1) 13.1

13. Hyvä ohjelmointitapa (osa 1) 13.1 13. Hyvä ohjelmointitapa (osa 1) 13.1 Yleistä Ohjelman elinkaari ei tyypillisesti pääty sen toteuttamiseen tarvitaan ylläpitoa. Jotta koodin muuttaminen on mahdollista, on sen oltava myös muidenkin kuin

Lisätiedot

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python Ohjelmoinnin perusteet Y Python T-106.1208 21.1.2009 T-106.1208 Ohjelmoinnin perusteet Y 21.1.2009 1 / 32 Tyypeistä Monissa muissa ohjelmointikielissä (esim. Java ja C) muuttujat on määriteltävä ennen

Lisätiedot

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

IDL - proseduurit. ATK tähtitieteessä. IDL - proseduurit IDL - proseduurit 25. huhtikuuta 2017 Viimeksi käsiteltiin IDL:n interaktiivista käyttöä, mutta tämä on hyvin kömpelöä monimutkaisempia asioita tehtäessä. IDL:llä on mahdollista tehdä ns. proseduuri-tiedostoja,

Lisätiedot

3. Muuttujat ja operaatiot 3.1

3. Muuttujat ja operaatiot 3.1 3. Muuttujat ja operaatiot 3.1 Sisällys Imperatiivinen laskenta. Muuttujat. Nimi ja arvo. Muuttujan nimeäminen. Muuttujan tyyppi. Operaattorit. Operandit. Arvon sijoitus muuttujaan. Aritmeettiset operaattorit.

Lisätiedot

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

ATK tähtitieteessä. Osa 3 - IDL proseduurit ja rakenteet. 18. syyskuuta 2014 18. syyskuuta 2014 IDL - proseduurit Viimeksi käsiteltiin IDL:n interaktiivista käyttöä, mutta tämä on hyvin kömpelöä monimutkaisempia asioita tehtäessä. IDL:llä on mahdollista tehdä ns. proseduuri-tiedostoja,

Lisätiedot

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

C-kielessä taulukko on joukko peräkkäisiä muistipaikkoja, jotka kaikki pystyvät tallettamaan samaa tyyppiä olevaa tietoa. Taulukot C-kielessä taulukko on joukko peräkkäisiä muistipaikkoja, jotka kaikki pystyvät tallettamaan samaa tyyppiä olevaa tietoa. Taulukon muuttujilla (muistipaikoilla) on yhteinen nimi. Jokaiseen yksittäiseen

Lisätiedot

Virtuaalifunktiot ja polymorfismi

Virtuaalifunktiot ja polymorfismi Virtuaalifunktiot ja polymorfismi 16 Virtuaalifunktiot ja polymorfismi Polymorfismi on niin tehokas olio-ohjelmoinnin ominaisuus, että tulet varmastikin käyttämään sitä lähes kaikissa C++-ohjelmissasi.

Lisätiedot

Ehto- ja toistolauseet

Ehto- ja toistolauseet Ehto- ja toistolauseet 1 Ehto- ja toistolauseet Uutena asiana opetellaan ohjelmointilauseet / rakenteet, jotka mahdollistavat: Päätösten tekemisen ohjelman suorituksen aikana (esim. kyllä/ei) Samoja lauseiden

Lisätiedot

Ohjelmointiharjoituksia Arduino-ympäristössä

Ohjelmointiharjoituksia Arduino-ympäristössä Ohjelmointiharjoituksia Arduino-ympäristössä Yleistä Arduino-sovelluksen rakenne Syntaksi ja käytännöt Esimerkki ohjelman rakenteesta Muuttujat ja tietotyypit Tietotyypit Esimerkkejä tietotyypeistä Ehtolauseet

Lisätiedot

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python Ohjelmoinnin perusteet Y Python T-106.1208 1.3.2010 T-106.1208 Ohjelmoinnin perusteet Y 1.3.2010 1 / 36 Monikko Monikko (engl. tuple) muistuttaa listaa, mutta monikon sisältöä ei voi muuttaa sen jälkeen,

Lisätiedot

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

C-ohjelma. C-ohjelma. C-ohjelma. C-ohjelma. C-ohjelma. C-ohjelma. Operaatioiden suoritusjärjestys 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,

Lisätiedot

Harjoitus 2 (viikko 45)

Harjoitus 2 (viikko 45) Mikäli tehtävissä on jotain epäselvää, laita sähköpostia vastuuopettajalle ([email protected]). Muista lisätä static-määre operaatioidesi otsikoihin, jotta ohjelmasi kääntyvät. Muista noudattaa hyvän

Lisätiedot

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

Operaattoreiden ylikuormitus. Operaattoreiden kuormitus. Operaattoreiden kuormitus. Operaattoreista. Kuormituksesta C++ - perusteet Java-osaajille luento 5/7: operaattoreiden ylikuormitus, oliotaulukko, parametrien oletusarvot, komentoriviparametrit, constant, inline, Operaattoreiden ylikuormitus Operaattoreiden kuormitus

Lisätiedot

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

AS-0.1103 C-ohjelmoinnin peruskurssi 2013: C-kieli käytännössä ja erot Pythoniin AS-0.1103 C-ohjelmoinnin peruskurssi 2013: C-kieli käytännössä ja erot Pythoniin Raimo Nikkilä Aalto-yliopiston sähkötekniikan korkeakoulu - Automaation tietotekniikan tutkimusryhmä 17. tammikuuta 2013

Lisätiedot

811120P Diskreetit rakenteet

811120P Diskreetit rakenteet 811120P Diskreetit rakenteet 2018-2019 1. Algoritmeista 1.1 Algoritmin käsite Algoritmi keskeinen laskennassa Määrittelee prosessin, joka suorittaa annetun tehtävän Esimerkiksi Nimien järjestäminen aakkosjärjestykseen

Lisätiedot

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python Ohjelmoinnin perusteet Y Python T-106.1208 3.2.2010 T-106.1208 Ohjelmoinnin perusteet Y 3.2.2010 1 / 36 Esimerkki: asunnon välityspalkkio Kirjoitetaan ohjelma, joka laskee kiinteistönvälittäjän asunnon

Lisätiedot

Tietojen syöttäminen ohjelmalle. Tietojen syöttäminen ohjelmalle Scanner-luokan avulla

Tietojen syöttäminen ohjelmalle. Tietojen syöttäminen ohjelmalle Scanner-luokan avulla Tietojen syöttäminen ohjelmalle Tähän mennessä on käsitelty Javan tulostuslauseet System.out.print ja System.out.println sekä ohjelman perusrakenneosat (muuttujat, vakiot, lauseet). Jotta päästään tekemään

Lisätiedot

System.out.printf("%d / %d = %.2f%n", ekaluku, tokaluku, osamaara);

System.out.printf(%d / %d = %.2f%n, ekaluku, tokaluku, osamaara); Mikäli tehtävissä on jotain epäselvää, laita sähköpostia vastuuopettajalle ([email protected]). Muista nimetä muuttujat hyvin sekä kommentoida ja sisentää koodisi. Ohjelmointitehtävien osalta palautetaan

Lisätiedot

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

Javan perusteet. Ohjelman tehtävät: tietojen syöttö, lukeminen prosessointi, halutun informaation tulostaminen tulostus tiedon varastointi 1 Javan perusteet Ohjelmointi IPO-malli Java lähdekoodista suoritettavaksi ohjelmaksi Vakio Muuttuja Miten Javalla näytetään tietoa käyttäjälle, miten Javalla luetaan käyttäjän antama syöte Miten Javalla

Lisätiedot

KAAVAT. Sisällysluettelo

KAAVAT. Sisällysluettelo Excel 2013 Kaavat Sisällysluettelo KAAVAT KAAVAT... 1 Kaavan tekeminen... 2 Kaavan tekeminen osoittamalla... 2 Kaavan kopioiminen... 3 Kaavan kirjoittaminen... 3 Summa-funktion lisääminen... 4 Suorat eli

Lisätiedot

Sisällys. 3. Pseudokoodi. Johdanto. Johdanto. Johdanto ja esimerkki. Pseudokoodi lauseina. Kommentointi ja sisentäminen.

Sisällys. 3. Pseudokoodi. Johdanto. Johdanto. Johdanto ja esimerkki. Pseudokoodi lauseina. Kommentointi ja sisentäminen. Sisällys 3. Pseudokoodi Johdanto ja esimerkki. Pseudokoodi lauseina. Kommentointi ja sisentäminen. Ohjausrakenteet: Valinta if- ja if--rakenteilla. oisto while-, do-while- ja for-rakenteilla. 3.1 3.2 Johdanto

Lisätiedot

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

Ohjelmassa muuttujalla on nimi ja arvo. Kääntäjä ja linkkeri varaavat muistilohkon, jonne muuttujan arvo talletetaan. Osoittimet Ohjelmassa muuttujalla on nimi ja arvo. Kääntäjä ja linkkeri varaavat muistilohkon, jonne muuttujan arvo talletetaan. Muistilohkon koko riippuu muuttujan tyypistä, eli kuinka suuria arvoja muuttujan

Lisätiedot

Tutoriaaliläsnäoloista

Tutoriaaliläsnäoloista Tutoriaaliläsnäoloista Tutoriaaliläsnäolokierroksella voi nyt täyttää anomuksen läsnäolon merkitsemisestä Esim. tagi ei toiminut, korvavaltimon leikkaus, yms. Hyväksyn näitä omaa harkintaa käyttäen Tarkoitus

Lisätiedot

// Tulostetaan double-tyyppiseen muuttujaan "hinta" tallennettu // kertalipun hinta ja vaihdetaan riviä. System.out.printf("%.1f euros.

// Tulostetaan double-tyyppiseen muuttujaan hinta tallennettu // kertalipun hinta ja vaihdetaan riviä. System.out.printf(%.1f euros. Lue kukin tehtävänanto huolellisesti ja kokonaisuudessaan ennen kuin aloitat vastaamisen. Kustakin tehtävästä voi saada 0 6 pistettä. Tentin läpipääsyraja on 12 / 24 pistettä. Ratkaisut palautetaan WETO-järjestelmään

Lisätiedot

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

Metodit. Metodien määrittely. Metodin parametrit ja paluuarvo. Metodien suorittaminen eli kutsuminen. Metodien kuormittaminen Metodit Metodien määrittely Metodin parametrit ja paluuarvo Metodien suorittaminen eli kutsuminen Metodien kuormittaminen 1 Mikä on metodi? Metodi on luokan sisällä oleva yhteenkuuluvien toimintojen kokonaisuus

Lisätiedot

Harjoitus 5. Esimerkki ohjelman toiminnasta: Lausekielinen ohjelmointi I Kesä 2018 Avoin yliopisto 1 / 5

Harjoitus 5. Esimerkki ohjelman toiminnasta: Lausekielinen ohjelmointi I Kesä 2018 Avoin yliopisto 1 / 5 Kysy Karilta tai Kimmolta, jos tehtävissä on jotain epäselvää. Kerro WETOon liittyvät tekniset ongelmat suoraan Jormalle sähköpostitse ([email protected]). Muista nimetä muuttujat hyvin sekä kommentoida

Lisätiedot

815338A Ohjelmointikielten periaatteet 2015-2016. Harjoitus 5 Vastaukset

815338A Ohjelmointikielten periaatteet 2015-2016. Harjoitus 5 Vastaukset 815338A Ohjelmointikielten periaatteet 2015-2016. Harjoitus 5 Vastaukset Harjoituksen aiheena ovat aliohjelmat ja abstraktit tietotyypit sekä olio-ohjelmointi. Tehtävät tehdään C-, C++- ja Java-kielillä.

Lisätiedot

1. Mikä on lukujen 10, 9, 8,..., 9, 10 summa? 2. Mikä on lukujen 10, 9, 8,..., 9, 10 tulo? =?

1. Mikä on lukujen 10, 9, 8,..., 9, 10 summa? 2. Mikä on lukujen 10, 9, 8,..., 9, 10 tulo? =? Tehtävät 1 1. Mikä on lukujen 10, 9, 8,..., 9, 10 summa? 2. Mikä on lukujen 10, 9, 8,..., 9, 10 tulo? 3. 16 125 250 =? 4. Kirjoita lausekkeeseen sulut siten, että tulos on nolla. 2 + 2 2 2 : 2 + 2 2 2

Lisätiedot

Esimerkkiprojekti. Mallivastauksen löydät Wroxin www-sivuilta. Kenttä Tyyppi Max.pituus Rajoitukset/Kommentit

Esimerkkiprojekti. Mallivastauksen löydät Wroxin www-sivuilta. Kenttä Tyyppi Max.pituus Rajoitukset/Kommentit Liite E - Esimerkkiprojekti E Esimerkkiprojekti Olet lukenut koko kirjan. Olet sulattanut kaiken tekstin, Nyt on aika soveltaa oppimiasi uusia asioita pienen, mutta täydellisesti muotoiltuun, projektiin.

Lisätiedot

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

Merkkijono määritellään kuten muutkin taulukot, mutta tilaa on varattava yksi ylimääräinen paikka lopetusmerkille: Merkkijonot C-kielessä merkkijono on taulukko, jonka alkiot ovat char -tyyppiä. Taulukon viimeiseksi merkiksi tulee merkki '\0', joka ilmaisee merkkijonon loppumisen. Merkkijono määritellään kuten muutkin

Lisätiedot

Luokat. Luokat ja olio-ohjelmointi

Luokat. Luokat ja olio-ohjelmointi Luokat 12 Luokat Tässä luvussa laajennamme edellisessä luvussa käsittelemäämme struktuurityyppiä ja siirrymme yhteen C++-ohjelmoijan kaikkein tärkeimmistä välineistä: luokkiin. Käsittelemme myöskin joitakin

Lisätiedot

5/20: Algoritmirakenteita III

5/20: Algoritmirakenteita III Ohjelmointi 1 / syksy 2007 5/20: Algoritmirakenteita III Paavo Nieminen [email protected] Tietotekniikan laitos Informaatioteknologian tiedekunta Jyväskylän yliopisto Ohjelmointi 1 / syksy 2007 p.1/17 Tämän

Lisätiedot

811120P Diskreetit rakenteet

811120P Diskreetit rakenteet 811120P Diskreetit rakenteet 2016-2017 1. Algoritmeista 1.1 Algoritmin käsite Algoritmi keskeinen laskennassa Määrittelee prosessin, joka suorittaa annetun tehtävän Esimerkiksi Nimien järjestäminen aakkosjärjestykseen

Lisätiedot

Python-ohjelmointi Harjoitus 5

Python-ohjelmointi Harjoitus 5 Python-ohjelmointi Harjoitus 5 TAVOITTEET Kerrataan silmukkarakenteen käyttäminen. Kerrataan jos-ehtorakenteen käyttäminen. Opitaan if else- ja if elif else-ehtorakenteet. Matematiikan sisällöt Tehtävät

Lisätiedot

// Tulostetaan double-tyyppiseen muuttujaan "hinta" tallennettu // kertalipun hinta ja vaihdetaan riviä. System.out.printf("%.1f euros.

// Tulostetaan double-tyyppiseen muuttujaan hinta tallennettu // kertalipun hinta ja vaihdetaan riviä. System.out.printf(%.1f euros. Lue kukin tehtävänanto huolellisesti ja kokonaisuudessaan ennen kuin aloitat vastaamisen. Kustakin tehtävästä voi saada 0 6 pistettä. Tentin läpipääsyraja on 12 / 24 pistettä. Ratkaisut palautetaan WETO-järjestelmään

Lisätiedot

Luento 5. Timo Savola. 28. huhtikuuta 2006

Luento 5. Timo Savola. 28. huhtikuuta 2006 UNIX-käyttöjärjestelmä Luento 5 Timo Savola 28. huhtikuuta 2006 Osa I Shell-ohjelmointi Ehtolause Lausekkeet suoritetaan jos ehtolausekkeen paluuarvo on 0 if ehtolauseke then lauseke

Lisätiedot

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin peruskurssi Y1 Ohjelmoinnin peruskurssi Y1 CSE-A1111 21.9.2016 CSE-A1111 Ohjelmoinnin peruskurssi Y1 21.9.2016 1 / 22 Mahdollisuus antaa luentopalautetta Goblinissa vasemmassa reunassa olevassa valikossa on valinta Luentopalaute.

Lisätiedot

Sisällys. 12. Näppäimistöltä lukeminen. Yleistä. Yleistä 12.1 12.2 12.3 12.4

Sisällys. 12. Näppäimistöltä lukeminen. Yleistä. Yleistä 12.1 12.2 12.3 12.4 Sisällys 12. Näppäimistöltä lukeminen Arvojen lukeminen näppäimistöltä yleisesti. Arvojen lukeminen näppäimistöltä Java-kielessä.. Luetun arvon tarkistaminen. Tietovirrat ja ohjausmerkit. Scanner-luokka.

Lisätiedot

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python Ohjelmoinnin perusteet Y Python T-106.1208 25.2.2009 T-106.1208 Ohjelmoinnin perusteet Y 25.2.2009 1 / 34 Syötteessä useita lukuja samalla rivillä Seuraavassa esimerkissä käyttäjä antaa useita lukuja samalla

Lisätiedot

Metropolia ammattikorkeakoulu 05.02.2015 TI00AA43-3004: Ohjelmointi Kotitehtävät 3

Metropolia ammattikorkeakoulu 05.02.2015 TI00AA43-3004: Ohjelmointi Kotitehtävät 3 : http://users.metropolia.fi/~pasitr/2014-2015/ti00aa43-3004/kt/03/ratkaisut/ Tehtävä 1. (1 piste) Tee ohjelma K03T01.cpp, jossa ohjelmalle syötetään kokonaisluku. Jos kokonaisluku on positiivinen, niin

Lisätiedot