812347A Olio-ohjelmointi, 2015 syksy 2. vsk. I Johdanto ohjelmointiin C++kielellä

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

815338A Ohjelmointikielten periaatteet Harjoitus 5 Vastaukset

Osoitin ja viittaus C++:ssa

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

815338A Ohjelmointikielten periaatteet Harjoitus 3 vastaukset

12 Mallit (Templates)

812347A Olio-ohjelmointi, 2015 syksy 2. vsk. X Poikkeusten käsittelystä

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

Ohjelmointi 1 Taulukot ja merkkijonot

Java-kielen perusteet

Tietueet. Tietueiden määrittely

Kääntäjän virheilmoituksia

C++ rautaisannos. Kolme tapaa sanoa, että tulostukseen käytetään standardikirjaston iostreamosassa määriteltyä, nimiavaruuden std oliota cout:

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

tietueet eri tyyppisiä tietoja saman muuttujan arvoiksi

13 Operaattoreiden ylimäärittelyjä

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

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

Java-kielen perusteet

Geneeriset luokat. C++ - perusteet Java-osaajille luento 6/7: Template, tyyppi-informaatio, nimiavaruudet. Geneerisen luokan käyttö.

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

Olio-ohjelmointi Syntaksikokoelma

Virtuaalifunktiot ja polymorfismi

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

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

Ohjelmoinnin perusteet Y Python

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

ITKP102 Ohjelmointi 1 (6 op)

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

Ohjelmoinnin peruskurssi Y1

Ohjelmointi funktioiden avulla

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

ITKP102 Ohjelmointi 1 (6 op)

Ohjelmoinnin perusteet Y Python

Ohjelman virheet ja poikkeusten käsittely

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

ITKP102 Ohjelmointi 1 (6 op)

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

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

JAVA-PERUSTEET. JAVA-OHJELMOINTI 3op A JAVAN PERUSTEET LYHYT KERTAUS JAVAN OMINAISUUKSISTA JAVAN OMINAISUUKSIA. Java vs. C++?

Tiedostot. Tiedostot. Tiedostot. Tiedostot. Tiedostot. Tiedostot

ITKP102 Ohjelmointi 1 (6 op)

Ohjelmointiharjoituksia Arduino-ympäristössä

1. Omat operaatiot 1.1

Ohjelmoinnin peruskurssi Y1

Osoittimet. Mikä on osoitin?

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

Lyhyt kertaus osoittimista

7. Oliot ja viitteet 7.1

UNIVERSITY OF OULU DEPARTMENT OF INFORMATION PROCESSING SCIENCE

1. C++ -pääohjelma. Olio-ohjelmointi Johdanto ohjelmointiin C++-kielellä

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

Muuttujien roolit Kiintoarvo cin >> r;

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

4. Luokan testaus ja käyttö olion kautta 4.1

Loppukurssin järjestelyt

Ohjelmoinnin peruskurssi Y1

Loppukurssin järjestelyt C:n edistyneet piirteet

1. Olio-ohjelmointi 1.1

Rakenteiset tietotyypit Moniulotteiset taulukot

Osoittimet ja taulukot

Ohjelmoinnin peruskurssi Y1

Olio-ohjelmointi Javalla

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

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

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

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

Kielioppia: toisin kuin Javassa

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

812347A Olio-ohjelmointi, 2015 syksy 2. vsk. V Geneerisyys

Mallit standardi mallikirjasto parametroitu tyyppi

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

Harjoitustyö: virtuaalikone

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

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

Osoittimet ja taulukot

Sisällys. Yleistä attribuuteista. Näkyvyys luokan sisällä ja ulkopuolelta. Attribuuttien arvojen käsittely aksessoreilla. 4.2

Ohjelmoinnin perusteet Y Python

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

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

7. Näytölle tulostaminen 7.1

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

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

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

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

Omat tietotyypit. Mikä on olio?

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

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

Esimerkki luokkahierarkiasta: C++-kielen IOstream-kirjasto

Luokat. Luokat ja olio-ohjelmointi

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

Olio-ohjelmointi Geneerisyys. 1. Johdanto

Ohjelmoinnin perusteet Y Python

Taulukot. Jukka Harju, Jukka Juslin

C# olio-ohjelmointi perusopas

D-OHJELMOINTIKIELI. AA-kerho, 33. Antti Uusimäki. Arto Savolainen

