C++-KIELI. Versio 4.0

Koko: px
Aloita esitys sivulta:

Download "C++-KIELI. Versio 4.0"

Transkriptio

1 C++-KIELI Versio 4.0

2 RAJOITUKSET Kunnes toisin määrätään, tätä materiaalia voivat monistaa omaan henkilökohtaiseen käyttöön OAMK/Tekniikan yksikön opiskelijat. Tämän materiaalin käyttö kaikenlaisessa kaupallisessa toiminnassa on kielletty. Materiaalin edelleen levitys on myös kielletty. Materiaalin laittaminen imuroitavaksi esimerkiksi omille kotisivuille on kielletty. Omille kotisivuille voi laittaa ainoastaan linkin, josta pääsee sivuilleni, missä tämä materiaali on ladatavissa/imuroitavissa omalle koneelle. Copyrights Markku Rahikainen All Rights Reserved. 1

3 ALKUSANAT Tämä materiaali käsittelee suurimmaksi osaksi C++-kielen keskeisiä olio-piirteitä, joitakin C++-kielen perusasioita on materiaalin alkuun sijoitettu. Lisäksi materiaalin loppuun on sijoitettu kolme osaa, jotka käsittelevät kellonajan ja tiedostojen käsittelyä sekä nimiavaruuden käyttöä. Materiaali ei ole täydellinen oppikirja, vaan se on tehty osaksi Oulun seudun ammattikorkeakoulun / Tekniikan yksikön olio-ohjelmointi kurssin kurssimateriaalia. Materiaali on koottu monista eri lähteistä. Keskeisenä ajatuksena on ollut juuri se, että keskeisimmät olio-ohjelmoinnin piirteet on saatu esitettyä. Copyrights Markku Rahikainen All Rights Reserved. 2

4 SISÄLLYSLUETTELO 1. JOHDANTO C OLIO-OHJELMOINTI C++ TYYLINEN TULOSTUS: CIN JA COUT COUT CIN ESIMERKKEJÄ HARVASTI.CPP EHTO- JA VERTAILULAUSEET TOTUUSARVOT IF-LAUSE SWITCH-LAUSE OPERAATTORI?: SILMUKAT FOR-SILMUKKA WHILE-SILMUKKA DO-SILMUKKA ESIMERKKEJÄ LUUPPEJA.CPP ASCIIT.CPP CONTINUE.CPP TYYPIT, MUUTTUJAT JA VAKIOT TYYPPIEN YLEISESITTELY PERUSTIETOTYYPIT JA MERKKIJONO KOKONAISLUVUT REAALILUVUT TOTUUSARVO BOOL MERKKI MERKKIJONO C++-TYYLINEN STRING-MERKKIJONO VAKIOT ENUM CONST #DEFINE MAKRO TAULUKKO TIETUE STRUCT OSOITTIMET OSOITINOPERAATTORIT...32 Copyrights Markku Rahikainen All Rights Reserved. 3

5 5.7.2 OSOITTIMET TIETUEESEEN ESIMERKKEJÄ STRINGIT.CPP TUNNUKSET JA MUUTTUJAT TUNNUSTEN MÄÄRITTELYALUE JA NÄKYVYYSALUE GLOBAALIIN MUUTTUJAAN VIITTAUS ::-OPERAATTORILLA TUNNUKSEN ELINIKÄ VARATUT SANAT OPERAATTORIT C++-STANDARDIKIRJASTO ESIKÄSITTELIJÄ OTSIKKOTIEDOSTOT C++-OTSIKKOTIEDOSTOJEN KÄYTTÖ ( UUSI TAPA ) UUDISTETTUJEN C-OTSIKKOTIEDOSTOJEN KÄYTTÖ VANHEMPIEN C- JA C++-OTSIKKOTIEDOSTOJEN KÄYTTÖ FUNKTIOT MÄÄRITTELY FUNKTION ESITTELY FUNKTION KUTSU FUNKTION MÄÄRITYS ESIMERKKEJÄ PARAMETRIT PERUSTYYPIT ARGUMENTTEINA OSOITINPARAMETRI TIETUETYYPPINEN PARAMETRI TAULUKKOTYYPPINEN PARAMETRI ALIOHJELMIEN KUORMITUS (OVERLOADING) ONGELMATILANTEITA LUETELLUN TYYPIN (ENUM) KUORMITUS ESIMERKKEJÄ SUURUUS.CPP VIITTAUS VIITTAUSMUUTTUJA (REFERENSSIMUUTTUJA) NULL-OSOITTIMET JA NULL-VIITTAUKSET VIITTAUS TIETUEESEEN VIITTAUS OSOITTIMEEN PERUSTIETOTYYPPI MUUTTUJAPARAMETRINA (VIITTAUS-PARAMETRI) VIITTAUSPARAMETRINA VÄLIAIKAINEN MUUTTUJA DYNAAMINEN MUISTI MUISTINHALLINNAN OPERAATTORIT NEW-OPERAATTORI DELETE-OPERAATTORI TAULUKON DYNAAMINEN KÄSITTELY YKSIULOTTEINEN TAULUKKO...66 Copyrights Markku Rahikainen All Rights Reserved. 4

6 16. LUOKKA JA OLIO LUOKKA OLIOT JA NIIDEN KOMMUNIKOINTI VALMIIDEN LUOKKIEN KÄYTTÖ LUOKKATYYPIT (CLASS TYPES) YLLÄPIDETTÄVYYS JA UUDELLEENKÄYTETTÄVYYS LUOKAN MÄÄRITTELYSSÄ KÄYTETTÄVÄT TYYPIT UNION-MÄÄRE STRUCT-MÄÄRE CLASS-MÄÄRE LUOKKAN MÄÄRITTELY LUOKKATYYPPI CLASS REKURSIO TYHJÄ LUOKKA ALIOHJELMAJÄSENET ESIMERKKEJÄ AUTO.CPP ELAIMET.CPP OLIOIDEN MUISTINVARAUSLUOKAT OLION LUONTI ELI TILANVARAUS AUTOMAATTISEN OLION ESITTELY JA MÄÄRITTELY DYNAAMISEN OLION ESITTELY JA MÄÄRITTELY OLION ESITTELY JA MÄÄRITTELY ERIKSEEN OLION ESITTELY JA MÄÄRITTELY YHTÄAIKAISESTI STAATTISEN OLION ESITTELY JA MÄÄRITTELY OLION TILANVAPAUTUS KONSTRUKTORI (CONSTRUCTOR) OLION LUONTI JA TUHOAMINEN OLION TIETOJÄSENTEN ALUSTUS OLETUSARVOILLA JA OLETUSMUODOSTIN OLION TIETOJÄSENTEN ALUSTUS MÄÄRÄTYILLÄ ARVOILLA JA PARAMETRILLINEN MUODOSTIN KOPIOINTIMUODOSTIN ESIMERKKEJÄ STACK.CPP HAJOTIN (DESTRUCTOR) DYNAMISIA TIETOJÄSENIÄ SISÄLTÄVÄN OLION TYHJENNYS JA HAJOTIN ESIMERKKEJÄ STACKD.CPP THIS-OSOITIN (THIS-POINTER, THIS-POINTTERI) PARAMETRILLA JA DATAJÄSENELLÄ SAMA NIMI MALLIT (TEMPLATES) ALIOHJELMAMALLIT LUOKKAMALLIT (CLASS TEMPLATE) ESIMERKKEJÄ STACKT.CPP Copyrights Markku Rahikainen All Rights Reserved. 5

7 26. OPERAATTOREIDEN KUORMITUS (OPERATOR OVERLOADING) SYÖTTÖ- JA TULOSTUSOPERAATTORIT >> JA << ESIMERKKEJÄ DARRAY.CPP LUOKAN YSTÄVÄT (FRIEND) ESIMERKKEJÄ FRIEND01.CPP JOHDANTO PERIYTYMISEEN PERIYTYMISEN KÄYTTÖTILANTEITA ALILUOKAN PALVELULIITTYMÄN LAAJENTAMINEN ALILUOKAN TOTEUTTAJAN NÄKÖKULMASTA TOTEUTUSTAVAN PERIYTYMINEN YLILUOKAN MÄÄRITTELY NÄKYVYYSSÄÄNNÖT YLILUOKASSA YLILUOKAN PALVELULIITTYMÄN JA TOTEUTUKSEN PERIYTYMISEN SUUNNITTELU ALILUOKAN MÄÄRITTELY ALILUOKAN METODIEN SUUNNITTELU MUODOSTIMIEN JA HAJOTTIMIEN SUORITUSJÄRJESTYS YLILUOKAN MUODOSTIMEN KUTSUMINEN VIRTUAALINEN METODI (VIRTUAL FUNCTION) TOTEUTUSTAVAN PERIYTYMINEN PROTECTED- JA PRIVATE-PERIYTYMISTAVOILLA YLILUOKAN NÄKYVYYS ALILUOKAN ASIAKKAIDEN JA TOTEUTTAJAN NÄKÖKULMISTA PERIYTYMISTAVAN VAIKUTUKSEN KUMOAMINEN ESIMERKKEJÄ PANKKII.CPP PANKKIV.CPP KELLONAIKA JA PÄIVÄYS TIEDOSTOT BINÄÄRIMUOTOINEN TIEDOSTOJEN KÄSITTELY TIEDOSTON AVAUS OPEN-METODILLA BINÄÄRITIEDOSTON AVAUS KIRJOITTAMISTA VARTEN BINÄÄRITIEDOSTON AVAUS LUKEMISTA VARTEN TIEDOSTON AVAUKSEN ONNISTUMINEN TIEDOSTON SULKEMINEN CLOSE-METODILLA BINÄÄRITIEDOSTOON KIRJOITTAMINEN WRITE-METODILLA BINÄÄRITIEDOSTOSTA LUKEMINEN READ-METODILLA BINÄÄRITIEDOSTON HAJAKÄSITTELY TEKSTITIEDOSTOJEN KÄSITTELY NIMIAVARUUS (NAMESPACE) NIMIAVARUUDEN MÄÄRITTELY NIMIAVARUUDEN KÄYTTÖÖNOTTO Copyrights Markku Rahikainen All Rights Reserved. 6

8 1. JOHDANTO Oliolähestymistapa (Object-oriented approach) on ajattelutapa, systeemityön lähestymistapa ja ohjelmointitekniikka. Ensimmäinen olio-ohjelmointitekniikoita sisältävä ohjelmointikieli Simula otettiin käyttöön vuonna Seuraavalla vuosikymmenellä varsinaisen lähtölaukauksen olio-ohjelmointi antoi Smalltalk, joka oli luvulla suosittu olio-ohjelmointikieli luvulla suosituimmaksi olio-ohjelmointikieleksi on noussut C++-kieli. Toteutusvälineiden kirjo on nykyisin monipuolinen ohjelmointikielineen ja kehittimineen. Monet välineet lupaavat tukea oliolähestymistavalle. Tuen taso vaihtelee eikä oliokeskeisyys aina ole täydellistä. Lähestymistavoista uusin on oliolähestymistapa, jossa keskeisessä asemassa ovat ohjelmistokomponenttien ylläpidettävyys ja uudelleenkäytettävyys. Näitä ominaisuuksia ei ole kuitenkaan mahdollista saavuttaa ilman kunnollista suunnittelua ja tekniikoiden hallintaa silloinkaan, kun toteutus tapahtuu oliokeskeisellä ohjelmointikielellä. Miksi sitten sana "olio" on nykyaikana keskeisessä asemassa systeemityöstä ja ohjelmointivälineistä puhuttaessa? Olioita hyödyntävään ohjelmointiin liittyy kaksi eri näkökulmaa: Valmiiden luokkien hyödyntäminen. Uudelleenkäytettävien luokkien tuottaminen. Valmiiden luokkien hyödyntäminen tarkoittaa luokkakirjaston käyttöä. Valmiita luokkia käyttäessä ohjelmoija voi luoda olioita luokkiin ja käyttää olioita pyytämällä niiltä valmiiksi määriteltyjä palveluita. Ohjelmoijan on siis tunnettava luokkakirjaston luokkarakenne ja kunkin luokan vastuulla olevat palvelut. Oliot kapseloivat sisäänsä ulospäin näkymättömän toteutustapansa. Tämä toteutustavan piilottaminen tukee ylläpidettävyyttä. Ylläpito paikallistuu perinteistä ohjelmointitapaa paremmin tiettyihin ohjelmistokomponentteihin. Uudelleenkäytettävien luokkien tuottaminen tarkoittaa luokkakirjaston rakentamista ja täydentämistä. Tällöin olemassa olevia ohjelmistokomponentteja voidaan uudelleenkäyttää kokoamalla tai periyttämällä niistä uusia komponentteja. Oliokeskeinen ohjelmisto on toistensa kanssa vuorovaikutuksessa toimivien ohjelmistokomponenttien luokkien kokoelma. Ohjelmistojen rakentaminen on tuottavaa, kun ohjelmistoja voidaan koota valmiista testatuista ohjelmistokomponenteista tuottamalla mahdollisimman vähän uutta ohjelmakoodia. Ohjelmistojen rakentamista voidaan verrata esim. autoteollisuuteen. Autotehtailijan ei kannata perustaa uusia tuotantolinjoja eri komponenttien, kuten renkaiden, mittareiden yms. komponenttien tuottamiseksi. Autotehtailija ostaa komponentit ja kokoaa auton valmiista komponenteista. Komponentteja hyödyntäviltä kokoajilta vaaditaan komponenttien liittämistaitoa ja komponentteja valmistavilta tuottajilta vaaditaan yksityiskohtaista tietoutta komponenttien valmistamisesta. Sama pätee ohjelmoijiin: toiset käyttävät ohjelmistokomponentteja eli luokkia ja toiset tuottavat niitä. 1.1 C++ C++ on yleiskäyttöinen, järjestelmäohjelmointiin painottuva ohjelmointikieli. Jonka kantakielenä on C-kieli Joka tukee tiedon abstrahointia Joka tukee olio-ohjelmointia Joka tukee geneeristä ohjelmointia Eli toisin sanoin sama asia: C++ on suunniteltu tukemaan tiedon abstrahointia, olio-ohjelmointia ja geneeristä ohjelmointia sekä perinteisiä C-ohjelmointimenetelmiä näiden rajoituksien alaisena. C-kieli on puolestaan kehitetty BCPL-kielestä. Seuraavassa kuvassa on esitetty kielet joista C++-kieli on saanut vaikutteita. Copyrights Markku Rahikainen All Rights Reserved. 7

9 BCPL Algol68 Simula67 Ada CLU C C++ Kuva 1-1. Kielet joista C++-kieli on saanut vaikutteita. Simula67:sta C++ on saanut seuraavat piirteet: Luokka-käsitteen Periytymisen Virtuaali-funktiot Algol68:sta C++ on saanut seuraavat piirteet: Operaattoreiden ylikuormitus Ada-kielestä C++ on saanut seuraavat piirteet: Geneerisyyttä Luokkamallit CLU-kielestä C++ on saanut seuraavat piirteet: Poikkeuskäsittelymekanismeja 1.2 Olio-ohjelmointi Olio-ohjelmointi on ohjelmointimenetelmä paradigma tai kaava, jonka mukaisesti kirjoitetaan ohjelmia ongelmien ratkaisemiseksi. Jos termi olio-ohjelmointikieli yleensä tarkoittaa jotakin, se tarkoittaa ohjelmointikieltä, jonka mekanismit tukevat olio-ohjelmointityyliä hyvin. Tärkeää on havaita seuraava ero: Kielen sanotaan tukevan tiettyä ohjelmointityyliä, jos sen ominaisuudet tekevät kyseisellä tavalla ohjelmoimisen mukavaksi (melko helpoksi, turvalliseksi ja tehokkaaksi). Kieli ei tue ohjelmointityyliä, jos kyseisten ohjelmien kirjoittaminen vaatii poikkeuksellisia ponnistuksia tai taitoja; se vain mahdollistaa tyylin käyttämisen. Voimme esimerkiksi kirjoittaa olio-ohjelmia C-kielellä, mutta se on tarpeettoman hankalaa, koska kielessä ei ole suoraa tukea tälle menetelmälle. Copyrights Markku Rahikainen All Rights Reserved. 8

10 2. C++ TYYLINEN TULOSTUS: cin JA cout Pääohjelman nimi on aina main. C++-kielessä pääohjelman määrittelytapoja on useita. Alkuperäisen C-kielen mukaisen pääohjelman tyyppi on void mikä tarkoittaa, että funktio main ei palauta mitään kutsuvalle ohjelmalle. Voidaan ajatella, että käyttöjärjestelmä kutsuu funktiota main silloin, kun ohjelma suoritetaan tietokoneessa. C++-kielen pääohjelman rakenne on esitetty kuvassa 2-1. int main () lauseet return 0 ; Kuva 2-1. Pääohjelma määrittely. C++-kielen otsikkotiedostojen käytön uusi tapa on esitetty kuvassa 2-2. Uudet otsikkotiedostot eivät sisällä.htarkenninta. std-nimiavaruuden käyttöönotto tapahtuu ohjelmassa yhden kerran, vaikka sisällytettäviä C++otsikkotiedostoja olisi useita. #include <iostream> using namespace std ; Kuva 2-2. C++-kielen otsikkotiedostojen käyttö. 2.1 cout Kuvassa 2-3 on esitetty esimerkki cout-tulostusolion käytöstä. cout on tulostusolio joka symboloi ohjelmassa näyttöruutua. Tulostusoperaattorilla << siirretään tulostusvirtaan tulostettavat tekstit ym. tulostusoliolle cout. cout lausutaan see-aut. cout ym. input/output toimintoihin liittyvät asiat on määritelty tiedostossa iostream.h tai iostream riippuen siitä käytetäänkö perinteistä vai uutta nimeämistapaa. // // eka.cpp // // C++ ohjelmissa kommentit ovat tallaisia. // Kahden perakkaisen kauttaviivan jalkeen tuleva // teksti aina rivin loppuun saakka on kommenttia. /* Myos C-kielen tyyliset kommentit ovat sallittuja, silla C++ on laajennus C-kielesta. */ #include <iostream> using namespace std ; int main () cout << "\n\n\n Hello, world. \n\n\n" ; return 0 ; Kuva 2-3. cout tulostusolion käyttöesimerkki. Copyrights Markku Rahikainen All Rights Reserved. 9

11 Kuva 2-4. Edellisen esimerkin tulostus. 2.2 cin C++ ohjelmissa näppäimistöltä voidaan lukea tekstiä näppäimistöä edustavan cin-olion [ see-in ] avulla (cin siis edustaa ohjelmalle näppäimistöä ja sieltä syötettävää tietovirtaa). Yleisesti ottaen kun tietovirran lukuoperaattorilla >> luetaan näppäimistöoliolta cin tavaraa ohjelmaan sisään, välilyönnit toimivat tavaran osien erottimina. Tämän vuoksi välilyöntejä sisältävien merkkijonojen luku ei onnistu. Em. kaltaisten stringien lukemiseen voi käyttää funktiota getline. #include <iostream> using namespace std ; int main () int Ika ; char Nimi [12] ; cout << "Syota ika ja nimi: " ; cin >> Ika >> Nimi ; cout << "\nnimi oli siis " << Nimi ; cout << " ja ika " << Ika ; cout << "\n" ; cout << endl ; return 0 ; Kuva 2-5. Tiedon lukeminen cin-olion avulla. Kuva 2-6. Edellisen esimerkin tulostus. Copyrights Markku Rahikainen All Rights Reserved. 10

