Tiedon vieminen funktiolle tMyn1 Tiedon vieminen funktiolle, parametrit Argumentin vieminen funktiolle voidaan toteuttaa kahdella menetelmällä: –Pass-by-Value.

Slides:



Advertisements
Samankaltaiset esitykset
Luokkien väliset koostesuhteet
Advertisements

Luokan otsikko- ja toteutustiedosto tMyn1 Luokan otsikko- ja toteutustiedosto •Tähän asti ohjelmaesimerkit on toteutettu siten, että kaikki koodi on yhdessä.
Johdetun luokan määrittely tMyn1 Johdetun luokan määrittely •Kun johdettu luokka periytetään kantaluokasta, saadaan kantaluokan jäsenet enemmän tai vähemmän.
Poikkeuskäsittely- lohkot tMyn1 Poikkeuskäsittelylohkot try-catch Poikkeustilanteiden käsittelymekanismi toteutetaan varatuilla sanoilla try, throw ja.
Vakio-osoitin ja osoitin vakioon tMyn1 Vakio-osoitin ja osoitin vakioon Tavallinen osoitin voi vaihtaa osoitettavaa keskusmuistialuetta. Tämä voidaan tehdä.
Osoitin ja char- tietotyyppi tMyn1 Osoitin ja char-tietotyyppi Osoitinmuuttuja, joka on tyyppiä char* voidaan alustaa merkkijonolla: char* alku=”En toivo.
Olioon kohdistuvia perustoimintoja tMyn1 Olioon kohdistuvia perustoimintoja Kopiointimuodostin (copy constructor) alustaa olion tietojäsenet saman luokan.
Virtuaaliset jäsenfunktiot tMyn1 Virtuaaliset jäsenfunktiot Virtuaalinen jäsenfunktio on esiteltävä monimuotoisessa kantaluokassa. Virtuaalisen jäsenfunktion.
Funktion esittely eli prototyyppi tMyn1 Funktion esittely eli prototyyppi Funktion esittely (function declaration) kertoo funktion nimen, parametrien tyypit.
Johdetun luokan olion alustus tMyn1 Johdetun luokan olion alustus määrätyillä arvoilla Kun ohjelmassa esiintyy johdetun luokan olion määrittely, järjestelmä.
Lueteltu tyyppitMyn1 Lueteltu tyyppi Lueteltu tyyppi on tietotyyppi, jonka arvot luetellaan erikseen tyypin määrittelyn yhteydessä. Lueteltua tietotyyppiä.
Miksi osittaa ohjelmatMyn1 Miksi osittaa ohjelma C++ -kielessä funktiot voivat olla itsenäisiä tai luokkaan liittyviä funktioita. Funktio on ohjelma, jolla.
Olioon kohdistuvia perustoimintoja tMyn1 Olioon kohdistuvia perustoimintoja Kopiointimuodostin (copy constructor) alustaa olion tietojäsenet saman luokan.
Ohjelman keskeytys virhetilanteessa tMyn1 Ohjelman keskeytys virhetilanteessa Poikkeustilanteet voidaan ryhmitellä logiikkavirheisiin ja muihin ajonaikaisiin.
Johdetun luokan olion alustus tMyn1 Johdetun luokan olion alustus määrätyillä arvoilla Kun ohjelmassa esiintyy johdetun luokan olion määrittely, järjestelmä.
Johdetun luokan olion esittely... tMyn1 Johdetun luokan olion esittely ja määrittely Esittelyluokka tarkoittaa olion tunnuksen luokkaa. Määrittelyluokka.
Oman poikkeus- käsittelyfunktion tMyn1 Oman poikkeuskäsittelyfunktion määrittely Funktion tulisi muodostaa ainoastaan sellaisia poikkeuksia, jotka on sallittu.
Ohjelmointi työtä n. 16 h/vko onnistumista työtä n. 16 h/vko onnistumista #include int main(void) { std::cout
Monimuotoinen luokka tMyn1 Monimuotoinen luokka Monimuotoinen luokka mahdollistaa saman jäsenfunktion toteutuksen monella tavalla. Tällöin puhutaan virtuaalisesta.
NR-ristikot ja massiivisauvarakenteet
Ilmakehän pienhiukkasten ja aerosolien tutkimus
TU KERTAUSTA ja vanhoja tenttikysymyksiä 1. välikoetta varten
. Haemme S-ryhmän hankinta- ja logistiikkayhtiö Inex Partners Oy:n Limingan terminaaliin KESÄTYÖNTEKIJÄÄ Kuljetusesimiesten loman sijaiseksi toukokuun.
Kuntaliiton kehittämistoiminnan vaikuttavuus
Ohjeita tunnin pitäjälle
Työvälineitä yritteliäisyyteen yläkoulussa
Tietoja Kivistön suuralueelta
Liikkuminen ja hyvinvoiva nuori Raija Oksanen, UKK-instituutti
Rakennusperinnön hoidon rahoitusmahdollisuus maaseudun kehittämisrahoituksella Kulttuuriympäristön ja rakennusperinnön hoidon seminaari, museokeskus.
Hanke toimii Kanta- ja Päijät-Hämeessä, rahoitus Hämeen ELY
Pk-yritysbarometri, syksy 2016
Tieteellinen kirjoittaminen
Uusia ja päivitettyjä ohjelmia
Sivuston luominen oppilasryhmän käyttöön
tunti – Liiketoimintasuunnitelma
Pk-yritysbarometri, syksy 2016
Presidenttivalmennus 1
Potilaan rooli potilasturvallisuudessa - mitä mieltä ovat potilaat ja potilasturvallisuusasiantuntijat? Sahlström, Merja, TtM, TtT-opiskelija, ¹˒², Partanen,
Free Being Me – Ihan Vapaasti Mä
Haapaveden-Siikalatvan seutukunta
äi7 puhe- ja vuorovaikutustaitojen syventäminen
Puhdasoppisuuden aika Suomen kirkossa
VENÄJÄ Pinta-ala: km² Presidentti: Vladimir Putin
Metallisidos.
YHDISTEET.
Suoran kulmakerroin.
Sinin ja kosinin ominaisuuksia
Toistokoe Toistetaan samaa satunnaiskoetta ja tarkkaillaan, kuinka monta kertaa jokin tapahtuma tapahtuu. Todennäköisyys joka kokeessa pysyy samana!
4. Teho ja hyötysuhde kuvaavat energiansiirtoa
4. Kovalenttinen sidos ja metallisidos
Videosta Youtube: X-Rays by Wilhelm Conrad Röntgen (Milestones of Science) Miksi näkyvä valo läpäisee lasin,
Liikkuvalla kappaleella on liike-energiaa (kineettistä energiaa).
Suoran yhtälö y = 2x + 1 kulmakerroin = suoran jyrkkyys vakiotermi
Lammas Lammas on märehtijä ja laumaeläin. Lampaasta saadaan lihaa, villaa ja nahkaa. Kun lammas polkee maahan jalkaa se varoittaa muita jostain. Moni.
PAREMPAA TEHOKKUUTTA ETSIMÄSSÄ
Luku 19 – Profeettakirjat
20€ 20€ 20€ Puhtaat matot kevään juhliin Matto kuin matto vain
Puulustotutkimuksen opetuksia 3
SUBITIZING <alaotsikko> Template updated: date:
2 Reaktioyhtälö Reaktion symbolinen ilmaisu Reaktioyhtälö reseptinä
Digitaalisen yo-kokeen ohjeistus
1. Millaisia asioita kilpailukykyä mittaavissa tutkimuksissa mitataan
5. lecture Questions associated with earlier lecture? Programme:
Perussanastoa.
Minustako fyysikko ? Fysiikan ja tähtitieteen laitos Esittele itsesi!
Tapahtumajärjestäjän vastuu turvallisuudesta
Yhteistä keskustelua klo 14–15
Viisaan liikkumisen asiakasraati
Datan avaamisen ohjeistus
LINTUVISA Harjoitus lk.
Esityksen transkriptio:

Tiedon vieminen funktiolle tMyn1 Tiedon vieminen funktiolle, parametrit Argumentin vieminen funktiolle voidaan toteuttaa kahdella menetelmällä: –Pass-by-Value -mekanismi. –Pass-by-Reference -mekanismi.

Tiedon vieminen funktiolle tMyn2 Arvoparametri, Pass-by-Value Tässä menetelmässä funktion kutsun yhteydessä funktion argumenttina oleva muuttuja tai vakio ei itse asiassa siirry funktioon. Muuttujasta tai vakiosta tehdään kopio, ja tämä kopio viedään funktioon. Kun funktion suoritus päättyy, kopiot häviävät pois. Käytetään ensimmäisenä esimerkkinä aiemmin esiteltyä potenssiinKorotus-funktiota:

Tiedon vieminen funktiolle tMyn3... double kantaluku=20.0; int potenssi=3; double vastaus=potenssiinKorotus(kantaluku, potenssi); double potenssiinKorotus(double x, int n) { Täällä oleva koodi ei voi operoida alkuperäisiä muuttujia kantaluku ja potenssi. } potenssi kantaluku kopio main-funktiossa:

Tiedon vieminen funktiolle tMyn4 Otetaan seuraava esimerkki – se edustaa samalla HUONOA tunnusten nimeämistapaa!!