Periytyminen. Luokat ja olio-ohjelmointi

Operaattoreiden uudelleenmäärittely

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

Tietorakenteet ja algoritmit

Transkriptio:

812347A Olio-ohjelmointi, 2015 syksy 2. vsk I Johdanto ohjelmointiin C++kielellä

Sisältö 1. C++-kielen lyhyt historia 2. C++-kielen ominaisuuksia tiivistettynä 3. Peruskäsitteitä 4. C++-ohjelman looginen rakenne 5. Ohjelmatiedostot 6. Tietotyypit 7. Muuttujat 8. Perus I/O 9. Funktiot ohjelmointiin C++-kielellä 2

I.1 C++-kielen lyhyt historia 1980 C with classes kielen ensimmäinen versio Bjarne Stroustrup, AT&T Bell Laboratories 1983 C++ Nimen keksi Rick Mascitti Käyttöön AT&T:n ulkopuolella 1989 C++ 2.0 Uusia ominaisuuksia moniperiytyminen, parametrisoidut tyypit ja poikkeusten käsittely 1997 C++:lle ISO-standardi Sisältää kielen ja standardikirjaston (STL) Uusin versio standardista C++14 ohjelmointiin C++-kielellä 3

I.2 C++-kielen ominaisuuksia tiivistettynä Standardoitu ohjelmointikieli Tukee suoraan useita eri ohjelmointiparadigmoja Proseduraalinen ohjelmointi Modulaarinen ohjelmointi Olio-ohjelmointi Geneerinen ohjelmointi Perustuu C-ohjelmointikieleen Voidaan käyttää olemassa olevia C-kielen kirjastoja ohjelmointiin C++-kielellä 4

I.2 C++-kielen ominaisuuksia tiivistettynä (2) Moniperiytyminen Template-mekanismi on täydellinen ohjelmointikieli Voidaan tehdä monimutkaisia suunnitteluratkaisuja jo käännösaikana Ohjelmoijan muodostamat tyypit eivät eroa millään tavoin sisäisistä tyypeistä Operaattoreiden ylikuormitus ohjelmointiin C++-kielellä 5

I.2 C++-kielen ominaisuuksia tiivistettynä (3) Rinnakkaisuuden tuki (Concurrency) Uusimmassa versiossa (C++11) suora tuki säikeille (Threads) Ei tukea moniprosessointiin (Multi-Processing) Säännöllisten ilmausten tuki Uusimmassa versiossa (C++11) Ei automaattista roskien keruuta Ohjelmoijan vapautettava kekodynaaminen muisti Ei suoraa tukea tiedon pysyvyyteen (Persistence) Toteuttamiseen olemassa kirjastoja ohjelmointiin C++-kielellä 6

I.3 Peruskäsitteitä : I.3.1 Entiteetti C++ ohjelman osa, jolla on nimi ja tyyppi Nimiavaruus (namespace) Tietue (struct) Luokka (class) Funktio (function) Muuttuja (variable) Vakio (const) ohjelmointiin C++-kielellä 7

I.3.2 Lohko Yksi lausekielten peruskäsitteitä Määrää rajat ohjelman entiteettien olemassaololle C++:n lohkotyypit Ohjelma Nimiavaruus Luokka Funktio Lohko { } sulkeiden välissä oleva alue ohjelmointiin C++-kielellä 8

I.3.3 Esittely ja tyyppi Jokainen ohjelman entiteetti esiteltävä ennen käyttöä Jos entiteettiä käytetään, pitää myös määritellä Esittelyn yhteydessä entiteetille sidotaan tyyppi Tyyppi määrittelee entiteetille sallitut operaatiot Tyyppi määrittelee kuinka tietokoneen muistia tulkitaan ajonaikana T 00110101 float 0.0117647 53 ohjelmointiin C++-kielellä 9

I.3.4 Määrittely Entiteetti esitellään ja samalla liitetään siihen toteutus Jokainen käytettävä entiteetti pitää määritellä täsmälleen kerran Muuten viimeistään linkittäjä antaa virheilmoituksen Voimassa siinä lohkossa, jossa määritys tapahtuu Määrittelyn ja esittelyn vastattava täsmälleen toisiaan ohjelmointiin C++-kielellä 10