12 2.3 Esimerkkejä Harvasti.cpp Tässä ohjelmassa funktiosta main kutsutaan funktiota tulosta_harvasti. Koska kutsuttavan funktion varsinainen ohjelmakoodi on kirjoitettu vasta kutsuvan funktion jälkeen, tulee kutsuttava funktio esitellä prototyyppinä. Huomaa myös se, että koska funktio tulosta_harvasti ei palauta mitään, niin sen paluuarvon tyyppi on void (void on näennäistyyppi ja tarkoittaa tyhjää ja yms.). Samoin on huomattavaa myös se, että funktiolle tulosta_harvasti välitetään yksi parametri, joka on tulostettava stringi (annettu_stringi [ ]). Eli funktio ottaa yhden argumentin joka on stringi, siis taulukko tyyppiä char. Koska taulukot eivät kopioidu kutsuttavaan ohjelmaan (funktioon), niin niiden kokoa ei tarvitse määritellä, vaan tyhjät hakasulut riittävät. void tulosta_harvasti ( char annettu_stringi [ ] ) ; Stringivakiot määritellään kaksoisheittomerkkien väliin. Kun stringi presidentin_rouva alustetaan samalla kun se määritellään. Kun hakasulkujen sisällä ei kerrota stringin kokoa, niin kääntäjä tekee stringistä automaattisesti niin suuren kuin sille annettaan alustuksessa merkkejä. Tässä tapauksessa stringin koko tulee olemaan 16 tavua (tila näkyville merkeille ja stringin päättävälle nollalle eli NULLille). char presidentin_rouva [ ] = "Pertti Arajarvi" ; #include <iostream> using namespace std ; // Seuraava on funktion tulosta_harvasti prototyyppi. // Prototyyppi tarvitaan jos funktion ohjelmakoodi // kirjoitetaan vasta funktion kutsumisen jalkeen. void tulosta_harvasti ( char annettu_stringi [ ] ) ; int main () cout << "\n Seuraavassa tulostetaan stringeja harvasti:" << "\n\n" ; tulosta_harvasti ( "Tarja Halonen" ) ; char presidentin_rouva [ ] = "Pertti Arajarvi" ; cout << "\n\n" ; tulosta_harvasti ( presidentin_rouva ) ; cout << "\n\n" ; return 0 ; void tulosta_harvasti ( char annettu_stringi [ ] ) int stringi_indeksi = 0 ; while ( annettu_stringi [ stringi_indeksi ]!= 0 ) cout << " " << annettu_stringi [ stringi_indeksi ] ; stringi_indeksi ++ ; Kuva 2-7. Esimerkki ohjelma Harvasti.cpp. Copyrights Markku Rahikainen All Rights Reserved. 11

13 Kuva 2-8. Edellisen esimerkin tulostus. Copyrights Markku Rahikainen All Rights Reserved. 12

14 3. EHTO- JA VERTAILULAUSEET Ehtolausekkeita käytetään vertailu- ja toistolauseissa ohjelman suorituksen ohjaamiseksi. Ehtolausekkeet esitetään sulkeissa ja ne muodostetaan operandeista, vertailuoperaattoreista ja loogisista operaattoreista. Operandit voivat olla muuttujia, vakioita tai lausekkeita. Seuraavassa taulukossa on esitetty C++-kielen vertailuoperaattorit. Vertailuoperaattorit palauttavat totuusarvon true, jos vertailu on tosi, ja muuten arvon false. TAULUKKO C++-kielen vertailuoperaattorit Operaattori Merkitys = = Yhtäsuuruus! = Erisuuruus > Suurempi kuin > = Suurempi tai yhtäsuuri kuin < Pienempi kuin < = Pienempi tai yhtäsuuri kuin Seuraavassa taulukossa on esitetty C++-kielen loogiset operaattorit. TAULUKKO C++-kielen loogiset operaattorit Operaattori Merkitys & & Ja Tai! Ei 3.1 Totuusarvot Alkuperäiset C++-kielen totuusarvot tulevat C-kielestä, jossa ehtolauseke on tosi, jos sen arvo on nollasta poikkeava. Ehtolauseke on epätosi, jos sen arvo on nolla. C++-kieleen on lisätty totuusarvotyyppi bool, jolla ilmaistaan loogisten operaatioiden tuloksia. Totuusarvotyypillä bool voi olla kaksi arvoa: true (tosi) tai false (epätosi) bool- ja int-tyypit ovat yhteensopivia, true vastaa lukua 1 ja false lukua 0. Tyyppimuunnostilanteissa luku 1 muuntuu true-arvoksi ja luku 0 false-arvoksi. Tyyppimuunnos toimii myös bool-arvosta int-arvoksi. void Funktio (int a, int b) bool b1 = a == b ; // = tarkoittaa sijoitusta ja = = yhtäsuuruutta. // // Jos a on yhtä suuri kuin b, b1 on true; muuten b1 on false. Kuva 3-1. Esimerkki bool-tyypistä. Määritelmän mukaan true vastaa kokonaisluvuksi muunnettuna arvoa 1 ja false arvoa 0. Vastaavasti kokonaisluvut voidaan muuntaa automaattisesti totuusarvoiksi; nollasta poikkeavasta kokonaisluvusta tulee true ja nollasta false. Esimerkiksi: bool b = 7 ; // bool (7) on tosi, joten b on true. int i = true ; // int (true) on 1, joten i on 1. Copyrights Markku Rahikainen All Rights Reserved. 13

15 Aritmeettisissa ja loogisissa lausekkeissa totuusarvot muuttuvat int-arvoiksi, ja muunnettuja arvoja käsitellään loogisilla operaatioilla ja kokonaislukujen aritmeettisilla operaatioilla. Jos tulos muunnetaan takaisin totuusarvoksi, nollasta tulee false ja nollasta poikkeavasta arvosta true. Esimerkki: void Funktio ( ) bool a = true ; bool b = true ; bool x = a + b ; // a + b on 2, joten x on true. bool y = a / b ; // a / b on 1, joten y on true. 3.2 if-lause if-lausetta käytetään tiedon vertailuun. Seuraavassa on esitetty if-lauseen perusrunko. if ( lauseke ) lauset ; else lauset ; if-lauseen else-haara ei ole pakollinen. if-lausetta voidaan myös ketjuttaa seuraavaan tapaan. if ( lauseke ) lauset ; else if ( lauseke ) lauset ; else if ( lauseke ) lauset ; else lauset ; Järjestelmä suorittaa ensimmäisen if-lauseen lohkossa olevat lauseet, jos lausekkeen arvo on tosi. Muussa tapauksessa järjestelmä suorittaa seuraavan if-lauseen lohkossa olevat lauseet, jos sen lohkon ehto on tosi. Jos minkään if-lauseen lohkon ehto ei ole tosi, niin sitten suoritetaan else-haaran sisältämät lauseet, jos else-haara on olemassa. #include <iostream> using namespace std ; int main () int luku ; cout << "Syota luku: " ; cin >> luku ; Copyrights Markku Rahikainen All Rights Reserved. 14

16 if (luku < 0) luku = luku * -1 ; cout << "\nluku on positiivisena: " << luku << "\n\n" ; else cout << "\nluku on positiivinen \n\n" ; return 0 ; Kuva 3-2. Esimerkki if-rakenteen käytöstä. Kuva 3-3. Edellisen esimerkin tulostus. 3.3 switch-lause switch-lauseessa haarautuminen tapahtuu tutkittavan lausekkeen vakioarvon perusteella. switch-rakenteessa tutkitaan, vastaako testattavan lausekkeen arvo yhdessäkän case-haarassa määriteltyä vakioarvoa. casehaarassa olevat lauseet suoritetaan, kunnes tulee vastaan break-lause. break-lause siirtää kontrollin switchrakenteen loppuun. Jos case-haaran lopussa ei ole break-lausetta, ohjelman suoritus jatkuu suoraan seuraavaan case-lohkoon. switch ( lauseke ) case : // Lauseet break ; case : // Lauseet break ; case : // Lauseet break ; default : // Lauseet break ; switch-lauseella voidaan korvata ketjutetut if-lauseet. switch-lause voi sisältää useita eri vakioarvoihin liittyviä case-haaroja. Tutkittavan lauseen arvon on oltava kokonaislukutyyppiä tai siihen muunnettavaa typpiä (esim. char, bool, enum). case-haarassa ei saa esitellä sellaisia paikallisia muuttujia, jotka alustetaan määrittelyssä. Esittely ja alustus voi esiintyä erikseenkin. #include <iostream> using namespace std ; Copyrights Markku Rahikainen All Rights Reserved. 15

17 int main ( ) char Merkki ; cout << " Syota +, -, * tai / merkki: " ; cin >> Merkki ; switch (Merkki) case '+' : cout << " Merkki on + " << endl ; break ; case '-' : cout << " Merkki on - " << endl ; break ; case '*' : cout << " Merkki on * " << endl ; break ; case '/' : cout << " Merkki on / " << endl ; break ; default : cout << " Merkki on tuntematon!" << endl ; return 0 ; Kuva 3-5. Esimerkki switch-rakenteen käytöstä. Kuva 3-4. Kuvan 3-5 esimerkin tulostus. 3.4 Operaattori?: Operaattori?: on ehto-operaattori. Ehto-operaattorissa on kolme operandia. Operaattorin rakenne on esitetty kuvasa 3-6. Ehtolause? Tosilauseke : Epätosilauseke Kuva 3-6. Ehto-operaattorilauseen rakenne. Jos, Ehtolause on tosi, niin suoritetaan Tosilauseke muutoin Epätosilauseke. #include <iostream> using namespace std ; int main ( ) int Luku ; int EkaLuku, TokaLuku ; Copyrights Markku Rahikainen All Rights Reserved. 16

18 cout << "Syota eka luku: " ; cin >> EkaLuku ; cout << "Syota toka luku: " ; cin >> TokaLuku ; Luku = (EkaLuku > TokaLuku)? EkaLuku : TokaLuku ; cout << "\nsuurempi luku on " << Luku << " tai luvut ovat yhtasuuria!\n\n" ; return 0 ; Kuva 3-7. Esimerkki ehto-operaattorin käytöstä. Kuva 3-8. Edellisen esimerkin tulostus. Copyrights Markku Rahikainen All Rights Reserved. 17

19 4. SILMUKAT Silmukat (luupit) eli toistolauseet muodostetaan for-, while- tai do-lauseesta. 4.1 for-silmukka for-luuppi on tarkoitettu melko säännöllisten silmukoiden muodostamiseen. for-luuppia käytetään usein taulukoiden käsittelyssä. for-luuppi: for ( Aloituslauseke ; Toistoehto ; Toistolauseke) Toistettavat lauseet ; Aloituslauseke sisältää sen lausekkeen, joka suoritetaan ohjelman suorituksen tullessa toistorakenteeseen. Aloituslauseke suoritetaan vain yhden kerran. Toistoehto määrää sen, kuinka monta kertaa toistettavat lauseet suoritetaan. Toistettavien lauseiden toistaminen loppuu, kun toistoehdon totuusarvo on epätosi. Toistolauseke suoritetaan jokaisen toistokerran lopuksi. #include <iostream> using namespace std ; int main () for (int i=0; i<5 ; i++) cout << "Kierros nro.: " << i << endl ; return 0 ; Kuva 4-1. Esimerkki for-luupista. Kuva 4-2. Edellisen esimerkin tulostus. 4.2 while-silmukka while-luuppi on alkuehtoinen toistolause. Alkuehtoisessa toistolauseessa järjestelmä päättelee toistoehdon arvon ensin ja suorittaa sen jälkeen toistettavat lauseet, jos ehto on tosi. while-luuppi: Copyrights Markku Rahikainen All Rights Reserved. 18

20 while ( Toistoehto ) Toistettavat lauseet ; Järjestelmä suorittaa toistettavia lauseita niin kauan, kunnes toistoehto on epätosi. Lauseita ei suoriteta yhtään kertaa, jos toistoehto on epätosi jo while-rakenteeseen tultaessa. #include <iostream> using namespace std ; int main () int Laskuri = 0 ; while (Laskuri < 5) cout << "Kierros nro.: " << Laskuri << endl ; Laskuri++ ; return 0 ; Kuva 4-3. Esimerkki while-luupista. Kuva 4-4. Edellisen esimerkin tulostus. 4.3 do-silmukka do-luuppi on loppuehtoinen toistolause. Loppuehtoisessa toistolauseessa järjestelmä suorittaa toistettavat lauseet ainakin yhden kerran, koska toistoehto sijaitsee toistorakenteen lopussa. do-luuppi: do Toistettavat lauseet ; while ( Toistoehto ) ; Toisto loppuu, kun toistoehto saa arvon epätosi. Huomattavaa on se, että lausekkeen loppusulun jälkeen on puolipiste. Copyrights Markku Rahikainen All Rights Reserved. 19

21 #include <iostream> using namespace std ; int main () int Laskuri = 0 ; do cout << "Kierros nro.: " << Laskuri << endl ; Laskuri++ ; while (Laskuri < 5) ; return 0 ; Kuva 4-5. Esimerkki do-luupista. Kuva 4-6. Edellisen esimerkin tulostus. 4.4 Esimerkkejä Luuppeja.cpp #include <iostream> using namespace std ; int main () int tulostuslaskuri = 2 ; cout << "\n Seuraavat 2 tulostusta tehdaan while-luupilla:\n" ; while ( tulostuslaskuri > 0 ) cout << "\n Hello, world. " ; tulostuslaskuri -- ; cout << "\n\n Seuraavat 3 toivotusta tehdaan for-luupilla:\n" ; for ( int toivotusten_lukumaara = 0 ; toivotusten_lukumaara < 3 ; toivotusten_lukumaara ++ ) cout << "\n Hyvaa uutta vuotta 2000!!! " ; cout << "\n\n Seuraavat rivit tekee do-while silmukka:\n" ; int tulostettujen_lauseiden_lukumaara = 0 ; Copyrights Markku Rahikainen All Rights Reserved. 20

22 do cout << "\n All work and no play makes Jack a dull boy." ; tulostettujen_lauseiden_lukumaara ++ ; while ( tulostettujen_lauseiden_lukumaara < 4 ) ; cout << "\n" ; return 0 ; Kuva 4-7. Esimerkki ohjelma Luuppeja.cpp. Kuva 4-8. Edellisen esimerkin tulostus Asciit.cpp #include <iostream> using namespace std ; #include <iomanip> int main () int koodeja_talla_rivilla = 0 ; cout << "\n Nakyvat ASCII-koodatut merkit valilla" << "\n 20H... 7FH ovat seuraavat:\n\n" ; for ( int numeerinen_koodi = 0x20 ; numeerinen_koodi < 0x80 ; numeerinen_koodi ++ ) char ascii_merkki = numeerinen_koodi ; cout << ascii_merkki << " " << hex << numeerinen_koodi << " " ; // hex on I/O manipulaattori. koodeja_talla_rivilla ++ ; if ( koodeja_talla_rivilla == 8 ) cout << "\n" ; koodeja_talla_rivilla = 0 ; return 0 ; Kuva 4-9. Esimerkki ohjelma Asciit.cpp. Seuraavassa kuvassa on Asciit.cpp ohjelman aiheuttama tulostus ruudulle. Ascii-merkit ovat suurin piirtein samat kaikissa tietokoneissa välillä 20H 7FH (0x20 0x7F). Ascii-merkeistä pienikoodisimmat välillä 00H 1FH eivät ole näkyviä merkkejä vaan siellä on sellaisia koodeja kuin esimerkiksi escape-näppäimen koodi ja rivinvaihdon koodi. Copyrights Markku Rahikainen All Rights Reserved. 21

23 Kuva Edellisen esimerkin tulostus. HUOMION ARVOISIA SEIKOJA OHJELMASSA asciit.cpp Koska ohjelmassa Asciit.cpp käytetään niin sanottua input/output manipulaattoria hex, täytyy ohjelmaan inkluudata myös standardi kirjaston tiedosto iomanip tai iomanip.h, jossa input/output manipulaattorit on määritelty. Manipulaattorin hex avulla kokonaisluku saadaan tulostumaan heksalukuna. Tulostettaessa operaattorin << avulla pistetään tulostusvirtaan, oliolle cout, tulostettavat tekstit. Kun ohjelmassa halutaan käyttää heksadesimaalisia arvoja, ne kirjoitetaan etuliitteen 0x avulla. Kääntäjälle 0x20 tarkoittaa samaa kuin 32. Kun numeerinen koodi kopioidaan tyyppiä char olevaan muuttujaan, koodi saadaan tulostumaan merkkinä. char ascii_merkki = numeerinen_koodi ; cout << ascii_merkki << " " << hex << numeerinen_koodi << " " ; Continue.cpp C++-kielessä on lause continue, jolla siirrytään silmukkalauseen loppuun. Kontrolli siirtyy siis toistoehdon vertailuun ennen kuin kaikki toistettavat lauseet on suoritettu loppuun. Seuraavassa on yksinkertainen esimerkki continue-lauseen käytöstä. Esimerkissä käytetään myös break-lausetta. break-lause keskeyttää toistolauseen. Toistolause voidaan siis keskeyttää ennen kuin toistoehdon arvo muuttuu epätodeksi. Kontrolli siirtyy tällöin toistolausetta seuraavaan lauseeseen. #include <iostream> using namespace std ; int main () char merkki ; int lkm = 0 ; cout << "Kirjoita lause (keskeytys CTRL-C): " ; while ( cin.get(merkki) ) if (merkki == '.') break ; if (merkki == ' ') lkm++ ; continue ; // Jos merkki on. eli piste, niin toistot // lopetetaan break-lauseella. // Välilyönnit ohitetaan continue-lauseen avulla. // Laskuri lkm jää näin päivittämättä. Copyrights Markku Rahikainen All Rights Reserved. 22

24 cout << "\nlauseessa oli yhteensa " << lkm << " kirjainta\n\n" ; return 0 ; Kuva Esimerkki ohjelma Continue.cpp. Kuva Edellisen esimerkin tulostus. Copyrights Markku Rahikainen All Rights Reserved. 23

25 5. TYYPIT, MUUTTUJAT JA VAKIOT 5.1 Tyyppien yleisesittely C++-kielen tyypit voidaan jakaa kolmen ryhmään: 1) Perustietotyypit (Fundamental types), joihin kuuluvat Kokonaisluvut: int, short, long Reaaliluvut: float, double, long double Totuusarvot: bool (Vain C++) Merkki: char Näennäistyyppi: void 2) Perustietotyypeistä johdetut tyypit (Derived types), joita ovat Taulukot (Arrays): [ ] Aliohjelmat (Functions): ( ) Osoittimet (Pointers) muuttujaan tai olioon: * Viittaukset (References): & (Vain C++) Vakiot (Constant) Osoittimet (Pointers) luokan jäseniin: ::*.* ->* 3) Luokkatyypit (Class types): class, struct, union Valmiita luokkia standardikirjastossa ja kehitysympäristökohtaisissa luokkakirjastoissa. Lisäksi ohjelmoijan itsensä laatimia olio-ohjelmoinnissa. Perustietotyypit (Fundamental types) ovat kielen sisään rakennettuja valmiita tyyppejä ja niitä käytetään muuttujien määrittelyssä. Johdetut tyypit (Derived types) ovat ohjelmoijan perustietotyypeistä tai luokkatyypeistä johtamia uusia tyyppejä. Luokkatyypit (Class types) ovat tyyppejä, jotka ohjelmoija kokoaa muista tyypeistä. Luokkatyyppi voi siten sisältää erilaisia muuttujia ja aliohjelmia. 5.2 Perustietotyypit ja merkkijono Tässä on esitetty perustietotyypeistä kokonaisluvut, reaaliluvut ja merkit sekä johdettua tyyppiä oleva merkkijonon määrittely ja alustus Kokonaisluvut Kokonaislukutyyppejä ovat short, int ja long. C-kielessä kokonaislukuihin lasketaan kuuluvan myös merkki char, koska merkit tallentuvat ASCII-arvoina. Myös totuusarvo bool luetaan kokonaislukutyypiksi. Kokonaislukujen arvoalueeseen kuuluvat negatiiviset ja positiiviset luvut. Kokonaisluvut voidaan määritellä etumerkittömiksi määreellä unsigned. Tällöin arvoalueeseen kuuluvat vain positiiviset luvut. Copyrights Markku Rahikainen All Rights Reserved. 24

