3.10.2012 © Hannu Laine 1 Tietorakenteet ja algoritmit Funktio-osoittimet Funktio-osoittimen ja taulukko-osoittimen vertailu Funktio-osoittimen käyttötapoja.

Slides:



Advertisements
Samankaltaiset esitykset
Tuloksellinen Java-ohjelmointi Luku 3 Luokkien käyttäminen
Advertisements

18. Abstraktit tietotyypit
Tietorakenteet ja algoritmit
Olio-ohjelmoinnin perusteet luento 3: Muuttujista ja funktioista Sami Jantunen LTY/Tietotekniikan osasto.
© Jukka Harju, Viittausmuuttujat. © Jukka Harju, Viittaukset •Viittausmuuttuja sisältää tiedon siitä missä muistipaikassa olio.
Jouni Juntunen Oulun seudun ammattikorkeakoulu Liiketalouden yksikkö Netbeans ja XAMPP Projektin luominen.
Tietorakenteet ja algoritmit
Syksy 2001 KYAMK/J.Ansamäki/Olio- ohjelmointi71 Olio-ohjelmointi 2. osa: diat (2. välikoe) KYMENLAAKSON AMMATTIKORKEAKOULU Jarkko Ansamäki, 2001.
Nämä kalvot on lisensoitu Creative Commons Attribution-ShareAlike 1
11/9/2012 © Hannu Laine 1 Tietorakenteet ja algoritmit Elegantti toteutus funktiolle insert_to_list_end Alkion lisäys sisällön mukaan järjestettyyn listaan.
2.8.3 Abstraktit tietotyypit
Taulukot: Array Taulukko Javassa pitää aina perustaa (new)
Copyright  Hannu Laine Osoittimet ja taulukot Hannu Laine.
C-kieli ja dynaaminen muistin varaus
22. Taulukot.
HTML-kielen perusteet Osa 5 Vilho Kemppainen
Rakenteinen ohjelmointi
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.
10/9/2012 © Hannu Laine 1 Tietorakenteet ja algoritmit Listan määritelmä Listan toteutustapoja Yksinkertainen taulukkototeutus Linkattu taulukko Dynaamisesti.
13. Pakkaukset.
Auli Jaakkola 1 Palkkatiedustelun tietomallin mukaisen tilastovastauksen luonti Tässä esimerkissä tiedosto tuotetaan excelistä csv-muotoon. 1.Oletetaan,
C-ohjelmointi, kevät 2006 Taulukot Binääritiedostot Luento
Java-ohjelmointi Opas ammattimaiseen osaamiseen Luku 4 Toistolauseet
OHJELMAN OSITTAMINEN LUOKKA ATTRIBUUTIT METODIT. LUOKKA JAVA ohjelma koostuu luokista LUOKKA sisältää metodeja molemmat sisältävät attribuutteja eli muuttujia.
@ Leena Lahtinen OHJELMAN OSITTAMINEN LUOKKA ATTRIBUUTIT METODIT.
OLIO-OHJELMOINTI PERUSTEET PERUSTIETOTYYPIT
Poikkeuskäsittely- lohkot tMyn1 Poikkeuskäsittelylohkot try-catch Poikkeustilanteiden käsittelymekanismi toteutetaan varatuilla sanoilla try, throw ja.
TyyppimuunnoksettMyn1 Tyyppimuunnokset Joskus kääntäjän on tehtävä itse päätöksiä, jos ohjelmoija ei ole ajatellut yksityiskohtia: int arvo1=10; long arvo2=25;
Vakio-osoitin ja osoitin vakioon tMyn1 Vakio-osoitin ja osoitin vakioon Tavallinen osoitin voi vaihtaa osoitettavaa keskusmuistialuetta. Tämä voidaan tehdä.
© Jukka Harju, Jukka Juslin Java-ohjelmointi Opas ammattimaiseen osaamiseen Luku 9 Poikkeuskäsittely.
Kuvan tuominen sivulle Työvaiheet käytettäessä Kuvanhallinta-toimintoa: 1. Ladataan kuvatiedosto oman tietokoneen hakemistosta sivustolle 2. Liitetään.
TAULUKKO YKSIULOTTEINEN TAULUKKO. TAULUKKO  Taulukon tarkoitus Ohjelmassa tarvitaan paljon samantyyppisiä samaan kohdealueeseen kuuluvia muuttujia Näitä.
Osoitin ja char- tietotyyppi tMyn1 Osoitin ja char-tietotyyppi Osoitinmuuttuja, joka on tyyppiä char* voidaan alustaa merkkijonolla: char* alku=”En toivo.
© Jukka Harju, Jukka Juslin
Funktion esittely eli prototyyppi tMyn1 Funktion esittely eli prototyyppi Funktion esittely (function declaration) kertoo funktion nimen, parametrien tyypit.
1 Kertaus koetta varten oleellisista asioista Jukka Juslin.
String-vertailusta ja Scannerin käytöstä (1/2)
Metodit – Arvotyyppi Ellei metodi palauta arvoa, sen arvotyyppi on void Tällöin ”return;”-lauseke ei ole metodissa pakollinen, vaikka sen käyttö on sallittua.
4. Attribuutit 4.1. Sisällys Yleistä attribuuteista. Näkyvyys luokan sisällä ja ulkopuolelta. Attribuuttien arvojen käsittely aksessoreilla. 4.2.
5. Kapselointi Yleistä Kapseloinnilla (encapsulation) tarkoitetaan luokan tietojen ja toimintojen pakkaamista yhdeksi suojatuksi kokonaisuudeksi.
@ Leena Lahtinen OHJELMAN OSITTAMINEN LUOKKA ATTRIBUUTIT METODIT.
Johdetun luokan olion alustus tMyn1 Johdetun luokan olion alustus määrätyillä arvoilla Kun ohjelmassa esiintyy johdetun luokan olion määrittely, järjestelmä.
© Jukka Juslin1 Osio2 Olio-ohjelmointi: Merkkijonot eli Stringit Jukka Juslin.
Rinnakkaisuus Järjestelmässä, jossa voi olla useita prosesseja rinnakkain suorituksessa voi tulla tilanteita, joissa prosessien suoritusta täytyy kontrolloida.
Johdatus ohjelmointiin – C kielen peruselementit Tutkijayliopettaja Manne Hannula Opetusharjoittelu (ohjaava opettaja Jukka Jauhiainen)
FunktiottMyn1 Funktiot Funktiot voidaan jakaa –Kirjastofunktioihin, jotka ovat valmiina kaikkien käytössä. Erikoisempien kirjastofunktioiden käyttöönotto.
Oman poikkeus- käsittelyfunktion tMyn1 Oman poikkeuskäsittelyfunktion määrittely Funktion tulisi muodostaa ainoastaan sellaisia poikkeuksia, jotka on sallittu.
Sovellettu matematiikka 3 Jarkko Hurme1 Maplen peruskäyttö 2. Derivaatta ja integraali.
Olioiden taulukointi Perustaulukon käyttö Luokan ilmentymät voidaan tallettaa taulukkoon samoin kuin muuttujat Esimerkki talletetaan taulukkoon opintojaksojen.
Kontrollirakenteet laajemmin
Tiedon vieminen funktiolle tMyn1 Tiedon vieminen funktiolle, parametrit Argumentin vieminen funktiolle voidaan toteuttaa kahdella menetelmällä: –Pass-by-Value.
Johdetun luokan olion alustus tMyn1 Johdetun luokan olion alustus määrätyillä arvoilla Kun ohjelmassa esiintyy johdetun luokan olion määrittely, järjestelmä.
1 © Jukka Juslin Luokat, attribuutit ja metodit Yleistietoa: seuraavalla koulutusviikolla tarkempi käsittely.
Ohjelmointi 1. toinen luento1 Taulukot n Kiinteät taulukot: alkioiden määrä tiedetään Dim intCount(12) As Integer 0 indeksit saavat arvoja 0-12 (Option.
15. Ohjelmoinnin tekniikkaa
Osoittimen määrittely ja alustus tMyn1 Osoittimen määrittely ja alustus Osoitin (pointer) on muuttuja, joka voi sisältää keskusmuistiosoitteen. Osoitinmuuttujan.
Foreach-toistolausetMyn1 foreach-toistolause foreach-rakenteella on kätevä käydä läpi kaikki taulukon alkiot. Erityisen kätevää se on hajautustaulukon.
Ohjausrakenteet Määräävät ohjelmakoodin suoritusjärjestyksen Ehtolause if – else on muotoa if (lauseke) lause1 else lause2 Jos lauseke on tosi, niin suoritetaan.
Prioriteettijonot ja kekolajittelu (heapsort)
Lajittelun sovelluksia Yksilöllisyyden testaaminen Kopioiden poistaminen Mediaani/n:ksi suurimman valinta frekvenssien laskenta/yleisin alkio, l.moodi.
Muuttujan osoite int a=1; 0xbfffea64 /* tulostetaan a:n osoite*/ printf(“%p\n”, &a); 0xbfffea68 /* tulostetaan a:n osoite + 1*/ printf(“%p\n”, &a+1); /*
String-vertailusta ja Scannerin käytöstä (1/2)
4. Komentoriviparametrit
TIES341 Funktio-ohjelmointi 2 Kevät 2006
3. Luokat, oliot ja metodit Java-kielessä (Lausekielinen ohjelmointi I ja II –kursseilla opitun kertausta.)
Foreach-toistolause foreach-rakenteella on kätevä käydä läpi kaikki taulukon alkiot. Erityisen kätevää se on hajautustaulukon tapauksessa, jossa taulukon.
11. Javan valintarakenteet
Kontrollirakenteet laajemmin
3. Attribuutit.
4. Luokan testaus ja käyttö olion kautta
Esityksen transkriptio:

© Hannu Laine 1 Tietorakenteet ja algoritmit Funktio-osoittimet Funktio-osoittimen ja taulukko-osoittimen vertailu Funktio-osoittimen käyttötapoja funktio taulukon alkiona funktio funktion parametrina funktio palauttaa funktion Kuinka qsort käyttää funktioparametria Iteraattorit

© Hannu Laine 2 Funktiot ja niiden osoittimet  Funktion nimi on vakio-osoitin, jolla on oma (kohde)tyyppinsä  Voidaan määritellä osoitinmuuttuja, jonka kohdetyyppi on funktio.  Funktion osoite (nimi) voidaan tallentaa (sijoittaa) tällaiseen muuttujaan.  Funktiota voidaan kutsua myös tällaisen muuttujan kautta (kunhan sinne on sijoitettu kutsuttavan funktion osoite).  Esimerkki int f1(int); // f1 on funktio eli f1 on vakio-osoitin int *f2(int); // f2 on funktio eli f2 on vakio-osoitin int (*f3)(int); // f3 on osoitinmuuttuja, jonka kohdetyyppi on // funktio int *(*f4)(int); // f4 on osoitinmuuttuja, jonka kohdetyyppi on funktio  Nyt voidaan tehdä sijoitukset f3 = f1; ja f4 = f2;  Funktiota f1 voidaan kutsua normaalisti esimerkiksi tavalla f1(2);  Sitä voidaan kutsua myös muuttujan f3 kautta näin f3(2); (Kieliopillisesti olisi myös oikein sanoa (*f3)(2) )

© Hannu Laine 3 Funktio- ja taulukko-osoittimen vertailu Funktio  Funktion nimi on vakio-osoitin, jolla on oma (kohde)tyyppinsä  Osoitin osoittaa funktion ensimmäistä suoritettavaa käskyä  Voidaan määritellä osoitinmuuttuja, jonka kohdetyyppi on funktio  Funktiota kutsutaan ts. käskyjä aletaan suorittaa liittämällä osoitteeseen kutsusulkeet () sisältäen parametrit.  Funktiota voidaan kutsua (asettaa kutsusulut) osoitinmuuttujan kautta. Taulukko  Taulukon nimi on vakio-osoitin, jolla on oma (kohde)tyyppinsä  Osoitin osoittaa taulukon ensimmäistä alkiota  Voidaan määritellä osoitinmuuttuja, jonka kohdetyyppi on taulukon alkio.  Taulukosta valitaan alkioita liittämällä osoitteeseen indeksointisulkeet sisältäen indeksin.  Taulukkoa voidaan käsitellä (valita alkioita, asettaa indeksointisulut) osoitinmuuttujan kautta.

© Hannu Laine 4 Funktio-osoittimen käyttötapoja  Siitä, että funktiota voi edustaa muuttuja (osoitinmuuttuja) seuraa, että funktio voi olla taulukon alkiona funktio voi olla funktion parametrina funktio voi palauttaa funktion funktio voi olla tietueen kenttänä jne

© Hannu Laine 5 Oma switch-rakenne funktiotaulukolla //Funktioiden prototyypit int f1(void); int f2(void); int f3(void); //Vaihtoehto: typedef int (*Tf)(void);  void main(void) { int ( *ft [3] ) (void) = { f1, f2, f3 } ;  //Vaihtoehto: Tf ft [3] = { f1, f2, f3 } ;  int valinta, funktionTulos; scanf(”%d”, &valinta); // Väliltä funktionTulos = ft[valinta](); } Ohjelma suorittaa funktion f1, f2 tai f3 sen mukaan, onko syötetty 0, 1 tai 2. Huomautus. Kolmiolla merkitty rivi voidaan korvata neliöillä merkityillä riveillä. //Funktioiden toteutukset int f1(void) {return 1; } int f2(void) {return 2; } int f3(void) {return 3; }

© Hannu Laine 6 Funktiotaulukkoa edustava osoitin Edellisen sivun funktio-osoittimien taulukon määrittely int (*ft1[3])(void); Varaa muistista 3 osoitinta. Tässäkin, kuten kaikissa taulukoissa, taulukon nimi ft1 on taulukon ensimmäisen alkion vakio-osoitin. Osoitinmuuttuja, joka edustaa funktio-osoittimien taulukkoa on silloin: int (**ft2) (void); Nyt voi tehdä sijoituksen ft2 = ft1; jonka jälkeen esim: ft1[1](); ft2[1](); Jos olisi funktio kayta_funktiotaulukkoa, joka ottaa parametriksi yllä olevan funktiotaulukon, sen prototyyppi olisi esimerkiksi void kayta_funktiotaulukkoa (int (**par) (void)); Tätä funktiota voitaisiin kutsua muodossa kayta_funktiotaulukkoa (ft1);

© Hannu Laine 7 Funktio funktion parametrina (qsort) 1 Esimerkkinä funktio qsort void qsort(void *base, size_t n, size_t size, int (*fcmp) (const void*, const void *)); typedef struct { int age; char name[30]; } Tperson; int compareNames(const void *p1, const void *p2); int compareAges(const void *p1, const void *p2); int main(void) { Tperson array[100]; //Muodostetaan taulukko qsort(array, 100, sizeof(Tperson), compareNames); //Nyt taulukko on järjestyksessä nimen mukaan qsort(array, 100, sizeof(Tperson), compareAges); //Nyt taulukko on järjestyksessä iän mukaan } Funktion qsort prototyyppi Tietueen Tperson määrittely Vertailufunktioi- den prototyypit Sovellus, jossa taulukko järjestetään

© Hannu Laine 8 Funktio funktion parametrina (qsort) 2 //Vertailufunktioiden toteutukset: int compareNames(const void *p1, const void *p2) { return strcmp(((Tperson*) p1)->name, ((Tperson*) p2)->name); } int compareAges(const void *p1, const void *p2) { if (((Tperson*) p1)->age age) return -1; if (((Tperson*) p1)->age == ((Tperson*) p2)->age) return 0; return 1; } Huomautus. Vertailufunktiot tietueelle Tperson voidaan kirjoittaa myös niiden ”luonnollisessa” muodossa seuraavasti: int compareNames(const Tperson *p1, const Tperson *p2) { return strcmp(p1->name, p2->name); } Silloin tarvitaan tyyppimuunnos funktion qsort kutsussa seuraavasti: qsort(array, 5, sizeof(Tperson), (int (*)(const void*, const void*)) compareNames);

© Hannu Laine 9 Kuinka qsort käyttää funktioparametria Qsort käyttää parametrina saamaansa funktiota taulukon alkioiden vertailuun. Se kutsuu järjestämisprosessissa vertailufunktiota useita kertoja ja siirtää alkioita taulukossa vertailutulosten mukaisesti oikeaan järjestykseen. Tutustumme tähän periaatteeseen yksinkertaisen lajittelumenetelmän avulla. Tarkastelemme esimerkkiä, jossa selection sort menetelmällä on tehty geneerinen järjestämisfunktio sort_selection. Tämän esimerkkifunktion parametrilista on täsmälleen sama kuin qsort- funktion, jolloin nähdään kuinka asiat tapahtuvat järjestämisfunktion ”sisällä”. Esimerkkiohjelma löytyy verkosta.

© Hannu Laine 10 Funktio palauttaa funktion (signal) Unix/Linux-käyttöjärjestelmien API-rajapinnalla on funktio signal, jolla asetetaan signaalinkäsittelijäfunktio. Funktio signal ottaa signaalinkäsittelyfunktion parametrina ja palauttaa ennen asetusta käytössä olleen signaalinkäsittelyfunktion. Tämän funktion prototyyppi on void (*signal ( int signo, void(*func)(int)))(int); Tätä voitaisiin käyttää seuraavasti: void my_handler(int signo); int main(void) { void (*old_handler)(int); … old_handler = signal(SIGALRM, my_handler); …. signal(SIGALRM, old_handler); } void my_handler(int signo) { return; } Asetetaan uusi signaalinkäsittelijä- funktio. Palautetaan alkuperäinen

© Hannu Laine 11 Sisäinen iteraattori 1 Iteraattori voi olla sisäinen tai ulkoinen. Sisäinen iteraattori tarkoittaa, että säiliö itse osaa läpikäydä alkionsa. Säiliöllä on silloin operaatiofunktio ForAll, ForEach tms. Tällaisen funktion prototyyppi C:ssä voisi olla on muotoa void ForAll(Tcontainer *cont, void (*f)(Titem *item)); missä f on parametrina annettava funktio, jonka käyttäjä voi vapaasti kirjoittaa ja jossa kuvataan, mitä alkioille tehdään. Tarkastellaan tarkemmin esimerkkinä listan sisäistä iteraattoria. Sitä käytetään esimerkissä ensin listan alkioiden tulostamiseen ja sitten siten, että alkioihin lisätään 1. (Katso verkossa oleva esimerkkiohjelma sisiter.c)

© Hannu Laine 12 Sisäinen iteraattori 2 Jos alkiota käsittelevä funktio halutaan yleisemmäksi siten, että sille voidaan välittää parametreja, sen muoto on esimerkiksi void (*f)(Titem *item, void *args); Funktion ForAll prototyyppi on silloin: void ForAll(Tcontainer *cont, void (*f)(Titem *, void *), void *args); Tällöin sisäisen iteraattorin kutsu voisi olla esimerkiksi muotoa int lisays = 3; ForAll(&stack, lisaaluku, &lisays); Parametrin lisays oikea tyypitys tehdään itse funktiossa. Kutsussa olevan funktion lisaaluku toteutus olisi silloin void lisaaluku(Titem *item, void *args) { *item = *item + *(int*)args; } Funktion ForAll toteutus tässä tapauksessa olisi ….