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

Koko: px
Aloita esitys sivulta:

Download "Algoritmit ja tietorakenteet / HL 1 Copyright Hannu Laine. Lista. Yleistä"

Transkriptio

1 Algoritmit ja tietorakenteet / HL 1 Lista Yleistä Lista, pino ja jono ovat abstrakteja tietotyyppejä, joilla on yleistä käyttöä. Niitä voidaan hyödyntää mitä erilaisimmissa probleemoissa ja sovelluksissa. Tällaiset tietorakenteet vastaavat ohjelmistotekniikassa laitetekniikan komponentteja. Laitetekniikassa samoja komponentteja käytetään hyvinkin erilaisten laitteiden rakennuspalikoina. Myös ohjelmistotekniikassa pyritään yhä enemmän tilanteeseen, jossa olisi mahdollisimman paljon käytettävissä valmiita komponentteja, joista rakentamalla tehdään sovelluksia. Ohjelmistotekniikassa alimman tason rakennuspalikat ovat käytettävän ohjelmointikielen käskyjä. Jos kaikki sovellukset tehtäisiin aina puhtaalta pöydältä, jouduttaisiin uusien sovellusten sellaisiakin osia, jotka ovat toistuneet jo ainakin samantyyppisinä edellisissä projekteissa, toteuttamaan uudelleen. Tämä merkitsee tietysti jo kerran tehdyn työn tekemistä uudelleen. Tehtyä ohjelmistoa voitaisiin alkeellisimmalla tasolla yrittää käyttää hyväksi kopioimalla jo toteutetuista ohjelmista koodin osia uuteen sovellukseen. Tämä on kuitenkin hankalaa, jos ohjelman uudelleenkäyttöä ei ole ollenkaan suunniteltu sitä tehtäessä. Seuraavaa tasoa uudelleenkäytön huomioimisessa edustaa ajattelumalli, jossa ohjelmisto jaetaan aliohjelmiin (funktioihin). Uusissa sovelluksissa käytetään sitten hyväksi näitä funktioita. Etuna edellä mainittuun kopioimismenettelyyn nähden on, että funktioiden toteutuksia ei tarvitse ottaa mukaan uuden sovelluksen lähdekoodiin. Tarvittavat funktiot voidaan linkata uuteen sovellukseen. Näin kerran tehtyjä funktioita voidaan käyttää hyväksi ylemmällä abstraktiotasolla. Toinen etu, joka saadaan toteuttamalla uudelleenkäytettävät osat funktioina on se, että funktiot voidaan ohjelmoida uudelleen paremmin, esimerkiksi tehokkaammalla algoritmilla, vähemmän muistitilaa vievällä algoritmilla tai virheettömällä algoritmilla, jos siinä on havaittu virhe. Funktion uudelleen ohjelmointi ei vaikuta mitään tehdyn sovelluksen lähdekoodiin, mikäli funktion prototyyppi (interface) säilyy samana. Kolmatta tasoa uudelleenkäytön huomioimisessa edustaa abstrakti tietotyyppi. Siinä, kuten aikaisemmin on todettu, kootaan yhteen asiaan liittyvät tiedot yhdeksi tietotyypiksi ja kaikki tähän asiaan liittyvät toiminnat ohjelmoidaan funktioiksi. Tällä tavalla saadaan uudelleenkäytön abstraktiotasoa edelleen nostettua, koska siihen sisällytetään myös tiedot. Samalla tällaisen komponentin toteutuksen muutettavuus paranee huomattavasti, koska nyt voidaan muuttaa abstraktin tietotyypin tiedon sisäistä esitystapaa ja tiedon käsittelyyn tarkoitettujen funktioiden toteutustapaa siten, että tietotyyppiä käyttävään sovellukseen ei tarvita muutoksia. Tämä edellyttää, että uudessa abstraktin tietotyypin toteutuksessa säilytetään interface (tietotyypin nimi ja operaatiofunktioiden prototyypit). Neljättä tasoa uudelleenkäytön huomioimisessa edustaa olio. Olio on itse asiassa abstrakti tietotyyppi. Olio-ohjelmoinnissa tulee esille uusia käsitteitä. Ehkä tärkein uusi piirre on periyttäminen. Periyttämisen avulla olioon voidaan lisätä uusia piirteitä ilman, että tarvitsee muuttaa olion alkuperäistä toteutusta. Periyttäminen edustaa erikoistumista. Tässä yhteydessä tutustumme yleisiin tietorakenteisiin lista, pino ja jono. Niillä on paljon sovelluksia. Toteutukset tehdään abstrakteina tietotyyppeinä. Tulemme esittämään samalle abstraktille tietotyypille useita erilaisia toteutuksia. Näillä kaikilla säilytämme saman liityntärajapinnan, jolloin eri toteutukset ovat vaihtokelpoisia ohjelmistokomponentteja sovelluksissa. Ne vastaavat siis laitepuolen komponentteja sillä tavalla, että laitteeseen voidaan asentaa uusi komponentti vanhan tilalle, jos sen liitäntäspeksi vastaa ennen käytetyn komponentin tietoja. Lista pino ja jono ovat kaikki niin sanottuja säiliöitä (container). Niitä kutsutaan säiliöiksi, koska niihin voidaan tallentaa muita tietoalkioita. Periaatteessa taulukko