26 Tietotyyppi Arvoalue Tarvittava tila short bittiä (2 tavua) int tai 16 bittiä (2 tavua) tai bittiä (4 tavua) long bittiä (4 tavua) unsigned short bittiä (2 tavua) unsigned bittiä (2 tavua) tai bittiä (4 tavua) unsigned long bittiä (4 tavua) Kuva 5-1. Kokonaislukutyyppien arvoalueet ja varaukseen tarvittava tila. Pelkkä unsigned vastaa tyyppiä unsigned int. int-tyypin arvoalueen ja tilanvarauksen koko on riippuvainen järjestelmästä. Muuttujien tilanvaraukset vaihtelevat järjestelmästä toiseen. C++ takaa kuitenkin seuraavat yleiset tilanvaraussäännöt: short varaa vähintään 16 bittiä, int-tyypin tilanvaraus on vähintään short-tyypin tilanvarauksen kokoinen, long varaa ainakin 32 bittiä ja on vähintään int-tyypin tilanvarauksen kokoinen. Kokonaislukuvakioiden esitysmuodot C++- ja C-kielissä kokonaislukuvakiot voidaan esittää kolmen lukujärjestelmän avulla: 10-järjestelmän lukuina, 8-järjestelmän lukuina tai 16-järjestelmän lukuina. 10-järjestelmä (Decimal) Desimaaliluvut, ensimmäinen vakio numero 1-9. Esim järjestelmä (Octal) Ensimmäinen numero 0, toinen 1-7. Esim. 064 vastaa desimaalilukua 52. UNIX-käyttöjärjestelmässä perinteinen tapa. 16-järjestelmä (Hexadecimal) Ensimmäiset merkit 0x tai 0X, loput numeroita ja a-f tai A-F, jotka edustavat arvoja Esim. 0x34 vastaa desimaalilukua Reaaliluvut Reaaliluvut tallentuvat liukulukumuodossa. Liukulukutyyppejä ovat float, double ja long double. Reaalilukujen sisältö voi olla positiivinen tai negatiivinen. Liukuluku tallettaa arvon kahdessa osassa. Osat ovat mantissa ja eksponentti. Mantissa ilmoittaa merkitsevät numerot, eksponentti skaalattavan desimaalipisteen paikan. Esim mantissa 2.5 voidaan skaalata mm. luvuiksi 0.25 tai 2500 riippuen ilmoitettavasta eksponentista. Eksponentti E3 tarkoittaa samaa kuin 10 potenssiin 3 eli 10 * 10 * 10 eli Eksponentti E-1 tarkoittaa lukua Eksponenttimuotoinen liukuluku 2.5E-1 tarkoittaa desimaalilukua 0.25 ja liukuluku eksponenttimuodossa 2.5E3 tarkoittaa reaalilukua Positiivinen eksponentti skaalaa desimaalipisteen oikealle ja negatiivinen eksponentti vasemmalle. Ohjelmoija voi ilmoittaa reaalilukuvakiot yhtä hyvin tutussa desimaalimuodossa kuin eksponenttimuodossakin. Eksponenttimuoto on hyödyllinen silloin, kun käsitellään erittäin suuria tai erittäin pieniä lukuja. Reaalilukujen tarvitsema tila vaihtelee järjestelmästä toiseen. Tietotyyppi Arvoalue Tarvittava tila float 3.4x x bittiä (4 tavua) double 1.7x x bittiä (8 tavua) long double 3.4x x bittiä (10 tavua) Kuva 5-2. Reaalilukujen arvoalueet ja tilanvaraus (Borland). Liukuluvun tarkkuus määräytyy luvun mantissan mukaan. Luvun mantissa siis sisältää luvun merkitsevät numerot. float-tyyppisellä luvulla mantissan pituus on vähintään 6 numeroa, double-tyyppisillä luvuilla se on vähintään 10 numeroa. Tarkkuus vaihtelee ympäristöstä toiseen. Borland-ympäristöissä float-tyyppisen luvun tarkkuus on 6 numeroa, double-tyyppisen 15 numeroa ja long double tyyppisen luvun tarkkuus on 18 numeroa. Microsoft Visual 6.0 ympäristössä vastaavat tarkkuudet ovat 6, 15 ja 15 numeroa. Copyrights Markku Rahikainen All Rights Reserved. 25

27 Liukuluvuilla laskennassa ovat pyöristysvirheet mahdollisia. Esimerkiksi, jos talletetaan luku floattyyppiseen muuttujaan, putoaa luvun loppuosa 7891 pois, koska mantissan pituus on 6 numeroa. Reaalilukuja alustettaessa desimaaliosa erotetaan pisteellä (.). Jos desimaaliosia ei ole, pistettä ja sitä seuraavia nollia ei tarvitse alustuksessa kirjoittaa. Reaalilukuvakiot ovat tyyppiä double. Jos reaalilukuvakio halutaan float-tyyppiseksi, sen jälkeen on laitettava liite f tai F. Jos reaaliluku halutaan long double tyyppiseksi, sen jälkeen on laitettava liite l tai L. 2.5 // Tyyppi double. 2.5E2 // Tyyppi double. 2.5E2f // Tyyppi float. 2.4L // Tyyppi long double. Kuva 5-3. Esimerkkejä. Kaikki järjestelmät eivät tue f-liitettä. Tällöin voi käyttää vaihtoehtoisesti tyyppimuunnosta: (float) 2.5. Uusimmissa C++-kääntäjäympäristöissä kuten Borland C++ Builder ja Microsoft Visuall C on cfloatotsikkotiedosto (C-versio float.h-otsikkotiedosto), josta voi tutkia järjestelmäkohtaiset liukulukujen mantissan ja eksponentin suurimmat ja pienimmät arvot Totuusarvo bool Totuusarvo bool on uusi tyyppi C++-standardissa. Bool-tyyppiä ei voi käyttää C-kielisissä ohjelmissa. Varattu sana bool esittelee totuusarvoisen tiedon, jonka sisältö voi olla false eli epätosi tai true eli tosi. Totuusarvon false numeerinen arvo on 0 ja totuusarvon true numeerinen arvo on 1. bool-tyyppinen tieto muuntuu siten int-tyyppiseksi. Mikä tahansa numeerinen arvo tai osoitin on muunnettavissa bool-tyyppiseksi. Nolla-arvot ja NULL-arvoiset osoittimet muuntuvat false-arvoiksi, mikä tahansa muu arvo muuntuu true-arvoksi. Varattuja sanoja true ja false voidaan käyttää ohjelmakoodissa vakioina. Totuusarvo voidaan myös tulostaa joko numeerisena tai tekstimuotoisena Merkki Merkkityyppejä ovat char ja unsigned char. Tietotyyppi Arvoalue Tarvittava tila char tai bittiä (1 tavua) unsigned char bittiä (1 tavua) Kuva 5-4. Merkkitiedon arvoalue ja tilanvaraus. Kaikki ASCII-merkit numerot, kirjaimet ja välimerkit voidaan esittää unsigned char tyyppisessä muuttujassa. char-tyyppisessä muuttujassa voidaan esittää pieniä numeroita ja ASCII-merkkejä. Perustietotyypeistä char on ainut, jonka tilanvaraus vastaa tavua (8 bittiä). char-tyyppiä voidaankin käyttää tarvittaessa korvaamaan kielestä puuttuvaa byte-tyyppiä Merkkijono C-kielessä ei ole varsinaista merkkijonotyyppiä, vaan merkkijono on merkkitaulukko, jonka kukin alkio on chartyyppinen ja viimeisen alkion sisältö on \0. Merkkijono on siis perustietotyypistä char johdettu tyyppi. Tätä johdettua tyyppiä on käytetty myös C++-kielessä. Standardointikomitea on hyväksynyt C++-standardiin myös string-luokan, joka mahdollistaa merkkijonon käsittelyn ilman taulukkokäsittelyä. Copyrights Markku Rahikainen All Rights Reserved. 26

28 char Muuttuja [pituus] ; Kuva 5-5. C-tyylisen merkkijonon määrittely merkkitaulukkona. Merkkijonomuuttujan määrittelyssä merkkijonon pituus ilmoitetaan vakiolausekkeella hakasulkeiden välissä [ ]. Pituuteen on laskettava mukaan yksi merkki merkkijonon lopetusmerkkiä \0 varten C++-tyylinen string-merkkijono C++-kielen standardiin on hyväksytty uutena tyyppinä string-luokka, joka toteuttaa merkkijonokäsittelyn. stringluokan käyttö muistuttaa jossain määrin tavallisen monista muista kielistä löytyvän merkkijonotyypin käsittelyä. Tämä tyyppi ei ole käytettävissä C-kielessä. #include <iostream> using namespace std ; #include <string> int main ( ) string Etunimi = Markku ; string Sukunimi = Rahikainen ; cout << endl << Etunimi ; cout << endl << Sukunimi ; return 0 ; Kuva 5-6. C++-tyylinen merkkijono string-luokalla toteutettuna. Markku Rahikainen Kuva 5-7. Edellisen esimerkin tulostus. 5.3 Vakiot C++-kielessä vakioita voidaan määritellä #define-komennolla tai const ja enum märeillä. Näistä #define on esikääntäjän komento ja const ja define ovat varattuja sanoja enum Lueteltua tyyppiä enum olevat vakiot ovat arvoluettelomuotoisia vakioita. Jokainen luettelon tunnus eli symbolinen nimi omaa jonkin kokonaislukuarvon. Ellei erikseen ole määritelty, arvoluettelon vakiot ovat kokonaislukuarvoja nollasta alkaen. Jos luettelon ensimmäisen tunnuksen arvo on 0, niin seuraavan tunnuksen arvo on edellisen arvo plus 1 jne. Tunnukset erotetaan toisistaan pilkulla. Luetellulle tyypille annetaan tyyppitunnus, jonka avulla määritellään varsinainen lueteltua tyyppiä oleva muuttuja. enum Tyyppinimi Arvoluettelo ; Kuva 5-8. Luetellun tyypin määrittely. enum Tyyppinimi Muuttuja Tyyppinimi Muuttuja Kuva 5-9. Lueteltua tyyppiä olevan muuttujan määrittely. Copyrights Markku Rahikainen All Rights Reserved. 27

29 Kuvassa 5-11 on esimerkki enum-tyypin käytöstä. enum Tyyppinimi Arvoluettelo = Muuttuja ; Kuva Luetellun tyypin esittely ja määrittely samalla rivillä. #include <iostream> using namespace std ; enum WEEK_DAY MO=1, TU, WE, TH, FR, SA, SU ; int main ( ) WEEK_DAY Day = FR ; cout << "\npaivan numero on " << Day << "! \n\n" ; cout << "\npaivan numero on " << WEEK_DAY(5) << "! \n\n" ; return 0 ; Kuva Esimerkki enum-tyypin käytöstä. Kuva Edellisen esimerkin tulostus const Varatulla sanalla const voidaan muuttujan arvo määrätä vakioksi. const Tyyppi Tunnus = Arvo ; Kuva Nimetyn vakion määrittelyn syntaksi. #include <iostream> using namespace std ; const int MAX_ARVO = 1000 ; int main () cout << "\nraja-arvo on " << MAX_ARVO << "!\n\n" ; return 0 ; Kuva Esimerkki nimetyn vakion määrittelystä. Copyrights Markku Rahikainen All Rights Reserved. 28

30 Kuva Edellisen esimerkin tulostus #define #define-lauseella määritellään symbolisia nimiä vakioarvoille tai lausekkeille. #define-lauseella määriteltyjen symbolisten vakioiden käyttö selventää ohjelmatekstin luettavuutta ja parantaa ylläpidettävyyttä. #define-lause on esikäsittelijän komento, joten esikäsittelijä korvaa lähdetekstistä esiintyvät symboliset nimet ko. vakioarvoilla. #define PII 3.14 Kuva Symbolisen vakion määrittämisen syntaksi. 5.4 Makro Makroja määritellään #define-lauseella. Makrolle voidaan välittää parametreja ja se voi palauttaa tulosparametrin. Makron nimen ja vasemman sulkeen välissä ei saa olla välilyöntiä. Esikääntäjä kopio makrossa määritellyt koodirivit siihen kohtaan missä makron nimi esiintyy ohjelmakoodissa. #define NIMI ( Parametrit ) Makron_ohjelmakoodi Kuva Makron määrittelyn yleinen muoto. #include <iostream> using namespace std ; #define SUURIN_LUKU(Luku1, Luku2) \ if (Luku1 > Luku2) \ \ cout << "\nluku1 eli " << Luku1 << " on suurempi!\n\n" ; \ \ else \ \ cout << "\nluku1 eli " << Luku1 << " on suurempi!\n\n" ; \ int main () SUURIN_LUKU(100,50) return 0 ; Kuva Esimerkki makron käytöstä. Copyrights Markku Rahikainen All Rights Reserved. 29

31 Kuva Edellisen esimerkin tulostus. 5.5 Taulukko Taulukko voidaan muodostaa perustietotyypeistä, tietuetyypeistä, luokkatyypistä ja johdetuista tyypeistä eli lähes kaiksita tietotyypeistä. Taulukot voivat olla yksi- tai moniulotteisia. Taulukot määritellään kirjoittamalla määrittelyssä muuttujan nimen jälkeen hakasuluissa taulukon koko (Kts. kuva 5-21). Tyyppi Nimi [ Alkioiden_lkm. ] Tyyppi Nimi [ Rivien_lkm. ] [ Sarakkeiden_lkm. ] Kuva Yksi- ja kaksiulotteisen taulukon määritys. int Taulukko [10] = 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 ; int Taulukko [2][5] = 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 ; Kuva Yksi- ja kaksiulotteisen taulukun alustus määrittelyn yhteydessä. 5.6 Tietue Tietuetyyppi on ohjelmoijan itsensä kokoama tietotyyppi. Tietuetyyppi sisältää kenttiä, jotka voivat olla joko perustietotyyppiä tai perustietotyypeistä johdettuja tyyppejä. C++-kielessä tietuetyyppejä voi määritellä varatuilla sanoilla struct tai union struct Ohjelmoijan itsensä tekemää tietuetyyppiä voidaan käyttää samaan tapaan, kuin mitä tahansa perustietotyyppiä. Tietuetyyppiä käytetään tietueiden tilanvaraukseen. Itse tietue tyyppi määritellään varatulla sanalla struct seuraavaan tapaan. struct TIETUETYYPPI // Tietueen kentät. ; Huomattavaa on se, että tietuetyyppi ei varaa tilaa muistista, vaan vasta kun tietuetyyppiä käytetään tietueen tilan varaamiseen, niin tapahtuu tietuetyypin mukainen tilanvaraus muistista. Kuvassa 5-8 on esitetty esimerkki tietuetyypin DATE määrittelystä. Tietuetyyppi sisältää kolme kenttää (Paiva, Kuukausi ja Vuosi). Copyrights Markku Rahikainen All Rights Reserved. 30

32 struct DATE int Paiva ; int Kuukausi ; int Vuosi ; ; Kuva Esimerkki tietuetyypin määrittämisestä. Tietuetyypin avulla voidaan määrittää tietue. Tietue on tietuetyypin mukainen tilanvaraus muistista. Tietueelle annetaan tunnus sen määrittelyn yhteydessä. DATE Paivays ; Kuva Esimerkki tietueen määrittelystä. Samassa struct-määrittelyssä voidaan määritellä tietuetyyppi ja tietuemuuttuja. Tietuemuuttujia voidaan märitellä useitakin samanaikaisesti kirjoittamalla muuttujien nimet pilkuilla erotettuina ennen tietuetyypin määrityksen lopettavaa puolipistettä. struct DATE int Paiva ; int Kuukausi ; int Vuosi ; Paivays, Viimeinen_kayttopaiva ; Kuva Tietuetyypin ja kahden tietuemuuttujan samanaikainen määrittäminen. struct-määrittelyssä voidaan myös jättää tietuetyypin nimeäminen pois ja määritellä pelkästään tietuemuuttuja. struct int Paiva ; int Kuukausi ; int Vuosi ; Date ; Kuva Tietuetyypin määrittäminen jättämällä tietyetyypin nimi pois. DATE Paivays = 13, 12, 2001 ; Kuva Tietueen alustaminen sen määrittelyn yhteydessä. Ohjelmassa tietueen kenttiin voidaan viitata käyttämällä.-operaattoria seuraavasti. Paivays.Vuosi = 2002 ; #include <iostream> using namespace std ; struct OPPILAS char Nimi [40] ; char Aine [30] ; int Arvosana ; ; Copyrights Markku Rahikainen All Rights Reserved. 31

33 struct OPPILAS Luokka [ ] = "Tarja Halonen", "C++", 1, "Martti Ahtisaari", "C++", 2, "Mauno Koivisto", "C++", 3 ; int main () for ( int i=0; i<3; i++ ) cout << Luokka[ i ].Nimi << " " ; cout << Luokka[ i ].Aine << " arvosana " ; cout << Luokka[ i ].Arvosana << "." << endl ; return 0 ; Kuva Esimerkki tietueen määrittämisestä ja käytöstä. Kuva Edellisen esimerkin tulostus. 5.7 Osoittimet Osoittimet ovat muuttujia, joilla voidaan viitata toisiin muuttujiin epäsuorasti. Osoitin voi sisältää keskusmuistiosoitteen. PC-ympäristössä kaikki muuttujat sijaitsevat keskusmuistissa, joten jokaisella muuttujalla on oma keskusmuistiosoitteensa. Osoittimen ja sen sisältämän keskusmuistiosoitteen avulla päästään siis käsiksi muistiin talletettuun tietoon. Osoittimia käytetään mm. dynaamisessa muistinhallinnassa ja aliohjelmien parametreissa Osoitinoperaattorit Osoittimien käsittelyyn käytetään seuraavia operaattoreita: & osoiteoperaattori * sisältöoperaattori Osoiteoperaattorilla & saadaan selville muuttujan osoite keskusmuistissa. Sisältöoperaattorilla * päästään viittaamaan epäsuorasti muuttujan sisältöön. Sisältöoperaattorista voidaan käyttää myös nimeä epäsuoran osoituksen operaattori. Tähti * muuttujan määrittelyn yhteydessä tarkoittaa sitä, että ko. muuttuja on osoitinmuuttuja. Copyrights Markku Rahikainen All Rights Reserved. 32

