10/9/2012 © Hannu Laine 1 Tietorakenteet ja algoritmit Listan määritelmä Listan toteutustapoja Yksinkertainen taulukkototeutus Linkattu taulukko Dynaamisesti.

Slides:



Advertisements
Samankaltaiset esitykset
18. Abstraktit tietotyypit
Advertisements

Copyright  Hannu Laine Bittitason-operaatiot Hannu Laine.
Tietorakenteet ja algoritmit
15. Loogiset operaatiot.
Olio-ohjelmoinnin perusteet luento 3: Muuttujista ja funktioista Sami Jantunen LTY/Tietotekniikan osasto.
Active directory.
© Hannu Laine 1 Tietorakenteet ja algoritmit Funktio-osoittimet Funktio-osoittimen ja taulukko-osoittimen vertailu Funktio-osoittimen käyttötapoja.
Tietorakenteet ja algoritmit
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
Rakenteinen ohjelmointi
Käännösaikaiset virheilmoitukset • Tulee silloin, kun koodissa on jotain sellaista, joka ei ole Javan syntaksin mukaista • Esim. – Syntax error, insert.
13. Pakkaukset.
Sovellusohjelman suunnittelu & toteutus
C-ohjelmointi, kevät 2006 Taulukot Binääritiedostot Luento
Java-ohjelmointi Opas ammattimaiseen osaamiseen Luku 4 Toistolauseet
@ Leena Lahtinen OHJELMAN OSITTAMINEN LUOKKA ATTRIBUUTIT METODIT.
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.
TIETO JA TIETOKONEOHJELMA TIETOKONEOHJELMA KÄSITTELEE TIETOJA TIETOJA VOIDAAN KÄSITELLÄ OHJELMASSA VAIN SALLITUILLA MENETELMILLÄ.
Osoitin ja char- tietotyyppi tMyn1 Osoitin ja char-tietotyyppi Osoitinmuuttuja, joka on tyyppiä char* voidaan alustaa merkkijonolla: char* alku=”En toivo.
Sami Jantunen LTY/Tietotekniikan osasto
Dynaamiset oliottMyn1 Dynaamiset oliot Dynaamisen olion tunnuksen esittely ja olion määrittely voivat tapahtua yhtäaikaisesti tai eri aikaan. Dynaamisen.
Olioon kohdistuvia perustoimintoja tMyn1 Olioon kohdistuvia perustoimintoja Kopiointimuodostin (copy constructor) alustaa olion tietojäsenet saman luokan.
13. Hyvä ohjelmointitapa (osa 1)
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.
TUTTI - TietotUrvallisuuden iTsearvioinTivälIne v 1.0 ©2012 Kimmo Rousku sivu 1(8) TietotUrvallisuuden iTsearvioinTivälIne Pisteytysapuvälineet.
TIEP114 Tietokoneen rakenne ja arkkitehtuuri, 3 op ALU.
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.
PHP funktiot Jouni Juntunen Oulun seudun ammattikorkeakoulu Liiketalouden yksikkö.
1. Usean muuttujan funktiot
Muuttujat ja vakiottMyn1 Muuttujat ja vakiot PHP-kielen syntaksi on lainattu suurimmaksi osaksi C- kielestä. PHP on erityisesti HTML-dokumenttien sisään.
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.
10. Abstrakti luokka Johdanto Abstrakti luokka (abstract class) poikkeaa konkreettisesta luokasta (ei-abstrakti luokka) siten, että siitä ei.
@ Leena Lahtinen OHJELMAN OSITTAMINEN LUOKKA ATTRIBUUTIT METODIT.
Olioon kohdistuvia perustoimintoja tMyn1 Olioon kohdistuvia perustoimintoja Kopiointimuodostin (copy constructor) alustaa olion tietojäsenet saman luokan.
Tietokannat -kurssi KSAO, Datanomit, käytön tuki kevät 2015 Lauri Tapola.
5. Lineaarinen optimointi
@ Leena Lahtinen TIETOKONEOHJELMAN RAKENNE OHJELMALLA ON KAKSI OSAA:  MÄÄRITYSOSA TIETOJEN KUVAUKSIA VARTEN  SUORITUSOSA TIETOJEN KÄSITTELYÄ.
© 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.
Johdetun luokan olion esittely... tMyn1 Johdetun luokan olion esittely ja määrittely Esittelyluokka tarkoittaa olion tunnuksen luokkaa. Määrittelyluokka.
FunktiottMyn1 Funktiot Funktiot voidaan jakaa –Kirjastofunktioihin, jotka ovat valmiina kaikkien käytössä. Erikoisempien kirjastofunktioiden käyttöönotto.
DO NOT PRINT THIS DOCUMENT SQL -valintaehto CREATE TABLE opettaja ( opetunnus varchar(12) NOT NULL, nimi varchar(40) NOT NULL, puhelin varchar(12), tyohuone.
Olioiden taulukointi Perustaulukon käyttö Luokan ilmentymät voidaan tallettaa taulukkoon samoin kuin muuttujat Esimerkki talletetaan taulukkoon opintojaksojen.
S ysteemianalyysin Laboratorio Teknillinen korkeakoulu Esitelmä 2 - Jirka Poropudas Optimointiopin seminaari - Kevät 2005 / 1 Bayes-verkoista s
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.
Johdetun luokan olion alustus tMyn1 Johdetun luokan olion alustus määrätyillä arvoilla Kun ohjelmassa esiintyy johdetun luokan olion määrittely, järjestelmä.
Javascript 2: Ohjelmointikielen ominaisuudet Jaana Holvikivi Metropolia.
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
Listat eli luettelot listaelementit ovat lohkoelementtejä:  lista ja listan alkiot alkavat uudelta riviltä  listan jälkeen tuleva elementti alkaa uudelta.
Ohjausrakenteet Määräävät ohjelmakoodin suoritusjärjestyksen Ehtolause if – else on muotoa if (lauseke) lause1 else lause2 Jos lauseke on tosi, niin suoritetaan.
Sami Jantunen LTY/Tietotekniikan osasto
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); /*
Olio-ohjelmoinnin perusteet luento 7: C++ mallit, Standard Template Library (STL) Sami Jantunen LTY/Tietotekniikan osasto.
Usein aliohjelman kutsun tulos ei riipu pelkästään eksplisiittisistä syötteistä vaan myös moduulin tai olion tilasta (state). ● Tila määräytyy yleensä.
KSAO, Datanomit, käytön tuki kevät 2015 Lauri Tapola
Yksikkötestaus ● Yksikkötestauksella tarkoitetaan lähdekoodiin kuuluvien yksittäisten osien testaamista. Termi yksikkö viittaa ohjelman pienimpiin mahdollisiin.
13. Loogiset operaatiot.
14. Hyvä ohjelmointitapa.
13. Loogiset operaatiot.
4. Luokan testaus ja käyttö olion kautta
Esityksen transkriptio:

10/9/2012 © Hannu Laine 1 Tietorakenteet ja algoritmit Listan määritelmä Listan toteutustapoja Yksinkertainen taulukkototeutus Linkattu taulukko Dynaamisesti linkattu taulukko Listan toteutuksen yleisyysvaatimukset Millä ehdoilla yleisyysvaatimukset toteutuvat Alkiotyypin vaihto Samassa ohjelmassa kaksi säiliötä eri alkiotyypeille Makrojen hyödyntäminen edellisissä asioissa C++:n ”lisäavut” edellisiin asioihin

10/9/2012 © Hannu Laine 2 Lineaarinen lista (Ordered List or List) Määritelmä. Lineaarinen lista on sellaisten alkioiden kokoelma, joiden kesken on määritelty lineaarinen järjestys. Lisäksi tälle kokoelmalle on määritelty seuraavat operaatiot: alusta lista tyhjäksi (initialize_list) testaa onko lista tyhjä (empty) selvitä listan pituus eli alkioiden määrä (find the lenght of the list) hae listasta i:s alkio (retrieve the i:th element) selvitä onko listassa tietty alkio (x) selvitä alkion järjestysnumero listassa () lisää uusi alkio listaan (store a new value to the list) poista alkio listasta paikalta i (delete an item at position i) Määritelmässä mainittiin, että listan alkioiden kesken on määritelty lineaarinen järjestys. Tämä järjestys voi olla esimerkiksi syöttöjärjestys, nouseva suuruusjärjestys, laskeva suuruusjärjestys, aakkosjärjestys tai joku muu järjestys. Siitä että alkioiden kesken on määritelty järjestys seuraa, että käsitteet ensimmäinen alkio ja viimeinen alkio voidaan määritellä formaalisesti.

10/9/2012 © Hannu Laine 3 toteutustapoja Listan toteutustapoja  taulukko  linkattu taulukko  dynaamisesti varattu linkattu rakenne

10/9/2012 © Hannu Laine 4 Yksinkertainen taulukkototeutus #define N 100 typedef... Titem; typedef struct { Titem array[N]; int count; } Tlist; Tlist count array …

10/9/2012 © Hannu Laine 5 Linkattu taulukkototeutus (ketjutus) #define N 100 typedef... Titem; typedef struct { Titem item; int next; } Tarrayitem; typedef struct { int first; int first_free Tarrayitem array[N]; } Tlist; Tlist first array first_free Arrayitem item next item next

10/9/2012 © Hannu Laine 6 Linkattu taulukkototeutus (vapaat pinossa) #define N 100 typedef... Titem; typedef struct { Titem item; int next; } Tarrayitem; typedef struct { int first; int number_of_items; Tarrayitem array[N]; Tintstack freestack; } Tlist; Tlist first array number_of_items Arrayitem item next item next freestack

10/9/2012 © Hannu Laine 7 Yleisyysvaatimukset Asetamme säiliölle seuraavat yleisyystavoitteet:  Säiliötä voidaan käyttää uudelleen uusissa sovelluksissa (ja uusilla sovellusalueilla).  Säiliötä käyttävä sovellus on riippumaton säiliön toteutustavasta  Säiliön toteutus on riippumaton säilöttävän alkion tyypistä.  Vaatimusten täyttyminen todetaan esimerkkiohjelman 1 (list5.c) avulla.

10/9/2012 © Hannu Laine 8 Alkiotyypin vaihto käytännössä Alkiotyypin vaihto uuteen edellyttää seuraavia toimenpiteitä: 1) uusi typedef määrittely alkiotyypille typedef... Titem 2) säiliön toteutuksessa tarvittavien alkion operaatiofunktioiden toteutus säiliön toteutuksessa käytetyn prototyypin mukaisesti 3) säiliön kääntäminen uudelleen (siis säiliön source tarvitaan uudelleenkäytössä, vaikka sitä ei modifioida).

10/9/2012 © Hannu Laine 9 Esimerkki alkiotyypin vaihdosta Jos tunnilla käsitelty merkkilistaohjelma (list5.c) halutaan muuttaa pistelistaohjelmaksi, muutokset ovat seuraavat. (Oletetaan, että adt piste on toteutettu aikaisemmin kuten tunnilla ja harjoituksissa on ollut esillä). Yhtä hyvin listasta voidaan tehdä aikojen lista (adt aika toteutettu labratehtävänä). incluudataan piste.h määritellään piste "itemiksi" typedef Tpiste Titem; void read_item(Titem *item) { read_point(item, "Enter point"); } void print_item(Titem item) { print_point(item); } int compare_item(Titem item1, Titem item2) { //kuinka pisteitä halutaan vertailla }

10/9/2012 © Hannu Laine 10 Alkion käsittelyn aiheuttamat ongelmat säiliön yleisyydelle OperationProblem in CImprovement in C C++ outputprintfprint_itemcout << and overloading inputscanfread_itemcin >> and overloading vertailut== (and other comparision ops) compareoverloading of operators sijoitus= (shallow copy)copyoverloading of assignment

10/9/2012 © Hannu Laine 11 Samassa ohjelmassa säiliöt kahdelle eri alkiotyypille (eri säiliöt kummallekin) 1/3 On jo todettu, että säiliön toteutus ei muutu source-kooditasolla alkion tyypin muuttuessa. Konekielitasolla kuitenkin säiliön toteutusfunktiot ovat samoja. Miten saadaan säiliöt kahdelle alkiotyypille samassa sovelluksessa? Esimerkki. Person-lista ja point-lista. person.h Tperson, read_person, print_person, … point.h Tpoint, read_point, print_point, … person_list.h (#include ”person.h”) Tperson_list; void initialize_person_list(Tperson_list* list); void insert_to_person_list(Tperson_list* list, const Titem*item); point_list.h (#include ”point.h”) Tpoint_list; void initialize_point_list(Tpoint_list* list); void insert_to:point_list(Tpoint_list* list, const Titem*item);

10/9/2012 © Hannu Laine 12 Samassa ohjelmassa säiliöt kahdelle eri alkiotyypille (eri säiliöt kummallekin) 2/3 person_list.c => person_list.obj point_list.c => pointt_list.obj Application.c #include ”point_list.h” #include ”person_list.h” int main(void) { Tpoint_list point_list; Tperson_list person_list; Tpoint point; Tperson person; initialize_point_list(&point_list); initialize_person_list(&person_list); insert_to_point_list(&point_list); insert_to_person_list(&person_list); … }

10/9/2012 © Hannu Laine 13 Samassa ohjelmassa säiliöt kahdelle eri alkiotyypille (eri säiliöt kummallekin) 3/3 C-kielessä pitää siis tehdä listan kaikista funktioista kopiot erikseen jokaiselle alkiotyypille. Listan funktioille on annettava nyt vain eri nimet. Ainoa ero funktioissa on listan ja alkioiden tyyppinimissä ja funktioiden nimissä. Nämä muutokset ovat täysin mekaanisia ja ne voidaan tehdä editorin search and replace – toiminolla. On mahdollista tehdä, jopa makrot, joilla säiliö saadaan generoitua uudelle alkiotyypille ”automaattisesti”. Tällaiset makrot ovat ”korvike” C++:n funktio- luokkamalleille (function template ja class template). Seuraavaksi tutkimme kuinka C++:ssa funktioiden ylikuormitus ja mallifunktiot (tai malliluokat) helpottavat ohjelmoijan työtä tässä tapauksessa. Lopuksi katsomme myös esimerkkiä, kuinka C:ssäkin asiaa voidaan ”automatisoida” makroilla. Esimerkki makrosta sivulla 17.

10/9/2012 © Hannu Laine 14 Funktioiden ylikuormituksen (overloading) perusteet C++:ssa C-kielessä // funktion prototyyppi void read(Tpoin* p); // sovellus int main(void) { Tpoint p1; read(&p1); return 0; } Tulos C-kääntäjästä push call _read … // funktion toteutus void read(Tpoint* p) { scanf(”%f%f”, &p->x, &p->y); } Tulos C-kääntäjästä _read ; label … END _read C++-kielessä // funktion prototyyppi void read(Tpoin* p); // sovellus int main(void) { Tpoint p1; read(&p1); return 0; } Tulos C++-kääntäjästä push ; $qp6Tpointpc … ; on signature // funktion toteutus void read(Tpoint* p) { scanf(”%f%f”, &p->x, &p->y); } Tulos ; label with signature …

10/9/2012 © Hannu Laine 15 Funktioiden ylikuormituksen hyödyntäminen C++:ssa Sivulla 13 on mainittu, että toisen alkiotyypin listassa ”ainoa ero funktioissa on listan ja alkioiden tyyppinimissä ja funktioiden nimissä”. C++:ssa uuden listan funktioille ei tarvitse antaa uutta nimeä. Riittää kun tehdään toiset samannimiset funktiot, joissa on uudet listan ja alkioiden tyyppinimet. Esimerkki. Person-lista ja point-lista. person.h Tperson, read, print, … point.h Tpoint, read, print, … person_list.h (#include ”person.h”) Tperson_list; void initialize(Tperson_list* list); void insert(Tperson_list* list, const Tperson* item); point_list.h (#include ”point.h”) Tpoint_list; void initialize(Tpoint_list* list); void insert(Tpoint_list* list, const Tpoint* item);

10/9/2012 © Hannu Laine 16 Mallifunktioiden hyödyntäminen C++:ssa Jopa tämä mekaaninen ”search and replace” toiminto voidaan C++:ssa delegoida kääntäjälle ns. mallifunktio ja malliluokkakäsitteen avulla. Alla vielä kerran person- lista ja point-lista mallifunktioilla toteutettuna. Mallifunktiot template void initialize(Tlist* list) { …. } template void insert(Tlist* list, const Titem* item) { … } Mallifunktioiden käyttö #include ”person_list.h” // vain typedef Tperson_list tyypille #include ”point_list.h”// vain typedef Tpoint_list tyypille int main(void) { Tperson_list person_list; Tpoint_list point_list; initialize(&person_list); initialize(&point_list); … Kääntäjä generoi oikean funktion mallin avulla. C++-kurssissa mennään tästäkin askel pitemmälle ja opitaan malliluokat.

10/9/2012 © Hannu Laine 17 Samassa ohjelmassa säiliöt kahdelle eri alkiotyypille (makrot käytössä) Käsitellään verkossa olevaa esimerkkiohjelmaa, jossa listatoteutus on makrona ja jossa samassa ohjelmassa käytetään merkkilistaa ja pistelistaa. Tällöin ohjelma sovellusohjelmoijan kannalta näyttää seuraavalta: DO_LIST_HEADER(Tpoint, 10) DO_LIST_HEADER(Tchar, 20) void main(void) { TlistTchr charlist; TlistTpoint pointlist; Tpoint p1;... store_item_Tchar(&charlist, 'a'); store_item_Tpoint(&poinlist, p1);... } DO_LIST_IMP(Tpoint) DO_LIST_IMP(Tchar)