Tietorakenteet ja algoritmit

Samankaltaiset tiedostot
Algoritmit ja tietorakenteet / HL 1 Copyright Hannu Laine. Lista. Yleistä

Tietorakenteet ja algoritmit

Tietorakenteet ja algoritmit

Tietorakenteet ja algoritmit

Tietorakenteet ja algoritmit

Tietorakenteet ja algoritmit

Tietorakenteet ja algoritmit

TIETORAKENTEET JA ALGORITMIT

Tietorakenteet ja algoritmit

Tietorakenteet ja algoritmit

Tietorakenteet ja algoritmit

Rakenteiset tietotyypit Moniulotteiset taulukot

Olio-ohjelmointi Syntaksikokoelma

Demo 6 vastauksia. 1. tehtävä. #ifndef #define D6T1 H D6T1 H. #include <iostream> using std::ostream; using std::cout; using std::endl;

Tietueet. Tietueiden määrittely

Osoitin ja viittaus C++:ssa

Lyhyt kertaus osoittimista

tietueet eri tyyppisiä tietoja saman muuttujan arvoiksi

Osoittimet ja taulukot

815338A Ohjelmointikielten periaatteet Harjoitus 5 Vastaukset

C-kielessä taulukko on joukko peräkkäisiä muistipaikkoja, jotka kaikki pystyvät tallettamaan samaa tyyppiä olevaa tietoa.

Algoritmit ja tietorakenteet / HL Copyright Hannu Laine

815338A Ohjelmointikielten periaatteet Harjoitus 3 vastaukset

A TIETORAKENTEET JA ALGORITMIT

3. Binääripuu, Java-toteutus

12 Mallit (Templates)

Dynaamiset tietorakenteet

Muita linkattuja rakenteita

Muistin käyttö. Muistin käyttö. Muistin käyttö. Muistin käyttö. Muistin käyttö. Muistin käyttö. Muistin käyttö C-ohjelmassa

Osa VII. Mitä mallit ovat ja kuinka niitä käytetään Miksi mallit tarjoavat paremman vaihtoehdon makroille Kuinka luokkamalleja luodaan

Merkkijono määritellään kuten muutkin taulukot, mutta tilaa on varattava yksi ylimääräinen paikka lopetusmerkille:

Jakso 4 Aliohjelmien toteutus

1.1 Pino (stack) Koodiluonnos. Graafinen esitys ...

Algoritmi ja abstraktio

Geneeriset luokat. C++ - perusteet Java-osaajille luento 6/7: Template, tyyppi-informaatio, nimiavaruudet. Geneerisen luokan käyttö.

Operaattoreiden ylikuormitus. Operaattoreiden kuormitus. Operaattoreiden kuormitus. Operaattoreista. Kuormituksesta

Moduli 4: Moniulotteiset taulukot & Bittioperaatiot

Luento 4 Aliohjelmien toteutus