34 int Luku ; // Muuttujan määrittely int Numero ; // Muuttujan määrittely int *Osoitin ; // Osoitinmuuttujan määrittäminen Luku = 10 ; // Sijoitetaan muuttujaan Luku sisällöksi 10. Osoitin = &Luku ; // Sijoitetaan muuttujan Luku osoite osoitinmuuttujan // Osoite arvoksi. *Osoitin = 20 ; // Sijoitetaan muuttujan Luku arvoksi 20. Numero = *Osoitin ; // Sijoitetaan muuttujan Numero arvoksi 20. Kuva Esimerkkejä osoiteoperaattoreiden käytöstä Osoittimet tietueeseen Tietueen kenttien käsittelyyn käytetään seuraavia operaattoreita:. piste-operaattori -> nuoli-operaattori Piste. -operaattoria käytetään, kun tietuemuuttujaan viitataan tietuemuuttujan nimellä. Nuoli -> operaattoria käytetään, kun tietuemuuttujaan viitataan osoitinmuuttujan kautta. struct TIME // Tietueen määrittely. int Hour ; int Minute ; int Second ; ; TIME Time ; // Tietuemuuttujan määritys. TIME *paika ; // Tietueosoittimen määritys. Time.Hour = 11 ; // Asetetaan tuntikentän arvoksi 11. // Sijoitetaan paika osoittimen arvoksi Time -tietueen keskusmuistiosoite. paika->hour = 10 ; // Muutetaan Time -tietueen Hour -kenttä arvoon 10. Osoitinta käytettäessä tietueen kenttään viitattaessa voidaan käyttää myös * -operaattoria seuraavasti: (*paika).hour = 9 ; // Muutetaan Time -tietueen Hour -kenttä arvoon 9. Kuva Esimerkkejä tietueen kenttien osoittamisesta. Copyrights Markku Rahikainen All Rights Reserved. 33

35 5.10 Esimerkkejä Stringit.cpp // // Stringit.cpp // #include <iostream> using namespace std ; #include #include <iomanip> <string> void tulosta_stringi_monessa_muodossa ( char annettu_stringi[] ) cout << "\n Tekstina: " << annettu_stringi ; cout << "\n Heksana: " << hex ; int stringi_indeksi = 0 ; while ( annettu_stringi[ stringi_indeksi ]!= 0 ) cout << setw ( 4 ) << (int) annettu_stringi [ stringi_indeksi ] ; stringi_indeksi ++ ; cout << "\n Desim.: " << dec ; stringi_indeksi = 0 ; while ( annettu_stringi [ stringi_indeksi ]!= 0 ) cout << setw ( 4 ) << (int) annettu_stringi[ stringi_indeksi ] ; stringi_indeksi ++ ; cout << "\n" ; void main() char formula_autoilija [ 100 ] ; strcpy ( formula_autoilija, "Mika Hakkinen" ) ; cout << "\n Stringin \"" << formula_autoilija << "\" pituus on " << strlen ( formula_autoilija ) << "\n" ; tulosta_stringi_monessa_muodossa ( formula_autoilija ) ; char toinen_autoilija [ ] = "Mika Salo" ; strcpy ( formula_autoilija, toinen_autoilija ) ; tulosta_stringi_monessa_muodossa ( formula_autoilija ) ; formula_autoilija [ 5 ] = 'X' ; formula_autoilija [ 6 ] = 0 ; tulosta_stringi_monessa_muodossa ( formula_autoilija ) ; Kuva Esimerkki stringien ja merkkitiedon käsittelystä. Copyrights Markku Rahikainen All Rights Reserved. 34

36 Kuva Edellisen esimerkin tulostus. Copyrights Markku Rahikainen All Rights Reserved. 35

37 6. TUNNUKSET JA MUUTTUJAT Tunnus (Identifier) on muuttujan, vakion, aliohjelman, makron tai ohjelmoijan määrittelemän tyypin nimi. Muuttuja (Variable) on keskusmuistista varattu paikka tiedon säilyttämiseksi ohjelman suorituksen aikana. Muuttujaan viitataan tunnuksella. Lähdetekstissä käytetyt tunnukset on esiteltävä ja määriteltävä. Esiteltyä tunnusta eli nimeä voidaan käyttää lähdetekstissä. Määrittelyn jälkeen tunnusta vastaa keskusmuistiin varattu muistialue, jonka sisältöön on mahdollista viitata tunnuksen avulla. Usein, esim. muuttujien yhteydessä esittely ja määrittely tapahtuvat samanaikaisesti. Esim. int luku; esittelee luku-nimisen muuttujan ja varaa tunnusta vastaavan kokonaislukutyypin int verran keskusmuistitilaa. Tunnusta käytetään siis keskusmuistista varattuun muuttujaan viittaamiseksi. Muuttujan olemassaolo määräytyy sen muistinvarausluokan perusteella ja tunnuksen käyttömahdollisuus vaihtelee tunnuksen määrittelypaikan mukaan. Muuttujien käyttöön liittyviä ominaisuuksia ovat: Elinikä kuinka kauan muuttujan tilanvaraus säilyy keskusmuistissa. Määrittelyalue ohjelmassa kuinka laajalla alueella tunnus näkyy käännösyksikössä. Linkitystapa miten tunnus näkyy eri käännösyksiköissä. 6.1 Tunnusten määrittelyalue ja näkyvyysalue Muuttujan määrittelyalue (Scope) ohjelmassa määrittelee kuinka laajalla alueella käännösyksikössä tunnus on olemassa ja missä osissa tunnusta voidaan käyttää. Määrittelyalue kertoo siis näkyvyyden eli mahdollisen viittausalueen. Määrittelyalue vaikuttaa myös muuttujan elinikään. Näkyvyysalueita ovat: lohko, aliohjelma, aliohjelman esittely, tiedosto, luokka ja nimiavaruus. Määrittelyalueet voidaan ryhmitellä seuraavasti: Globaali määrittelyalue (Global scope) eli tiedosto (File scope). Tunnus näkyy kaikkialla käännösyksikössä. Tilanvaraus on olemassa koko ohjelman suorituksen ajan (Staattinen tilanvaraus). Paikallinen määrittelyalue (Local scope) eli aliohjelman (Function scope) tai lohko (Block scope). Lisäksi erotetaan aliohjelman esittelyn määrittelyalue (Function prototype scope). Tunnus näkyy vain paikallisesti lohkossa tai aliohjelmassa. Tilanvaraus (Oletus) on olemassa lohkon tai aliohjelman suorituksen ajan (Automaattinen tilanvaraus). Luokan määrittelyalue (Class scope) Tunnus näkyy luokan määrittelyssä esiintyvien näkyvyyssääntöjen mukaisesti. Tilanvaraus (Oletus) on olemassa yhtä kauan kuin olio. Nimiavaruus (Namespace scope) Tunnus näkyy kaikkialla, missä nimiavaruus on otettu käyttöön. Tilanvaraus on olemassa koko ohjelman suorituksen ajan. Lohko (Block): Lohkossa esitellyn tunnuksen viittausalue alkaa esittelykohdasta ja päättyy lohkon lopussa. Lohkossa esitelty tunnus on paikallinen lohkossa. for (int j=0; j<10; j++) int Luku; Copyrights Markku Rahikainen All Rights Reserved. 36

38 Koska Luku on paikallinen for-lauseen lohkossa, se ei ole käytettävissä enää lohkon päättävän aaltosulun jälkeen. Aliohjelma (Function): Aliohjelman määrittely tarkoittaa aliohjelman rungon toteutusta. Aliohjelman runko sisältää aliohjelman muuttujien esittelyn ja suoritettavat lauseet. Muuttujat ja lauseet yhdistetään lohkoksi. Aliohjelman lohkon sisällä esiteltyyn muuttujaan voidaan viitata vain aliohjelman lohkon sisällä. Aliohjelman lohkossa voidaan viitata myös aliohjelman parametriluettelossa esiteltyyn tunnukseen. Aliohjelman muuttujat ovat paikallisia (Local). void Vaihda (int *PtrA, int PtrB) // PtrA ja PtrB ovat paikallisia // aliohjelmassa. int Apu ; Apu = *PtrA ; *PtrA = *PtrB ; *PtrB = Apu ; Muuttujat PtrA, PtrB ja Apu ovat paikallisia Vaihda-aliohjelmassa, joten ne eivät ole käytettävissä enää aliohjelman päättävän aaltosulun jälkeen. Aliohjelman esittely (Function prototype): Aliohjelman esittelyrivillä oleviin parametreihin ei voi muualla viitata. void Vaihda (int *PtrA, int PtrB) ; int main () // Main ei voi viitata PtrA- ja PtrB muuttujiin. return 0 ; Koska aliohjelman esittelyssä lueteltuihin tunnuksiin PtrA ja PtrB ei ole mahdollista viitata, niillä ei ole varsinaista merkitystä. Tällöin tunnusten nimet voidaan jättää pois parametriluettelosta. Parametrien tyypit on kuitenkin merkittävä luetteloon pilkuilla erotettuina. Ohjelmatiedosto (File): Globaalit (Global) tunnukset esitellään lohkojen ja luokkien ulkopuolella. Globaalien tunnusten viittausalue alkaa esittelykohdasta ja päättyy ohjelmatiedoston lopussa. #include <iostream> using namespace std ; int Globaali = 10 ; int main ( ) cout << Globaali ; return 0 ; Main ohjelman yläpuolella esitelty Globaali-muuttuja on käytettävissä missä tahansa lähdetekstissä. Siihen voidaan viitata main-ohjelman sisällä ja myös kaikissa samassa lähdetekstissä (tiedostossa) sijaitsevissa aliohjelmissa. Luokka (Class): Luokassa esiteltyjä tietoja on mahdollista käsitellä vain luokan aliohjelmilla (Oletusarvoisesti). Aliohjelmiin voidaan yleensä viitata luokan ulkopuolelta luokan olion kautta. Lisää luokan viittausalueista ja käytöstä kts. muut dokumentit. Copyrights Markku Rahikainen All Rights Reserved. 37

39 Nimiavaruus (Namespace): Nimiavaruus on uusi tunnusten esittelyalue. Nimiavaruutta käyttämällä voidaan poistaa suurissa järjestelmissä nimikonflikteja. Sama tunnus voi esiintyä eri nimiavaruuksissa ja yksilöityy nimiavaruuden perusteella. Nimiavaruudesta lisää kts. dokumentti namespace. Tunnuksen näkyvyysalue eli viittausalue (Visibility) tarkoittaa sitä aluetta lähdetekstissä, jossa voidaan tehdä laillinen viittaus tunnukseen sidottuun muuttujaan tai olioon.tunnukset ovat globaaleja tai paikallisia viittausalueellaan. Näkyvyys- eli viittausalue on yleensä sama kuin määrittelyalue. Näin ei ole, jos samanniminen tunnus on esitelty sisäkkäisissä lohkoissa. #include <iostream> using namespace std ; int main ( ) int Luku = 10 ; cout << Luku << ; // Tulostuu 10. if (Luku > 2) int Luku = 5; cout << Luku << ; // Tulostuu 5. cout << Luku ; // Tulostuu 10. return 0 ; Kuva 6-1. Samannimisen muuttujan määrittely sisäkkäisissä lohkoissa. 6.2 Globaaliin muuttujaan viittaus ::-operaattorilla Jos aliohjelmassa on esitelty samanniminen muuttuja kuin tiedoston viittausalueella oleva globaali muuttuja, voidaan aliohjelmassa viitata globaaliin muuttujaan ::-operaattorin avulla. Jos aliohjelmassa ei ole globaalin muuttujan kanssa samannimistä tunnistetta, ei ::-operaattoria tarvitse käyttää. Seuraavassa esimerkki globaalin muuttujan käsittelystä. #include <iostream> using namespace std ; int Luku = 10 ; int main ( ) int Luku = 5; cout << Luku << ; // Tulostuu 5. cout << ::Luku ; // Tulostuu 10. return 0 ; Kuva 6-2. Samannimisen muuttujan määrittely sisäkkäisissä lohkoissa. 6.3 Tunnuksen elinikä Tunnuksen elinikä (Duration) eli tilanvaraus määrittelee ajanjakson, jonka aikana esiteltyä tunnusta vastaa varattu alue keskusmuistissa. Elinikä määräytyy tunnuksen muistinvarausluokan (Storage class) perusteella. Elinikään vaikuttavia muistinvarausluokkia on kolmenlaisia: automaattinen, staattinen ja dynaaminen. Muistinvarausluokka vaikuttaa myös muuttujan näkyvyyteen. Copyrights Markku Rahikainen All Rights Reserved. 38

40 Järjestelmä käyttää pääasiassa kolmea erilaista keskusmuistialuetta, jotka vastaavat muuttujien muistinvarausluokkia. Muuttujan elinikä voi olla: Automaattinen (Automatic) Muuttujien tilanvaraus pinosta (Stack) tai joskus pyydettäessä rekisteristä (Register). Pino on keskusmuistialue, jonne järjestelmä tallettaa ohjelman suorituksen ajaksi ohjelmassa määritellyt automaattiset muuttujat ja oliot. Muuttujien tilanvaraus ja vapautus tapahtuu automaattisesti lohkoissa ja aliohjelmissa. Staattinen (Static) Muuttujien tilanvaraus staattisesta muistista. Muuttujien tilanvaraus tapahtuu ohjelman käynnistyessä ja on voimassa ohjelman päättymiseen asti. Dynaaminen (Dynamic) Muuttujien tilanvaraus dynaamisesta muistista eli keosta (Heap). Keko on tietokoneen vapaa muistialue (Free store), joka on käytettävissä mistä tahansa ohjelmasta. Muuttujien tilanvaraus tapahtuu ohjelmoijan toimesta varatulla sanalla new ja tilanvapautus varatulla sanalla delete tai ohjelman päättyessä (tai kunnes keskusmuistista katkaistaan virta). Automaattiset tunnukset Automaattinen (Automatic) tunnus on paikallinen lohkossa tai aliohjelmassa. Automaattinen tunnus on siten näkyvä vain kyseisessä lohkossa tai aliohjelmassa. Järjestelmä varaa tällaiselle tunnukselle muistitilan ajonaikaisesta pinosta (Stack) lohkoon tai aliohjelmaan tultaessa. Automaattisen tunnuksen tilanvaraus on olemassa niin kauan kuin sille on varattu tila pinosta. Tila vapautuu automaattisesti lohkosta tai aliohjelmasta poistuttaessa. Ohjelmoijan on alustettava automaattiset muuttujat, muuten niiden sisältö ei ole ennustettavissa. Tunnus voidaan määritellä automaattiseksi auto-määreellä. Lohkon ja aliohjelman sisäiset muuttujat ovat oletusarvoisesti automaattisia, joten niiden yhteydessä auto-määreen käyttö on turhaa. Stattiset tunnukset Staattisia (Static) tunnuksia ovat kaikki globaalit tunnukset, extern-määreellä esitellyt ulkoiset tunnukset ja static-määreellä esitellyt paikalliset tunnukset. Järjestelmä varaa staattisille tunnuksille tilan pääohjelman käynnistyessä. Muistitila pysyy varattuna koko suorituksen ajan, vaikka staattinen tunnus olisi esitelty paikalliseksi aliohjelmassa. Järjestelmä alustaa staattiset muuttujat nollalla, jos ohjelmoija ei ole alustanut muuttujia. Staattiset muuttujat alustuvat vain kerran, tilanvarauksen yhteydessä. Täten alustus ei tapahdu uudelleen aliohjelmaan tultaessa, vaikka staattinen muuttuja olisi paikallinen aliohjelmassa. Aliohjelmassa määritellyn staattisen muuttujan arvo säilyy aliohjelmasta poistumisen jälkeenkin. Kun aliohjelmaan seuraavan kerran tullaan, on muuttujassa sen arvo, joka siihen jäi edellisen kerran aliohjelmasta poistuttaessa. Dynaamiset tunnukset Dynaamiset (Dynamic) tunnukset ovat tunnuksia, joita vastaavien muuttujien ja olioiden tilanvaraushetken ja tilanvapautushetken ohjelmoija päättää. Ohjelmoijan on varattava dynaamisille muuttujille ja olioille tila ohjelmassa new-operaattorilla ja vastaavasti tila on vapautettava delete-operaattorilla. Järjestelmä varaa ajon aikana dynaamiselle muuttujalle tai oliolle muistitilan keosta (Heap). Dynaamisesti varattuun muuttujaan tai olioon viitataan ohjelmassa osoitinmuuttujan avulla. Samaan muuttujaan tai olioon saattaa viitata useita osoittimia samanaikaisesti. Osoittimille varataan tila erikseen sen oman muistinvarausluokan mukaisesti. Copyrights Markku Rahikainen All Rights Reserved. 39

41 7. VARATUT SANAT Varattu sana (Reserved identifier) on ilmaisu, jolla on tietty merkitys ohjelmassa. Varattu sana on kääntäjän tuntema lause, määre tai operaattori. Varattu sana voi aloittaa esim. valinta- tai toistolauseen. Määreitä (specifiers) käytetään yleensä tietotyyppien, muuttujien, olioiden ja aliohjelmien esittelyn yhteydessä. Operaattori (Operator) on varattu sana tai merkintätapa, jota käytetään lausekkeen osana. Seuraavassa taulukossa on lueteltu C++-kielen varatut sanat. Lihavoidulla tekstityypillä esitetyt sanat ovat käytettävissä ainoastaan C++-kielisessä lähdetekstissä. Varattuja sanoja on yhteensä 62, joista 30 on ainoastaan C++-kielisissä lähdeteksteissä käytettäviä. Varatut sanat on kirjoitettava aina pienillä kirjaimilla. Varattuja sanoja käytettäessä on muistettava, että sama sana ei välttämättä tarkoita samaa asiaa C-kielessä ja C++-kielessä. Esimerkiksi sana struct tarkoittaa C-kielessä tietuetta ja C++-kielessä luokkaa. Samoin on muistettava, että saman varatun sanan esiintyminen eri yhteyksissä tarkoittaa eri asioita. Esimerkiksi varattuja sanoja private, protected ja public käytetään luokan jäsenten näkyvyyssääntöjen määräämisessä ja luokan perintätavan määräämisessä. TAULUKKO C++-kielen varatut sanat asm float static auto for static_cast break friend struct bool goto switch case if template catch inline this char int throw class long true const mutable try Const_cast namespace typedef Continue new typeid default operator typename delete private union do protected unsigned Double public using dynamic_cast register virtual else reinterpret_cast void enum return volatile Explicit short wchar_t extern signed while false sizeof Edellä olevassa taulukossa luetellut varatut sanat ryhmiteltyinä aiheluokittain: Muistimääreet (Storage-class specifiers) ilmoittavat kääntäjälle esiteltävän muuttujan, olion tai aliohjelman eliniän ja näkyvyyden. Muistimääreitä ovat auto, register, static ja extern. Aliohjelmien esittelyyn liittyviä määreitä (Function specifiers) ovat friend, inline ja virtual. Tyyppimääreitä (Type specifiers) ovat bool, char, short, int, long, signed, unsigned, float, double, void, wchar_t, enum, class, struct, union, const, mutable ja volatile. Varatut sanat true ja false ovat bool-tyyppisen tiedon totuusarvoja. Tunnusten näkyvyyteen voidaan vaikuttaa varatuilla sanoilla namespace ja using. Aliohjelma- ja luokkamallien määrittelyssä käytetään määrettä template. Tyypin uudelleennimeämisessä käytetään määrettä typedef. Luokan olioihin liittyviä tyyppimuunnoksia voidaan rajoittaa varatulla sanalla explicit. Luokan aliohjelmissa voidaan käyttää this-osoitinta, kun halutaan viitata käsiteltävän olion osoitteeseen. Luokkien esittelyn yhteydessä käytettäviä saantimääreitä (Access specifiers) ovat private, protected ja public. Lauseita muodostetaan varatuilla sanoilla asm, break, case, catch, continue, default, do, else, for, goto, if, return, switch, throw, try ja while. Varattua sanaa asm käytetään assembler-käskyn suorittamiseen. Copyrights Markku Rahikainen All Rights Reserved. 40

