5. oppitunti. Funktiot. Osa. Mikä on funktio?
|
|
- Veikko Kokkonen
- 8 vuotta sitten
- Katselukertoja:
Transkriptio
1 Osa I 5. oppitunti Funktiot Kun C++ -kielestä puhutaan, mainitaan yleensä oliot ensimmäiseksi. Oliot taasen ovat riippuvia funktioista, joiden kautta ne toimivat. Tässä luvussa opit seuraavat asiat: Mikä on funktio ja mitkä ovat sen osat Kuinka funktio esitellään ja määritellään Kuinka parametreja viedään funktioon Kuinka funktiosta palautetaan arvo Mikä on funktio? Funktio on aliohjelma, joka voi käsitellä tietoa ja palauttaa arvon. Jokaisessa C++ -ohjelmassa on ainakin yksi funktio, main(). Kun ohjelma käynnistyy, kutsutaan main()-funktiota automaattisesti. Main() saattaa kutsua muita funktioita, jotka taas voivat edelleen kutsua muita funktioita.
2 60 5. oppitunti Jokaisella funktiolla on nimensä ja kun tuo nimi kohdataan ohjelmassa, haaraudutaan suorittamaan funktion koodia. Kun funktio päättyy, suoritus palaa kutsun jälkeiselle riville. Tätä ohjelman kulkua on havainnollistettu kuvassa 5.1. Kuva 5.1. Kun ohjelma kutsuu funktiota, suoritus siirtyy funktion runkoon, jonka jälkeen palataan kutsua seuraavalle riville. Hyvin kehitetty funktio suorittaa tietyn tehtävän. Se tekee siis yhden tehtävän, mahdollisimman kokonaisesti ja päättyy sen jälkeen. Monimutkaiset toiminnot tulisi jakaa useisiin funktioihin, jotka sitten kutsuvat toisiaan. Tämä tekee ohjelmasta helpomman ymmärtää ja ylläpitää. Kirjassa puhutaan usein ylläpidettävyyden helpottamisesta. Ohjelman hinta ei koostu pelkästään koodaamisesta vaan koko sen eliniän jatkuvasta ylläpidosta ja luotettavuuden takaamisesta. Funktioiden esittely ja määrittely Ennen funktion käyttömahdollisuutta on funktio esiteltävä ja sitten määriteltävä. Uusi käsite Uusi käsite Esittelyssä kerrotaan kääntäjälle funktion nimi, palautustyyppi sekä parametrit. Funktion esittelyä kutsutaan funktion prototyypiksi. Määrittely kuvaa kääntäjälle funktion toiminnan. Mikään funktio ei voi kutsua funktiota, jota ei ole määritelty.
3 Funktiot 61 Funktion esittely Kääntäjän mukana tulevien funktioiden prototyypit ovat jo valmiina. Nuo funktiot saadaan käyttöön #include-komennolla. Uusi käsite Funktion prototyyppi on lause, joka päättyy puolipisteeseen. Se sisältää funktion palautustyypin, nimen ja parametriluettelon. Parametriluettelo on luettelo kaikista parametreista ja niiden tyypeistä pilkuilla erotettuina. Kuva 5.2 havainnollistaa funktion prototyypin osia. Kuva 5.2. Funktion prototyypin osat. Funktion prototyypin ja määrittelyn täytyy täsmätä täysin palautustyypin, nimen ja parametrien suhteen. Jos näin ei ole, generoi kääntäjä virheilmoituksen. Huomaa kuitenkin, että funktion prototyypin ei tarvitse sisältää parametrien nimiä, vaan parametrien tyypit riittävät. Seuraava prototyyppi on täysin laillinen: long Area(int, int); Tämä prototyyppi esittelee funktion nimeltä Area, joka palauttaa long-tyypin ja jolla on kaksi kokonaislukuparametria. Vaikkakin esittely on hyväksyttävä, se ei ole kovinkaan hyvä. Parametrien nimien lisääminen selkeyttää koodia. Sama funktio voitaisiin esitellä siis näinkin: long Area(int length, int width); Nyt funktion toiminta ja parametrit ovat selvästi tiedossa. Huomaa, että kaikilla funktioilla on palautustyyppi. Listaus 5.1 esittelee ohjelman, joka sisältää Area()-funktion prototyypin. Listaus 5.1. Funktion esittely ja määrittely sekä käyttö. 1: // Listaus esittelee funktion prototyypin 2: typedef unsigned short USHORT; 3: typedef unsigned long ULONG; 4: #include <iostream.h> 5: ULONG FindArea(USHORT length, USHORT width); //funktion prototyyppi 6: 7: int main() 8: { 9: USHORT lengthofyard;
4 62 5. oppitunti 10: USHORT widthofyard; 11: ULONG areaofyard; 12: 13: cout << "\nhow wide is your yard? "; 14: cin >> widthofyard; 15: cout << "\nhow long is your yard? "; 16: cin >> lengthofyard; 17: 18: areaofyard= FindArea(lengthOfYard,widthOfYard); 19: 20: cout << "\nyour yard is "; 21: cout << areaofyard; 22: cout << " square feet\n\n"; 23: return 0; 24: } 25: 26: ULONG FindArea(USHORT l, USHORT w) 27: { 28: return l * w; 29: } Tulostus How wide is your yard? 100 How long is your yard? 200 Your yard is square feet Analyysi FindArea()-funktion prototyyppi on rivillä 5. Vertaa prototyyppiä rivin 26 määrittelyyn. Huomaa, että nimi, palautustyyppi ja parametrit ovat samat. Jos ne olisivat erilaiset, olisi generoitu kääntäjän virhe. Itse asiassa ainoat erot ovat siinä, että funktion prototyyppi päättyy puolipisteeseen eikä siinä ole funktion runkoa. Huomaa myös, että prototyypin parametrien nimet ovat length ja width, mutta määrittelyssä käytetään nimiä l ja w. Prototyypin parametrinimiä ei siis käytetä, vaan ne ovat pelkästään informaation antajia ohjelmoijalle. Argumentit viedään funktiolle siinä järjestyksessä kuin ne on esitelty ja määritelty. Funktion määrittely Funktion määrittely koostuu otsikosta ja rungosta. Otsikko on täsmälleen sama kuin prototyyppi lukuunottamatta parametrien nimiä, jotka tulee otsikossa mainita, sekä prototyypin tarvitsemaa puolipistettä. Funktion runko on joukko ohjelmalauseita aaltosulkujen sisällä. Kuva 5.3 esittää funktion otsikon ja rungon.
5 Funktiot 63 Kuva 5.3. Funktion otsikko ja runko. Funktiot Funktion prototyyppi kertoo kääntäjälle funktion nimen, palautusarvon ja parametrit. Palautustyyppi funktionnimi ( [tyyppi [parametrinimi]] ); Funktion määrittely kuvaa funktion toiminnan. Palautustyyppi funktionnimi ( [tyyppi parametrinimi] ) { ohjelmalauseet; } Funktion prototyyppi kertoo kääntäjälle funktion palautustyypin, nimen ja parametriluettelon. Funktioiden ei ole pakko ottaa parametreja. Jos parametreja kuitenkin tarvitaan, ei prototyypissä ole pakko kertoa parametrien nimiä vaan tyypit riittävät. Prototyyppi päättyy aina puolipisteeseen (;). Funktion määrittelyn otsikon tulee olla yhdenmukainen prototyypin kanssa. Siinä tulee olla kaikkien parametrien nimet. Runko sijoitetaan aaltosulkuihin. Kaikki rungon lauseet päättyvät puolipisteeseen, mutta itse funktio ei pääty puolipisteeseen vaan sulkevaan aaltosulkuun. Jos funktio palauttaa arvon, sen tulisi päättyä return-lauseeseen, vaikkakin return-lauseet voivat sijaita millä kohtaa funktion runkoa tahansa. Jokaisella funktiolla on palautustyyppi. Jos sitä ei ole erikseen määrätty, on palautustyyppinä int. Varmista, että jokaisella funktiollasi on
6 64 5. oppitunti palautustyyppinsä. Jos funktio ei palauta arvoa, sen palautustyyppinä on void. Seuraavassa on esimerkkejä funktion prototyypeistä: long FindArea(long length, long width); //palauttaa longtyypin, 2 parametria void printmessage(int messagenumber); // palauttaa voidin, 1 parametri int GetChoice(); // palauttaa int-arvon, ei parametreja BadFunction(); // palauttaa int-arvon, ei parametreja Seuraavassa on esimerkkejä funktioiden määrittelyistä: long Area(long l, long w) { return l * w; } void PrintMessage(int whichmsg) { if (whichmsg == 0) cout << "Hello.\n"; if (whichmsg == 1) cout << "Goodbye.\n"; if (whichmsg > 1) cout << "I'm confused\n"; } Paikalliset muuttujat Uusi käsite Funktioon voidaan muuttujien viemisen lisäksi määritellä myös omia muuttujia. Omat muuttujat määritellään siis funktion rungossa ja niitä kutsutaankin paikallisiksi muuttujiksi. Kun funktio päättyy, eivät paikalliset muuttujat ole enää käytettävissä. Paikalliset muuttujat määritellään aivan samoin kuin muutkin muuttujat. Myös funktioille vietyjä parametreja pidetään paikallisina muuttujina, jolloin niitä voidaan käyttää aivan kuin ne olisi määritelty funktion rungossa. Listaus 5.2 on esimerkki parametrien ja paikallisesti määriteltyjen muuttujien käyttämisestä. Listaus 5.2. Paikallisten muuttujien ja parametrien käyttäminen. 1: #include <iostream.h> 2: 3: float Convert(float); 4: int main() 5: {
7 Funktiot 65 6: float TempFer; 7: float TempCel; 8: 9: cout << "Please enter the temperature in Fahrenheit: "; 10: cin >> TempFer; 11: TempCel = Convert(TempFer); 12: cout << "\nhere's the temperature in Celsius: "; 13: cout << TempCel << endl; 14: return 0; 15: } 16: 17: float Convert(float TempFer) 18: { 19: float TempCel; 20: TempCel = ((TempFer - 32) * 5) / 9; 21: return TempCel; 22: } Tulostus Please enter the temperature in Fahrenheit: 212 Here's the temperature in Celsius: 100 Please enter the temperature in Fahrenheit: 32 Here's the temperature in Celsius: 0 Please enter the temperature in Fahrenheit: 85 Here's the temperature in Celsius: Analyysi Riveillä 6 ja 7 esitellään kaksi float-muuttujaa, toinen tallentamaan Fahrenheit-lukema ja toinen taas Celsius-lukema. Käyttäjää kehoitetaan antamaan Fahrenheit-lukema rivillä 9 ja tuo arvo viedään funktiolle Convert(). Suoritus hyppää funktion Convert() ensimmäiselle riville (rivi 18), jossa esitellään myös paikallinen muuttuja nimeltä TempCel. Huomaa, että tämä muuttuja ei ole sama kuin rivin 7 TempCel, vaan se on käytettävissä vain Convert()-funktion sisällä. Parametrina TempFer viety arvo on myös vain paikallinen kopio muuttujasta. Funktio olisi voinut nimetä parametrin FerTemp ja paikallisen muuttujan CelTemp ja ohjelma olisi toiminut yhtä hyvin. Voit antaa nuo nimet uudelleen ja testata ohjelman toiminnan. Paikalliseen muuttujaan TempCel sijoitetaan laskettu Celsius-lukema ja se palautetaan sitten funktion palautusarvona ja sijoitetaan rivillä 11 main()- funktion muuttujaan TempCel. Rivillä 12 tulostetaan muuttujan arvo. Ohjelma ajetaan kolme kertaa. Ensiksi viedään muunnosfunktiolle arvo 212, jotta nähdään funktion antavan veden kiehumispisteen oikein. Toiseksi testataan veden jäätymispiste ja kolmanneksi annetaan satunnainen lukema, joka tuottaa murto-osia.
8 66 5. oppitunti Kokeile harjoituksena kirjoittaa ohjelmaan muita muuttujanimiä kuten seuraavassa: #include <iostream.h> float Convert(float); int main() { float TempFer; float TempCel; cout << "Please enter the temperature in Fahrenheit: "; cin >> TempFer; TempCel = Convert(TempFer); cout << "\nhere's the temperature in Celsius: "; cout << TempCel << endl; return 0; } float Convert(float Fer) { float Cel; Cel = ((Fer - 32) * 5) / 9; return Cel; } Tulosten pitäisi olla samoja. Muuttujan näkyvyysalue (viittausalue), joka määrää, kuinka kauan muuttuja on käytettävissä ohjelmassa ja missä ohjelman osissa se on käytettävissä. Lohkon sisällä olevat muuttujat ovat näkyvissä vain lohkon sisällä; niitä voidaan käyttää vain lohkon sisällä eivätkä ne näy muualle. Globaalit muuttujat ovat näkyvillä kaikkialla ohjelmassa. Yleensä näkyvyysalue on helposti ymmärrettävä asia, mutta on olemassa joitakin hankalia poikkeuksia. Nykyisin for-silmukan otsikossa esitellyt muuttujat (for int i = 0; i<somevalue; i++) ovat näkyvillä lohkossa, jossa forsilmukka luotiin, mutta viime aikoina on puhuttu standardin muuttamisesta. Näkyvyysalue ei tuottane hankaluuksia, kunhan vain olet huolellinen. Globaalit muuttujat Uusi käsite Funktion ulkopuolella esitellyillä muuttujilla on globaali näkyvyysalue ja siten mikä tahansa ohjelman funktio, mukaan lukien main(), voi käsitellä niitä. C++ -kielessä vältetään globaalien muuttujien käyttämistä, koska ne luovat sekavaa koodia, jota on vaikea ylläpitää. Tämän kirjan esimerkeissä ei
9 Funktiot 67 käytetä lainkaan globaaleja muuttujia, enkä käytä niitä muulloinkaan ohjelmissani. Funktion runko Funktion rungossa voi olla rajaton määrä eri tyyppisiä ohjelmalauseita. Toisaalta hyvin suunnitellut funktiot ovat yleensä lyhyitä. Suurin osa funktioista sisältää vain kourallisen koodirivejä. Funktion argumentit Funktion argumenttien ei tarvitse olla samaa tyyppiä. On täysin järkevää kirjoittaa funktio, joka ottaa kokonaisluvun, kaksi long-tyyppiä ja merkin argumenteikseen. Mikä tahansa kelvollinen ilmaus voi olla funktion argumenttina, mukaan lukien vakiot, matemaattiset ja loogiset ilmaukset tai toiset, arvoja palauttavat funktiot. Funktioiden käyttö toisten funktioiden parametreina Vaikkakin on täysin hyväksyttävää käyttää arvon palauttavaa funktiota toisen funktion argumenttina, tekee menettely koodista vaikealukuista ja virhealtista. Olettakaamme, että meillä on neljä funktiota double(), triple(), square() ja cube(), jotka kukin palauttavat arvon. Voisimme nyt kirjoittaa Answer = (double(triple(square(cube(myvalue))))); Lause vie muuttujan myvalue argumenttina funktiolle cube(), jonka palauttama arvo menee funktiolle square(), jonka palauttama arvo taas viedään funktiolle triple(). Lopuksi funktio double() saa triple()-funktion palauttaman arvon ja lopullinen arvo sijoitetaan muuttujaan Answer. Tällainen koodi ei ole kovinkaan helppolukuista (oliko arvo kerrottu kolmella ennen neliöintiä?) ja jos lopputulos on virheellinen, niin mistä funktiosta virhe johtuu. Vaihtoehtona on suorittaa koodi vaiheittain käyttäen apumuuttujia: unsigned long myvalue = 2; unsigned long cubed = cube(myvalue(); // tulos 8 unsigned long squared = square(cubed); // tulos 64 unsigned long tripled = triple(squared); // tulos 192 unsigned long Answer = double(tripled); // tulos 384 Nyt kutakin välitulosta on mahdollista tutkia ja suoritusjärjestys on selvä.
10 68 5. oppitunti Parametrit ovat paikallisia muuttujia Funktiolle viedyt parametrit ovat paikallisia funktiolle. Argumentteihin tehdyt muutokset eivät vaikuta kutsuvan funktion arvoihin. Menettelyä kutsutaan arvon viemiseksi, mikä tarkoittaa sitä, että funktiossa tehdään paikallinen kopio kustakin argumentista. Näitä paikallisia kopioita kohdellaan aivan kuin mitä tahansa muita paikallisia muuttujia. Listaus 5.3 havainnollistaa tätä. Listaus 5.3. Arvon vieminen. 1: // Listaus arvon vienti 2: 3: #include <iostream.h> 4: 5: void swap(int x, int y); 6: 7: int main() 8: { 9: int x = 5, y = 10; 10: 11: cout << "Main. Before swap, x: " << x << " y: " << y << "\n"; 12: swap(x,y); 13: cout << "Main. After swap, x: " << x << " y: " << y << "\n"; 14: return 0; 15: } 16: 17: void swap (int x, int y) 18: { 19: int temp; 20: 21: cout << "Swap. Before swap, x: " << x << " y: " << y << "\n"; 22: 23: temp = x; 24: x = y; 25: y = temp; 26: 27: cout << "Swap. After swap, x: " << x << " y: " << y << "\n"; 28: 29: } Tulostus Main. Before swap. x: 5 y: 10 Swap. Before swap. x: 5 y: 10 Swap. After swap. x: 10 y: 5 Main. After swap. x: 5 y: 10 Analyysi Ohjelma alustaa kaksi muuttujaa main()-funktiossa ja vie ne sitten swap()- funktiolle, joka vaihtaa ne. Kun ne on tutkittu uudelleen main()-funktiossa, nähdään niiden olevan kuitenkin muuttumattomia! Muuttujat alustetaan rivillä 9 ja niiden arvot esitetään rivillä 11. Sitten kutsutaan swap()-funktiota, jolle viedään muuttujat.
11 Funktiot 69 Rivillä 21 tulostetaan arvot uudelleen. Ne ovat samassa järjestyksessä kuin main()-funktiossa. Riveillä vaihdetaan muuttujien paikkaa ja tuo vaihto vahvistetaan tulostusrivillä 27. Nähdään, että swap()-funktion sisällä ovat arvot vaihtuneet. Suoritus palaa sitten riville 13 eli takaisin main()-funktioon, jossa arvot ovat alkuperäisessä järjestyksessä. Kuten olet huomannut, swap()-funktiolle viedään argumentit arvoina, jolloin tehdään paikalliset kopiot muuttujista. Nuo paikalliset muuttujat vaihdetaan riveillä 23-25, mutta main()-funktiossa eivät muutokset näy. Myöhemmin tutkimme vaihtoehtoisia tapoja viedä tietoa funktioihin ja näet, että funktiot voivat muuttaa pysyvästi niille vietyjen argumenttien arvoja. Palautusarvot Funktiot palauttavat joko arvon tai voidin, joka kertoo kääntäjälle, että mitään arvoa ei palauteta. Funktio palauttaa arvon komennolla return, jota seuraa palautettava arvo. Arvo voi olla itsekin arvon palauttava ilmaus, kuten: Return 5; Return (x > 5); Return (MyFunction()); Kaikki edellä olevat lauseet ovat hyväksyttyjä olettaen, että MyFunction() itse palauttaa arvon. Toisen lauseen, return (x > 5), arvo on nolla, jos x on suurempi kuin 5, muutoin se on yksi. Lause ei siis palauta x:ää vaan vertailulauseen arvon. Kun return-lause kohdataan, palautetaan return-lauseen jälkeen oleva ilmaus funktion arvona. Ohjelman suoritus palaa kutsuvaan funktioon, kutsua seuraavalle riville. Yhdessä funktiossa voi olla useampia kuin yksi return-lause. Muista kuitenkin, että heti, kun jokin return-lause suoritetaan, funktio päättyy. Listaus 5.4 havainnollistaa tätä ideaa. Listaus 5.4. Useita return-lauseita. 1: // Listaus palautetaan useita arvoja 2: // return-lauseissa 3: 4: #include <iostream.h> 5: 6: int Doubler(int AmountToDouble); 7: 8: int main() 9: {
12 70 5. oppitunti 10: 11: int result = 0; 12: int input; 13: 14: cout << "Enter a number between 0 and 10,000 to double: "; 15: cin >> input; 16: 17: cout << "\nbefore doubler is called... "; 18: cout << "\ninput: " << input << " doubled: " << result << "\n"; 19: 20: result = Doubler(input); 21: 22: cout << "\nback from Doubler...\n"; 23: cout << "\ninput: " << input << " doubled: " << result << "\n"; 24: 25: 26: return 0; 27: } 28: 29: int Doubler(int original) 30: { 31: if (original <= 10000) 32: return original * 2; 33: else 34: return -1; 35: cout << "You can't get here!\n"; 36: } Tulostus Enter a number between 0 and 10,000 to double: 9000 Before double is called Input: 9000 double: 0 Back from doubler Input: 9000 doubled: Enter a number between 0 and 10,000 to double: Before double is called Input: double: 0 Back from doubler Input: doubled: -1 Analyysi Riveillä kehotetaan antamaan luku, joka sitten tulostetaan rivillä 18 yhdessä paikallisen muuttujan, result, kanssa. Funktiota Doubler() kutsutaan rivillä 20 ja syötetty arvo viedään funktiolle parametrina. Tulos sijoitetaan paikalliseen muuttujaan result ja arvot tulostetaan uudelleen riveillä Rivillä 30, funktiossa Doubler(), testataan parametri, jotta nähdään, onko arvo suurempi kuin 10,000. Jos se ei ole suurempi, funktio palauttaa kaksi kertaa alkuperäistä arvoa suuremman arvon. Jos arvo on suurempi kuin 10,000, funktio palauttaa arvon -1, joka toimii virhearvona.
13 Funktiot 71 Rivin 35 lausetta ei koskaan suoriteta, koska funktion return-lause kohdataan ennen sitä. Hyvä kääntäjä varoittaa siitä, että ko. lausetta ei suoriteta ja hyvä ohjelmoija poistaa tuollaiset lauseet. Jotkut kääntäjät generoivat jopa virheen tuon rivin takia. Jos saat virheen, kommentoi tuo rivi 35 pois. Oletusparametrit Jokaisen prototyypissä ja määrittelyssä olevan paremetrin paikalla tulee olla arvo funktiota kutsuttaessa. Tuon arvon tulee olla myös esiteltyä tyyppiä. Niinpä, jos funktion esittely on seuraavanlainen: long myfuntion(int); täytyy funktiolle viedä kokonaislukumuuttuja. Jos funktion määrittely on erilainen tai jos funktiolle ei viedä kokonaislukua, saadaan kääntäjän virhe. Ainoa poikkeus on silloin, kun funktion prototyyppi esittelee parametrin oletusarvon. Oletusarvo on arvo, jota käytetään silloin, kun mitään arvoa ei viedä. Edellä oleva esittelylause olisi voitu kirjoittaa näin: long myfunction (int x = 50); Tuo esittely kertoo, että "myfunction palautta long-tyypin ja kokonaislukuparametrin. Jos argumenttia ei viedä, käytetään oletusarvoa 50." Koska funktion prototyypissä ei vaadita parametrin nimeä, olisi esittely voitu kirjoittaa myös näin: long myfunction (int = 50); Funktion määrittely ei muutu oletusparametrin takia. Määrittelyn otsikkoosa olisi siis: long myfunction (int x); Jos kutsussa ei käytetä parametria, täyttää kääntäjä x:n oletusarvolla 50. Oletusparametrin nimen ei tarvitse olla sama esittelyssä ja määrittelyssä; oletusarvo sijoitetaan sijainnin, ei nimen perusteella. Mikä tahansa tai kaikki funktion parametrit voivat saada oletusarvot. Ainoa rajoitus on seuraava: Jos jollakin funktion parametrilla ei ole oletusarvoa, ei oletusarvoa saa olla myöskään millään aiemmalla parametrilla. Jos funktion prototyyppi on seuraavanlainen: long myfunction ( int Param1, int Param2, int Param3);
14 72 5. oppitunti voit sijoittaa oletusarvon Param2-parametriin vain, jos parametrilla Param3 on oletusarvo. Voit sijoittaa oletusarvon parametriin Param1 vain, jos parametreilla Param2 ja Param3 on oletusarvo. Listaus 5.5 esittelee oletusarvojen käyttöä. Listaus 5.5. Parametrien oletusarvot. 1: // Listaus esittelee oletusarvojen 2: // käyttöä 3: 4: #include <iostream.h> 5: 6: int AreaCube(int length, int width = 25, int height = 1); 7: 8: int main() 9: { 10: int length = 100; 11: int width = 50; 12: int height = 2; 13: int area; 14: 15: area = AreaCube(length, width, height); 16: cout << "First area equals: " << area << "\n"; 17: 18: area = AreaCube(length, width); 19: cout << "Second time area equals: " << area << "\n"; 20: 21: area = AreaCube(length); 22: cout << "Third time area equals: " << area << "\n"; 23: return 0; 24: } 25: 26: AreaCube(int length, int width, int height) 27: { 28: 29: return (length * width * height); 30: } Tulostus First area equals: Second time area equals: 5000 Third time area equals: 2500 Analyysi Rivi 6 kertoo, että AreaCube() ottaa kolme kokonaislukuparametria, joista kahdella viimeisellä on oletusarvot. Funktio laskee kuution parametreina vietyjen mittojen mukaan. Jos widtharvoa ei viedä, on oletuksena 25 ja height-arvona 1. Jos width-arvo annetaan, mutta ei height-arvoa, on height-oletuksena 1. Funktiolle ei voida viedä height-arvoa viemättä myös width-arvo. Riveillä alustetaan muuttujat length, height ja width ja ne viedään funktiolle AreaCube(). Tuloksen laskemisen jälkeen suoritetaan tulostaminen rivillä 16.
15 Funktiot 73 Suoritus palaa riville 18, jossa funktiota kutsutaan uudelleen, nyt ilman height-arvoa. Tällöin käytetään oletusarvoa. Funktiota kutsutaan vielä uudelleen, nyt ilman width- ja height-arvoja. Funktioiden ylikuormitus C++ mahdollistaa useamman kuin yhden samannimisen funktion luomisen. Sitä kutsutaan funktion ylikuormittamiseksi. Funktioiden tulee olla erilaisia parametriluetteloiden suhteen, eli parametrien tyypit tai niiden määrät voivat vaihdella. Seuraavassa on esimerkki: int myfunction (int, int); int myfunction (long, long); int myfunction (long); Funktio on ylikuormitettu kolmella erilaisella parametriluettelolla. Ensimmäinen ja toinen esittely eroavat toisistaan parametrien tyyppien kohdalla ja kolmas esittely poikkeaa parametrien määrän suhteen. Palautustyypit voivat olla samoja tai erilaisia ylikuormitetuilla funktioilla, kunhan vain parametriluettelot poikkeavat toisistaan. Ylikuormittamista ei voida kuitenkaan toteuttaa pelkästään palautustyyppien eroilla. Funktioiden ylikuormittamista kutsutaan myös polymorfiaksi (polymorphism) eli monimuotoisuudeksi. Poly tarkoittaa monta ja morph muotoa. Funktion monimuotoisuus viittaa mahdollisuuteen ylikuormittaa funktio useassa eri merkityksessä. Muuttamalla parametrien tyyppejä tai lukumäärää voidaan usealle funktiolle antaa sama nimi, jolloin oikea funktio tulee kutsutuksi parametrien täsmätessä. Menettely mahdollistaa sellaisen funktion luomisen, joka voi laskea keskiarvoja kokonaisluvuista, doublearvoista sekä muista arvoista tarvitsematta luoda useaa eri nimistä funktiota. Olettakaamme, että kirjoitat funktion, joka kaksinkertaistaa minkä tahansa antamasi lukuarvon. Funktiolle tulee viedä parametrina int-, long-, float- tai double-tyyppinen arvo. Ilman ylikuormittamista olisi luotava neljä eri funktiota: int DoubleInt(int); long DoubleLong(long); float DoubleFloat(float); double DoubleDouble(double); Ylikuormittamista käyttäen saataisiin sama aikaan seuraavasti:
16 74 5. oppitunti int Double(int); long Double(long); float Double(float); double Double(double); Nyt koodi on luettavampaa ja funktioita on helpompi käyttää. Oikea funktio tulee kutsutuksi sille viedyn parametrin mukaan. Inline-funktiot Normaalisti funktio määriteltäessä kääntäjä luo yhden komentojoukon muistiin. Kun funktiota kutsutaan, suoritus hyppää tuohon komentojoukkoon ja funktion päättyessä suoritus palaa kutsua seuraavalle riville. Jos funktiota kutsutaan 10 kertaa, ohjelma siirtyy suorittamaan samaa koodijoukkoa joka kerta. Eli muistissa on vain yksi koodijoukko, ei 10. Hypyt aiheuttavat hieman tehottomuutta suoritukseen. Jotkut funktiot ovat hyvin pieniä, ehkä vain pari koodiriviä, ja ohjelmaa voitaisiin tehostaa, jos siirtymisiä voitaisiin vähentää. Yleensä tehokkuuden merkkinä on nopeus, joka paranisi, jos funktioiden kutsuja voitaisiin vähentää. Jos funktio esitellään lisämääreellä inline, kääntäjä ei luo todellista funktiota: se kopioi koodin inline-funktiosta suoraan kutsuvaan funktioon. Mitään hyppyjä ei tapahdu, vaan kutsuttavan funktion koodi on ikään kuin kirjoitettuna kutsuvaan funktioon. Kuitenkin myös inline-funktioilla on heikot puolensa. Jos funktiota kutsutaan 10 kertaa, kopioidaan inline-koodi joka kerta kutsuviin funktioihin. Osa aikaansaadusta tehokkuudesta katoaa suoritettavan ohjelman koon kasvuun. Nopeuden parannuskin on hieman kuvitteellinen. Ensinnäkin modernit kääntäjät pyrkivät tehostamaan koodia varsin hyvin ja toiseksi inline-funktioita tulee kirjoitetuksi hyvin vähän. On tärkeää tietää, että koon kasvu vähentää tehokkuutta sekin. Milloin inline-funktiot sitten sopisivat käyttöön? Aina, kun eteen tulee pieniä funktioita (pari koodiriviä), tulisi harkita inline-funktioiden käyttöä. Jos tehokkuuden paranemista epäillään, on parempi jättää inline-menettely pois. Listaus 5.6 esittelee inline-funktioiden käyttöä. Listaus 5.6. Esimerkki inline-funktiosta. 1: 2: 3: #include <iostream.h> 4: 5: inline int Double(int); 6: 7: int main() 8: {
17 Funktiot 75 9: int target; 10: 11: cout << "Enter a number to work with: "; 12: cin >> target; 13: cout << "\n"; 14: 15: target = Double(target); 16: cout << "Target: " << target << endl; 17: 18: target = Double(target); 19: cout << "Target: " << target << endl; 20: 21: 22: target = Double(target); 23: cout << "Target: " << target << endl; 24: return 0; 25: } 26: 27: int Double(int target) 28: { 29: return 2 * target; 30: } Tulostus Enter a number to work with: 20 Target: 40 Target: 80 Target: 160 Analyysi Rivillä 5 esitellään Double() inline-funktiona, joka ottaa int-parametrin ja palauttaa int-tyypin. Esittely on aivan samanlainen kuin normaalisti lukuunottamatta lisämäärettä inline. Lisämääreen kautta funktio käännetään aivan kuin olisit kirjoittanut target = 2*target; joka paikkaan, jossa on koodi target = Double(target); Ohjelmaa ajettaessa ovat lauseet jo paikoillaan, käännettynä.objtiedostoon. Näin suoritusaikaa ei käytetä funktiokutsuihin, mutta toisaalta ohjelman koko kasvaa. Kuinka funktiot toimivat - katse pintaa syvemmälle Kun funktiota kutsutaan, koodi haarautuu kutsuttavaan funktioon, parametrit viedään funktiolle ja funktion runko suoritetaan. Kun funktio
18 76 5. oppitunti päättyy, palautetaan arvo (ellei funktio ole void-tyyppinen) ja suoritus palaa kutsuvalle funktiolle. Kuinka nuo tehtävät toteutetaan? Kuinka tiedetään, minne tulee haarautua? Missä muuttujat pidetään niiden viemisen jälkeen? Mitä tapahtuu funktion rungossa esitellyille muuttujille? Kuinka palautusarvo viedään? Kuinka paluu osataan tehdä oikeaan paikkaan? Pino Uusi käsite Kun ohjelma ajetaan, kääntäjä luo pinon. Pino on erikoinen muistialue, jonka ohjelma varaa funktioiden tarvitsemaa tietoa varten. Muistialuetta kutsutaan pinoksi, koska se toimii LIFO-periaatteella (Last In First Out, viimeksi laitettu tieto otetaan ensimmäisenä ulos). Ajattele pinoa vaikkapa astiapinona, jota kuva 5.4 esittää. Kuva 5.4. Pino Jono on toisenlainen muistialue, jossa ensimmäiseksi tullutta myös palvellaan ensimmäiseksi. Jonossa uusi alkio tulee aina loppupäähän (häntäpäähän) ja jono purkautuu jonon alkupäästä. Pinoon taas tulee uusi alkio pinon alkuun, päälle (push-toiminto) ja purkautuu päältä (poptoiminto). Pinon alkuun osoittaa muistissa pino-osoitin, jossa on tallessa pinon alun osoite. Koko pino sijaitsee sitten tuon pino-osoittimen kertoman osoitteen alapuolella. Kuva 5.5 havainnollistaa pinon sijaintia muistissa. Kun tietoa laitetaan pinoon, se sijoitetaan pino-osoittimen yläpuolelle, jonka jälkeen pino-osoitinta kasvatetaan, jotta se osoittaisi uuteen tietoon. Kun
19 Funktiot 77 tietoa otetaan pinosta, muutetaan pino-osoittimen osoitetta siirtämällä osoitinta alaspäin. Kuva 5.6 havainnollistaa tätä menettelyä. Kuva 5.5. Pino-osoitin. Kuva 5.6. Pino-osoittimen siirtäminen.
20 78 5. oppitunti Pino ja funktiot Kun ohjelmasi kutsuu funktiota, toteutetaan pinokehys. Pinokehys on pinoalue, joka varataan funktion hallintaa varten. Hallintamenettely vaihtelee hieman eri tietokoneissa, mutta päävaiheet ovat seuraavat: Funktion paluuosoite sijoitetaan pinoon. Kun funktio päättyy, saadaan täältä paluuosoite. Varataan tilaa jonosta funktion palautustyypin mukaisesti. Kaikki argumentit sijoitetaan pinoon. Ohjelma haarautuu suorittamaan funktiota. Paikalliset muuttujat sijoitetaan pinoon niiden määrittelyjärjestyksessä. Yhteenveto Tässä luvussa käsiteltiin funktioita. Funktio on aliohjelma, jolle voidaan viedä parametreja ja joka voi palauttaa arvon. Jokainen C++ -ohjelma alkaa main()-funktiolla, joka taas kutsuu muita funktioita. Funktio esittely on funktion prototyyppi, joka määrittää funktion palautusarvon, nimen ja parametrit tyyppeineen. Funktio voidaan esitellä inline-funktiona. Funktion prototyyppi voi myös esitellä oletusarvot yhdelle tai usealle parametrilleen. Funktion määrittelyn tulee vastata funktion esittelyä palautustyypin, nimen ja parametriluettelon suhteen. Funktion nimeä voidaan ylikuormittaa muuttamalla parametrien tyyppiä tai määrää; kääntäjä löytää oikean funktion funktiolle vietyjen parametrien mukaan. Paikalliset muuttujat ja funktiolle viedyt argumentit ovat paikallisia siinä lohkossa, jossa ne on esitelty. Arvoina viedyt parametrit ovat kopioita eikä niitä käsittelemällä voida muuttaa kutsuvan funktion arvoja.
21 Funktiot 79 Kysymyksiä ja Vastauksia K Miksei käytetä pelkästään globaaleja muuttujia? V Aikoinaan niin juuri tehtiinkin. Ohjelmista tuli sitten laajempia ja monimutkaisempia ja virheiden hakeminen oli työlästä, koska mikä tahansa funktio oli voinut vaikuttaa muuttujien arvoihin. Kokeneet ohjelmoijat tietävät, että paikallisia muuttujia kannattaa käyttää niin paljon kuin mahdollista; tällöin tiedetään, mikä funktio on käsitellyt kutakin muuttujaa. K Miksi argumenttien muutokset eivät välity funktiosta kutsuvaan funktioon? V Funktiolle viedään argumentit arvoina (normaalisti). Tällöin funktio saa kopion arvoista eikä siis alkuperäisiä arvoja. K Mitä tapahtuu, jos käytän seuraavia kahta funktiota? int Area (int width, int length = 1); int Area (int size); Ovatko funktiot monimuotoisia? Funktioissa on eri määrä parametreja, mutta ensimmäisellä on oletusarvo. V Esittely käännetään, mutta jos käytät funktiota yhdellä parametrilla, saat virheilmoituksen: ambiguity between Area(int, int) and Area(int). Eli menettelyssä on ristiriitaa.
22 80 5. oppitunti
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
Osa. Listaus 2.1. HELLO.CPP esittelee C++ -ohjelman osat. 14: #include <iostream.h> 15: 16: int main() 17: {
Osa I 2. oppitunti C++-ohjelman osat Ennen kuin menemme yksityiskohtaisemmin sisälle C++-luokkiin, -muuttujiin jne, katsokaamme ensin, millaisista osista C++-ohjelma koostuu. Tämän tunnin aikana opit seuraavat
Osoitin ja viittaus C++:ssa
Osoitin ja viittaus C++:ssa Osoitin yksinkertaiseen tietotyyppiin Osoitin on muuttuja, joka sisältää jonkin toisen samantyyppisen muuttujan osoitteen. Ohessa on esimerkkiohjelma, jossa määritellään kokonaislukumuuttuja
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ä.
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
14. oppitunti. Operaattorin ylikuormitus. Osa. Operaattorin ylikuormittaminen
Osa IV 14. oppitunti Operaattorin ylikuormitus Edellisessä luvussa opit ylikuormittamaan metodeita ja luomaan kopiomuodostimen, joka tekee syvän kopion. Tässä luvussa käsitellään seuraavia aiheita: Kuinka
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
Tutoriaaliläsnäoloista
Tutoriaaliläsnäoloista Tutoriaaliläsnäolokierroksella voi nyt täyttää anomuksen läsnäolon merkitsemisestä Esim. tagi ei toiminut, korvavaltimon leikkaus, yms. Hyväksyn näitä omaa harkintaa käyttäen Tarkoitus
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,
Osa III. Olioiden luominen vapaalle muistialueelle
Osa III 10. oppitunti Kehittyneet osoittimet Eräs tehokkaimpia C++ -työkaluja on mahdollisuus käsitellä tietokoneen muistia suoraan osoittimien avulla. Tässä luvussa käsitelläänkin seuraavia aiheita: Kuinka
Operaattoreiden ylikuormitus. Operaattoreiden kuormitus. Operaattoreiden kuormitus. Operaattoreista. Kuormituksesta
C++ - perusteet Java-osaajille luento 5/7: operaattoreiden ylikuormitus, oliotaulukko, parametrien oletusarvot, komentoriviparametrit, constant, inline, Operaattoreiden ylikuormitus Operaattoreiden kuormitus
Osa III. Edelliset kolme lukua ovat käsitelleet viittausten ja osoittimien käyttöä. Tämän luvun aiheita ovat:
Osa III 12. oppitunti Kehittyneet viittaukset ja osoittimet Edelliset kolme lukua ovat käsitelleet viittausten ja osoittimien käyttöä. Tämän luvun aiheita ovat: Kuinka viittausten viemisellä voidaan tehostaa
5.6. C-kielen perusteet, osa 6/8, Taulukko 6.1.2008, pva, kuvat jma
5.6. C-kielen perusteet, osa 6/8, Taulukko 6.1.2008, pva, kuvat jma Every cloud has a silver line. - englantilainen sananlasku Tässä osiossa tärkeää: yksi- ja moniulotteinen taulukko Sisältö Yleistä Yksiulotteinen
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
IDL - proseduurit. ATK tähtitieteessä. IDL - proseduurit
IDL - proseduurit 25. huhtikuuta 2017 Viimeksi käsiteltiin IDL:n interaktiivista käyttöä, mutta tämä on hyvin kömpelöä monimutkaisempia asioita tehtäessä. IDL:llä on mahdollista tehdä ns. proseduuri-tiedostoja,
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,
C-kielessä taulukko on joukko peräkkäisiä muistipaikkoja, jotka kaikki pystyvät tallettamaan samaa tyyppiä olevaa tietoa.
Taulukot C-kielessä taulukko on joukko peräkkäisiä muistipaikkoja, jotka kaikki pystyvät tallettamaan samaa tyyppiä olevaa tietoa. Taulukon muuttujilla (muistipaikoilla) on yhteinen nimi. Jokaiseen yksittäiseen
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
Harjoitustyö: virtuaalikone
Harjoitustyö: virtuaalikone Toteuta alla kuvattu virtuaalikone yksinkertaiselle olio-orientoituneelle skriptauskielelle. Paketissa on testaamista varten mukana kaksi lyhyttä ohjelmaa. Ohjeita Noudata ohjelman
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
Tietueet. Tietueiden määrittely
Tietueet Tietueiden määrittely Tietue on tietorakenne, joka kokoaa yhteen eri tyyppistä tietoa yhdeksi asiakokonaisuudeksi. Tähän kokonaisuuteen voidaan viitata yhteisellä nimellä. Auttaa ohjelmoijaa järjestelemään
Metodit. Metodien määrittely. Metodin parametrit ja paluuarvo. Metodien suorittaminen eli kutsuminen. Metodien kuormittaminen
Metodit Metodien määrittely Metodin parametrit ja paluuarvo Metodien suorittaminen eli kutsuminen Metodien kuormittaminen 1 Mikä on metodi? Metodi on luokan sisällä oleva yhteenkuuluvien toimintojen kokonaisuus
Harjoitus 2 (viikko 45)
Mikäli tehtävissä on jotain epäselvää, laita sähköpostia vastuuopettajalle (jorma.laurikkala@uta.fi). Muista lisätä static-määre operaatioidesi otsikoihin, jotta ohjelmasi kääntyvät. Muista noudattaa hyvän
13 Operaattoreiden ylimäärittelyjä
248 13 C++-kielessä voidaan operaattoreita ylimäärittää. Ylimääriteltävää operaattoria voidaan pitää ikäänkuin metodina, joka esitellään luokan esittelyssä ja määritellään luokan ulkopuolella kuten metoditkin.
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
ITKP102 Ohjelmointi 1 (6 op)
ITKP102 Ohjelmointi 1 (6 op) Tentaattori: Antti-Jussi Lakanen 20. huhtikuuta 2018 Vastaa kaikkiin tehtäviin. Tee kukin tehtävä omalle konseptiarkille. Noudata ohjelmointitehtävissä kurssin koodauskäytänteitä.
Apuja ohjelmointiin» Yleisiä virheitä
Apuja ohjelmointiin» Yleisiä virheitä Ohjelmaa kirjoittaessasi saattaa Visual Studio ilmoittaa monenlaisista virheistä "punakynällä". Usein tämä johtuu vain siitä, että virheitä näytetään vaikket olisi
Lyhyt kertaus osoittimista
, syksy 2007 Kertausta Luento 10 12.10.2007 Syksy 2007 1 Lyhyt kertaus osoittimista char *p; /* char, int, jne ilmoittavat, minkä tyyppisiä */ Keskusmuisti int *q; /* olioita sisältäviin muistilohkoihin
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
Java-kielen perusteet
Java-kielen perusteet Tunnus, varattu sana, kommentti Muuttuja, alkeistietotyyppi, merkkijono, literaalivakio, nimetty vakio Tiedon merkkipohjainen tulostaminen 1 Tunnus Java tunnus Java-kirjain Java-numero
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
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
812347A Olio-ohjelmointi, 2015 syksy 2. vsk. X Poikkeusten käsittelystä
812347A Olio-ohjelmointi, 2015 syksy 2. vsk X Poikkeusten käsittelystä Sisältö 1. Yleistä poikkeusten käsittelystä 2. Poikkeuskäsittelyn perusteita C++:ssa 3. Standardissa määritellyt poikkeukset 4. Poikkeusvarmuus
Merkkijono määritellään kuten muutkin taulukot, mutta tilaa on varattava yksi ylimääräinen paikka lopetusmerkille:
Merkkijonot C-kielessä merkkijono on taulukko, jonka alkiot ovat char -tyyppiä. Taulukon viimeiseksi merkiksi tulee merkki '\0', joka ilmaisee merkkijonon loppumisen. Merkkijono määritellään kuten muutkin
Ohjelmointitaito (ict1td002, 12 op) Kevät 2008. 1. Java-ohjelmoinnin alkeita. Tietokoneohjelma. Raine Kauppinen raine.kauppinen@haaga-helia.
Ohjelmointitaito (ict1td002, 12 op) Kevät 2008 Raine Kauppinen raine.kauppinen@haaga-helia.fi 1. Java-ohjelmoinnin alkeita Tietokoneohjelma Java-kieli ja Eclipse-ympäristö Java-ohjelma ja ohjelmaluokka
ITKP102 Ohjelmointi 1 (6 op)
ITKP102 Ohjelmointi 1 (6 op) Tentaattori: Antti-Jussi Lakanen 7. huhtikuuta 2017 Vastaa kaikkiin tehtäviin. Tee jokainen tehtävä erilliselle konseptiarkille. Kirjoittamasi luokat, funktiot ja aliohjelmat
Osa VII. Mitä mallit ovat ja kuinka niitä käytetään Miksi mallit tarjoavat paremman vaihtoehdon makroille Kuinka luokkamalleja luodaan
Osa VII 23. oppitunti Mallit Muutaman viime vuoden aikana on C++ -kieleen lisätty joitakin uusia piirteitä. Eräs kiinnostavimpia ja tehokkaimpia uusia C++ -ominaisuuksia ovat mallit. Mallit mahdollistavat
4. oppitunti. Ilmaukset ja ohjelmalauseet. Osa
Osa I 4. oppitunti Ilmaukset ja ohjelmalauseet Ohjelma ei todellisuudessa ole mitään muuta kuin joukko komentoja, jotka suoritetaan peräkkäin. Monipuolisuutta ohjelmaan saadaan, kun ohjelmassa haaraudutaan
815338A Ohjelmointikielten periaatteet Harjoitus 4 vastaukset
815338A Ohjelmointikielten periaatteet 2015-2016. Harjoitus 4 vastaukset Harjoituksen aiheena ovat imperatiivisten kielten lauseisiin, lausekkeisiin ja aliohjelmiin liittyvät kysymykset. Tehtävä 1. Mitä
Ohjelmoinnin perusteet Y Python
Ohjelmoinnin perusteet Y Python T-106.1208 16.2.2010 T-106.1208 Ohjelmoinnin perusteet Y 16.2.2010 1 / 41 Kännykkäpalautetteen antajia kaivataan edelleen! Ilmoittaudu mukaan lähettämällä ilmainen tekstiviesti
1. Miten tehdään peliin toinen maila?
Muilla kielillä: English Suomi Pong-peli, vaihe 4 Tässä oppaassa teemme toisenkin mailan. 1. Miten tehdään peliin toinen maila? Maila tehtiin edellisessä vaiheessa, aliohjelmassa LuoKentta, seuraavasti:
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
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ä
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
ITKP102 Ohjelmointi 1 (6 op)
ITKP102 Ohjelmointi 1 (6 op) Tentaattori: Antti-Jussi Lakanen 12. huhtikuuta 2019 Tee kukin tehtävä omalle konseptiarkille. Noudata ohjelmointitehtävissä kurssin koodauskäytänteitä. Yksi A4-kokoinen lunttilappu
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
Taulukot. Jukka Harju, Jukka Juslin 2006 1
Taulukot Jukka Harju, Jukka Juslin 2006 1 Taulukot Taulukot ovat olioita, jotka auttavat organisoimaan suuria määriä tietoa. Käsittelylistalla on: Taulukon tekeminen ja käyttö Rajojen tarkastus ja kapasiteetti
Sisällys. Yleistä attribuuteista. Näkyvyys luokan sisällä. Tiedonkätkentä. Aksessorit. 4.2
4. Attribuutit 4.1 Sisällys Yleistä attribuuteista. Näkyvyys luokan sisällä. Tiedonkätkentä. Aksessorit. 4.2 Yleistä Luokan lohkossa, mutta metodien ulkopuolella esiteltyjä muuttujia ja vakioita. Esittely
Ohjelmoinnin perusteet Y Python
Ohjelmoinnin perusteet Y Python T-106.1208 20.1.2010 T-106.1208 Ohjelmoinnin perusteet Y 20.1.2010 1 / 40 Arvon pyytäminen käyttäjältä Käyttäjän antaman arvon voi lukea raw_input-käskyllä. Käskyn sulkujen
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
Peilaus pisteen ja suoran suhteen Pythonin Turtle moduulilla
Peilaus pisteen ja suoran suhteen Pythonin Turtle moduulilla ALKUHARJOITUS Kynän ja paperin avulla peilaaminen koordinaatistossa a) Peilaa pisteen (0,0) suhteen koordinaatistossa sijaitseva - neliö, jonka
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ä
Ohjelmoinnin perusteet Y Python
Ohjelmoinnin perusteet Y Python T-106.1208 21.1.2009 T-106.1208 Ohjelmoinnin perusteet Y 21.1.2009 1 / 32 Tyypeistä Monissa muissa ohjelmointikielissä (esim. Java ja C) muuttujat on määriteltävä ennen
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
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
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
Kääntäjän virheilmoituksia
OHJ-1101 Ohjelmointi 1e 2008-09 1 Kääntäjän virheilmoituksia Kun progvh2 ohjelma käännetään antaa tutg++ seuraavat virheilmoitukset ja varoitukset: proffa> tutg++ progvh2.cc progvh2.cc:29:13: warning:
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
Osa. Johdanto C++ - kieleen. Oppitunnit 6 Perusluokat 7 Lisää luokista 8 Kehittynyt ohjelman kulku
Osa II Johdanto C++ - kieleen Oppitunnit 6 Perusluokat 7 Lisää luokista 8 Kehittynyt ohjelman kulku Osa II 6. oppitunti Perusluokat Luokat ovat C++ -kielen ominaisuus, joka tukee monimutkaisten reaalimaailman
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
12 Mallit (Templates)
12 Mallit (Templates) Malli on määrittely, jota käyttämällä voidaan luoda samankaltaisten aliohjelmien ja luokkien perheitä. Malli on ohje kääntäjälle luoda geneerisestä tyyppiriippumattomasta ohjelmakoodista
Kirjoita, tallenna, käännä ja suorita alla esitelty ohjelma, joka tervehtii käyttäjäänsä.
Tehtävä 1. Kirjoita, tallenna, käännä ja suorita alla esitelty ohjelma, joka tervehtii käyttäjäänsä. #include /* mm. I/O-funktiot */ #include /* mm. EXIT_SUCCESS */ /*main-funktio,
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.
Ohjelmoinnin perusteet Y Python
Ohjelmoinnin perusteet Y Python T-106.1208 17.2.2010 T-106.1208 Ohjelmoinnin perusteet Y 17.2.2010 1 / 41 Sanakirja Monissa sovelluksissa on tallennettava rakenteeseen avain arvo-pareja. Myöhemmin rakenteesta
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,
System.out.printf("%d / %d = %.2f%n", ekaluku, tokaluku, osamaara);
Kysy Karilta tai Kimmolta, jos tehtävissä on jotain epäselvää. Kerro WETOon liittyvät ongelmat suoraan Jormalle sähköpostitse (jorma.laurikkala@uta.fi). Muista nimetä muuttujat hyvin sekä kommentoida ja
Tietorakenteet ja algoritmit
Tietorakenteet ja algoritmit Rekursio Rekursion käyttötapauksia Rekursio määritelmissä Rekursio ongelmanratkaisussa ja ohjelmointitekniikkana Esimerkkejä taulukolla Esimerkkejä linkatulla listalla Hanoin
Ohjelmointi funktioiden avulla
Ohjelmointi funktioiden avulla 8 Ohjelmointi funktioiden avulla Ohjelman jakaminen hallittaviin osiin on idea, joka on perustana kaikille ohjelmointikielille. Funktio on kaikkien C++-ohjelmien perusosa.
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
Harjoitus 6. Käytä String-luokasta vain charat- ja length-operaatioita.
Nämä ovat kurssin viimeiset harjoitukset. Hyväksytyistä ratkaisuista ja läsnäoloista kerättyjen pisteiden summan tulee olla vähintään 40 % ( pistettä) tehtävien ja läsnäolopisteiden kokonaislukumäärien
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
Metodien tekeminen Javalla
1 Metodien tekeminen Javalla Mikä metodi on? Metodin syntaksi Metodi ja sen kutsuminen Parametreista Merkkijonot ja metodi Taulukot ja metodi 1 Mikä metodi on? Metodilla toteutetaan luokkaan toiminnallisuutta.
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
Harjoitus 6 (viikko 42)
Nämä ovat kurssin viimeiset harjoitukset. Hyväksytyistä ratkaisuista ja läsnäoloista kerättyjen pisteiden summan tulee olla vähintään 40 % ( pistettä) tehtävien ja läsnäolopisteiden kokonaislukumäärien
Monipuolinen esimerkki
Monipuolinen esimerkki Lopuksi monipuolinen esimerkki, jossa ohjelmisto koostuu pääohjelmasta ja kahdesta aliohjelmasta, joista toinen on proseduuri ja toinen funktio. Funktio Sqrt(int n): int Sqrt(int
15. oppitunti. Taulukot. Osa. Mikä on taulukko?
Osa IV 15. oppitunti Taulukot Aiemmissa luvuissa on käytetty yksinkertaisia int-, char-, yms. kohteita. Usein on kuitenkin tarvetta käyttää kohteiden kokoelmia, kuten joukkoa, jossa on 20 int-arvoa tai
Perusteet. Pasi Sarolahti Aalto University School of Electrical Engineering. C-ohjelmointi Kevät Pasi Sarolahti
C! Perusteet 19.1.2017 Palautteesta (1. kierros toistaiseksi) (Erittäin) helppoa Miksi vain puolet pisteistä? Vaikeinta oli ohjelmointiympäristön asennus ja käyttö Ei selvää että main funktion pitikin
Lohkot. if (ehto1) { if (ehto2) { lause 1;... lause n; } } else { lause 1;... lause m; } 15.3
15. Lohkot 15.1 Sisällys Tutustutaan lohkoihin. Muuttujien ja vakioiden näkyvyys sekä elinikä erityisesti operaation lohkossa. Nimikonfliktit. Muuttujat operaation alussa vai myöhemmin? 15.2 Lohkot Aaltosulkeet
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ä
Tähtitieteen käytännön menetelmiä Kevät 2009 Luento 4: Ohjelmointi, skriptaus ja Python
Tähtitieteen käytännön menetelmiä Kevät 2009 Luento 4: Ohjelmointi, skriptaus ja Python 31. tammikuuta 2009 Ohjelmointi Perusteet Pythonin alkeet Esittely Esimerkkejä Muuttujat Peruskäsitteitä Käsittely
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
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
Ohjelmassa henkilön etunimi ja sukunimi luetaan kahteen muuttujaan seuraavasti:
1 (7) Tiedon lukeminen näppäimistöltä Scanner-luokan avulla Miten ohjelma saa käyttöönsä käyttäjän kirjoittamaa tekstiä? Järjestelmässä on olemassa ns. syöttöpuskuri näppäimistöä varten. Syöttöpuskuri
Osa. Mitä ovat vakiot jäsenfunktiot Kuinka erotetaan luokan käyttöliittymä sen toteutuksesta
Osa II 7. oppitunti Lisää luokista Aiemmassa luvussa opit luomaan uusia tietotyyppejä esittelemällä luokkia. Tässä luvussa opit hallitsemaan luokkia ja käyttämään kääntäjää auttamaan virheiden löytämisessä
Sisällys. 19. Olio-ohjelmointia Javalla. Yleistä. Olioiden esittely ja alustus
Sisällys 19. Olio-ohjelmointia Javalla Olioiden esittely ja alustus. Metodit Yleistä metodeista. Mihin metodeja tarvitaan? Metodien määrittely. Omat metodit: nimeäminen, paikka, kutsuminen, parametrit
Ohjelmoinnin perusteet Y Python
Ohjelmoinnin perusteet Y Python T-106.1208 2.2.2009 T-106.1208 Ohjelmoinnin perusteet Y 2.2.2009 1 / 43 Funktiot Tähän asti esitetyt ohjelmat ovat oleet hyvin lyhyitä. Todellisessa elämässä tarvitaan kuitenkin
Lohkot. if (ehto1) { if (ehto2) { lause 1;... lause n; } } else { lause 1;... lause m; } 16.3
16. Lohkot 16.1 Sisällys Tutustutaan lohkoihin. Muuttujien ja vakioiden näkyvyys sekä elinikä erityisesti operaation lohkossa. Nimikonfliktit. Muuttujat operaation alussa vai myöhemmin? 16.2 Lohkot Kaarisulut
58131 Tietorakenteet ja algoritmit (syksy 2015)
58131 Tietorakenteet ja algoritmit (syksy 2015) Harjoitus 2 (14. 18.9.2015) Huom. Sinun on tehtävä vähintään kaksi tehtävää, jotta voit jatkaa kurssilla. 1. Erään algoritmin suoritus vie 1 ms, kun syötteen
Harjoitus 5 (viikko 48)
Moni tämän harjoituksen tehtävistä liittyy joko suoraan tai epäsuorasti kurssin toiseen harjoitustyöhön. Harjoitustyö edistyy sitä paremmin, mitä enemmän tehtäviä ratkaiset. Mikäli tehtävissä on jotain
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
\+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)
Informaatioteknologian laitos Olio-ohjelmoinnin perusteet / Salo 15.2.2006
TURUN YLIOPISTO DEMO III Informaatioteknologian laitos tehtävät Olio-ohjelmoinnin perusteet / Salo 15.2.2006 1. Tässä tehtävässä tarkastellaan erääntyviä laskuja. Lasku muodostaa oman luokkansa. Laskussa
6. Funktiot 85. Kuinka funktioita määritellään ja kutsutaan. Kuinka funktioille viedään arvoja ja niistä palautetaan arvoja
6. Funktiot 85 OPPITUNTI 6 Funktiot Funktiot ovat hyvin laaditun skriptin perusta. Ne tekevät koodista helppolukuista ja uudelleen käytettävää. Laajoja projekteja on mahdotonta hallita ilman funktioiden
Aliohjelmatyypit (2) Jakso 4 Aliohjelmien toteutus
Jakso 4 Aliohjelmien toteutus Tyypit Parametrit Aktivointitietue (AT) AT-pino Rekursio Aliohjelmatyypit (2) Korkean tason ohjelmointikielen käsitteet: aliohjelma, proseduuri parametrit funktio parametrit,
Jakso 4 Aliohjelmien toteutus
Jakso 4 Aliohjelmien toteutus Tyypit Parametrit Aktivointitietue (AT) AT-pino Rekursio 1 Aliohjelmatyypit (2) Korkean tason ohjelmointikielen käsitteet: aliohjelma, proseduuri parametrit funktio parametrit,
Harjoitus 1 (viikko 44)
Mikäli tehtävissä on jotain epäselvää, laita sähköpostia vastuuopettajalle (jorma.laurikkala@uta.fi). Muista lisätä static-määre operaatioidesi otsikoihin, jotta ohjelmasi kääntyvät. Muista noudattaa hyvän
811312A Tietorakenteet ja algoritmit , Harjoitus 2 ratkaisu
811312A Tietorakenteet ja algoritmit 2017-2018, Harjoitus 2 ratkaisu Harjoituksen aiheena on algoritmien oikeellisuus. Tehtävä 2.1 Kahvipurkkiongelma. Kahvipurkissa P on valkoisia ja mustia kahvipapuja,
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,
Tietorakenteet ja algoritmit
Tietorakenteet ja algoritmit Merkintöjen tulkintoja *++Pstack->top = item *Pstack->top++ = item (*Pstack->top)++ *(Pstack++)->top = item *(++Pstack)->top = item Lisää pinon toteutuksia Dynaaminen taulukko
Ohjelmoinnin perusteet Y Python
Ohjelmoinnin perusteet Y Python T-106.1208 9.2.2009 T-106.1208 Ohjelmoinnin perusteet Y 9.2.2009 1 / 35 Listat Esimerkki: halutaan kirjoittaa ohjelma, joka lukee käyttäjältä 30 lämpötilaa. Kun lämpötilat