(p j b (i, j) + p i b (j, i)) (p j b (i, j) + p i (1 b (i, j)) p i. tähän. Palaamme sanakirjaongelmaan vielä tasoitetun analyysin yhteydessä.

Dynaaminen muisti Rakenteiset tietotyypit

Pino S on abstrakti tietotyyppi, jolla on ainakin perusmetodit:

Loppukurssin järjestelyt C:n edistyneet piirteet

Loppukurssin järjestelyt

ITKP102 Ohjelmointi 1 (6 op)

Algoritmit 2. Luento 2 To Timo Männikkö

Osoittimet ja taulukot

A TIETORAKENTEET JA ALGORITMIT

Algoritmit 2. Luento 2 Ke Timo Männikkö

Tehtävän V.1 ratkaisuehdotus Tietorakenteet, syksy 2003

Ohjelmointi 1 Taulukot ja merkkijonot

Algoritmit 1. Luento 4 Ke Timo Männikkö

C++11 Syntaksi. Jari-Pekka Voutilainen Jari-Pekka Voutilainen: C++11 Syntaksi

C++11 lambdat: [](){} Matti Rintala

Aliohjelmatyypit (2) Jakso 4 Aliohjelmien toteutus

812336A C++ -kielen perusteet,

Luento 4 (verkkoluento 4) Aliohjelmien toteutus

Luento 4 (verkkoluento 4) Aliohjelmien toteutus

Algoritmit 2. Luento 7 Ti Timo Männikkö

815338A Ohjelmointikielten periaatteet Harjoitus 4 vastaukset

Muuttujien roolit Kiintoarvo cin >> r;

Ohjelmoinnin perusteet Y Python

Luokassa määriteltävät jäsenet ovat pääasiassa tietojäseniä tai aliohjelmajäseniä. Luokan määrittelyyn liittyvät varatut sanat:

13 Operaattoreiden ylimäärittelyjä

Tieto- ja tallennusrakenteet

Ohjelmoinnin peruskurssien laaja oppimäärä

Kaksiloppuinen jono D on abstrakti tietotyyppi, jolla on ainakin seuraavat 4 perusmetodia... PushFront(x): lisää tietoalkion x jonon eteen

Tietorakenteet ja algoritmit Johdanto Lauri Malmi / Ari Korhonen

Jakso 4 Aliohjelmien toteutus

1. Mitä seuraava ohjelma tulostaa? Vastaukseksi riittää yksi rivi joka esittää tulosteen. (6 p)

Kirjoita oma versio funktioista strcpy ja strcat, jotka saavat parametrinaan kaksi merkkiosoitinta.

useampi ns. avain (tai vertailuavain) esim. opiskelijaa kuvaavassa alkiossa vaikkapa opintopistemäärä tai opiskelijanumero

Sisältö. 2. Taulukot. Yleistä. Yleistä

Yleistä. Nyt käsitellään vain taulukko (array), joka on saman tyyppisten muuttujien eli alkioiden (element) kokoelma.

Tietorakenteet ja algoritmit - syksy

1. Esittelyt ja vakiot 1.1 Esittelyt (declarations) Ennen nimen, tunnuksen (identifier) käyttöä se on

1. Olio-ohjelmointi 1.1

Algoritmit 1. Demot Timo Männikkö

Algoritmit 1. Luento 6 Ke Timo Männikkö

Algoritmit 1. Luento 3 Ti Timo Männikkö

Moduli 2: Osoittimet ja taulukot. Joel Huttunen

Funktiomallit Funktiomallin määrittely

Kääntäjän virheilmoituksia

Modulaarinen ohjelmointi

QT model view. Juha Järvensivu 2008

ITKP102 Ohjelmointi 1 (6 op)

#include <stdio.h> // io-toiminnot. //#define KM_MAILISSA int main( ){

ITKP102 Ohjelmointi 1 (6 op)

812347A Olio-ohjelmointi, 2015 syksy 2. vsk. X Poikkeusten käsittelystä

Tehtävä 1. TL5302 Olio-ohjelmointi Koe Malliratkaisuja. Tässä sekä a)- että b)-kohdan toimiva ratkaisu:

Ohjelmoinnin perusteet Y Python

Algoritmit 1. Luento 1 Ti Timo Männikkö

Rajapinta (interface)

Tietorakenteet, laskuharjoitus 3, ratkaisuja

Voit käyttää tekemääsi ohjelmaa seuraavan viikon harjoituksissa, joten kopio työsi hedelmät talteen äläkä tuhoa niitä.

Algoritmit 1. Demot Timo Männikkö

Harjoitustyö: virtuaalikone

4. Luokan testaus ja käyttö olion kautta 4.1

Ohjelmoinnin jatkokurssi, kurssikoe

C-ohjelmointi, syksy Modulaarinen ohjelmointi. Luento C-ohjelmointi Syksy

6.4. Järjestyssuhteet

Transkriptio:

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 1

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

Listan toteutustapoja taulukko linkattu taulukko dynaamisesti varattu linkattu rakenne 3

Yksinkertainen taulukkototeutus #define N 100 typedef... Titem; typedef struct { Titem array[n]; int count; Tlist; Tlist array count 4

Linkattu taulukkototeutus (ketjutus) Tlist #define N 100 typedef... Titem; typedef struct { Titem item; int next; Tarrayitem; typedef struct { int first; int first_free Tarrayitem array[n]; Tlist; item next item next first first_free array Arrayitem Arrayitem Arrayitem 5

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; item next Tlist item next first number_of_items array Arrayitem Arrayitem Arrayitem freestack 6

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

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

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 9

Alkion käsittelyn aiheuttamat ongelmat säiliön yleisyydelle Operation Problem in C Improvement in C C++ output printf print_item cout << and overloading input scanf read_item cin >> and overloading vertailut == (and other comparision ops) compare overloading of operators sijoitus = (shallow copy) copy overloading of assignment 10

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

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

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

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 14

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

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 personlista ja point-lista mallifunktioilla toteutettuna. Mallifunktiot template <class Titem, class Tlist> void initialize(tlist* list) {. template <class Titem, class Tlist> void insert(tlist* list, const Titem* item) { Mallifunktioiden käyttö #include person_list.h #include point_list.h int main(void) { Tperson_list person_list; Tpoint_list point_list; initialize(&person_list); initialize(&point_list); // vain typedef Tperson_list tyypille // vain typedef Tpoint_list tyypille C++-kurssissa mennään tästäkin askel pitemmälle ja opitaan malliluokat. Kääntäjä generoi oikean funktion mallin avulla. 16

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