42 Varatut sanat const_cast, delete, dynamic_cast, new, reinterpret_cast, sizeof ja static_cast ovat operaattoreita. Operaattorimerkkien kuormituksen yhteydessä aliohjelmissa käytetään varattua sanaa operator. Copyrights Markku Rahikainen All Rights Reserved. 41

43 8. OPERAATTORIT Operaattori (Operator) on merkintätapa, jota käytetään lausekkeen osana. Operaattori muodostaa arvon operandien arvojen perusteella. Operaattorit ovat: Yksioperandisia (Unary operator): käsittelevät yhtä operandia. Kaksioperandisia (Binary operator): käsittelevät kahta operandia. Kolmioperandisia (Ternary operator): Käsittelevät kolmea operandia. Seuraavassa taulukossa on lueteltu merkit ja merkkiyhdistelmät, joita käytetään operaattoreina. Operaattorit on lueteltu taulukossa suoritusjärjestyksessä. Suoritusjärjestyksessä samanarvoiset operaattorit on esitetty ryhmänä ja eroteltu muista operaattoriryhmistä väliviivoilla ja ryhmänumeroinnilla. Jos samassa lausekkeessa esiintyy suoritusjärjestyksessä samanarvoisia operaattoreita, järjestelmä suorittaa operaattorit vasemmalta oikealle, paitsi operaattoriryhmissä 3, 15 ja 16, joissa suoritusjärjestys on oikealta vasemmalle. TAULUKKO Operaattorit Ryhmä Operaattori Nimi tai merkitys Syntaksiesimerkki 1 :: Viittaus luokan jäseneen. luokka::jäsen :: Viittaus globaaliin muuttujaan. ::muuttuja 2. Viittaus olion jäseneen. olio.jäsen -> Viittaus jäseneen osoittimella. osoitin->jäsen [ ] Viittaus taulukon alkioon. osoitin [lauseke] ( ) Aliohjelmakutsu lauseke(lausekkeet) ( ) Arvon laskenta. tyyppi (lauseke) ++ Operandin käyttö ja kasvatus. operandi Operandin käyttö ja vähennys. operandi - - typeid( ) Tyypin nimi. const_cast Tyyppimuunnos dynamic_cast Tyyppimuunnos reinterpret_cast Tyyppimuunnos static_cast Tyyppimuunnos 3 sizeof Olion tilanvarauksen koko tavuina. sizeof lauseke sizeof( ) Tyypin tilanvarauksen koko tavuina. sizeof (tyyppi) ++ Operandin kasvatus ja käyttö. ++ operandi - - Operandin vähennys ja käyttö. - - operandi ~ Komplementti (Bittioperaattori). ~lauseke! Looginen ei.!lauseke - Etumerkki -lauseke + Etumerkki +lauseke & Osoiteoperaattori &operandi * Sisältöoperaattori *lauseke new Tilan varaus. new tyyppi delete Tilan vapautus. delete osoitin delete [ ] Taulukon tilan vapautus. delete [ ] osoitin (tyyppi) Tyyppimuunnos (tyyppi) lauseke 4.* Viittaus luokan jäseneen. olio.*osoitin jäseneen ->* Epäsuora viittaus jäseneen. osoitin->*osoitin jäs. 5 * Kertolasku lauseke * lauseke / Jakolasku lauseke / lauseke % Jakojäännös lauseke % lauseke 6 + Yhteenlasku lauseke + lauseke Copyrights Markku Rahikainen All Rights Reserved. 42

44 - Vähennyslasku lauseke lauseke 7 << Siirto vasemmalle. lauseke << lauseke >> Siirto oikealle. lauseke >> lauseke 8 < Pienempi kuin. lauseke < lauseke <= Pienempi tai yhtä suuri. lauseke <= lauseke > Suurempi kuin. lauseke > lauseke >= Suurempi tai yhtäsuuri. lauseke >= lauseke 9 == Yhtäsuuri kuin. lauseke == lauseke!= Eri suuri kuin. lauseke!= lauseke 10 & Ja (Bittioperaattori). lauseke & lauseke 11 ^ Poissulkeva tai (Bittioperaattori). lauseke ^ lauseke 12 Tai (Bittioperaattori). lauseke lauseke 13 && Ja (Looginen operaattori). lauseke&&lauseke 14 Tai (Looginen operaattori). lauseke lauseke 15 = Sijoitus operandi = lauseke *= Kertolasku ja sijoitus. operandi *= lauseke /= Jakolasku ja sijoitus. operandi /= lauseke %= Jakojäännös ja sijoitus. operandi%=lauseke += Yhteenlasku ja sijoitus. operandi+=lauseke -= Vähennyslasku ja sijoitus. operandi -= lauseke <<= Siirto vasemmalle ja sijoitus. operandi<<=lauseke >>= Siirto oikealle ja sijoitus. operandi>>=lauseke &= Ja ja sijoitus (Bittioperaattori). operandi&=lauseke = Tai ja sijoitus (Bittioperaattori). operandi = lauseke ^= Poissulkeva tai ja sijoitus (Bittioperaattori). operandi^=lausek 16? : Ehtolauseke lauseke? lauseke lauseke 17 throw Poikkeus throw lausek 18, Pilkku Edellisessä taulukossa sana operandi tarkoittaa lauseketta, joka viittaa muistialueeseen, jossa muuttuja, olio tai aliohjelma sijaitsee. Operandi on siis yleensä tunnus, jota voidaan käyttää sijoituksessa vasemmalla puolella. Tässä tarkoitettu operandi tunnetaan vieraskielisissä kirjoissa yleensä nimellä lvalue. Jos samassa lausekkeessa on useita suoritusjärjestyksessä samanarvoisia operaattoreita, lausekkeen arvo lasketaan yleensä vasemmalta oikealle. Poikkeuksia ovat yksioperandiset operaattorit (Ryhmä 3), arvonmuuntooperaattorit (Ryhmä 15) =, *=, /=, %=, +=, -= ja bittioperaattorit <<=, >>=, &=, <= ja ^= sekä ehto-operaattori? :, joita käytettäessä lausekkeen arvon laskenta tapahtuu oikealta vasemmalle. Ohjelmoija voi vaikuttaa sulkeilla ( ) laskentajärjestykseen. Huom! Käytä sulkeita ( ) epäselvyyksien välttämiseksi. Copyrights Markku Rahikainen All Rights Reserved. 43

45 9. C++-STANDARDIKIRJASTO C++-standardikirjasto (C++ Standard Library) sisältää 49 otsikkotiedostoa. Standardikirjasto sisältää luokkia ja algoritmeja mm. merkkijonojen ja tietovirtojen käsittelyä varten sekä kirjaston erilaisten kokoelmien käsittelyä varten. Kokoelmien käsittelyyn liittyvä kirjasto on nimeltään STL (Standard Template Library). STL-kirjastoon liittyy 13-erillistä otsikkotiedostoa. Standardikirjasto sisältää 18 otsikkotiedostoa, jotka on muokattu suoraan C-kielen vastaavista otsikkotiedostoista uudelleennimeämällä ja mahdollisesti vähäisiä muutoksia tehden. Nämä otsikkotiedostot alkavat alla olevassa taulukossa kohdasta <cassert> ja päättyvät kohtaan <cwctype>. Esimerkiksi <cassert> sisältää merkinnän: namespace std #include <assert.h> ;. Merkintä lisää C-kielisen <assert.h> tiedoston sisällön C++:n std-nimiavaruuteen. Muut kuin c-alkuiset otsikkotiedostonimet tarkoittavat C++-kielen otsikkotiedostoja, joista suuri joukko on myös uudelleennimettyjä standardoinnin yhteydessä. Otsikkotiedostojen nimissä oli aiemmin tarkennin.h, joka on sittemmin poistettu käytöstä. Seuraavassa taulukossa on lueteltu standardikirjaston otsikkotiedostot. Otsikkotiedosto TAULUKKO C++ Standardikirjaston otsikkotiedostot Sisällön tarkoitus <algorithm> STL: algoritmit <bitset> Malliluokan määrittely bittikäsittelyä varten. <cassert> Suoritusaikaisten poikkeustilanteiden käsittely. <cctype> Merkkitiedon luokittelu. <cerrno> Kirjastoaliohjelmien virhekoodien testaus. <cfloat> Liukulukujen käsittely. <ciso646> ISO 646 merkistön käyttö ohjelmoinnissa. <limits> Kokonaislukutyyppien ominaisuuksien selvitys. <clocale> Sovitus eri kulttuureihin. <cmath> Matemaattisten aliohjelmien käyttö. <ccomplex> Kompleksilukujen käyttö. <csetjmp> Ei-paikalisten goto-lauseiden suoritus. <csignal> Erilaisten poikkeustilanteiden käsittely. <cstdarg> Parametrien käsittely. <cstddef> Tyyppien ja makrojen määrittely. <cstdio> Syöttö ja tulostus. <cstdlib> Erilaisia operaatioita (cmalloc, calloc, realoc, free, ). <cstring> Erilaisten merkkijonojen käsittely. <ctime> Aika- ja päivämääräkäsittely. <cwchar> Merkkijonojen käsittely (wide char). <cwctype> Merkkien (wide char) luokittelu. <deque> STL: jonon toteutus. <exception> Poikkeuskäsittely <fstream> Tiedostojen käsittely. <functional> STL: algoritmeissa käytettävien aliohjelmaolioiden määrittely. <iomanip> Iostream-luokkien parametreinaan käyttämiä syöttö- ja tulostus manipulaattoreita. <ios> <ios> Iostream-luokkien yliluokka. <iosfwd> Iostream-luokkien tarvitsemia luokkia. <iostream> Standardivirtoja käsittelevät iostream-oliot. <istream> Syöttövirtojen käsittely. <iterator> STL: iteraattoreiden käsittely. <limits> Numeeristen tyyppien tutkiminen. <list> STL: listan toteutus. <locale> Useita luokkia paikallisen tiedon käsittelyä varten. <map> STL: avainrakenteisen map-kokoelman määrittely. <memory> STL: kokoelmien muistinkäsittely. <numeric> STL: numeerisia aliohjelmia. <ostream> Tulostusvirtojen käsittely. <queue> STL:jonojen toteutus. <set> STL: yksilöivän avainrakenteisen kokoelman toteutus. <sstream> Merkkijonokokoelmien käsittely. <stack> STL: pinon toteutus. <stdexcept> Poikkeusten käsittelyyn käytettäviä luokkia. <streambuf> Iostream-käsittelyn puskurointi. <string> Merkkijonojen käittely. Copyrights Markku Rahikainen All Rights Reserved. 44

46 <strstream> <utility> <valarray> <vector> Merkkijonojen iostream-käsittely. STL: yleisiä apuluokkia. Taulukoiden käyttö. STL: vektorin toteutus. Standardikirjaston sisältämät otsikkotiedostot ovat jaettavissa neljään ryhmään: Alkuperäiset C-kielen otsikkotiedostot. - Päättyvät.h-tarkentimeen, esimerkiksi stdio.h. - Voidaan käyttää C- ja C++-kielisissä lähdeteksteissä. Uudistetut C-kielestä muokatut otsikkotiedostot. - c-etuliite, ei tarkenninta, esim. cstdio. - Voidaan käyttää C++-kielisissä lähdeteksteissä. Alkuperäiset C++-kielen otsikkotiedostot. - Päättyvät.h-tarkentimeen, esim. iostream.h. - Voidaan käyttää C++-kielisissä lähdeteksteissä. Uudistetut C++-kielen otsikkotiedostot. - Ei tarkenninta, esim. iostream. - Voidaan käyttää C++-kielisissä lähdeteksteissä std-nimiavaruuden kautta. Ennen C++-kielen standardointia ohjelmoija on voinut sisällyttää C++-kielisiin lähdeteksteihin C- ja C++-kielen.h-tarkentimella varustettuja otsikkotiedostoja. Standardoinnin jälkeen lähdeteksteihin on voinut sisällyttää myös uudistettuja otsikkotiedostoja. Vanhemmissa ohjelmistokehitysympäristöissä ei siis ole mahdollista käyttää 1997 standardoituja otsikkotiedostojen nimiä. Uusimmissa marraskuun 1997 jälkeen julkaistuissa ohjelmistokehitysympäristöissä on mahdollisuus käyttää sekä uusia että vanhoja otsikkotiedostoja. Eri otsikkotiedostojen täydellisen ja tarkan sisällön voi tutkia ohjelmointiympäristön aputiedostoista, käsikirjoista ja help-toimintojen avulla. Copyrights Markku Rahikainen All Rights Reserved. 45

47 10. ESIKÄSITTELIJÄ Esikäsittelijä eli esikääntäjä (Preprocessor, precompiler) käsittelee lähdetekstin ennen käännösvaihetta. Esikäsittelijän tehtävänä on tavallisesti tehdä erilaisia tekstin haku- ja korvaustoimintoja lähdetekstissä. Haku ja korvaus voivat olla myös ehdollisia. Esikäsittelijää ohjataan esikäsittelijän komennoilla (Directives), jotka alkavat merkillä #, jonka on oltava ensimmäinen merkitsevä merkki rivillä. Komennon kanssa samalla rivillä voi esiintyä kommenttimerkit // tai /* */. Komentoa voi myös jatkaa seuraavalle riville merkin \ jälkeen. Esikäsittelijän komentoja voi esiintyä missä tahansa lähdetekstissä. Esikäsittelijän komennoilla on oma syntaksinsa. Ohjelmoijan ei tarvitse aktivoida esikäsittelyprosessia vaan se käynnistyy automaattisesti ennen käännöstä. TAULUKKO Esikäsittelijän komentoja Komento Merkitys # Null-komento eli tyhjä, rivillä ei ole muita merkkejä. #define Makron ja symbolisen vakion määrittely #error Virheen raportointi käännösvaiheessa ja käännöksen keskeytys. #if, #elif, #else, #endif Ehdon vertailu. #ifdef, #ifndef Makron ja symbolisen vakion määrittelyn olemassaolon tutkiminen. #import Tyyppikirjaston sisällyttäminen. #include Tiedostojen sisällyttäminen. #line Rivinumeron tuottaminen koodiin. #pragma Kääntäjäkohtaisia komentoja. #undef Makron ja symbolisen vakion määrittelyn purkaminen. Esikäsittelijän komennoissa voidaan käyttää makroja. Esikäsittelijä tunnistaa joukon valmiiksi määriteltyjä makroja, jotka on lueteltu seuraavassa taulukossa. Eri ohjelmistokehitysympäristöissä on lisäksi ympäristöriippuvaisia makroja. Makrojen sisältö muuttuu esikäsittelijän komentojen tai ohjelmistokehitysympäristön asetusten mukaisesti. Makrojen nimien alussa ja lopussa on kaksi alaviivaa. Makro DATE FILE LINE STDC TIME TIMESTAMP TAULUKKO Esikäsittelijän makroja Merkitys Käännöspäivämäärä (mmm dd yyyy). Kuukausi vastaa time.h kirjaston asctime-funktion palauttamaa kuukautta. Lähdetekstitiedoston nimi lainausmerkeillä ympäröitynä. Lähdetekstin aktiivinen rivinumero. Rivinumeroa voidaan muuttaa #line-komennolla. Lähdeteksti vastaa ANSI C standardia. Makron arvo on vakio 1, jos kääntäjän optiossa on merkintä C-kielisyydestä, muuten makron arvo on määrittelemätön. Edellisen käännöksen kellonaika (hh:mm:ss). Lähdetekstin edellisen muokkauksen aikaleima. Aikaleimassa on päivämäärä ja kellonaika. Copyrights Markku Rahikainen All Rights Reserved. 46

48 11. OTSIKKOTIEDOSTOT 11.1 C++-otsikkotiedostojen käyttö ( uusi tapa ) Kun standardointikomitea tarvitsi nimiä vakiokirjastojen muutettuja versioita ja uusia toimintoja varten, syntyi ongelma. Vanhojen.h-nimien käyttäminen olisi aiheuttanut yhteensopivuusongelmia. Ratkaisu oli poistaa vakiootsikkotiedostojen nimistä jälkiliite.h. Jälkiliite on joka tapauksessa tarpeeton, koska kulmasulkeet < > ilmaisevat, että kyseessä on vakio-otsikkotiedosto. Näiden tiedostojen esittely on sijoitettu nimiavaruuteen std. Vanhat esittelyt ovat yleisessä nimiavaruudessa ja sijaitsevat otsikkotiedostoissa, joiden jälkiliite on.h. #include <iostream> using namespace std ; C++-kielen standardoinnin yhteydessä C++:n otsikkotiedostoja on muokattu. Uudet otsikkotiedostot eivät sisällä.h-tarkenninta. Uudet otsikkotiedostot käyttävät nimiavaruutta std, joten se on otettava käyttöön otsikkotiedoston sisällyttämisen jälkeen. Jos std-nimiavaruutta ei oteta käyttöön, ei kääntäjä käytä iostreamkirjaston määrityksiä vaan globaalista nimiavaruudesta löytyviä määrityksiä. std-nimiavaruuden käyttöönotto tapahtuu ohjelmassa yhden kerran, vaikka sisällytettäviä C++-otsikkotiedostoja olisi useita. Tätä otsikkotiedostojen käyttötapaa ei välttämättä voi käyttää vanhemmissa (ennen standardointia julkaistuissa) ohjelmistonkehitysympäristöissä. Tuki uusimmille standardiin sisällytetyille piirteille tulee mukaan vähitellen ohjelmistokehitysympäristöihin Uudistettujen C-otsikkotiedostojen käyttö #include <cctype> c-kirjaimella alkavat otsikkotiedostot ovat uudelleennimettyjä tiedostoja, jotka sisältävät pääasiassa samat määrittelyt kuin aikaisemmat.h-tarkentimella varustetut C-kielestä peräisin olevat otsikkotiedostot. Otsikkotiedostoissa voi kuitenkin olla pieniä muutoksia C-kielisiin otsikkotiedostoihin verrattuna, joten niitä ei voi käyttää C-kielisissä ohjelmissa. Tätä otsikkotiedostojen käyttötapaa ei välttämättä voi käyttää vanhemmissa ohjelmistokehitysympäristöissä Vanhempien C- ja C++-otsikkotiedostojen käyttö Ennen C++-kielen standardointia otsikkotiedostot sisälsivät.h-tarkentimen. Tätä otsikkotiedostojen käyttöönottotapaa voidaan käyttää sekä vanhoissa että uusissa ohjelmistonkehitysympäristöissä. Copyrights Markku Rahikainen All Rights Reserved. 47