Tiedon vieminen funktiolle tMyn5 using namespace System; using namespace std; double muutaArvo(double); int main(array ^args) { double arvo=5.0; double muutos=muutaArvo(arvo); cout<<"Funktion suorittamisen j\204lkeen " <<"\"arvo\"= "<<arvo<<"."<<endl; cout<<"Funktion palauttama arvo on " <<muutos<<"."<<endl; return 0; }

Tiedon vieminen funktiolle tMyn6 double muutaArvo(double arvo) { arvo+=10.0; cout<<"Funktion sis\204lt\204 \"arvo\"=" <<arvo<<"."<<endl; return arvo; }

Tiedon vieminen funktiolle tMyn7 muuttuja arvo funktiossa main() muuttujasta arvo tehdään kopio, kun funktiota muutaArvo() kutsutaan main()-funktiossa. kopio muuttujasta arvo: double muutos=muutaArvo(arvo); double muutaArvo(double arvo) { arvo+=10.0; cout<<"Funktion sis\204lt\204 \"arvo\"=" <<arvo<<"."<<endl; return arvo; } Tehdään paikallisesta muuttujasta arvo kopio, ja tämä palautetaan kutsuvaan ohjelmanosaan! Paluuarvosta tehtyä kopiota käytetään tässä, koska alkuperäinen paikallinen muuttuja arvo funktion muutaArvo() sisällä on lakannut olemasta! Tämä on lause main() -funktiosta: 55 15

Tiedon vieminen funktiolle tMyn8 Entä jos kutsuvan ohjelmanosan muuttujan arvoa halutaan muuttaa kutsutun funktion kautta? Pysytään edelleenkin pass-by-value -kategoriassa. Tällöin käytetään funktion argumenttina osoitinmuuttujaa. Koska osoitinmuuttujan kopio sisältää saman osoitteen kuin alkuperäinen osoitinmuuttuja, niin nyt kopio osoittaa samaan keskusmuistiosoitteeseen! Kirjoitetaan aiempi esimerkki tähän tilanteeseen sopivaksi:

Tiedon vieminen funktiolle tMyn9 using namespace System; using namespace std; double muutaArvo(double*); int main(array ^args) { double arvo=5.0; double muutos=muutaArvo(&arvo); cout<<"Funktion suorittamisen j\204lkeen " <<"\"arvo\"="<<arvo<<"."<<endl; cout<<"Funktion palauttama arvo on " <<muutos<<"."<<endl; return 0; }

Tiedon vieminen funktiolle tMyn10 double muutaArvo(double* osArvo) { *osArvo+=10.0; cout<<"Funktion sis\204lt\204 \"arvo\"=" <<*osArvo<<"."<<endl; return *osArvo; }

Tiedon vieminen funktiolle tMyn11 Olkoot muuttujan arvo osoite funktiossa main(): muuttujan arvo osoitteesta tehdään kopio, kun funktiota muutaArvo() kutsutaan main()-funktiossa. double muutos = muutaArvo(&arvo); double muutaArvo(double* osArvo) { *osArvo+=10.0; cout<<"Funktion sis\204lt\204 \"arvo\"=" <<*osArvo<<"."<<endl; return *osArvo; } Tehdään palautettavasta arvosta kopio, ja tämä kopio palautetaan kutsuvaan ohjelmanosaan! Tämä on lause main() -funktiosta: 64FDEC 15 64FDEC 5 Tämä kasvattaa main()-osassa olevan muuttujan arvoa 10.0:lla