2 Algoritmit ja tietorakenteet / HL 2 on yksinkertaisin säiliö, koska sinne voidaan tallentaa esimerkiksi useita floating-point lukuja (vaikkapa mittausarvoja). 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: list) item) alusta lista tyhjäksi (initialize list) testaa onko lista tyhjä (test if 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 (determine whether or not a given item is in selvitä alkion järjestysnumero listassa (determine the order number of the 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. Toinen määritelmä lineaariselle listalle. Edellisessä määritelmässä on osa Lineaarinen lista on sellaisten alkioiden kokoelma, joiden kesken on määritelty lineaarinen järjestys. Tämän lauseen määrittelemää kokoelmaa sanotaan usein sarjaksi (sequence). Sarja voidaan määritellä myös toisella tavalla rekursiivisesti seuraavasti: (i) Tyhjä joukko on sarja. (ii) Jos S on sarja ja a on alkio, niin (S,a) on sarja. Lineaarinen lista on siis sarja, jolle on määritelty edellisessä määritelmässä mainitut operaatiot. Listan toteutustavat Kuten alussa mainittiin, abstrakti tietotyyppi voidaan toteuttaa eri tavoilla siten, että toteutustapa ei vaikuta sitä käyttäviin sovelluksiin. Myös lineaarinen lista voidaan toteuttaa useilla eri tavoilla. Pääasialliset erot seuraavissa toteutuksissa ovat siinä, millä tavalla tiedot esitetään tietokoneen muistissa. Puhumme tiedon tallennusrakenteesta. Lineaarisen listan tapauksessa on jollakin tavalla esitettävä itse alkiot ja niiden järjestys. Pääasialliset tavat, joita voidaan käyttää tallennettaessa listan (ja muidenkin säiliöiden) tietoja ovat taulukko linkattu taulukko dynaamisesti varattu linkattu rakenne Näiden päätapojen sisällä on vielä useita erilaisia variaatioita. Yllä olevat otsikot eivät yksikäsitteisesti selvitä, minkälaisista tallennusrakenteista on kysymys. Seuraavassa esitetään, mitä kullakin rakenteella tarkoitetaan.

3 Algoritmit ja tietorakenteet / HL 3 Taulukkototeutus. Taulukkototeutuksessa lineaarisen listan alkiot esitetään tavallisen ohjelmointikielen taulukon alkioissa. Järjestys määräytyy tässä tapauksessa alkion tallennuspaikasta taulukossa. Taulukon alkiothan on varattu muistista peräkkäisistä muistipaikoista. Tässä toteutustavassa järjestyksessä ensimmäinen alkio on talletettuna ensimmäiseen varattuun muistipaikkaan, järjestyksessä toinen alkio toiseen muistipaikkaan jne. Tässä toteutustavassa on ratkaistava lisäksi, miten esitetään alkioiden lukumäärä (todellisen tilanteen mukainen lukumäärä ja maksimilukumäärä). Taulukko voi olla staattinen taulukko tai dynaamiselta muistialueelta varattu taulukko. Nämä yksityiskohdat voidaan hoitaa eri tavoilla, ja näin saadaan erilaisia variaatioita tämän pääratkaisun sisällä. Operaatiofunktioiden toteutuksesta tulee myös melko lailla erilaiset riippuen siitä, onko järjestys määritelty syöttöjärjestyksenä vai esimerkiksi suuruusjärjestyksenä. Kaikissa toteutuksissa kaikki listaan liittyvät tiedot on paketoitava yhdeksi tietotyypiksi abstraktin tietotyypin määritelmän mukaisesti. Liitteenä on esimerkki lineaarisen listan toteutukselle taulukkona. Siinä järjestys määräytyy syöttöjärjestyksen mukaisesti, eli uusi syötettävä alkio viedään aina listan loppuun. Alkion tietotyyppi on esimerkissä merkki (char), mutta on huomattava, että se voi olla mikä tahansa tietotyyppi (integer, varaosa, henkilo, jne). Tästä syystä esimerkissä on käytetty alkion tyyppinä yleistä muotoa Titem. Jos Titem muutetaan typedef määrittelyllä esimerkiksi tietueeksi, joka sisältää kaikki varaosan tiedot, niin lineaarisen listan operaatiofunktiot pysyvät täysin muuttumattomina! Silloin voidaan käsitellä varaosien listaa! Tämä edellyttää, että abstraktioajattelua on käytetty myös alemmalla tasolla, eli että listan alkioita on käsitelty abstraktina tietotyyppinä ja niille on omat operaatiofunktiot kuten esimerkissä read_item ja print_item. Esimerkkiohjelman tiedon tallennusrakenne, jonka tietotyyppi on Tlist, on seuraavan mallin mukainen: Tlist count array Tietotyyppi Tlist on määritelty seuraavasti: #define N 100 typedef... Titem; typedef struct { int count; Titem array[n]; } Tlist;

4 Algoritmit ja tietorakenteet / HL 4 Linkattu taulukkototeutus. Edellä olevalla taulukkototeutuksella on haittapuolena se, että alkioita poistettaessa täytyy kaikkia seuraavia alkioita siirtää taulukossa alkuun päin, jos vapaa tila halutaan säilyttää taulukon lopussa, mikä lienee järkevintä, jos listan järjestys määräytyy syöttöjärjestyksestä. Jos järjestys määräytyy suuruusjärjestyksen mukaan, myös lisäyksen yhteydessä tietoja joudutaan siirtämään taulukossa. Ainakin suurten tietomäärien kyseessä ollessa tällainen tietojen siirtäminen vie paljon prosessoriaikaa. Linkattu taulukko on ratkaisu, jolla päästään poistojen ja lisäysten yhteydessä tarvittavasta tietojen siirtämisestä. Ratkaisussa käytetään edelleen taulukkoa, mutta nyt taulukon alkioon sisällytetään myös alkion järjestystä kuvaava järjestysnumero. Tlist first free item next array Arrayitem Arrayitem item next Arrayitem Tietotyyppi Tlist on määritelty seuraavasti: #define N 100 typedef... Titem; typedef struct { Titem item; int next; } Tarrayitem; typedef struct { int first; int free; Tarrayitem array[n]; } Tlist; Listan alkiot saadaan tulostettua aloittamalla taulukon paikasta, jonka indeksi saadaan kentästä first, ja etenemällä taulukon alkioiden next-kentän mukaan. Taulukon vapaat paikat on myös ketjutettu samalla tavalla ja ensimmäisen vapaan paikan indeksi on kentässä free. Dynaamisesti linkatun listan toteutus. Edellä olevissa listan toteutuksissa on molemmissa haittapuolena, että niissä taulukon koko tulee määrätyksi jo ohjelman käännösvaiheessa, koska listan alkiot talletetaan staattisesti muistista varattuun taulukkoon. Asiaa voitaisiin parantaa osittain siten, että taulukolle varattaisiin sopiva tila dynaamiselta muistialueelta listan alustusoperaation yhteydessä. Tässäkin tapauksessa tarvittavan tilan maksimimäärä pitäisi olla tiedossa ennen kuin listaan aletaan lisäämään alkioita. Dynaamisesti linkattu

5 Algoritmit ja tietorakenteet / HL 5 listarakenne on sellainen, että kullekin alkiolle varataan tila vasta alkion lisäyksen yhteydessä. Tässä on etuna se, että alkioiden määrän ylärajaa ei tarvitse tietää etukäteen ja toisaalta se, että muistissa ei ole koskaan varattuna hukkatilaa, koska tilaa on varattu kullakin hetkellä juuri sille määrälle alkioita kuin niitä tosiasiassa on. Tällaisessa ratkaisussa alkioiden järjestys esitetään alkioon liitettyinä linkkeinä. Kussakin alkiossa on linkki, joka on järjestyksessä seuraavan alkion osoite. Seuraavasta kuvasta selviää periaate. Staattinen muistialue Lista 1 Dynaaminen muistialue 7 3 Dynaamisesti linkatun listan toteutus käsitellään myöhemmin. Toteutuksen yleisyysnäkökohtia Tässä tarkastellaan vielä lisää toteutetun listan yleisyysvaatimuksia ja yleisyyden edellytyksiä. Tarkastelu tehdään käyttäen esimerkkinä ylläesitettyä ja verkossa täydellisenä olevaa listan toteutusta (list5.c). Tämä yleisyystarkastelu sopii silti kaikkiin myös myöhemmin esiteltäviin säiliöihin. 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ä Ensimmäinen vaatimus tarkoittaa, että tehtyä säiliötä voidaan helposti käyttää uudelleen sellaisenaan muissakin ohjelmistoprojekteissa. Käytön helppous tarkoittaa sitä, että uudelleenkäyttö tapahtuu "inkluudaamalla" listan otsikkotiedosto (.h) ja linkkaamalla sen toteutus (.obj tai.lib tiedosto) sovellukseen. Tässä oletamme vielä, että uusissa sovelluksissa säiliöön tallennetaan sitä tyyppiä olevia tietoalkioita, johon säiliö on suunniteltu. Tämä yleisyystavoite saadaan täytetyksi sillä, että listasta tehdään abstrakti tietotyyppi, ja että tehdään operaatiovalikoima niin täydelliseksi, että sillä pystyy ratkaisemaan mitä erilaisimpia probleemoita. Toinen yleisyysvaatimus voidaan selventää seuraavalla esimerkkitapauksella. Oletetaan että säiliöllä on jo toteutettu tietty sovellus. Tämä sovellus ei kuitenkaan toimi riittävän tehokkaasti. Tiedon poisto listasta kestää liian kauan. Toinen yleisyysvaatimus tarkoittaa, että voidaan ohjelmoida säiliölle uusi toteutus, nyt vaikkapa dynaamisesti linkattua rakennetta käyttäen, siis aivan toisenlaisella tekniikalla. Sovellukseen tämä uusi listan toteutus saadaan muuttamatta sovelluksessa mitään! Ainoat tarvittavat toimenpiteet ovat, että sovellus käännetään ja linkataan uudelleen. Käännös joudutaan tekemään koska listan otsikkotiedosto (.h) on muuttunut ja linkkaus joudutaan tekemään, koska listan operaatiofunktioiden konekielinen koodi on tietysti muuttunut aivan täysin. Mutta todella suuri etu, että sovelluksen source-koodiin ei tarvitse tehdä muutoksia voidaan saavuttaa. Tämän tekeminen mahdolliseksi edellyttää asioita sekä säiliön tekijältä (komponenttiohjelmoija) ja sovelluksen tekijältä (sovellusohjelmoijalta). Komponenttiohjelmoijan puolelta edellytyksenä on, että hän on noudattanut toteutuksessa abstraktin tietotyypin mallia ja tehnyt kattavan operaatiofunktiovalikoiman. Sovellusohjelmoijan pitää noudattaa hyvää ohjelmointitapaa käyttäessään säiliötä eli hän ei saa viitata suoraan tietotyypin sisäisiin kenttiin vaan hänen tulee pitäytyä säiliön operaatiofunktioissa. Muussa tapauksessa säiliön toteutuksen vaihtaminen uuteen merkitsee todennäköisesti valtavaa päivitystyötä sovellusohjelmassa.

6 Algoritmit ja tietorakenteet / HL 6 Kolmas yleisyysvaatimus tai -tavoite on säiliön toteutuksen riippumattomuus säiliöön tallennettavan tietoalkion tyypistä. Tämä tarkoittaa sitä, että listan toteutusta source-tasolla ei tarvitse muuttaa, vaikka säilöttävän alkion tyyppi muutetaan vaikka merkistä henkilöksi! Huomautus. On jopa niin, että myöskään sovellusta ei tarvitse muuttaa yllämainitussa tapauksessa, jos sovelluksen toimintalogiikka säilyy ennallaan! Jotta tämä säiliön riippumattomuus säilöttävän alkion tyypistä toteutuisi, edellytyksenä on, että alkiota käsitellään (sovelluksen tasolla ja) säiliön tasolla ADT:nä eli vain alkion omilla operaatioilla. On siis huomattava, että nyt puhutaan abstraktista tietotyypistä tietoalkioille ja abstraktista tietotyypistä säiliölle. Näitä alkion operaatioita esimerkkiohjelmassa (list5.c) ovat read_item, print_item ja compare_item. Jos halutaan vaihtaa säilöttävän alkion tyyppi, niin säiliön source-koodiin ei tarvita muutoksia. Muutos saadaan aikaan määrittelemällä alkion tietotyyppi Titem uudelleen ja kirjoittamalla operaatiofunktiot uudelle alkiotyypille. Kun toteutuksissa on käytetty puhdasta C-kieltä ja säiliö on tehty jollekin yksinkertaiselle (kielestä valmiina löytyvälle tietotyypille), kuten merkeille meidän esimerkissämme, yleisyysongelma piilee seuraavissa asioissa : syöttöön on käytetty scanf-funktiota, tulostukseen on käytetty printf funktiota, vertailu on tehty vertailuoperaattorilla ja sijoitus sijoitusoperaattorilla. Nämä ovat ongelmia siksi, että syöttö- ja tulostusfunktioiden kutsumuodot ovat riippuvaisia käsiteltävän tiedon tyypistä ja vielä pahempaa, että niitä ei voi käyttää rakenteellisten tietotyyppien tulostamiseen. Vertailu on myös ongelmallista, koska sitäkään ei voi käyttää rakenteisille tietotyypeille. Pelkkä sijoituskin saattaa olla ongelmallinen (vertaa aikaisemmin käsitelty aihe: matalakopiointi / syväkopiointi). Jos näille ongelmaoperaatioille tehdään omat operaatiofunktiot (read_item, print_item, compare_items ja copy_item), niin niille voidaan aina kirjoittaa kulloisellekin alkiotyypille toimiva toteutus. Tätä ajattelumallia käyttäen säiliöstä saadaan siis yleinen säilöttävän alkiotyypin suhteen. Muutokseen tarvitaan kuitenkin säiliön source-koodi, koska se on käännettävä uudelleen. Käännös tarvitaan siksi, koska siihen inkluudattava alkion otsikkotiedosto on muuttunut alkion uuden määrittelyn vuoksi. Jossakin vaiheessa myös alkion uudet operaatiofunktiot on linkattava sovellukseen. Huomautus. C:ssä siis yleisyyden saavuttaminen vaatii tietyllä tavalla totutuista tavoista luopumista, koska alkeistyypille pitää tehdä omat syöttö ja tulostusfunktiot samoin kuin omat vertaus- ja mahdollisesti sijoitusfunktiot. C++:ssa myös syöttö ja tulostus ovat operaattoreita (>> ja <<). Koska C++:ssa kaikki operaattorit ovat ylikuormitettavissa, niin silloin C++:n perustapa on sellaisenaan yleistettävissä mielivaltaiselle tyypille (luokalle). Tässäkin tapauksessa itse funktiot on kirjoitettava, mutta niitä voidaan kutsua samalla tavalla kuin alkeistyyppien yhteydessä. Verkosta löytyy myös ohjelma lista5.cpp, joka on listan C++ versio ja jossa on toteutettu ym. operaattoreiden ylikuormitukset (tämä esimerkki ei kuulu varsinaisesti kurssiin). Esimerkkiohjelmassa (list5.c) käytettiin alkiotyypille, joka nyt sattui olemaan merkki (char), tyyppinimeä Titem ja alkio operaatiofunktioiden niminä read_item, print_item, compare_item. nämä nimet ovat hyvin yleisiä eivätkä mitenkään ilmaise juuri kyseisessä esimerkissä käytössä ollutta merkkiä. Yleisiä nimiä käytettiin tässä korostamaan sitä, että kaikki ratkaisut olivat riippumattomia alkion tyypistä. Uusi tilanne syntyy, jos samassa ohjelmassa tarvitaan listaa 1 alkiotyypille 1 ja listaa 2 alkiotyypille 2. Edellä nähtiin, että listojen toteutukset ovat source-kooditasolla identtisiä, mutta konekielitasolla ei. Kysymys on siitä, että ainoa ero näissä funktioissa on tyyppien nimissä. Olisi siis kaksi sarjaa operaatiofunktioita jotka ovat muuten samanlaisia, mutta niissä olevat tyyppinimet ovat eri nimiä.. Kyseessä on vain nimeämiskysymys. C:ssä pitää myös funktioille antaa eri nimet. C++:ssa riittää pelkkä tyyppinimen ero eri funktioissa, koska ns. funktioiden ylikuormitus on mahdollista.

7 Algoritmit ja tietorakenteet / HL 7 C:ssä tämä säiliön koodin generointi uudelle alkiotyypille( headerien ja toteutusten generointi) voidaan tehdä automaattisesti makroilla (tietysti sama asia voidaan tehdä myös editorissa (Ensin Copy / Paste ja Sitten Search / Replace). C++:ssa kääntäjä voidaan saada generoimaan nämä määrittelemällä säiliö ns. template-luokaksi. C++:n template luokkien ajatus perustuu juuri tässä käsiteltyihin asioihin. Lisävalaistuksena vielä yllä olevaan asiaan seuraava. Jos ohjelmassa tarvitaan merkkilista ja pistelistaa, niin merkeille on omat operaatiofunktiot: void read_char(char *); void print_char(char ); int compare_char(char c1, char c2); ja vastaavasti pisteelle omansa: void read_point(tpoint *); void print_pointr(tpoint ); int compare_point(tpoint p1, Tpoint p2); Vastaavasti tarvitaan tietotyypit listoille, esimerkiksi TCharList ja TPointList. Ja vielä operaatiofunktiot listoille. Merkkilistan operaatiofunktiot voisivat olla vaikka tyyliä: void initialize_char_list(tcharlist *list);... ja pistelistan operaatiot tyyliä: void initialize_point_list(tpointlist *list);... C++:ssa riittää siis tyyppinimien vaihto funktioiden otsikoissa, koska usealla funktiolla voi olla sama nimi, kunhan niiden parametrilistat ovat erilaisia. Tätä kutsutaan funktioiden ylikuormittamiseksi. Asia perustuu siihen, että C++-kääntäjä generoi funktioon nimikirjoituksen (signature) parametrilistan perusteella. Säiliöiden yleisyyden lisäämiskeinoja opitaan lisää myöhemmin. Näitä ovat mm. se, että tallennetaan itse tiedon sijasta sen osoitin. Tällöin toteutus tehdään siten, että tallennettavan alkion tietotyyppinä on void*. Tällä yleisyyden lisäämiskeinolla on myös hintansa. C++:n luokat ja periyttäminen antaa myös hyödyllisen lisämahdollisuuden säiliöiden yleisyyden lisäämiseksi. Tämä ajatus perustuu siihen, että säilöttävän alkion tyypiksi laitetaan tässäkin osoitin ns. kantaluokkaan. Ns. polymorfismin takia tällaiseen säiliöön voidaan tallentaa myös osoittimia, jotka osoittavat olioon, joka edustaa kantaluokasta perittyä oliota. Tällöin samaankin säiliöön voidaan tallentaa erityyppisiä alkioita, kunhan ne ovat yhteisenkantaluokan perillisiä. Tämä aihe ei kuitenkaan kuulu kurssiin, vaan siihen palataan olio-ohjelmoinnin kurssissa.

Tietorakenteet ja algoritmit

Tietorakenteet ja algoritmit Tietorakenteet ja algoritmit Listan määritelmä Listan toteutustapoja Yksinkertainen taulukkototeutus Linkattu taulukko Dynaamisesti linkattu taulukko Listan toteutuksen yleisyysvaatimukset Millä ehdoilla

Lisätiedot

Tietorakenteet ja algoritmit

Tietorakenteet ja algoritmit Tietorakenteet ja algoritmit Elegantti toteutus funktiolle insert_to_list_end Alkion lisäys sisällön mukaan järjestettyyn listaan (insert_to_list) Linkatun listan yleisyys alkiotyypin suhteen source-tasolla

Lisätiedot

Tietorakenteet ja algoritmit

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

Lisätiedot

Tietorakenteet ja algoritmit

Tietorakenteet ja algoritmit Tietorakenteet ja algoritmit Kurssin sisältö pääpiirteittäin Tarvittavat pohjatiedot Avainsanat Abstraktio Esimerkkiohjelman tehtäväkuvaus Abstraktion käyttö tehtävässä Abstrakti tietotyyppi Hyötyjä ADT:n

Lisätiedot

Tietorakenteet ja algoritmit

Tietorakenteet ja algoritmit Tietorakenteet ja algoritmit Rekursio Rekursion käyttötapauksia Rekursio määritelmissä Rekursio ongelmanratkaisussa ja ohjelmointitekniikkana Esimerkkejä taulukolla Esimerkkejä linkatulla listalla Hanoin

Lisätiedot

Tietorakenteet ja algoritmit

Tietorakenteet ja algoritmit Tietorakenteet ja algoritmit Taulukon edut Taulukon haitat Taulukon haittojen välttäminen Dynaamisesti linkattu lista Linkatun listan solmun määrittelytavat Lineaarisen listan toteutus dynaamisesti linkattuna

Lisätiedot

Tietorakenteet ja algoritmit

Tietorakenteet ja algoritmit Tietorakenteet ja algoritmit Pino Pinon määritelmä Pinon sovelluksia Järjestyksen kääntäminen Palindromiprobleema Postfix-lausekkeen laskenta Infix-lausekkeen muunto postfix-lausekkeeksi Sisäkkäiset funktiokutsut

Lisätiedot

Tietorakenteet ja algoritmit

Tietorakenteet ja algoritmit Tietorakenteet ja algoritmit Muuttujat eri muisteissa Ohjelman muistialueen layout Paikallisen ja globaalin muuttujan ominaisuudet Dynaamisen muistinkäytön edut Paikallisten muuttujien dynaamisuus ADT

Lisätiedot

Tieto- ja tallennusrakenteet

Tieto- ja tallennusrakenteet Tieto- ja tallennusrakenteet Sisältö Tyyppi, abstrakti tietotyyppi, abstraktin tietotyypin toteutus Tallennusrakenteet Taulukko Linkitetty rakenne Abstraktit tietotyypit Lista (Puu) (Viimeisellä viikolla)

Lisätiedot

Algoritmit ja tietorakenteet / HL Copyright Hannu Laine

Algoritmit ja tietorakenteet / HL Copyright Hannu Laine 1 Pino ja jono Yleistä Pino Pino ja jono ovat abstrakteja tietotyyppejä, joilla on yleistä käyttöä. Pino ja jono ovat listan erikoistapauksia. Kummassakin tapauksessa erona on se, että tietotyypin operaatiofunktioita

Lisätiedot

Tietorakenteet ja algoritmit

Tietorakenteet ja algoritmit Tietorakenteet ja algoritmit Abstrakti tietotyyppi komponenttina Komponentin kriteerit Täyttääkö ADT komponentin kriteerit Millä ehdoilla kriteerit täyttyvät Yleisyyden tarkastelua funktion read_point

Lisätiedot

Rakenteiset tietotyypit Moniulotteiset taulukot

Rakenteiset tietotyypit Moniulotteiset taulukot C! Rakenteiset tietotyypit Moniulotteiset taulukot 22.2.2018 Agenda Rakenteiset tietotyypit Vilkaisu 6. kierroksen tehtäviin Moniulotteiset taulukot Esimerkki Seuraava luento to 8.3. Ilmoittautuminen ohjelmointikokeeseen

Lisätiedot

A274101 TIETORAKENTEET JA ALGORITMIT

A274101 TIETORAKENTEET JA ALGORITMIT A274101 TIETORAKENTEET JA ALGORITMIT PERUSTIETORAKENTEET LISTA, PINO, JONO, PAKKA ABSTRAKTI TIETOTYYPPI Tietotyyppi on abstrakti, kun se on määritelty (esim. matemaattisesti) ottamatta kantaa varsinaiseen

Lisätiedot

Tietorakenteet ja algoritmit Johdanto Lauri Malmi / Ari Korhonen

Tietorakenteet ja algoritmit Johdanto Lauri Malmi / Ari Korhonen Tietorakenteet ja algoritmit Johdanto Lauri Malmi / Ari 1 1. JOHDANTO 1.1 Määritelmiä 1.2 Tietorakenteen ja algoritmin valinta 1.3 Algoritmit ja tiedon määrä 1.4 Tietorakenteet ja toiminnot 1.5 Esimerkki:

Lisätiedot

Tietorakenteet ja algoritmit - syksy 2015 1

Tietorakenteet ja algoritmit - syksy 2015 1 Tietorakenteet ja algoritmit - syksy 2015 1 Tietorakenteet ja algoritmit - syksy 2015 2 Tietorakenteet ja algoritmit Johdanto Ari Korhonen Tietorakenteet ja algoritmit - syksy 2015 1. JOHDANTO 1.1 Määritelmiä

Lisätiedot

Algoritmit 1. Luento 4 Ke Timo Männikkö

Algoritmit 1. Luento 4 Ke Timo Männikkö Algoritmit 1 Luento 4 Ke 18.1.2017 Timo Männikkö Luento 4 Tietorakenteet Pino Pinon toteutus Jono Jonon toteutus Lista Listaoperaatiot Algoritmit 1 Kevät 2017 Luento 4 Ke 18.1.2017 2/29 Pino Pino, stack,

Lisätiedot

tietueet eri tyyppisiä tietoja saman muuttujan arvoiksi

tietueet eri tyyppisiä tietoja saman muuttujan arvoiksi tietueet eri tyyppisiä tietoja saman muuttujan arvoiksi ero taulukkoon taulukossa alkiot samantyyppisiä tietueessa alkiot voivat olla erityyppisiä tiedot kuitenkin yhteen kuuluvia ohjelmoinnin perusteet,

Lisätiedot

Tietueet. Tietueiden määrittely

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

Lisätiedot

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

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

Lisätiedot

Osoitin ja viittaus C++:ssa

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

Lisätiedot

TIETORAKENTEET JA ALGORITMIT

TIETORAKENTEET JA ALGORITMIT TIETORAKENTEET JA ALGORITMIT Timo Harju 1999-2004 1 typedef link List; /* Vaihtoehtoisia nimiä */ typedef link Stack; /* nodepointterille */ typedef link Queue typedef struct node Node; /* itse nodelle

Lisätiedot

815338A Ohjelmointikielten periaatteet Harjoitus 3 vastaukset

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,

Lisätiedot

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

useampi ns. avain (tai vertailuavain) esim. opiskelijaa kuvaavassa alkiossa vaikkapa opintopistemäärä tai opiskelijanumero Alkioiden avaimet Usein tietoalkioille on mielekästä määrittää yksi tai useampi ns. avain (tai vertailuavain) esim. opiskelijaa kuvaavassa alkiossa vaikkapa opintopistemäärä tai opiskelijanumero 80 op

Lisätiedot

Muita linkattuja rakenteita

Muita linkattuja rakenteita 1 Muita linkattuja rakenteita Johdanto Aikaisemmin on käsitelty listan, jonon ja pinon toteutus dynaamisesti linkattuna rakenteena. Dynaamisella linkkauksella voidaan toteuttaa mitä moninaisimpia rakenteita.

Lisätiedot

Algoritmit 2. Luento 2 To Timo Männikkö

Algoritmit 2. Luento 2 To Timo Männikkö Algoritmit 2 Luento 2 To 14.3.2019 Timo Männikkö Luento 2 Tietorakenteet Lineaarinen lista, binääripuu Prioriteettijono Kekorakenne Keko-operaatiot Keon toteutus taulukolla Algoritmit 2 Kevät 2019 Luento

Lisätiedot

Tietorakenteet ja algoritmit

Tietorakenteet ja algoritmit Tietorakenteet ja algoritmit Useampitasoiset ADT:t Käytetään esimerkkiohjelmaa Ratkaisuyritys 1 Ratkaisuyritys 2 Lopullinen ratkaisu Lopullisen ratkaisun toteutusyritys Lopullisen ratkaisun oikea toteutus

Lisätiedot

Algoritmit 1. Luento 3 Ti Timo Männikkö

Algoritmit 1. Luento 3 Ti Timo Männikkö Algoritmit 1 Luento 3 Ti 17.1.2017 Timo Männikkö Luento 3 Algoritmin analysointi Rekursio Lomituslajittelu Aikavaativuus Tietorakenteet Pino Algoritmit 1 Kevät 2017 Luento 3 Ti 17.1.2017 2/27 Algoritmien

Lisätiedot

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssien laaja oppimäärä Ohjelmoinnin peruskurssien laaja oppimäärä Keskeneräinen luento 3: Listat (mm. SICP 22.2.3) Riku Saikkonen 31. 10. 2011 Sisältö 1 Linkitetyt listat 2 Linkitetyt listat (SICP 2.1.1, 2.2.1) funktionaalinen

Lisätiedot

815338A Ohjelmointikielten periaatteet 2015-2016. Harjoitus 5 Vastaukset

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

Lisätiedot

Lyhyt kertaus osoittimista

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

Lisätiedot

Algoritmit 1. Luento 9 Ti Timo Männikkö

Algoritmit 1. Luento 9 Ti Timo Männikkö Algoritmit 1 Luento 9 Ti 7.2.2017 Timo Männikkö Luento 9 Graafit ja verkot Kaaritaulukko, bittimatriisi, pituusmatriisi Verkon lyhimmät polut Floydin menetelmä Lähtevien ja tulevien kaarien listat Forward

Lisätiedot

Algoritmit 2. Luento 2 Ke Timo Männikkö

Algoritmit 2. Luento 2 Ke Timo Männikkö Algoritmit 2 Luento 2 Ke 15.3.2017 Timo Männikkö Luento 2 Tietorakenteet Lineaarinen lista, binääripuu Prioriteettijono Kekorakenne Keko-operaatiot Keon toteutus taulukolla Algoritmit 2 Kevät 2017 Luento

Lisätiedot

Algoritmit 2. Luento 3 Ti Timo Männikkö

Algoritmit 2. Luento 3 Ti Timo Männikkö Algoritmit 2 Luento 3 Ti 20.3.2018 Timo Männikkö Luento 3 Järjestäminen eli lajittelu Kekorakenne Kekolajittelu Hajautus Yhteentörmäysten käsittely Ketjutus Algoritmit 2 Kevät 2018 Luento 3 Ti 20.3.2018

Lisätiedot

Olio-ohjelmointi Syntaksikokoelma

Olio-ohjelmointi Syntaksikokoelma C++-kielen uusia ominaisuuksia Olio-ohjelmointi Syntaksikokoelma 31.10.2008 Bool-tietotyyppi: Totuusarvo true (1), jos ehto on tosi ja false (0) jos ehto epätosi. Dynaaminen muistinvaraus: Yhden muuttuja

Lisätiedot

Algoritmi ja abstraktio

Algoritmi ja abstraktio Algoritmit ja tietorakenteet / HL 1 Algoritmi ja abstraktio Algoritmin määrittely yleisesti Algoritmi on täsmällisesti määritelty äärellinen sarja toimenpiteitä, jotka toteuttamalla saadaan aikaan jonkin

Lisätiedot

Ohjelmointi 1 Taulukot ja merkkijonot

Ohjelmointi 1 Taulukot ja merkkijonot Ohjelmointi 1 Taulukot ja merkkijonot Jussi Pohjolainen TAMK Tieto- ja viestintäteknologia Johdanto taulukkoon Jos ohjelmassa käytössä ainoastaan perinteisiä (yksinkertaisia) muuttujia, ohjelmien teko

Lisätiedot

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

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

Lisätiedot

811312A Tietorakenteet ja algoritmit II Perustietorakenteet

811312A Tietorakenteet ja algoritmit II Perustietorakenteet 811312A Tietorakenteet ja algoritmit 2017-2018 II Perustietorakenteet Sisältö 1. Johdanto 2. Pino 3. Jono 4. Lista 811312A TRA, Perustietorakenteet 2 II.1. Johdanto Tietorakenne on tapa, jolla algoritmi

Lisätiedot

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python Ohjelmoinnin perusteet Y Python T-106.1208 16.3.2009 T-106.1208 Ohjelmoinnin perusteet Y 16.3.2009 1 / 40 Kertausta: tiedostosta lukeminen Aluksi käsiteltävä tiedosto pitää avata: tiedostomuuttuja = open("teksti.txt","r")

Lisätiedot

Dynaamiset tietorakenteet

Dynaamiset tietorakenteet 1 Dynaamiset tietorakenteet Muuttujien sijaintipaikat ja muut ominaisuudet Kuten tiedetään, muuttujan määrittely tarkoittaa tilan varausta muuttujalle. Tämä tila voidaan varata eri paikoista. Periaatteessa

Lisätiedot

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssien laaja oppimäärä Ohjelmoinnin peruskurssien laaja oppimäärä Luento 2: SICP kohdat 22.2.3 Riku Saikkonen 2. 11. 2010 Sisältö 1 Linkitetyt listat 2 Listaoperaatioita 3 Listarakenteet 4 Gambit-C:n Scheme-debuggeri Linkitetyt

Lisätiedot

Loppukurssin järjestelyt C:n edistyneet piirteet

Loppukurssin järjestelyt C:n edistyneet piirteet C! Loppukurssin järjestelyt C:n edistyneet piirteet 30.3.2017 Ohjelmassa Ohjelmontitehtävän järjestelyt Tietokonetentin järjestelyt Esikääntäjä Parametrilistat Funktio-osoittimet Kunniamainintoja Kuura

Lisätiedot

ITKP102 Ohjelmointi 1 (6 op)

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

Lisätiedot

18. Abstraktit tietotyypit 18.1

18. Abstraktit tietotyypit 18.1 18. Abstraktit tietotyypit 18.1 Sisällys Johdanto abstrakteihin tietotyyppeihin. Pino ja jono. Linkitetty lista. Pino linkitetyllä listalla toteutettuna. 18.2 Johdanto Javan omat tietotyypit ovat jo tuttuja:

Lisätiedot

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

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

Lisätiedot

Perusteet. Pasi Sarolahti Aalto University School of Electrical Engineering. C-ohjelmointi Kevät Pasi Sarolahti

Perusteet. Pasi Sarolahti Aalto University School of Electrical Engineering. C-ohjelmointi Kevät Pasi Sarolahti C! Perusteet 19.1.2017 Palautteesta (1. kierros toistaiseksi) Toistaiseksi helppoa Miksi vain puolet pisteistä? Vaikeinta oli ohjelmointiympäristön asennus ja käyttö Vaikeaa eroavuudet Pythonin ja C:n

Lisätiedot

Algoritmit 1. Luento 6 Ke Timo Männikkö

Algoritmit 1. Luento 6 Ke Timo Männikkö Algoritmit 1 Luento 6 Ke 25.1.2017 Timo Männikkö Luento 6 Järjestetty lista Listan toteutus dynaamisesti Linkitetyn listan operaatiot Vaihtoehtoisia listarakenteita Puurakenteet Binääripuu Järjestetty

Lisätiedot

Algoritmit 2. Luento 3 Ti Timo Männikkö

Algoritmit 2. Luento 3 Ti Timo Männikkö Algoritmit 2 Luento 3 Ti 21.3.2017 Timo Männikkö Luento 3 Järjestäminen eli lajittelu Kekorakenne Kekolajittelu Hajautus Yhteentörmäysten käsittely Ketjutus Algoritmit 2 Kevät 2017 Luento 3 Ti 21.3.2017

Lisätiedot

Osoittimet ja taulukot

Osoittimet ja taulukot Osoittimet ja taulukot Hannu Laine Copyright Hannu Laine Osoittimet int main (void) { int a; int *p; //p on osoitinmuuttuja p = &a; *p = 10; printf( %d, *p); //tulostuu muuttujan a sisältö scanf( %d, p);

Lisätiedot

Loppukurssin järjestelyt

Loppukurssin järjestelyt C! Loppukurssin järjestelyt 29.3.2018 Ohjelmassa Yhteenvetoa palautteesta Ohjelmontitehtävän järjestelyt Tietokonetentin järjestelyt Kysyttävää / kerrattavaa 10-kierroksen asioista? Aikatauluista 10. kierroksen

Lisätiedot

Pino S on abstrakti tietotyyppi, jolla on ainakin perusmetodit:

Pino S on abstrakti tietotyyppi, jolla on ainakin perusmetodit: Pino (stack) Pino: viimeisenä sisään, ensimmäisenä ulos (LIFO, Last In, First Out) -tietorakenne kaksi perusoperaatiota: alkion lisäys pinon päälle (push), ja päällimmäisen alkion poisto (pop) Push(alkio)

Lisätiedot

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python Ohjelmoinnin perusteet Y Python T-106.1208 15.3.2010 T-106.1208 Ohjelmoinnin perusteet Y 15.3.2010 1 / 56 Tiedostoista: tietojen tallentaminen ohjelman suorituskertojen välillä Monissa sovelluksissa ohjelman

Lisätiedot

Ohjelmointi 2. Jussi Pohjolainen. TAMK» Tieto- ja viestintäteknologia , Jussi Pohjolainen TAMPEREEN AMMATTIKORKEAKOULU

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

Lisätiedot

15. Ohjelmoinnin tekniikkaa 15.1

15. Ohjelmoinnin tekniikkaa 15.1 15. Ohjelmoinnin tekniikkaa 15.1 Sisällys For-each-rakenne. Lueteltu tyyppi enum. Override-annotaatio. Geneerinen ohjelmointi. 15.2 For-each-rakenne For-rakenteen variaatio taulukoiden ja muiden kokoelmien

Lisätiedot

Ohjelmoinnin jatkokurssi, kurssikoe 28.4.2014

Ohjelmoinnin jatkokurssi, kurssikoe 28.4.2014 Ohjelmoinnin jatkokurssi, kurssikoe 28.4.2014 Kirjoita jokaiseen palauttamaasi konseptiin kurssin nimi, kokeen päivämäärä, oma nimi ja opiskelijanumero. Vastaa kaikkiin tehtäviin omille konsepteilleen.

Lisätiedot

Ohjelmassa muuttujalla on nimi ja arvo. Kääntäjä ja linkkeri varaavat muistilohkon, jonne muuttujan arvo talletetaan.

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

Lisätiedot

Sisällys. 18. Abstraktit tietotyypit. Johdanto. Johdanto

Sisällys. 18. Abstraktit tietotyypit. Johdanto. Johdanto Sisällys 18. bstraktit tietotyypit Johdanto abstrakteihin tietotyyppeihin. Pino ja jono. Linkitetty lista. Pino linkitetyllä listalla toteutettuna. 18.1 18.2 Johdanto Javan omat tietotyypit ovat jo tuttuja:

Lisätiedot

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python Ohjelmoinnin perusteet Y Python T-106.1208 11.2.2009 T-106.1208 Ohjelmoinnin perusteet Y 11.2.2009 1 / 33 Kertausta: listat Tyhjä uusi lista luodaan kirjoittamalla esimerkiksi lampotilat = [] (jolloin

Lisätiedot

Jokaisella tiedostolla on otsake (header), joka sisältää tiedostoon liittyvää hallintatietoa

Jokaisella tiedostolla on otsake (header), joka sisältää tiedostoon liittyvää hallintatietoa Tietojen tallennusrakenteet Jokaisella tiedostolla on otsake (header), joka sisältää tiedostoon liittyvää hallintatietoa tiedot tiedostoon kuuluvista lohkoista esim. taulukkona, joka voi muodostua ketjutetuista

Lisätiedot

Perusteet. Pasi Sarolahti Aalto University School of Electrical Engineering. C-ohjelmointi Kevät Pasi Sarolahti

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

Lisätiedot

15. Ohjelmoinnin tekniikkaa 15.1

15. Ohjelmoinnin tekniikkaa 15.1 15. Ohjelmoinnin tekniikkaa 15.1 Sisällys For-each-rakenne. Geneerinen ohjelmointi. Lueteltu tyyppi enum. 15.2 For-each-rakenne For-rakenteen variaatio taulukoiden ja muiden kokoelmien silmukoimiseen:

Lisätiedot

C-ohjelmoinnin peruskurssi. Pasi Sarolahti

C-ohjelmoinnin peruskurssi. Pasi Sarolahti C! C-ohjelmoinnin peruskurssi Pasi Sarolahti Mitä haluan oppia C-kurssilla? ja miksi? Tutustu lähimpään naapuriin Keskustelkaa miksi halusitte / jouduitte tulemaan kurssille 3 minuuttia è kootaan vastauksia

Lisätiedot

Taulukot. Jukka Harju, Jukka Juslin 2006 1

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

Lisätiedot

JAVA-PERUSTEET. JAVA-OHJELMOINTI 3op A274615 JAVAN PERUSTEET LYHYT KERTAUS JAVAN OMINAISUUKSISTA JAVAN OMINAISUUKSIA. Java vs. C++?

JAVA-PERUSTEET. JAVA-OHJELMOINTI 3op A274615 JAVAN PERUSTEET LYHYT KERTAUS JAVAN OMINAISUUKSISTA JAVAN OMINAISUUKSIA. Java vs. C++? JAVA-OHJELMOINTI 3op A274615 JAVAN PERUSTEET LYHYT KERTAUS Teemu Saarelainen teemu.saarelainen@kyamk.fi Lähteet: http://java.sun.com/docs/books/tutorial/index.html Vesterholm, Kyppö: Java-ohjelmointi,

Lisätiedot

12 Mallit (Templates)

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

Lisätiedot

ITKP102 Ohjelmointi 1 (6 op)

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

Lisätiedot

Algoritmit 2. Luento 4 Ke Timo Männikkö

Algoritmit 2. Luento 4 Ke Timo Männikkö Algoritmit 2 Luento 4 Ke 22.3.2017 Timo Männikkö Luento 4 Hajautus Yhteentörmäysten käsittely Avoin osoitteenmuodostus Hajautusfunktiot Puurakenteet Solmujen läpikäynti Algoritmit 2 Kevät 2017 Luento 4

Lisätiedot

3. Binääripuu, Java-toteutus

3. Binääripuu, Java-toteutus 3. Binääripuu, Java-toteutus /*-------------------------------------------------------------/ / Rajapinta SearchTree: binäärisen hakupuun käsittelyrajapinta / / Metodit: / / void insert( Comparable x );

Lisätiedot

Algoritmit 1. Luento 10 Ke Timo Männikkö

Algoritmit 1. Luento 10 Ke Timo Männikkö Algoritmit 1 Luento 10 Ke 14.2.2018 Timo Männikkö Luento 10 Algoritminen ongelmanratkaisu Suunnittelumenetelmät Raaka voima Järjestäminen eli lajittelu Kuplalajittelu Lisäyslajittelu Valintalajittelu Permutaatiot

Lisätiedot

Algoritmit. Ohjelman tekemisen hahmottamisessa käytetään

Algoritmit. Ohjelman tekemisen hahmottamisessa käytetään Ohjelmointi Ohjelmoinnissa koneelle annetaan tarkkoja käskyjä siitä, mitä koneen tulisi tehdä. Ohjelmointikieliä on olemassa useita satoja. Ohjelmoinnissa on oleellista asioiden hyvä suunnittelu etukäteen.

Lisätiedot

Harjoitus 6 (viikko 42)

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

Lisätiedot

Algoritmit 2. Luento 4 To Timo Männikkö

Algoritmit 2. Luento 4 To Timo Männikkö Algoritmit 2 Luento 4 To 21.3.2019 Timo Männikkö Luento 4 Hajautus Yhteentörmäysten käsittely Avoin osoitteenmuodostus Hajautusfunktiot Puurakenteet Solmujen läpikäynti Algoritmit 2 Kevät 2019 Luento 4

Lisätiedot

Ohjelmoinnin perusteet Y Python

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

Lisätiedot

815338A Ohjelmointikielten periaatteet Harjoitus 6 Vastaukset

815338A Ohjelmointikielten periaatteet Harjoitus 6 Vastaukset 815338A Ohjelmointikielten periaatteet 2015-2016. Harjoitus 6 Vastaukset Harjoituksen aiheena on funktionaalinen ohjelmointi Scheme- ja Haskell-kielillä. Voit suorittaa ohjelmat osoitteessa https://ideone.com/

Lisätiedot

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

Lisätiedot

Kääreluokat (oppikirjan luku 9.4) (Wrapper-classes)

Kääreluokat (oppikirjan luku 9.4) (Wrapper-classes) Kääreluokat (oppikirjan luku 9.4) (Wrapper-classes) Kääreluokista Javan alkeistietotyypit ja vastaavat kääreluokat Autoboxing Integer-luokka Double-luokka Kääreluokista Alkeistietotyyppiset muuttujat (esimerkiksi

Lisätiedot

5. HelloWorld-ohjelma 5.1

5. HelloWorld-ohjelma 5.1 5. HelloWorld-ohjelma 5.1 Sisällys Lähdekoodi. Lähdekoodin (osittainen) analyysi. Lähdekoodi tekstitiedostoon. Lähdekoodin kääntäminen tavukoodiksi. Tavukoodin suorittaminen. Virheiden korjaaminen 5.2

Lisätiedot

Pythonin alkeet Syksy 2010 Pythonin perusteet: Ohjelmointi, skriptaus ja Python

Pythonin alkeet Syksy 2010 Pythonin perusteet: Ohjelmointi, skriptaus ja Python Pythonin alkeet Syksy 2010 Pythonin perusteet: Ohjelmointi, skriptaus ja Python 8. marraskuuta 2010 Ohjelmointi Perusteet Peruskäsitteitä Olio-ohjelmointi Pythonin alkeet Esittely Esimerkkejä Muuttujat

Lisätiedot

ELM GROUP 04. Teemu Laakso Henrik Talarmo

ELM GROUP 04. Teemu Laakso Henrik Talarmo ELM GROUP 04 Teemu Laakso Henrik Talarmo 23. marraskuuta 2017 Sisältö 1 Johdanto 1 2 Ominaisuuksia 2 2.1 Muuttujat ja tietorakenteet...................... 2 2.2 Funktiot................................

Lisätiedot

Java-kielen perusteet

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

Lisätiedot

Harjoitus 6. Käytä String-luokasta vain charat- ja length-operaatioita.

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

Lisätiedot

Sekvenssi: kokoelma peräkkäisiä alkioita (lineaarinen

Sekvenssi: kokoelma peräkkäisiä alkioita (lineaarinen Sekvenssi Sekvenssi: kokoelma peräkkäisiä alkioita (lineaarinen järjestys) Timo Esim. pino, jono ja kaksiloppuinen jono ovat sekvenssin erikoistapauksia sekvenssejä, jotka kohdistavat operaationsa ensimmäiseen/viimeiseen

Lisätiedot

Algoritmit 2. Luento 7 Ti Timo Männikkö

Algoritmit 2. Luento 7 Ti Timo Männikkö Algoritmit 2 Luento 7 Ti 4.4.2017 Timo Männikkö Luento 7 Joukot Joukko-operaatioita Joukkojen esitystapoja Alkiovieraat osajoukot Toteutus puurakenteena Algoritmit 2 Kevät 2017 Luento 7 Ti 4.4.2017 2/26

Lisätiedot

D-OHJELMOINTIKIELI. AA-kerho, 33. Antti Uusimäki. Arto Savolainen

D-OHJELMOINTIKIELI. AA-kerho, 33. Antti Uusimäki. Arto Savolainen D-OHJELMOINTIKIELI AA-kerho, 33 Antti Uusimäki Arto Savolainen 2 D-OHJELMOINTIKIELI D-kielen historia alkaa vuodesta 1999, kun Walter Bright aloitti uuden ohjelmointikielen kehittämisen. Ensimmäinen versio

Lisätiedot

Ohjelmoinnin perusteet Y Python

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

Lisätiedot

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

Kaksiloppuinen jono D on abstrakti tietotyyppi, jolla on ainakin seuraavat 4 perusmetodia... PushFront(x): lisää tietoalkion x jonon eteen Viimeksi käsiteltiin pino: lisäys ja poisto lopusta jono: lisäys loppuun, poisto alusta Pinon ja jonon yleistävä tietorakenne: kaksiloppuinen jono alkion lisäys/poisto voidaan kohdistaa jonon alkuun tai

Lisätiedot

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssien laaja oppimäärä Ohjelmoinnin peruskurssien laaja oppimäärä Luento 5: Sijoituslause, SICP-oliot, tietorakenteen muuttaminen (mm. SICP 33.1.3, 3.33.3.2) Riku Saikkonen 6. 11. 2012 Sisältö 1 Muuttujan arvon muuttaminen:

Lisätiedot

Sisällys. 1. Omat operaatiot. Yleistä operaatioista. Yleistä operaatioista

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

Lisätiedot

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

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

Lisätiedot

1. Omat operaatiot 1.1

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

Lisätiedot

ITKP102 Ohjelmointi 1 (6 op)

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

Lisätiedot

815338A Ohjelmointikielten periaatteet 2014-2015. Harjoitus 7 Vastaukset

815338A Ohjelmointikielten periaatteet 2014-2015. Harjoitus 7 Vastaukset 815338A Ohjelmointikielten periaatteet 2014-2015. Harjoitus 7 Vastaukset Harjoituksen aiheena on funktionaalinen ohjelmointi Scheme- ja Haskell-kielillä. Voit suorittaa ohjelmat osoitteessa https://ideone.com/

Lisätiedot

TIE448 Kääntäjätekniikka, syksy Antti-Juhani Kaijanaho. 27. lokakuuta 2009

TIE448 Kääntäjätekniikka, syksy Antti-Juhani Kaijanaho. 27. lokakuuta 2009 TIE448 Kääntäjätekniikka, syksy 2009 Antti-Juhani Kaijanaho TIETOTEKNIIKAN LAITOS 27. lokakuuta 2009 Sisällys Sisällys Seuraava deadline Vaihe D tiistai 10.11. klo 10 välikielen generointi Kääntäjän rakenne

Lisätiedot

Imperatiivisen ohjelmoinnin peruskäsitteet. Meidän käyttämän pseudokielen lauseiden syntaksi

Imperatiivisen ohjelmoinnin peruskäsitteet. Meidän käyttämän pseudokielen lauseiden syntaksi Imperatiivisen ohjelmoinnin peruskäsitteet muuttuja muuttujissa oleva data voi olla yksinkertaista eli primitiivistä (esim. luvut ja merkit) tai rakenteista jolloin puhutaan tietorakenteista. puhuttaessa

Lisätiedot

Chapel. TIE Ryhmä 91. Joonas Eloranta Lari Valtonen

Chapel. TIE Ryhmä 91. Joonas Eloranta Lari Valtonen Chapel TIE-20306 Ryhmä 91 Joonas Eloranta Lari Valtonen Johdanto Chapel on Amerikkalaisen Cray Inc. yrityksen kehittämä avoimen lähdekoodin ohjelmointikieli. Chapel on rinnakkainen ohjelmointikieli, joka

Lisätiedot

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python Ohjelmoinnin perusteet Y Python T-106.1208 25.2.2009 T-106.1208 Ohjelmoinnin perusteet Y 25.2.2009 1 / 34 Syötteessä useita lukuja samalla rivillä Seuraavassa esimerkissä käyttäjä antaa useita lukuja samalla

Lisätiedot

1. Olio-ohjelmointi 1.1

1. Olio-ohjelmointi 1.1 1. Olio-ohjelmointi 1.1 Sisällys Olio-ohjelmointi on eräs ohjelmointiparadigma. Olio-ohjelmoinnin muotoja. Ohjelmiston analyysi ja suunnittelu. Olioparadigman etuja ja kritiikkiä. 1.2 Ohjelmointiparadigmoja

Lisätiedot

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

1.1 Pino (stack) Koodiluonnos. Graafinen esitys ... 1. Tietorakenteet Tietorakenteet organisoivat samankaltaisten olioiden muodostaman tietojoukon. Tämä järjestys voidaan saada aikaan monin tavoin, esim. Keräämällä oliot taulukkoon. Liittämällä olioihin

Lisätiedot

Ohjelmoinnin perusteet Y Python

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

Lisätiedot