49 13. FUNKTIOT Aliohjelmat eli funktiot voivat C++-kielessä olla joko itsenäisesti toimivia tai luokkaan liitettyjä aliohjelmia. Luokkaan liitettyjä aliohjelmia käsitellään osissa joissa käsitellään luokkia. Tässä osassa käsitellään itsenäisesti toimivia funktioita Määrittely Tavanomainen tapa suorittaa jokin tehtävä C++-kielisessä ohjelmassa on kutsua ko. tehtävän suorittavaa funktiota. Tehtävän suorittavalla funktiolla on selvästi määritetty rajapinta muuhun ohjelmistorakenteeseen nähden. Funktio huolehtii rajatun tehtäväkokonaisuuden suorittamisesta. Funktiolla voi olla omia funktiolohkon sisäisiä eli paikallisia muuttujia. Funktion rakenteesta ja käytöstä voidaan erottaa kolme eri osaa: Funktion esittely eli prototyyppi Funktion kutsu Funktion määrittely eli toteutus (Funktiolohkon toteutus) Funktion esittely Funktion esittelyssä (Function declaration) ilmoitetaan funktion nimi, funktion palautusarvon tyyppi sekä funktion kutsuun sisällytettävien argumenttien (Eli aliohjelmalle välitettävien parametrien.) määrä ja tyypit. Funktion esittely tarvitaan, jotta kääntäjä pystyy tarkastamaan funktiokutsujen oikeellisuuden (Funktion nimi, parametrit ja paluuarvon tyyppi). Aliohjelman esittely on seuraavanlainen: Tyyppi Aliohjelman_nimi ( Parametrit ) ; Aliohjelman Tyyppi: Aliohjelman return-lauseelle palauttaman tiedon tietotyyppi. return-lause suoritetaan aliohjelmassa viimeisenä, jos aliohjelma palauttaa jotain kutsuvalle ohjelmalle. Aliohjelman_nimi: Ohjelman määrittelemä nimi aliohjelmalle. Parametrit: Aliohjelman parametrien tyypit. Parametrien nimet voidaan myös esittää esittelyssä Funktion kutsu Aliohjelman kutsu (Function call) aiheuttaa ohjelman kontrollin siirtymisen aliohjelman lohkoon. Kun aliohjelman lohkossa olevat lauseet on suoritettu, niin kontrolli siirtyy takaisin kutsuvaan ohjelmaan. Aliohjelman kutsun on seuraavanlainen: Aliohjelman_nimi ( Parametrit ) ; Aliohjelmalle voidaan välittää parametreina muuttujia, vakioita ja lausekkeita. Parametrit kirjoitetaan sulkeiden sisälle pilkuilla toisistaan erotettuina. Parametrien on oltava samassa järjestyksessä, kuin ne ovat kirjoitettu aliohjelman esittelyyn. Kutsussa välitettävien parametrien nimien ei tarvitse olla samoja, mitä on käytetty aliohjelman esittelyssä. Aliohjelman kutsu, kun aliohjelma palauttaa jonkin paluuarvon: Copyrights Markku Rahikainen All Rights Reserved. 48

50 tyyppi Muuttuja ; Muuttuja = Aliohjelman_nimi ( Parametrit ) ; Aliohjelman_nimi ( Parametrit ) ; Jos aliohjelman tyyppi on jokin muu kuin void, aliohjelma palauttaa tiedon return-lauseella, joka on aliohjelman viimeinen suoritettava lause Funktion määritys Jokainen ohjelmassa kutsuttava aliohjelma on määriteltävä jossakin yhden kerran. Aliohjelman määrittely (Function definition) on aliohjelman esittely, johon kuuluu aliohjelman runko. Aliohjelman määrittely on seuraavanlainen: Tyyppi Aliohjelman_nimi ( Parametrit ) Määrittelyt Lauseet Aliohjelman tyypin, nimen ja parametrien tyyppien on vastattava aliohjelman esittelyä. Parametriluettelossa on oltava parametrien tyyppien lisäksi käytettävien parametrien nimet. Parametrien nimet ovat paikallisia aliohjelmassa, joten niiden ei tarvitse olla samoja joita käytetään aliohjelman kutsussa. Jos aliohjelman tyyppi on jokin muu kuin void, niin aliohjelman viimeisen lauseen on oltava return-lause. return-lauseen käyttö: return Lauseke ; Esimerkkejä SWAP void swap ( int *, int * ) ; // Esittely void swap ( int * p, int * q ) // Määrittely int t = *P ; *p = *q ; *q = t ; Kuva Esimerkki swap-aliohjelma. TULOSTA Tulosta aliohjelmassa tulostetaan kutsussa välitetyn henkilön nimi ja ikä. Pääohjelma sijaitsee omassa lähdetekstitiedostossa Main.cpp. Tulosta-aliohjelma sijaitsee omassa lähdetekstitiedostossa Tulosta.cpp ja tulosta aliohjelman esittely sijaitsee otsikkotiedostossa (Header file) Tulosta.h. Copyrights Markku Rahikainen All Rights Reserved. 49

51 // // Pääohjelma, Main.cpp // // (c) Markku Rahikainen 2001 // #include <iostream> using namespace std ; #include "Tulosta.h" // Otsikkotiedoston mukaan ottaminen. int main ( ) char Nimi [20] ; int Ika ; cout << "Syota nimi: " ; cin >> Nimi ; cout << "Syota ika: " ; cin >> Ika ; Tulosta ( Nimi, Ika ) ; return 0 ; Kuva Pääohjelman lähdetekstitiedosto Main.cpp. // // Tulostusohjelma, Tulosta.cpp // // (c) Markku Rahikainen 2001 // #include <iostream> using namespace std ; void Tulosta ( char HenkilonNimi [ ], int HenkilonIka ) cout << "\nnimi on " << HenkilonNimi ; cout << " ja ika on " << HenkilonIka ; cout << " vuotta.\n" << endl ; Kuva Tulosta aliohjelman lähdetekstitiedosto Tulosta.cpp. // // Tulosta.cpp tiedoston otsikkotiedosto. // // (c) Markku Rahikainen 2001 // void Tulosta ( char HenkilonNimi [ ], int HenkilonIka ) ; Kuva Tulosta lähdetekstitiedoston otsikkotiedosto Parametrit Aliohjelmille voidaan välittää parametreina muuttujia, vakioita ja lausekkeita. Lisäksi on olemassa joitakin erikoistapauksia, kuten osoitinparametrit, tietuetyyppiset parametrit, taulukkoparametrit ja viittausparametrit (Viittausparametrien käsittely on esitetty osassa 14 VIITTAUS) Perustyypit argumentteina Kun perustietotyyppejä käytetään aliohjelmalle välitettävinä parametreina, niin aliohjelman tekemät muutokset eivät näy kutsuvassa aliohjelmassa. Kutsuvassa aliohjelmassa muuttujien arvot säilyvät siis muuttumattomina Copyrights Markku Rahikainen All Rights Reserved. 50

52 aliohjelmakutsun jälkeenkin. Parametrina välitetyt arvot kopioituvat aliohjelman paikallisiin muuttujiin. Aliohjelman paikallisille muuttujille varataan tilaa pinosta (Stack). Perustietotyyppiä olevien parametrien määritys aliohjelmassa: void Aliohjelma ( Tyyppi Arvoparametri )... Arvoparametri on ohjelmoijan aliohjelmassa parametrille antama nimi. Tyyppi on jokin perustietotypistä (int, long, float, char ) Osoitinparametri Kun osoitinparametreja käytetään aliohjelmalle välitettävinä parametreina, niin aliohjelman tekemät muutokset näkyvät myös kutsuvaan ohjelmaan. osoitinparametri on mahdollista toteuttaa joko osoittimen tai viittauksen avulla (Viittaus käsitellään osassa 14 VIITTAUS). Toteutuksessa käytetään osoiteoperaattoria & ja sisältöoperaattoria (epäsuoran osoituksen operaattori) *. Perus idea on se, että osoitinparametria käytettäessä kutsuvassa ohjelmassa määriteltyjen muuttujien osoitteet välitetään aliohjelmaan parametreina. Muuttujien osoitteet kopioituvat aliohjelman omiin osoitinparametreihin. Osoitinparametrityyppiä olevien parametrien määritys aliohjelmassa: void Aliohjelma ( Tyyppi *Osoitinparametri )... Osoitinparametri on ohjelmoijan aliohjelmassa parametrille antama nimi. Osoitin sisältää parametrina välitetyn tiedon keskusmuistiosoitteen. Parametrin osoitteen välittäminen aliohjelmaan tapahtuu seuraavasti: Aliohjelma ( &Parametri ) Aliohjelmalle välittyy parametrina muuttujan keskusmuistiosoite. Muuttujan osoitteeseen viitataan osoiteoperaattorin & avulla. Esimerkiksi &Ika tarkoittaa Ika-nimisen muuttujan osoitetta keskusmuistissa Tietuetyyppinen parametri Tietuetyyppiä voidaan käyttää aliohjelmissa parametrien tyyppinä aivan samoin, kuin käytetään perustietotyyppejäkin. Seuraavassa on esimerkki tietuetyyppisen parametrin käytöstä. Esimerkissä on kaksi tiedostoa Para.cpp ja Para.h. Para.cpp tiedosto pitää sisällään pääohjelman ja aliohjelman. Para.h otsikkotiedosto (Header file) pitää sisällään aliohjelman prototyypin ja tietueen TIME. /* Esimerkki ohjelmasta jossa aliohjelmalle välitettävä parametri on tietuetyyppinen, Para.cpp (c) Markku Rahikainen 2001 */ #include <iostream> using namespace std ; #include "Para.h" int main ( ) TIME Aika = 11, 15, 30 ; Tulosta ( Aika ) ; Copyrights Markku Rahikainen All Rights Reserved. 51

53 return 0 ; void Tulosta ( TIME Kello ) cout << "Kello on " ; cout << Kello.Hour << ":" ; cout << Kello.Minute << ":" ; cout << Kello.Second << endl ; Kuva Esimerkki tietuetyyppisestä parametrista. Tiedosto Para.cpp. /* */ Para.cpp tiedoston otsikkotiedosto. (c) Markku Rahikainen 2001 struct TIME int Hour ; int Minute ; int Second ; ; void Tulosta ( TIME Kello ) ; Kuva Para.cpp tiedoston otsikkotiedosto. Kuva edellisen esimerkin tulostus. Edellisessä esimerkissä on huomattavaa se, että main-ohjelmassa määritetty tietue Aika kopioituu aliohjelmassa määritettävän taulukon Kello sisällöksi, joten aliohjelmassa tehtävät muutokset eivät näy pääohjelmassa. Jos muutosten halutaan näkyvän pääohjelmassa, niin silloin aliohjelmalle on välitettävä vain tietueen osoite keskusmuistissa Taulukkotyyppinen parametri Jos aliohjelman kutsun argumenttina on taulukko, niin aliohjelmalle välitetään osoitin taulukon ensimmäiseen alkioon. Seuraavassa on esimerkki merkkitaulukon osoitteen välittämisestä aliohjelmalle. /* Mjono.cpp Esimerkki ohjelmasta jossa aliohjelmalle välitettävä parametri on merkkitaulukon osoite. (c) Markku Rahikainen 2001 */ #include <iostream> using namespace std ; Copyrights Markku Rahikainen All Rights Reserved. 52

54 #include "Mjono.h" int main ( ) char Nimi [ ] = "Markku Rahikainen" ; Tulosta ( Nimi ) ; return 0 ; void Tulosta ( char TulostettavaNimi [ ] ) int i = 0 ; while ( TulostettavaNimi [ i ]!= NULL ) cout << TulostettavaNimi [ i++ ] ; cout << "\n\n" ; Kuva Esimerkki taulukon osoitteen välittämisestä parametrina aliohjelmaan. Kuva Edellisen esimerkin tulostus Aliohjelmien kuormitus (Overloading) Aliohjelmien kuormitus eli ylimäärittely tarkoittaa samannimisen aliohjelman esittelyä ja määrittelyä useaan kertaan samassa lähdetekstissä tai luokassa. Kuormitusta käytetään, kun aliohjelman nimi halutaan standardoida tiettyyn tarkoitukseen riippumatta käsiteltävän tiedon tyypistä ja käsittelyn logiikasta. Aliohjelmien kuormitus on aliohjelmien monimuotoisuuttaa (Function polymorphism). Aliohjelmien kuormitus on mahdollista vain C++-kielisissä (Ei C-kielisissä) ohjelmissa. Alla on muutamia esimerkkejä: int OmaFunktio (int, int) ; int OmaFunktio (int, long, double) ; void OmaFunktio (float) ; Kuormitetut aliohjelmat poikkeavat toisistaan parametrien tyyppien ja/tai lukumäärien perusteella. Ylikuormitettujen funktioiden paluuarvot voivat olla samaa tai eri tyyppiä. Jos funktioiden ainoa ero on paluuarvon tyyppi, saadaan aikaiseksi käännös virhe. Kääntäjä tarkistaa käännösaikana, mikä aliohjelma sopii käytettyyn aliohjelmakutsuun parhaiten. Käännöksen aikana tapahtuvaa aliohjelman määrittelyn sitomista aliohjelmakutsuun sanotaan staattiseksi sidonnaksi (Static binding). Jos aliohjelmakutsussa käytettyä parametria vastaavaa tietotyyppiä varten ei ole toteutettu aliohjelmaa, kääntäjä etsii tietotyyppiin lähinnä sopivan aliohjelman. Tällöin järjestelmä yrittää tehdä parametrille automaattisen tyyppimuunnoksen. Copyrights Markku Rahikainen All Rights Reserved. 53

55 Jos jotakin aliohjelmakutsua varten löytyy sopivia aliohjelmia enemmän kuin yksi, syntyy ristiriitatilanne ja kääntäjä antaa aliohjelmakutsusta virheilmoituksen. Tällöin ohjelmoijan on valittava käytettävä aliohjelma pakotettua eli eksplisiittistä tyyppimuunnosta käyttämällä. Tällaisia ristiriitatilanteita tapahtuu silloin, kun samojen aliohjelmien yhteydessä esiintyy sekä kuormitus että parametrien oletusarvot. #include <iostream> using namespace std ; void TulostaTyyppi (int) ; void TulostaTyyppi (int, int) ; void TulostaTyyppi (double) ; int main () TulostaTyyppi (5) ; TulostaTyyppi (2, 4) ; TulostaTyyppi (2.5) ; return 0 ; void TulostaTyyppi (int Luku) cout << "\n Parametri on tyyppia int " << Luku ; void TulostaTyyppi (int Luku1, int Luku2) cout << "\n\n 1. parametri on tyyppia int " << Luku1 ; cout << "\n 2. parametri on tyyppia int " << Luku2 ; void TulostaTyyppi (double Luku) cout << "\n\n Parametri on tyyppia double " << Luku << "\n\n" ; Kuva Esimerkki aliohjelman nimen ylikuormittamisesta. Kuva Edellisen esimerkin tulostus Ongelmatilanteita Funktionimien ylikuormittamisen yhteydessä on joitakin ristiriitaisia tilanteita jotka on huomioitava. Kääntäjä tarkistaa aliohjelmakutsun löytäessään mikä on oikea kutsuttava aliohjelma. Toisinaan eri aliohjelmien kutsu voi näyttää samalta, esim. kutsu KerroKahdella(Luku); voisi tarkoittaa kumman tahansa seuraavan aliohjelman kutsua. Copyrights Markku Rahikainen All Rights Reserved. 54

56 int KerroKahdella (int Luku) ; int KerroKahdella (int &Luku) ; Ohjelmoijan on siis itse valittava kummalla tavalla haluaa aliohjelman määritellä, viittauksella vai ilman viittausta. Toinen ristiriitatilanne voi syntyä kun aliohjelmien välitystiedot poikkeavat toisistaan vain paluuarvojen perusteella, esim. int TeeJako (int Jaettava, int Jakaja) ; short TeeJako (int Jaettava, int Jakaja) ; Kuormitetuissa aliohjelmissa ei riitä paluutyppien erilaisuus, eroa on oltava myös parametreissa. Kolmas ristiriitatilanne syntyy helposti, kun kuormitus ja parametrien oletusarvot esiintyvät yhdessä. Aliohjelmakutsu Tuplaa(2); voi tarkoittaa kumman tahansa seuraavan aliohjelman kutsua. int Tuplaa (int Luku) ; int Tuplaa (int Luku, int Tuplauskerroin = 1) ; Luetellun tyypin (enum) kuormitus Lueteltu tyyppi enum on mahdollista kuormittaa samaan tapaan kuin mikä tahansa käyttäjän määrittelemä tyyppi. Tämä piirre luokitellaan C++-kielen uusiin piirteisiin. Se ei ole ollut mukana alkuperäisessä standardiehdotuksessa, vaan on lisätty standardiehdotukseen keväällä Kuormitettavat seuraavaaliohjelmat palauttavat joko seuraavan viikonpäivän järjestysnumeron tai seuraavan merkin käytettävässä merkistössä. #include <iostream> using namespace std ; enum Paiva Maanantai = 1, Tiistai, Keskiviikko, Torstai, Perjantai, Lauantai, Sunnuntai ; char Seuraava (char Merkki) ; int Seuraava (Paiva paiva) ; int main () Paiva Tanaan = Tiistai ; cout << "\n Huomenna on viikon " << Seuraava (Tanaan) << ".paiva \n" ; char Merkki = 'A'; cout << "\n A:ta seuraava merkki on. " << Seuraava (Merkki) << "\n\n" ; return 0 ; char Seuraava (char Merkki) Merkki++ ; return Merkki ; int Seuraava (Paiva paiva) int Uusi = paiva ; Uusi = Uusi + 1 ; return Uusi ; Kuva Esimerkki luetellun tyypin käytöstä kuormituksessa. Copyrights Markku Rahikainen All Rights Reserved. 55

57 Kuva Edellisen esimerkin tulostus Esimerkkejä Suuruus.cpp Yleensä ohjelmoinnissa on totuttu siihen, että jokaisella funktiolla tulee olla yksikäsitteinen nimi, jolla se voidaan erottaa toisista funktioista. Funktioitahan kutsutaan nimenomaan niiden nimien avulla. Koska C++ on ns. vahvasti tyypitetty ohjelmointikieli, on mahdollista että usealla funktiolla on sama nimi, kunhan funktiot eroavat argumenttien perusteella toisistaan. Jos kahdella funktiolla on sama nimi, voidaan sanoa että kyseinen funktio (nimi) on ylikuormitettu ja samannimisellä funktiolla on monta eri muotoa. Seuraavassa esimerkkiohjelmassa Suuruus.cpp on funktiosta etsi_suurin_luku kolme erilaista versiota (muotoa). Kääntäjä voi tajuta nämä eri funktioiksi sen mukaan minkätyyppiset argumentit funktiota kutsuttaessa annetaan. Ohjelmassa Suuruus.cpp on huomionarvoista myös se, että siinä käytetään referenssiargumentteja (Viittausta). Yksi funktion etsi_suurin_luku versioista käyttää yhtenä argumenttina referenssiargumenttia. void etsi_suurin_luku (int kokonaislukutaulukko[], int lukujen_maara, int& suurin_luku) Funktion kolmas argumentti (int& suurin_luku) on siis referenssiargumentti, joka voi siirtää tietoa kutsuvalle ohjelmalle. Kun jokin muuttuja on referenssiargumentti, niin se ei kopioidukaan kutsuttaessa kutsuttavalle ohjelmalle, vaan kutsussa siirtyy muuttujan osoite. Näin kutsuttava ohjelma voi kirjoittaa tietoa kutsuvassa ohjelmassa olevaan muuttujaan. Kutsuttava ohjelma siis ikään kuin käyttää kutsuvan ohjelman muuttujaa. Referenssiargumentti määritellään kirjoittamalla & argumentin tyyppinimen eteen. // // Suuruus.cpp // #include <iostream> using namespace std ; #include <string> int etsi_suurin_luku ( int kokonaislukutaulukko [ ], int lukujen_maara ) int suurin_luku = kokonaislukutaulukko [ 0 ] ; int taulukkoindeksi = 1 ; while ( taulukkoindeksi < lukujen_maara ) if ( kokonaislukutaulukko [ taulukkoindeksi ] > suurin_luku ) suurin_luku = kokonaislukutaulukko [ taulukkoindeksi ] ; taulukkoindeksi++ ; Copyrights Markku Rahikainen All Rights Reserved. 56