I.4 C++-ohjelman looginen rakenne Koostuu yleensä vähintään kolmesta lohkosta Ohjelma eli globaalinen lohko main funktio (pääohjelma) std nimiavaruus (jos käytetään std kirjastoa) Mahdolliset muut nimiavaruudet, esimerkiksi boostkirjaston boost-nimiavaruus ohjelmointiin C++-kielellä 11

I.4.1 Nimiavaruudet Loogisia ohjelman osia sitovia kokonaisuuksia Työkaluja suurten ohjelmistojen ja ohjelmakirjastojen hallintaan Mahdollistavat samannimiset entiteetit esimerkiksi eri toimittajilta hankituista kirjastoista Tällä kurssilla käytetään vain std-nimiavaruutta Ovat avoimia: niihin voi lisätä entiteettejä useassa eri tilanteessa std-nimiavaruus Suljettu: sisältää standardissa määritellyt entiteetit ohjelmointiin C++-kielellä 12

I.4.2 Pääohjelma C++-ohjelman suoritus alkaa aina funktiosta main Kutsutaan automaattisesti Funktion tyyppi aina int Kaksi muotoa int main () int main (int argc, char** argv) Jos main -funktiossa ei ole return -lausetta kääntäjä olettaa paluuarvoksi nollan ohjelmointiin C++-kielellä 13

I.4.2 Pääohjelma (2) main-funktio ilman parametreja: #include <iostream> #include <string> using namespace std; int main() { cout << Anna nimesi: ; string nimi; getline(cin, nimi); cout << Onko ohjelmointi hauskaa << nimi <<? << endl; } return 0; ohjelmointiin C++-kielellä 14

I.4.2 Pääohjelma (3) main-funktio parametreilla #include <iostream> #include <string> int main(int argc, char** argv) { using namespace std; cout << Käynnistysparametrien lukumäärä on: << argc << endl; cout << Ohjelman nimi on: << argv[0] << endl; for (int i = 1; i < argc; ++i){ cout << Parametri << i << on << argv[i] << endl; } } ohjelmointiin C++-kielellä 15

I.5 Ohjelmatiedostot: I.5.1 Otsikkotiedostot Päätarkoitus: Tarjota entiteetin eri käyttäjille yhtenäinen esittely ja estää moninkertaiset esittelyt Sisällytetään esikääntäjän käskyllä #include Vältä sisällyttämästä toista otsikkotiedostoa toiseen otsikkotiedostoon Usein kuitenkin pakko tehdä Otsikkotiedostoissa ei tule koskaan esiintyä Funktioiden määrityksiä Muuttujien määrityksiä ohjelmointiin C++-kielellä 16

I.5.1 Otsikkotiedostot (2) #ifndef INCLUDED_OTSIKKOTIEDOSTON_NIMI_H #define INCLUDED_OTSIKKOTIEDOSTON_NIMI_H /* * OtsikkoTiedosto.h * -- Muut tiedostokommentin kentät */ // // Esittelyt ja määritykset // INCLUDE-VAHTI #endif // not def. INCLUDED_OTSIKKOTIEDOSTON_NIMI_H ohjelmointiin C++-kielellä 17

I.5.2 Lähdekooditiedostot Ohjelman eri entiteettien määrittely pääsääntöisesti Funktion määrittely on sen toteutus Yhden entiteetin määrittely yhdessä lähdetiedostossa Laajat määritykset voidaan hajottaa useampaan tiedostoon Pienemmät objektitiedostot Nopeammat käännösajat ohjelmointiin C++-kielellä 18

I.6 Tietotyypit C++:n tietotyypit jaetaan kolmeen ryhmään 1. Primitiiviset tyypit (perustietotyypit) 2. Johdetut tyypit 3. Luokkatyypit ohjelmointiin C++-kielellä 19

I.6.1 Primitiiviset tietotyypit Sisäänrakennettuja tietotyyppejä Ei määritellä muiden tyyppien avulla Primitiiviset tyypit char short, int, long, long long bool float, double, long double void - Merkki, tavu - Kokonaisluvut - Totuusarvo (false, true) - Reaaliluvut - Näennäistyypi Kokonaislukutyypit ohjelmointiin C++-kielellä 20

I.6.2 Primitiivisten tyyppien koko C++:n standardissa ei ole täsmällisesti määritelty primitiivityyppien kokoja short >= 16b, long >= 32b, C++11: long long >= 64b Tyypin koon tavuissa saa selville sizeof -operaattorilla Yleensä char -tyyppi on yhden tavun kokoinen Muille tyypeille standardissa sizeof (char) <= sizeof (short) <= sizeof(int) <= sizeof (long) <= sizeof (long long) sizeof(float) <= sizeof (double) <= sizeof(long double) ohjelmointiin C++-kielellä 21

