Esittely latautuu. Ole hyvä ja odota

Esittely latautuu. Ole hyvä ja odota

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

Samankaltaiset esitykset


Esitys aiheesta: "10/9/2012 © Hannu Laine 1 Tietorakenteet ja algoritmit Listan määritelmä Listan toteutustapoja Yksinkertainen taulukkototeutus Linkattu taulukko Dynaamisesti."— Esityksen transkriptio:

1 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

2 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.

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

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

5 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

6 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

7 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.

8 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).

9 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 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

11 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);

12 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); … }

13 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.

14 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 call @read$qp6Tpointpc ; $qp6Tpointpc … ; on signature // funktion toteutus void read(Tpoint* p) { scanf(”%f%f”, &p->x, &p->y); } Tulos C++-kääntäjästä @read$qp6Tpointpc ; label with signature … END @read$qp6Tpointpc

15 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);

16 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.

17 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)


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

Samankaltaiset esitykset


Iklan oleh Google