58 return suurin_luku ; void etsi_suurin_luku ( int kokonaislukutaulukko [ ], int lukujen_maara, int& suurin_luku ) suurin_luku = kokonaislukutaulukko [ 0 ] ; int taulukkoindeksi = 1 ; while ( taulukkoindeksi < lukujen_maara ) if ( kokonaislukutaulukko [ taulukkoindeksi ] > suurin_luku ) suurin_luku = kokonaislukutaulukko [ taulukkoindeksi ] ; taulukkoindeksi++ ; char etsi_suurin_luku ( char annettu_stringi [ ] ) int merkkien_maara = strlen ( annettu_stringi ) ; char suurin_merkki = annettu_stringi [ 0 ] ; int stringi_indeksi = 1 ; while ( stringi_indeksi < merkkien_maara ) if ( annettu_stringi [ stringi_indeksi ] > suurin_merkki ) suurin_merkki = annettu_stringi [ stringi_indeksi ] ; stringi_indeksi ++ ; return suurin_merkki ; void main ( ) int esimerkkitaulukko [ ] = 44, 2, 66, 33, 9 ; int toinen_taulukko [ ] = 888, 777, 66, 999, 998, 997 ; int suurin_taulukon_luku = etsi_suurin_luku ( esimerkkitaulukko, 5 ) ; cout << "\n Suurin esimerkkitaulukossa oleva luku on " << suurin_taulukon_luku ; etsi_suurin_luku ( toinen_taulukko, 6, suurin_taulukon_luku ) ; cout << "\n\n Suurin toisen taulukon luku on " << suurin_taulukon_luku ; char esimerkkistringi [ ] = "abcde12345abcde;:.,-" ; char suurin_stringin_merkki ; suurin_stringin_merkki = etsi_suurin_luku ( esimerkkistringi ) ; cout << "\n\n Suurin esimerkkistringin merkki on " << suurin_stringin_merkki << " joka on " << (int) suurin_stringin_merkki << "\n" ; Kuva Esimerkki funktionimien ylikuormittamisesta. Copyrights Markku Rahikainen All Rights Reserved. 57

59 Kuva Edellisen esimerkin tulostus. Copyrights Markku Rahikainen All Rights Reserved. 58

60 14. VIITTAUS 14.1 Viittausmuuttuja (Referenssimuuttuja) Viittausmuuttuja eli lyhyemmin viittaus (Reference) on tunnuksen vaihtoehtoinen nimi eli alias. Viittauksia käytetään pääasiassa aliohjelmien muuttuja-parametreissa ja aliohjelmien palauttaman tiedon tyyppinä. Viittausten käytöllä voidaan helpottaa osoittimien käytöstä johtuvaa monimutkaisuutta. Viittauksia voi käyttää C++-kielisessä (Ei siis C-kielisessä) ohjelmassa. Viittausmuuttuja on alustettava määrittelyn yhteydessä. Viittausmuutuja viittaa aina samaan alustuksessa määrättyyn kohteeseen. Kohdetta ei voi vaihtaa. Jos kohdetta on pystyttävä vaihtamaan, on viittauksen sijasta käytettävä osoitinta. Viittausta käytettäessä ei tapahdu kuitenkaan yhtä helposti virheitä kuin osoittimia käytettäessä koska viittaus on alustettava määrittelynsä yhteydessä. Viittaus muistuttaakin enemmän vakioosoitinta (const) kuin tavallista osoitinta. NULL-vertailua ei sitten tarvitse tehdä viittausmuuttujalle samaan tapaan kuin osoittimille. tyyppi &Viittaus = Muuttuja ; Kuva Viittauksen määrittely. Viittaus voidaan määritellä vakiolle (Ei tavallista) tai aiemmin määritellylle muuttujalle. Viittaus määritellään &- operaattorilla. #include <iostream> using namespace std ; int main () int Luku = 9 ; int &Viittaus = Luku ; Viittaus = Viittaus + 1 ; cout << "\n Viittaus: " << Viittaus ; cout << "\n\n Luku: " << Luku << "\n\n" ; return 0 ; Kuva Esimerkki viittausmuuttujan käytöstä. Kuva Edellisen esimerkin tulostus. Viittauksilla on rajoituksia. Viittausta ei voi määritellä toiseen viittausmuuttujaan tai bittikenttään, viittausmuuttujista ei voi määritellä taulukkoa ja viittaukseen ei voi määritellä osoitinta. Edellä olevat rajoitukset johtuvat siitä, että viittausmuuttuja samaistetaan toiseen, viitattuun muuttujaan. Viittaus on siis aliasnimi. Jos Copyrights Markku Rahikainen All Rights Reserved. 59

61 esim. tutkitaan viittauksen osoitetta, tutkitaankin oikeasti viitatun kohteen osoitetta. Samoin, jos määriteltäisiin viittauksen viittaus, on viittaus toinen aliasnimi alkuperäiselle muuttujalle, ei siis viittausmuuttujan aliasnimi. #include <iostream> using namespace std ; int main () int Luku = 10 ; int &Viite1 = Luku ; int &Viite2 = Viite1 ; int *Osoitin = &Viite1 ; cout << "\n Viittauksen 1 kautta luku: " << Viite1 ; cout << "\n\n Viittauksen 2 kautta luku: " << Viite2 ; cout << "\n\n Osoittimen kautta luku: " << *Osoitin ; int *&Viite3 = Osoitin; cout << "\n\n Viittaus osoittimeen: " << *Viite3 ; int Taulukko [10] = 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 ; int (&Viite4) [10] = Taulukko; // Huom! Seuraava olisi väärin: "int &Viite4 [] = Taulukko;". cout << "\n\n Viittauksen taulukkoon kautta: \n\n" ; for (int i = 0; i<10; i++) cout << " " << Viite4 [i] ; const int &Viite5 = 100 ; cout << "\n\n Viittaus vakioon: " << Viite5 << "\n\n" ; return 0 ; Kuva Erilaisia viittauksia. Kuva Edellisen esimerkin tulostus NULL-osoittimet ja NULL-viittaukset Kun osoitinta ei alusteta tai kun sen osoittaman muistialue on vapautettu delete-komennolla, osoittimen arvoksi kannattaa laittaa nolla eli NULL. Viittausten kohdalla tämä ei päde sillä viittaus ei voi olla arvoltaan nolla eli ei mitään. Viittaus voi kyllä kohdistua sellaiseen paikkaan muistia, jossa ei enää ole alkuperäistä viittauksen kohdetta. Ohjelma, jossa viitataan olemattomaan olioon tai käytetään NULL-osoitinta, on virheellinen. Virheellinen ohjelma saattaa toimia tekemättä vahinkoa tai se voi esim. sotkea tietokoneen ja poistaa kaikki tiedot kovalevyltä. Useimmat kääntäjät osaavat reagoida oikein jos ohjelmassa käytetään NULL-osoitinta. Yleensä ohjelma kaadetaan tai sen loputtua annetaan ilmoitus. Tästä huolimatta NULL-osoittimia kannattaa välttää (Kun käytetään viittauksia.). Kun ohjelma siirretään toiselle koneelle, sen toiminnassa saattaa ilmetä mysteerisiä häiriöitä. Copyrights Markku Rahikainen All Rights Reserved. 60

62 Viittaus tietueeseen Viitattavan tiedon tyyppi voi olla perustietotyyppien lisäksi tietuetyyppi tai luokkatyyppi. Viittauksen käyttö tietueiden yhteydessä on osoittimien käyttöä helpompaa. Viittausta käytettäessä tietueen kenttiin voidaan viitata suoraan pistenotaation avulla. #include <iostream> using namespace std ; struct PVM int pp, kk, vv ; ; int main () PVM Tietue = 1, 1, 2001 ; PVM &Viittaus = Tietue ; cout << "\nvuosi viittauksen kautta tulostettuna: " ; cout << Viittaus.vv << "\n\n" ; return 0 ; Kuva Viittaus tietueeseen. Kuva Viittaus tietueeseen ohjelman tulostus Viittaus osoittimeen Viittaus voidaan tarvittaessa määritellä myös osoittimeen. Osoitinta ei voi kuitenkaan määritellä viittaukseen. Viittausta käytettäessä merkintätavat yksinkertaistuvat huomattavasti osoitinmuuttujan käyttöön verrattuna. #include <iostream> using namespace std ; struct PVM int pp, kk, vv ; ; int main () PVM paiva = 1, 12, 99 ; PVM *osoitin1 = &paiva ; PVM *&osoitin2 = osoitin1 ; cout << "\n Kuukausi: " << osoitin1->kk ; cout << "\n\n Kuukausi: " << osoitin2->kk << "\n\n" ; Copyrights Markku Rahikainen All Rights Reserved. 61

Luokassa määriteltävät jäsenet ovat pääasiassa tietojäseniä tai aliohjelmajäseniä. Luokan määrittelyyn liittyvät varatut sanat:

Luokassa määriteltävät jäsenet ovat pääasiassa tietojäseniä tai aliohjelmajäseniä. Luokan määrittelyyn liittyvät varatut sanat: 1. Luokan jäsenet Luokassa määriteltävät jäsenet ovat pääasiassa tietojäseniä tai aliohjelmajäseniä. Luokan määrittelyyn liittyvät varatut sanat: class luokan_nimi tyypit: enum, struct, class, typedef

Lisätiedot

Ohjelmointi 2. Jussi Pohjolainen. TAMK» Tieto- ja viestintäteknologia , Jussi Pohjolainen TAMPEREEN AMMATTIKORKEAKOULU

Ohjelmointi 2. Jussi Pohjolainen. TAMK» Tieto- ja viestintäteknologia , Jussi Pohjolainen TAMPEREEN AMMATTIKORKEAKOULU Ohjelmointi 2 Jussi Pohjolainen TAMK» Tieto- ja viestintäteknologia Tietotyypeistä C++ - kielessä useita tietotyyppejä Kirjaimet: char, wchar_t Kokonaisluvut: short, int, long Liukuluvut: float, double

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

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

Olio-ohjelmointi Syntaksikokoelma

Olio-ohjelmointi Syntaksikokoelma C++-kielen uusia ominaisuuksia Olio-ohjelmointi Syntaksikokoelma 31.10.2008 Bool-tietotyyppi: Totuusarvo true (1), jos ehto on tosi ja false (0) jos ehto epätosi. Dynaaminen muistinvaraus: Yhden muuttuja

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

Sisällys. 15. Lohkot. Lohkot. Lohkot

Sisällys. 15. Lohkot. Lohkot. Lohkot Sisällys 15. Lohkot Tutustutaan lohkoihin. Muuttujien ja vakioiden näkyvyys sekä elinikä erityisesti operaation lohkossa. Nimikonfliktit. Muuttujat operaation alussa vai myöhemmin? 15.1 15.2 Lohkot Aaltosulkeet

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

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

Sisällys. 1. Omat operaatiot. Yleistä operaatioista. Yleistä operaatioista Sisällys 1. Omat operaatiot Yleistä operaatioista. Mihin operaatioita tarvitaan? Oman operaation määrittely. Yleisesti, nimeäminen ja hyvä ohjelmointitapa, määreet, parametrit ja näkyvyys. HelloWorld-ohjelma

Lisätiedot

T Olio-ohjelmointi Osa 3: Luokka, muodostin ja hajotin, this-osoitin Jukka Jauhiainen OAMK Tekniikan yksikkö 2010

T Olio-ohjelmointi Osa 3: Luokka, muodostin ja hajotin, this-osoitin Jukka Jauhiainen OAMK Tekniikan yksikkö 2010 11. Luokka Opetellaan seuraavaksi, miten omia luokkia kirjoitetaan. Aikaisemmin olikin jo esillä, että luokka on tietorakenne, joka sisältää sekä tiedot (attribuutit) että niitä käsittelevät aliohjelmat

Lisätiedot

1. Omat operaatiot 1.1

1. Omat operaatiot 1.1 1. Omat operaatiot 1.1 Sisällys Yleistä operaatioista. Mihin operaatioita tarvitaan? Oman operaation määrittely. Yleisesti, nimeäminen ja hyvä ohjelmointitapa, määreet, parametrit ja näkyvyys. HelloWorld-ohjelma

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

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

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

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

Olion elinikä. Olion luominen. Olion tuhoutuminen. Olion tuhoutuminen. Kissa rontti = null; rontti = new Kissa(); Sisällys 7. Oliot ja viitteet Olio Java-kielessä. Olion luominen, elinikä ja tuhoutuminen. Viitteiden käsittelyä: sijoitus, vertailu ja varautuminen null-arvoon. Viite metodin paluuarvona.. 7.1 7.2 Olio

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

Vertailulauseet. Ehtolausekkeet. Vertailulauseet. Vertailulauseet. if-lauseke. if-lauseke. Javan perusteet 2004

Vertailulauseet. Ehtolausekkeet. Vertailulauseet. Vertailulauseet. if-lauseke. if-lauseke. Javan perusteet 2004 Vertailulauseet Ehtolausekkeet Ehdot, valintalausekkeet Boolean-algebra == yhtäsuuruus!= erisuuruus < pienempi suurempi >= suurempi tai yhtäsuuri Esimerkkejä: int i=7; int j=10;

Lisätiedot

Sisältö. 2. Taulukot. Yleistä. Yleistä

Sisältö. 2. Taulukot. Yleistä. Yleistä Sisältö 2. Taulukot Yleistä. Esittely ja luominen. Alkioiden käsittely. Kaksiulotteinen taulukko. Taulukko operaation parametrina. Taulukko ja HelloWorld-ohjelma. Taulukko paluuarvona. 2.1 2.2 Yleistä

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

1. Esittelyt ja vakiot 1.1 Esittelyt (declarations) Ennen nimen, tunnuksen (identifier) käyttöä se on

1. Esittelyt ja vakiot 1.1 Esittelyt (declarations) Ennen nimen, tunnuksen (identifier) käyttöä se on 1. Esittelyt ja vakiot 1.1 Esittelyt (declarations) Ennen nimen, tunnuksen (identifier) käyttöä se on esiteltävä. char ch; int count=1; struct complex float re, im; complex z; complex sqrt( complex );

Lisätiedot

Sisällys. 7. Oliot ja viitteet. Olion luominen. Olio Java-kielessä

Sisällys. 7. Oliot ja viitteet. Olion luominen. Olio Java-kielessä Sisälls 7. Oliot ja viitteet Olio Java-kielessä. Olion luominen, elinikä ja tuhoutuminen.. Viitteiden vertailu. Varautuminen null-arvoon. Viite metodin paluuarvona.. Muuttumattomat ja muuttuvat merkkijonot.

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

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

Yleistä. Nyt käsitellään vain taulukko (array), joka on saman tyyppisten muuttujien eli alkioiden (element) kokoelma.

Yleistä. Nyt käsitellään vain taulukko (array), joka on saman tyyppisten muuttujien eli alkioiden (element) kokoelma. 2. Taulukot 2.1 Sisältö Yleistä. Esittely ja luominen. Alkioiden käsittely. Kaksiulotteinen taulukko. Taulukko operaation parametrina. Taulukko ja HelloWorld-ohjelma. Taulukko paluuarvona. 2.2 Yleistä

Lisätiedot

Sisältö. 22. Taulukot. Yleistä. Yleistä

Sisältö. 22. Taulukot. Yleistä. Yleistä Sisältö 22. Taulukot Yleistä. Esittely ja luominen. Alkioiden käsittely. Kaksiulotteinen taulukko. Taulukko metodin parametrina. Taulukko ja HelloWorld-ohjelma. Taulukko paluuarvona. 22.1 22.2 Yleistä

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

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

\+jokin merkki tarkoittaa erikoismerkkiä; \n = uusi rivi. 1. Johdanto 1.1 Yleistä Suurten ohjelmien organisointi vaikeaa C:ssä. 1980 Stroustrup lisäsi C:hen olio-ohjelmoinnin (OOP = Object Oriented Programming). C C++: C-ohjelma on (muutamia poikkeuksia lukuunottamatta)

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

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

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

Ohjelmointitaito (ict1td002, 12 op) Kevät Java-ohjelmoinnin alkeita. Tietokoneohjelma. Raine Kauppinen Ohjelmointitaito (ict1td002, 12 op) Kevät 2009 Raine Kauppinen raine.kauppinen@haaga-helia.fi 1. Java-ohjelmoinnin alkeita Tietokoneohjelma Java-kieli ja Eclipse-kehitysympäristö Java-ohjelma ja luokka

Lisätiedot

VIII. Osa. Liitteet. Liitteet Suoritusjärjestys Varatut sanat Binääri- ja heksamuoto

VIII. Osa. Liitteet. Liitteet Suoritusjärjestys Varatut sanat Binääri- ja heksamuoto Osa VIII Liitteet Liitteet A B C Suoritusjärjestys Varatut sanat Binääri- ja heksamuoto Osa VIII A. Liite Operaattoreiden suoritusjärjestys On tärkeää ymmärtää, että operaattoreilla on prioriteettinsa,

Lisätiedot

Sisällys. 6. Muuttujat ja Java. Muuttujien nimeäminen. Muuttujien nimeäminen. salinovi tai syntymapaiva

Sisällys. 6. Muuttujat ja Java. Muuttujien nimeäminen. Muuttujien nimeäminen. salinovi tai syntymapaiva Sisällys 6. Muuttujat ja Java Muuttujien nimeäminen. Muuttujan tyypin määritys. Javan tietotyypit: Kokonais- ja liukuluvut. boolean- ja char-tyypit. Tyyppien yhteensopivuus. Viitetietotyypit ja merkkijonotietotyyppi

Lisätiedot

6. Muuttujat ja Java 6.1

6. Muuttujat ja Java 6.1 6. Muuttujat ja Java 6.1 Sisällys Muuttujien nimeäminen. Muuttujan tyypin määritys. Javan tietotyypit: Kokonais- ja liukuluvut. boolean- ja char-tyypit. Tyyppien yhteensopivuus. Viitetietotyypit ja merkkijonotietotyyppi

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

T740103 Olio-ohjelmointi Osa 5: Periytyminen ja polymorfismi Jukka Jauhiainen OAMK Tekniikan yksikkö 2010

T740103 Olio-ohjelmointi Osa 5: Periytyminen ja polymorfismi Jukka Jauhiainen OAMK Tekniikan yksikkö 2010 12. Periytyminen Johdantoa Käytännössä vähänkään laajemmissa ohjelmissa joudutaan laatimaan useita luokkia, joiden pitäisi pystyä välittämään tietoa toisilleen. Ohjelmien ylläpidon kannalta olisi lisäksi

Lisätiedot

5/20: Algoritmirakenteita III

5/20: Algoritmirakenteita III Ohjelmointi 1 / syksy 2007 5/20: Algoritmirakenteita III Paavo Nieminen nieminen@jyu.fi Tietotekniikan laitos Informaatioteknologian tiedekunta Jyväskylän yliopisto Ohjelmointi 1 / syksy 2007 p.1/17 Tämän

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