I.6.3 Näennäistyyppi void void == tyhjä, ei-mitään Ei varsinainen tyyppi, koska sen avulla ei voida muodostaa muuttujaa Käytetään kun määritellään funktiota, joka ei palauta paluuarvoa void myfunc(); // funktio ei palauta mitään Voidaan käyttää tyypittömän osoitinmuuttujan määrittelemiseen. void* -- osoitin johonkin ohjelmointiin C++-kielellä 22

I.6.4 typedef Mekanismi tarjoaa keinon esitellä synonyymejä sisäisille tai muille tyypeille Uusi tyyppi on alias, uusi nimi vanhalle tyypille Käytetään usein, kun oikea tyyppi on epämiellyttävän mutkikas Esim. typedef int Ika; int pekanika=12,yhteensa; Ika maijanika=11; yhteensa = pekanika + maijanika; ohjelmointiin C++-kielellä 23

I.6.5 Johdetut tyypit Primitiivityypeistä johdetut tyypit 1. Vakiot 2. Viittaukset 3. Osoittimet 4. Taulukot 5. Aliohjelmat (funktiot) ohjelmointiin C++-kielellä 24

I.6.5.1 Vakiot Muuttuja määritellään vakiotyyppiseksi lisäämällä määrityksen alkuun ennen muuttujan nimeä avainsana const. Arvoa ei voida muuttaa alustuksen jälkeen const int monthsinyear = 12; ohjelmointiin C++-kielellä 25

I.6.5.2 Viittaukset Sekä viittaukset että osoittimet viittaavat muistipaikkaan Viittaukset sidotaan määrityksen yhteydessä (ei voi muuttaa suorituksen aikana) Osoittimet voivat muuttaa kohdettaan suorituksen aikana Viittaustyyppimääritys koostuu tyypistä ja &-merkistä ennen muuttujan nimeä Käytetään yleisesti vakioviittausparametrina suurten olioiden välittämiseen funktioille ohjelmointiin C++-kielellä 26

I.6.5.2 Viittaukset (2) Esimerkki int original = 1; int& reference = original; reference = 8; // original == 8 cout << reference; // tulostaa muuttujan // original arvon reference = 10; //original == 10 ohjelmointiin C++-kielellä 27

I.6.5.3 Osoittimet Osoitintyypin määritys koostuu tyypistä ja *-merkistä ennen muuttujan tai funktion nimeä. Osoittimen arvo on muuttujan, olion tai funktion osoite Tyypillisiä käyttökohteita: linkitettyjen tietorakenteiden luominen, dynaamisesti kekomuistista (heap) varattujen olioiden hallinta ja funktioiden parametrityyppinä pääasiassa taulukoiden ja suurten olioiden välittäminen Osoittimien käyttö on virhealtista! Suosi aina viittausta (&) jos voit Tarkista osoittimet ja huolehdi että osoittavat validiin kohteisiin tai että arvo on nolla! ohjelmointiin C++-kielellä 28

I.6.5.3 Osoittimet (2) Esimerkki int original = 1; int* pointer = &original; *pointer = 8; // original == 8 cout << pointer; // tulostaa muuttujan // original osoitteen cout << *pointer; // tulostaa muuttujan // original arvon pointer = 0; // Ei osoita enää mihinkään, // ei voida käyttää ohjelmointiin C++-kielellä 29

I.6.5.4 Taulukko Kokoelma samantyyppisiä olioita Voidaan alustaa eksplisiittisesti pilkuin erotellulla arvolistan avulla, joka on aaltosulkujen sisällä Ei ole mahdollista Alustaa taulukkoa suoraan toisen taulukon arvoilla Sijoittaa taulukkoa toiseen taulukkoon Tehdä taulukkoa, jonka alkioiden tyyppi on viittaus Välitetään funktioon aina osoittimena taulukon ensimmäiseen alkioon Indeksiarvoja ei tarkisteta ajon aikana! Usein kannattaa käyttää STL - kirjaston säiliöitä taulukoiden asemasta ohjelmointiin C++-kielellä 30