Tiedon vieminen funktiolle tMyn12 Yksiulotteinen taulukko funktion argumenttina Taulukon nimi on osoitin taulukon ensimmäiseen alkioon. Kun taulukko välitetään argumenttina funktiolle, niin käytännössä taulukon alkuosoite kopioidaan, ja tämä osoitteen kopio välitetään funktiolle. Taulukkoa ei voi välittää funktiolle muulla tapaa. Seuraavassa esimerkissä lasketaan taulukon alkioiden arvojen keskiarvo. Aluksi ei käytetä osoitinnotaatioita:

Tiedon vieminen funktiolle tMyn13 using namespace System; using namespace std; double keskiarvo(double [], int); int main(array ^args) { double mitattu[]={2.1, 4.7, 6.8, 3.1, 8.5, 9.4, 7.7, 5.3, 3.9}; cout<<"Keskiarvo = " <<keskiarvo(mitattu, (sizeof mitattu)/(sizeof mitattu[0])) <<"."<<endl; return 0; }

Tiedon vieminen funktiolle tMyn14 double keskiarvo(double numerot[], int maara) { double summa=0.0; for(int i=0; i<maara; i++) summa+=numerot[i]; return summa/maara; }

Tiedon vieminen funktiolle tMyn15 Funktion esittelyssä ensimmäisenä parametrinä oli double []. Hakasulkeiden sisään ei tule laittaa alkioiden lukumäärää. Jos sinne laittaisi jonkin kokonaisluvun, niin sillä ei olisi toivottua vaikutusta. Muutetaan ratkaisua siten, että käytetään avuksi osoitinnotaatiota:

Tiedon vieminen funktiolle tMyn16 using namespace System; using namespace std; double keskiarvo(double*, int); int main(array ^args) { double mitattu[]={2.1, 4.7, 6.8, 3.1, 8.5, 9.4, 7.7, 5.3, 3.9}; cout<<"Keskiarvo = " <<keskiarvo(mitattu, (sizeof mitattu)/(sizeof mitattu[0])) <<"."<<endl; return 0; }

Tiedon vieminen funktiolle tMyn17 double keskiarvo(double* viite, int maara) { double summa=0.0; for (int i=0; i<maara; i++) summa+=*viite++; return summa/maara; }

Tiedon vieminen funktiolle tMyn18 Funktion rungossa on rivi summa+=*viite++; Tässä ei ole ristiriitaa. Aikaisemmin on todettu, että ei ole mahdollista muuttaa taulukon nimeen liittyvää osoitetta. Funktiolle välitettiin kopio taulukon alkuosoitteesta, ja tämän kopion sisältämää osoitetta inkrementoidaan!!!

Tiedon vieminen funktiolle tMyn19 Kaksiulotteinen taulukko funktion argumenttina Kaksiulotteinen taulukko voisi olla vaikkapa double mitatut[3][4]; Tämä taulukko voitaisiin sijoittaa parametriksi funktion esittelyssä seuraavasti: double yhteenLaskettuna(double mitatut[3][4]); Ongelma on siinä, että yllä olevassa esittelyssä parametrina olevan taulukon ensimmäistä dimensiota ei voida tarkistaa… siispä yhtä hyvin olisi voitu kirjoittaa double yhteenLaskettuna(double mitatut[][4]);

Tiedon vieminen funktiolle tMyn20 Taulukon rivilukumäärä on siis vietävä funktiolle jotenkin käyttäen hyväksi toista parametriä, esim: double yhteenLaskettuna(double mitatut[][4], int rivi); Tehdään toimiva esimerkki:

Tiedon vieminen funktiolle tMyn21 using namespace System; using namespace std; double yhteenLaskettuna(double [][4], int); int main(array ^args) { double korkeudet[3][4] = { {1.8, 1.6, 1.4, 1.9}, {1.3, 1.2, 1.7, 1.2}, {2.0, 2.6, 1.4, 1.0} }; cout<<"Yhteenlasketuksi arvoksi saadaan " <<yhteenLaskettuna(korkeudet, sizeof korkeudet/ sizeof korkeudet[0]) <<"."<<endl; return 0; }

Tiedon vieminen funktiolle tMyn22 double yhteenLaskettuna(double mitatut[][4], int rivi) { double summa=0.0; for (int i=0; i<rivi; i++) for (int j=0; j<4; j++) summa+=mitatut[i][j]; return summa; }

Tiedon vieminen funktiolle tMyn23 Kun funktiolle välitetään argumenttina useampiulotteinen taulukko, niin silloin ei enää kannata käyttää osoitinnotaatiota. Tehdään se kuitenkin kerta kiellon päälle jotta nähdään, että se ei ole niin havainnollista:

Tiedon vieminen funktiolle tMyn24 using namespace System; using namespace std; double yhteenLaskettuna(double (*)[4], int); int main(array ^args) { double korkeudet[3][4] = { {1.8, 1.6, 1.4, 1.9}, {1.3, 1.2, 1.7, 1.2}, {2.0, 2.6, 1.4, 1.0} }; cout<<"Yhteenlasketuksi arvoksi saadaan " <<yhteenLaskettuna(korkeudet, sizeof korkeudet/ sizeof korkeudet[0])<<"."<<endl; return 0; }

Tiedon vieminen funktiolle tMyn25 double yhteenLaskettuna(double (*mitatut)[4], int rivi) { double summa=0.0; for (int i=0; i<rivi; i++) for (int j=0; j<4; j++) summa+=*(*(mitatut+i)+j); return summa; }

Tiedon vieminen funktiolle tMyn26 Viittausparametri, Pass-by-Reference Jos funktion esittelyssä on käytetty funktion parametrinä viittausparametriä, niin silloin funktiota kutsuttaessa käytetään funktion argumenttina tiedon välittämiseen funktiolle pass-by-reference - mekanismia. Viittausmuuttuja voidaan ymmärtää viitattavan muuttujan alias-nimenä. Viittausparametrin määrittely: void funktionNimi(tyyppi& viittausparametri)

Tiedon vieminen funktiolle tMyn27 int main() { int numero=20; … cout<<muutaArvoa(numero); …. return 0: } int muutaArvoa(int& arvo) { arvo+=10; return arvo; } Funktion kutsu main()-osasta: Toteutetaan funktio, jossa parametrina käytetään viittausparametria: Viittausmuuttuja arvo alustetaan muuttujalla numero, eli muuttujasta arvo tulee muuttujan numero alias. Muodostetaan paluuarvosta arvo kopio - siis tässä tapauksessa muuttujan numero sisällöstä kopio, ja tämä kopio palautetaan kutsuvaan osaan

Tiedon vieminen funktiolle tMyn28 Kun funktiossa käytetään (funktion suorituksen aikana) funktion esittelyssä viittausparametriksi määriteltyä argumenttia, kohdistuu käsittely suoraan argumenttina välitettyyn muuttujaan. Sitä ei siis kopioida funktiolle funktion kutsun yhteydessä. Tästä kopioimisen puuttumisesta aiheutuu myös se, että funktion suoritus on nopeampaa. Viittausparametrin käyttö funktion parametrinä saattaa olla hiukan hämäävää - ulkopuolinen koodin tarkkailija ei ehkä heti huomaa, että kutsuvan osan muuttujan arvoa tulee muutetuksi:

Tiedon vieminen funktiolle tMyn29 Funktion parametrina osoitinmuuttuja: int muutaArvoa(int* arvo) { *arvo+=10; return *arvo; } Funktiota kutsuttaessa argumenttina annetaan muuttujan osoite, jolloin on selvää, että kutsutun osan muuttujan arvoa saatetaan muuttaa!!... int luku=20; cout<< muutaArvoa(&luku);... Funktion parametrina viittausparametri: int muutaArvoa(int& arvo) { arvo+=10; return arvo; } Funktiota kutsuttaessa muodostuu kutsuvan osan muuttujan luku aliasnimeksi arvo. Kun siis funktiossa operoidaan aliasnimellä arvo, niin ei ole yhtä lailla ilmeistä, että samalla tullaan muuuttaneeksi kutsuvan ohjelmanosan muuttujan luku sisältöä!! … int luku=20; cout<<muutaArvo(luku)

Tiedon vieminen funktiolle tMyn30 Tehdään esimerkkiohjelma, jossa funktion parametreina on viiteparametreja. Tässä ei muuteta kutsuvan osan muuttujien arvoja:

Tiedon vieminen funktiolle tMyn31 using namespace System; using namespace std; int suurempiKahdesta(int&, int&); int main(array ^args) { int luku1, luku2; cout<<"Anna kaksi kokonaislukua: "; cin>>luku1>>luku2; cin.get(); cout<<"Suurempi annetuista on: " <<suurempiKahdesta(luku1, luku2)<<"."<<endl; return 0; }

Tiedon vieminen funktiolle tMyn32 int suurempiKahdesta(int& eka, int& toka) { if(eka>toka) return eka; else return toka; }