7. Oliot ja viitteet 7.1

7. Oliot ja viitteet 7.1 7. Oliot ja viitteet 7.1 Sisällys Olio Java-kielessä. Olion luominen, elinikä ja tuhoutuminen. Viitteiden sijoitus. Viitteiden vertailu. Varautuminen null-arvoon. Viite metodin paluuarvona. Viite metodin

Lisätiedot

Sisällys. 6. Muuttujat ja Java. Muuttujien nimeäminen. Muuttujien nimeäminen. salinovi tai syntymapaiva

Sisällys. 6. Muuttujat ja Java. Muuttujien nimeäminen. Muuttujien nimeäminen. salinovi tai syntymapaiva Sisällys 6. Muuttujat ja Java Muuttujien nimeäminen. Muuttujan tyypin määritys. Javan tietotyypit: Kokonais- ja liukuluvut, merkit, totuusarvot. Tyyppien yhteensopivuus. Viitetietotyypit ja merkkijonotietotyyppi

Lisätiedot

6. Muuttujat ja Java 6.1

6. Muuttujat ja Java 6.1 6. Muuttujat ja Java 6.1 Sisällys Muuttujien nimeäminen. Muuttujan tyypin määritys. Javan tietotyypit: Kokonais- ja liukuluvut, merkit, totuusarvot. Tyyppien yhteensopivuus. Viitetietotyypit ja merkkijonotietotyyppi

Lisätiedot

Harjoitustyö: virtuaalikone

Harjoitustyö: virtuaalikone Harjoitustyö: virtuaalikone Toteuta alla kuvattu virtuaalikone yksinkertaiselle olio-orientoituneelle skriptauskielelle. Paketissa on testaamista varten mukana kaksi lyhyttä ohjelmaa. Ohjeita Noudata ohjelman

Lisätiedot

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python Ohjelmoinnin perusteet Y Python T-106.1208 19.1.2011 T-106.1208 Ohjelmoinnin perusteet Y 19.1.2011 1 / 39 Haluatko antaa palautetta luennoista? Ilmoittaudu mukaan lähettämällä ilmainen tekstiviesti Vast

Lisätiedot

11/20: Konepelti auki

11/20: Konepelti auki Ohjelmointi 1 / syksy 2007 11/20: Konepelti auki Paavo Nieminen nieminen@jyu.fi Tietotekniikan laitos Informaatioteknologian tiedekunta Jyväskylän yliopisto Ohjelmointi 1 / syksy 2007 p.1/11 Tämän luennon

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

on ohjelmoijan itse tekemä tietotyyppi, joka kuvaa käsitettä

on ohjelmoijan itse tekemä tietotyyppi, joka kuvaa käsitettä LUOKAN MÄÄRITTELY Luokka, mitä se sisältää Luokan määrittely Olion ominaisuudet eli attribuutit Olion metodit Olion muodostimet ja luonti Olion tuhoutuminen Metodin kutsu luokan ulkopuolelta Olion kopioiminen

Lisätiedot

Muuttujat ja kontrolli. Ville Sundberg

Muuttujat ja kontrolli. Ville Sundberg Muuttujat ja kontrolli Ville Sundberg 14.9.2007 Alkeistyyppi Alin abstraktiotaso josta tarvitsee välittää Yksittäinen, jakamaton tiedonjyvä Tavallaan kaikki alkeistyypit ovat lukuja arvojoukko vaihtelee

Lisätiedot

Sisällys. 3. Muuttujat ja operaatiot. Muuttujat ja operaatiot. Muuttujat ja operaatiot

Sisällys. 3. Muuttujat ja operaatiot. Muuttujat ja operaatiot. Muuttujat ja operaatiot 3. Muuttujat ja operaatiot Sisällys Muuttujat. Nimi ja arvo. Algoritmin tila. Muuttujan nimeäminen. Muuttujan tyyppi. Muuttuja ja tietokone. Operaattorit. Operandit. Arvon sijoitus muuttujaan. Aritmeetiikka.

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

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

Java-kielen perusteet

Java-kielen perusteet Java-kielen perusteet String-merkkijonoluokka 1 Ohjelmointikielten merkkijonot Merkkijonot ja niiden käsittely on välttämätöntä ohjelmoinnissa Valitettavasti ohjelmointikielten tekijät eivät tätä ole ottaneet

Lisätiedot

19. Olio-ohjelmointia Javalla 19.1

19. Olio-ohjelmointia Javalla 19.1 19. Olio-ohjelmointia Javalla 19.1 Sisällys Olioiden esittely ja alustus. Metodit Yleistä metodeista. Mihin metodeja tarvitaan? Metodien määrittely. Omat metodit: nimeäminen, paikka, kutsuminen, parametrit

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

Tietuetyypin määrittely toteutetaan C-kielessä struct-rakenteena seuraavalla tavalla:

Tietuetyypin määrittely toteutetaan C-kielessä struct-rakenteena seuraavalla tavalla: KERTAUSTEHTÄVIÄ Tietue Tietuetyypin määrittely toteutetaan C-kielessä struct-rakenteena seuraavalla tavalla: struct henkilotiedot char nimi [20]; int ika; char puh [10]; ; Edellä esitetty kuvaus määrittelee

Lisätiedot

etunimi, sukunimi ja opiskelijanumero ja näillä

etunimi, sukunimi ja opiskelijanumero ja näillä Sisällys 1. Algoritmi Algoritmin määritelmä. Aiheen pariin johdatteleva esimerkki. ja operaatiot (sijoitus, aritmetiikka ja vertailu). Algoritmista ohjelmaksi. 1.1 1.2 Algoritmin määritelmä Ohjelmointi

Lisätiedot

LOAD R1, =2 Sijoitetaan rekisteriin R1 arvo 2. LOAD R1, 100

LOAD R1, =2 Sijoitetaan rekisteriin R1 arvo 2. LOAD R1, 100 Tiedonsiirtokäskyt LOAD LOAD-käsky toimii jälkimmäisestä operandista ensimmäiseen. Ensimmäisen operandin pitää olla rekisteri, toinen voi olla rekisteri, vakio tai muistiosoite (myös muuttujat ovat muistiosoitteita).

Lisätiedot

Ohjelmoinnin peruskurssi Y1

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

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 CS-A1111 14.9.2016 CS-A1111 Ohjelmoinnin peruskurssi Y1 14.9.2016 1 / 19 Oppimistavoitteet: tämän luennon jälkeen osaat kirjoittaa Python-ohjelman, joka pyytää käyttäjältä lukuja,

Lisätiedot

1. Algoritmi 1.1 Sisällys Algoritmin määritelmä. Aiheen pariin johdatteleva esimerkki. Muuttujat ja operaatiot (sijoitus, aritmetiikka ja vertailu). Algoritmista ohjelmaksi. 1.2 Algoritmin määritelmä Ohjelmointi

Lisätiedot

Tietorakenteet ja algoritmit

Tietorakenteet ja algoritmit Tietorakenteet ja algoritmit Muuttujat eri muisteissa Ohjelman muistialueen layout Paikallisen ja globaalin muuttujan ominaisuudet Dynaamisen muistinkäytön edut Paikallisten muuttujien dynaamisuus ADT

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

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

C++11 lambdat: [](){} Matti Rintala

C++11 lambdat: [](){} Matti Rintala C++11 lambdat: [](){} Matti Rintala bool(*)(int) Tarve Tarve välittää kirjastolle/funktiolle toiminnallisuutta Callback-funktiot Virhekäsittely Käyttöliittymät Geneeristen kirjastojen räätälöinti STL:n

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

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

tään painetussa ja käsin kirjoitetussa materiaalissa usein pienillä kreikkalaisilla

tään painetussa ja käsin kirjoitetussa materiaalissa usein pienillä kreikkalaisilla 2.5. YDIN-HASKELL 19 tään painetussa ja käsin kirjoitetussa materiaalissa usein pienillä kreikkalaisilla kirjaimilla. Jos Γ ja ovat tyyppilausekkeita, niin Γ on tyyppilauseke. Nuoli kirjoitetaan koneella

Lisätiedot

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python Ohjelmoinnin perusteet Y Python T-106.1208 15.3.2010 T-106.1208 Ohjelmoinnin perusteet Y 15.3.2010 1 / 56 Tiedostoista: tietojen tallentaminen ohjelman suorituskertojen välillä Monissa sovelluksissa ohjelman

Lisätiedot

Luokan muodostimet (Constructors)

Luokan muodostimet (Constructors) Mikä on muodostin? Luokan muodostimet (Constructors) Millaisia muodostimia on? Oletusmuodostin (Default Constructor) Parametrillinen muodostin Kopiointimuodostin (Copy Constructor) this-muuttuja Miten

Lisätiedot

2. Olio-ohjelmoinista lyhyesti 2.1

2. Olio-ohjelmoinista lyhyesti 2.1 2. Olio-ohjelmoinista lyhyesti 2.1 Sisällys Yleistä. Oliot ja luokat. Attribuutit. Olioiden esittely ja alustus. Rakentajat. Olion operaation kutsuminen. 2.2 Yleistä Olio-ohjelmointia käsitellään hyvin

Lisätiedot

UNIVERSITY OF OULU DEPARTMENT OF INFORMATION PROCESSING SCIENCE

UNIVERSITY OF OULU DEPARTMENT OF INFORMATION PROCESSING SCIENCE 1 UNIVERSITY OF OULU DEPARTMENT OF INFORMATION PROCESSING SCIENCE OPETUSMONISTEET SARJA C11 JUUSTILA ANTTI KETTUNEN HARRI KILPI TEEMU RÄISÄNEN TONI VESANEN ARI C++- OHJELMOINTIKURSSIN OHEISMATERIAALI ISBN

Lisätiedot

C++11 Syntaksi. Jari-Pekka Voutilainen Jari-Pekka Voutilainen: C++11 Syntaksi

C++11 Syntaksi. Jari-Pekka Voutilainen Jari-Pekka Voutilainen: C++11 Syntaksi 1 C++11 Syntaksi Jari-Pekka Voutilainen 13.4.2012 2 Range-for Iteroi säiliön kaikki alkiot for-silmukassa. Säiliöltä vaaditaan begin- ja end-iteraattorit. Pätee kaikille C++11 STL-säiliöille, taulukoille,

Lisätiedot

7/20: Paketti kasassa ensimmäistä kertaa

7/20: Paketti kasassa ensimmäistä kertaa Ohjelmointi 1 / syksy 2007 7/20: Paketti kasassa ensimmäistä kertaa Paavo Nieminen nieminen@jyu.fi Tietotekniikan laitos Informaatioteknologian tiedekunta Jyväskylän yliopisto Ohjelmointi 1 / syksy 2007

Lisätiedot

11. oppitunti III. Viittaukset. Osa. Mikä on viittaus?

11. oppitunti III. Viittaukset. Osa. Mikä on viittaus? Osa III 11. oppitunti Viittaukset Kahdessa viime luvussa opit käyttämään osoittimia kohteiden käsittelyyn vapaalla muistialueella sekä viittaamaan noihin kohteisiin epäsuorasti. Tässä luvussa käsiteltävät

Lisätiedot

Johdatus ohjelmointiin / Lausekielinen ohjelmointi 1 & 2

Johdatus ohjelmointiin / Lausekielinen ohjelmointi 1 & 2 Johdatus ohjelmointiin / Lausekielinen ohjelmointi 1 & 2 Syntaksilomake (22.4.2007) C-kielen standardikirjaston funktioita gets(merkkijono); scanf("formaatti", &muuttuja1,..., &muuttujan); sscanf(merkkijono,

Lisätiedot

12. Näppäimistöltä lukeminen 12.1

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

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

16. Ohjelmoinnin tekniikkaa 16.1

16. Ohjelmoinnin tekniikkaa 16.1 16. Ohjelmoinnin tekniikkaa 16.1 Sisällys For-lause lyhemmin. Vaihtoehtoisia merkintöjä aritmeettisille lauseille. Useiden muuttujien esittely ja alustaminen yhdellä lauseella. If-else-lause vaihtoehtoisesti

Lisätiedot

Sisällys. 17. Ohjelmoinnin tekniikkaa. Aritmetiikkaa toisin merkiten. for-lause lyhemmin

Sisällys. 17. Ohjelmoinnin tekniikkaa. Aritmetiikkaa toisin merkiten. for-lause lyhemmin Sisällys 17. Ohjelmoinnin tekniikkaa for-lause lyhemmin. Vaihtoehtoisia merkintöjä aritmeettisille lauseille. Useiden muuttujien esittely ja alustaminen yhdellä lauseella. if-else-lause vaihtoehtoisesti

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

17. Ohjelmoinnin tekniikkaa 17.1

17. Ohjelmoinnin tekniikkaa 17.1 17. Ohjelmoinnin tekniikkaa 17.1 Sisällys for-lause lyhemmin. Vaihtoehtoisia merkintöjä aritmeettisille lauseille. Useiden muuttujien esittely ja alustaminen yhdellä lauseella. if-else-lause vaihtoehtoisesti

Lisätiedot

Muuttujatyypit ovat Boolean, Byte, Integer, Long, Double, Currency, Date, Object, String, Variant (oletus)

Muuttujatyypit ovat Boolean, Byte, Integer, Long, Double, Currency, Date, Object, String, Variant (oletus) VISUAL BASIC OHJEITA Kutsuttava ohjelma alkaa kometoparilla Sub... End Sub Sub ohjelmanimi()...koodia... End Sub Muuttujat Muuttujan esittely Muuttujatyypit ovat Boolean, Byte, Integer, Long, Double, Currency,

Lisätiedot

Mallit standardi mallikirjasto parametroitu tyyppi

Mallit standardi mallikirjasto parametroitu tyyppi Mallit 18 Mallit Malli on tehokas mekanismi uusien luokkien generoimiseksi automaattisesti. Standardikirjaston suuri osa, standardi mallikirjasto, rakentuu kokonaan mallien määrittelymahdollisuuden ympärille,

Lisätiedot

Moduli 4: Moniulotteiset taulukot & Bittioperaatiot

Moduli 4: Moniulotteiset taulukot & Bittioperaatiot C! : Moniulotteiset taulukot & Bittioperaatiot 15.3.2016 Agenda Pieni kertausharjoitus Moniulotteiset taulukot Esimerkki taulukoista Tauko (bittitehtävä) Binäärioperaatioista Esimerkki (vilkaistaan IP

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

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

TIEP114 Tietokoneen rakenne ja arkkitehtuuri, 3 op. Assembly ja konekieli

TIEP114 Tietokoneen rakenne ja arkkitehtuuri, 3 op. Assembly ja konekieli TIEP114 Tietokoneen rakenne ja arkkitehtuuri, 3 op Assembly ja konekieli Tietokoneen ja ohjelmiston rakenne Loogisilla piireillä ja komponenteilla rakennetaan prosessori ja muistit Prosessorin rakenne

Lisätiedot

Tehtävä 1. TL5302 Olio-ohjelmointi Koe Malliratkaisuja. Tässä sekä a)- että b)-kohdan toimiva ratkaisu:

Tehtävä 1. TL5302 Olio-ohjelmointi Koe Malliratkaisuja. Tässä sekä a)- että b)-kohdan toimiva ratkaisu: TL5302 Olio-ohjelmointi Koe 19.4.2005 Malliratkaisuja Tehtävä 1 Tässä sekä a)- että b)-kohdan toimiva ratkaisu: #include using namespace std; int main() int taul[5]=1,2,3,4,5; int *p,&r=taul[0];

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

Pong-peli, vaihe Aliohjelman tekeminen. Muilla kielillä: English Suomi. Tämä on Pong-pelin tutoriaalin osa 3/7. Tämän vaiheen aikana

Pong-peli, vaihe Aliohjelman tekeminen. Muilla kielillä: English Suomi. Tämä on Pong-pelin tutoriaalin osa 3/7. Tämän vaiheen aikana Muilla kielillä: English Suomi Pong-peli, vaihe 3 Tämä on Pong-pelin tutoriaalin osa 3/7. Tämän vaiheen aikana Jaetaan ohjelma pienempiin palasiin (aliohjelmiin) Lisätään peliin maila (jota ei voi vielä

Lisätiedot

812341A Olio-ohjelmointi Peruskäsitteet jatkoa

812341A Olio-ohjelmointi Peruskäsitteet jatkoa 812341A Olio-ohjelmointi 2106 Peruskäsitteet jatkoa Luokkakohtaiset piirteet n Yhteisiä kaikille saman luokan olioille n Liittyvät luokkaan, eivät yksittäiseen olioon n Kaikki ko. luokan oliot voivat käyttää

Lisätiedot

Sisällys. 6. Metodit. Oliot viestivät metodeja kutsuen. Oliot viestivät metodeja kutsuen

Sisällys. 6. Metodit. Oliot viestivät metodeja kutsuen. Oliot viestivät metodeja kutsuen Sisällys 6. Metodit Oliot viestivät metodeja kutsuen. Kuormittaminen. Luokkametodit (ja -attribuutit).. Metodien ja muun luokan sisällön järjestäminen. 6.1 6.2 Oliot viestivät metodeja kutsuen Oliot viestivät

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

Table of Contents. T740103 Olio-ohjelmointi C/C++ perusteita Jukka Jauhiainen OAMK Tekniikan yksikkö 2010, 2011

Table of Contents. T740103 Olio-ohjelmointi C/C++ perusteita Jukka Jauhiainen OAMK Tekniikan yksikkö 2010, 2011 Tämän materiaalin lähteenä on käytetty osoitteesta http://www.cplusplus.com/doc/tutorial löytyvää C+ + Language Tutorial. Tämän osan tarkoituksena on pääasiassa kerrata C-kielestä tuttuja perusasioita

Lisätiedot

11. Javan valintarakenteet 11.1

11. Javan valintarakenteet 11.1 11. Javan valintarakenteet 11.1 Sisällys If- ja if--lauseet. Orpo. Valintaa toisin: switch-lause. 11.2 Valintarakenteet Valintarakenteilla ilmaistaan formaalisti, kuinka algoritmin suoritus voi haarautua

Lisätiedot

Tietorakenteet. JAVA-OHJELMOINTI Osa 5: Tietorakenteita. Sisällys. Merkkijonot (String) Luokka String. Metodeja (public)

Tietorakenteet. JAVA-OHJELMOINTI Osa 5: Tietorakenteita. Sisällys. Merkkijonot (String) Luokka String. Metodeja (public) Tietorakenteet JAVA-OHJELMOINTI Osa 5: Tietorakenteita Eero Hyvönen Tietojenkäsittelytieteen laitos Helsingin yliopisto Olioita ja tietoja voidaan organisoida määrämuotoisiksi tietorakenteiksi Hyödyllisiä

Lisätiedot

Ohjelmoinnin perusteet, kurssikoe

Ohjelmoinnin perusteet, kurssikoe Ohjelmoinnin perusteet, kurssikoe 18.6.2014 Kirjoita jokaiseen konseptiin kurssin nimi, kokeen päivämäärä, nimi, TMC-tunnus ja opiskelijanumero tai henkilötunnus. Vastaukset palautetaan tehtäväkohtaisiin

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

20. Javan omat luokat 20.1

20. Javan omat luokat 20.1 20. Javan omat luokat 20.1 Sisällys Application Programming Interface (API). Pakkaukset. Merkkijonoluokka String. Math-luokka. Kääreluokat. 20.2 Java API Java-kielen Application Programming Interface (API)

Lisätiedot