I.6.5.4 Taulukko (2): Esimerkkejä int kuukausienpaivat[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; int marraskuunpvat = kuukausienpaivat[10]; char nimi[50]; const int MAX_NIMI = 50; struct person { }; char nimi[max_nimi]; int ika; person persons[10]; persons[5].ika = 39; ohjelmointiin C++-kielellä 31

I.6.5.4 Taulukko (3) : Merkkitaulukko Alkiot merkkityyppisiä C-kielessä merkkijonot ovat merkkitaulukkoja, joiden viimeisenä merkkinä on nolla-merkki C++-kielessä merkkijonoa mallintaa standardikirjaston string luokka Älä käytä merkkitaulukkoa merkkijonon esittämiseen! ohjelmointiin C++-kielellä 32

I.7 Muuttujat Muuttujamääritys voi olla lohkossa missä kohdassa tahansa Muuttujamääritys koostuu tyypistä, nimestä ja alustuslausekkeesta Globaalit muuttujat alustetaan automaattisesti tyypin nolla-arvoon Muiden kuin globaalien muuttujien arvot pitää alustaa eksplisiittisesti Jos ei alustettu, arvo satunainen ohjelmointiin C++-kielellä 33

I.7.1 Muuttujan elinikä Aika muistinvarauksesta muistin vapauttamiseen C++:ssa eliniältään kolmentyyppisiä muuttujia 1. Staattiset (static) varataan muistialueen globaalista osasta 2. Automaattiset (pinodynaamiset) varataan pinomuistista (stack) 3. Kekodynaamiset varataan ohjelmoijan toimesta kekomuistista (heap) ohjelmointiin C++-kielellä 34

I.7.1.1 Staattiset muuttujat Muuttujat, jotka määritelty staattisiksi static - lisämääreen avulla Voivat olla funktion paikallisia muuttujia Globaalit muuttujat Luodaan ja alustetaan ohjelman käynnistämisen yhteydessä tai ensimmäisen määrityksen yhteydessä int myglobalint; void myfunc(int aparam) { static int mystaticint;... ohjelmointiin C++-kielellä 35

I.7.1.2 Pinodynaamiset muuttujat Paikalliset muuttujat (ellei static-määrettä) ja funktioiden parametrit Kääntäjä varaa pinosta muuttujalle tilan määrittelyn yhteydessä ja vapauttaa sen kun määrityslohko päättyy void myfunc(int aparam) { int totalcount;... } // muuttuja totalcount hävitetty ohjelmointiin C++-kielellä 36

I.7.1.3 Kekodynaamiset muuttujat Kekodynaamisen muuttujan elinikä täysin ohjelmoijan määrittelemä Muuttuja varataan keosta operaattorilla new ja vapautetaan operaattorilla delete int * allocheapint(void) { return new int; }... int * x = allocheapint();... delete x; // Tehtävä muistivuodon välttämiseksi!! ohjelmointiin C++-kielellä 37

I.8 Perus I/O Syöttö- ja tulostustoimenpiteet tehdään iostreamkirjaston avulla Oliokeskeinen luokkahierarkia Sisältyy C++ -standardikirjastoon IOStream - kirjasto laajennettavissa ohjelmoijan omiin tyyppeihin Älä käytä C-kielen tyylisiä muotoilumerkkijonoparametreja printf( %d, %s, intvar,charstringvar); ohjelmointiin C++-kielellä 38

I.8.1 Standardivirtaoliot Syöttö- ja tulostusoperaatiot on toteutettu istream- (syöttövirta) ja ostream-(tulostusvirta) luokkiin. Standardin määrittelemät virrat: cin (istream) edustaa vakiosyöttöä, joka on yleensä sidottu tietokoneen näppäimistöön cout (ostream) edustaa vakiotulostusta, joka on yleensä sidottu tietokoneen konsoli-ikkunaan cerr (ostream) edustaa vakiovirhetulostusta, joka on yleensä sidottu samaan kuin cout-olio clog (ostream) edustaa vakiolokitulostusta, joka on yleensä sidottu samaan kuin cerr-olio ohjelmointiin C++-kielellä 39

Esimerkki #include <iostream> #include <string> int main() { int i = 0; double f = 0; char ch = \000 ; } string str = ; cin >> i; // luetaan kokonaisluku esim. 1 cin >> f; // luetaan reaaliluku esim. 1.5 cin >> ch; // luetaan merkki esim. 1 cin >> str; // luetaan merkkijono esim. 0x1.5 ohjelmointiin C++-kielellä 40

I.8.2 Virhetilanteet I/O:ssa Virhetilanteissa asetetaan failbit jonka arvo voidaan lukea jäsenfunktiolla fail() Virhetilassa olevaa virtaan ei voida kirjoittaa eikä sitä voida lukea Virhelipun voi tyhjentää jäsenfunktiolla clear() Jäsenfunktiolla good() voidaan tarkistaa onko virta toimintakuntoinen Lisää I/O:sta myöhemmin ohjelmointiin C++-kielellä 41

Esimerkki:Syötteen tarkistus #include <iostream> #include <string> int main() { int luku = 0; int lukuja = 0; long summa = 0; do{ summa += luku; cin >> luku; if (!cin.fail()) lukuja++; } while (!cin.fail()); } cout << Syötettyjen lukujen keskiarvo on ; cout << setprecision(2) << static_cast<double>(summa) / lukuja; ohjelmointiin C++-kielellä 42

Esimerkki: Kokonaisen rivin lukeminen #include <iostream> #include <string> int main() { string nimi; cout << Anna nimesi: ; string nimi; getline(cin, nimi); cout << Onko ohjelmointi hauskaa << nimi <<? << endl; } return 0; ohjelmointiin C++-kielellä 43

I.9 Funktiot Funktion esittelylause (prototyyppi) koostuu Palautusarvon tyypistä Funktion nimestä Sulkeiden sisällä olevasta parametrien tyyppiluettelosta, jossa parametrien tyypit ovat pilkulla erotettuna toisistaan. Lauseen päättävästä puolipisteestä Esimerkki int summa(int n, int k); ohjelmointiin C++-kielellä 44

I.9 Funktiot (2) Funktion määrittely koostuu Prototyypistä (ilman puolipistettä) Funktion rungosta, joka on määritelty lohkona Esimerkki int summa(int n, int k){ return (n+k); } Määrittelyn ja esittelyn on vastattava toisiaan Parametrit ovat funktion paikallisia automaattisia muuttujia ohjelmointiin C++-kielellä 45

I.9.1 Parametrien välitys funktiolle C++ tukee kahdenlaista parametrien välitystä Arvoparametrit Viittausparametrit Arvoparametrivälityksessä välitetään parametrin arvo funktiolle, jolloin parametriin tehdyt muutokset jäävät kutsuttavan funktion muuttujaan Viittausvälityksessä välitetään parametrina olevan muuttujan osoite, jolloin siihen tehdyt muutokset välittyvät kutsuvan funktion muuttujaan C++:ssa oletusvälitys on arvoparametrivälitys ohjelmointiin C++-kielellä 46

I.9.1.1 Arvoparametrit Arvoparametri C++:ssa määritellään antamalla parametrille tyyppi, joka ei ole viittaustyyppinen Parametrista tulee funktion paikallinen muuttuja, jonka elinikä alkaa kun funktiota kutsutaan ja päättyy kun funktiosta palataan. Yleensä kielen sisäiset tyypit kannattaa välittää arvoparametrina ja muut tyypit (tietorakenteet, luokat) viittaustyyppisenä parametrina // Esimerkkejä arvoparametrista void f1(int i); void f2(myclass olio); ohjelmointiin C++-kielellä 47

I.9.1.1 Arvoparametrit (2): Osoitin parametrina HUOM! Osoitin välitetään arvoparametrina, mutta koska sisältää muistiosoitteen, voidaan sen kautta käsitellä alkuperäisen muuttujan muistipaikkaa: void arvoosoitinparamfun(int *p) { *p = 5; } int main() { int kokoluku = 1; std::cout << kokoluku << std::endl; // Tulostus 1 // HUOMAA että välitetään muuttujan osoite! arvoosoitinparamfun(&kokoluku); std::cout << kokoluku << std::endl; // Tulostus 5 ohjelmointiin C++-kielellä 48

I.9.1.2 Viittausparametrit Parametrin tyyppinä on viittaustyyppi Tyyppi ja merkki & Johdetut tyypit kannattaa yleensä välittää viittaustyyppisinä istream& luerivi(istream& in, string& rivi) { getline(in, rivi); return in; } Jos parametrin arvoa ei ole tarkoitus muuttaa funktiossa, se välitetään vakioviittauksena void tulosta (const string& viesti); ohjelmointiin C++-kielellä 49