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 käytöstä Operaattorien vahvuuskaavio Lisäesimerkki abstraktiosta (Neliöjuuren laskenta) 1
Kurssin sisältö pääkohdittain Abstraktio Abstraktit tietotyypit (ADT) ADT:t yleiseen käyttöön pino jono lista puut muita tietorakenteita Työkaluja tietorakenteiden ja algoritmien toteutukseen dynaamisen muistin käyttö rekursio oliot Funktio-osoittimet 2
Tarvittavat pohjatiedot C-kielen taito Erityisesti Funktiot ja parametrit Osoittimet Tietueet 3
Avainsanat Abstraktio Yleisyys Uudelleenkäytettävyys Ohjelmistokomponentti 4
Abstraktio yleensä Abstraktio tarkoittaa ylemmän tason käsitteiden käyttöä. Ihminen tarvitsee abstraktiota selvitäkseen monimutkaisista asioista. Abstraktion avulla asioiden monimutkaisuuden ei anneta häiritä ajattelua. Monimutkaisista asioista voidaan muodostaa useampitasoinen hierarkiarakenne. Voidaan käyttää myös ohjelmoinnissa. Päätehtävä Osatehtävä1 Osatehtävä2 Osatehtävä3 Osateht1.1 Osateht1.2 Osateht3.1 Osateht3.2 5
Esimerkkiohjelman tehtäväkuvaus Suunnistajan ohjelman tehtäväkuvaus Kirjoita ohjelma, jolle syötetään lähtöpisteen ja tavoitepisteen koordinaatit. Ohjelma laskee ja tulostaa kuljettavan matkan lähtöpisteestä tavoitepisteeseen. 6
Ensimmäinen ratkaisuyritys Käydään läpi tunnilla. Ei käytetä abstraktiota. (Sivu 15) http://users.metropolia.fi/~pasitr/2015-2016/ti00ac30-3006/luento/01/ratkaisut/tietorak_1_s15.pdf http://users.metropolia.fi/~pasitr/2015-2016/ti00ac30-3006/luento/01/ratkaisut/tietorak_1_s15.cpp Nähdään kuinka asia tehdään. Vaikea nähdä mitä oikeastaan tehdään ja mitä asiakokonaisuuksia käsitellään 7
Toinen ratkaisuyritys Käydään läpi tunnilla. Käytetään toimintojen abstraktiota. (Sivu 16) http://users.metropolia.fi/~pasitr/2015-2016/ti00ac30-3006/luento/01/ratkaisut/tietorak_1_s16.pdf http://users.metropolia.fi/~pasitr/2015-2016/ti00ac30-3006/luento/01/ratkaisut/tietorak_1_s16.cpp Funktiot Parempi kuin ensimmäinen yritys. Nähdään helposti mitä tehdään. Käsiteltävän datan muodostamat asiakokonaisuudet vielä hankala havaita. 8
Lopullinen ratkaisu Käydään läpi tunnilla. Käytetään toimintojen abstraktiota ja tietojen abstraktiota. (Sivu 17) http://users.metropolia.fi/~pasitr/2015-2016/ti00ac30-3006/luento/01/ratkaisut/tietorak_1_s17.pdf http://users.metropolia.fi/~pasitr/2015-2016/ti00ac30-3006/luento/01/ratkaisut/tietorak_1_s17.cpp Tietueet Nähdään helposti mitä tehdään ja mitä asiakokonaisuuksia käsitellään. Huomautus. Verkossa on täydellinen esimerkki (Moniste1, Esimerkki 1) 9
Abstrakti tietotyyppi Olemme itse asiassa kehittäneet abstraktin tietotyypin piste (tai point). Saadaan yhdistämällä tietojen ja toimintojen abstr. Määritelmä. Abstrakti tietotyyppi on tietotyyppi, joka sisältää kaikki jonkin asian kuvaamiseksi tarvittavat tietokentät ja tämän tietotyypin käsittelyyn tarvittavat funktiot ns. operaatiofunktiot. Pisteen tapauksessa siis abstrakti tietotyyppi on tyyppi Tpoint ja funktiot void read_point(tpoint *p, char *prompt); void print_point(tpoint p); float distance(tpoint p1, Tpoint p2); jne 10
Lopputulos Lopputulos: Ihmisen luonnostaan käyttämää abstraktiomallia voidaan käyttää ohjelmoinnissa sellaisenaan. Näin ohjelmista saadaan helposti ymmärrettäviä ja yksinkertaisia. Näin on saatu ratkaistua probleema, joka seuraa siitä, että ihminen kehittää ongelman ratkaisun kuvauksen, tietokone seuraa näitä ohjeita. Nyt ohjelma vastaa ihmisen ajattelumallia ja on yhtä aikaa tietokoneen ymmärrettävissä 11
Välittömät hyödyt Jo pikku ohjelmointitehtävien suorittamisessa saatuja etuja tästä lähestymistavasta: Ohjelmasta tulee selkeä, kun nähdään mitä tehdään (eikä vain kuinka). Ohjelma voidaan kehittää step-by-step menetelmällä ja osat voidaan jopa testata valmiiksi erikseen. Ohjelmiston ylätason toteutus tulee erotettua alatason ratkaisuista. Alatason komponentti voidaan vaihtaa muuttamatta ylätasolla mitään. Komponentti soveltuu muunkinlaisten sovellusten rakentamiseen kuin suunnistajan ohjelma. Kahteen jälkimmäiseen ja muihin etuihin tutustutaan myöhemmin. 12
ADT-ajattelu sopii kaikkiin sovelluksiin Esimerkkejä: kompleksilukujen käsittelysovellus matriisien käsittelysovellus urheilukilpailujen tulospalvelujärjestelmä mittausten analyysiohjela henkilöryhmien hallinta jne Tietotyyppi: Thloryhma Operaatiofunktiot: lue_hlo_ryhma tulosta_hlo_ryhma jne Tietotyyppi: Turheilulaji Operaatiofunktiot: ilmoittautuminen numeroiden_arvonta ajanotto_ja_mittaus tuloslistan_muodostaminen jne Tietotyyppi: Tmittaukset (tai Tmittaussarja) Operaatiofunktiot: lue_mittaukset tulosta_mittausket laske_ka jne 13
Operator precedence Operator Associativity () [] ->. Left to right! ~ + - ++ -- & * (type) Right to left (unary) * / % Right to left + - Left to right << >> Left to right < <= > >= Left to right ==!= Left to right & Left to right (bit-wise and) ^ Left to right (bit-wise xor) Left to right (bit-wise or) && Left to right (logical and) Left to right (logical or)? : (condition) Right to left = *= /= %= += -= &= ^= = <<= >>= Right to left, Left to right 14
Ensimmäinen ratkaisuyritys (koko ohjelma) int main(void) { float x1, y1, x2, y2, et, dx, dy; printf( Anna lähtöpiste : ); scanf( %f%f, &x1, &y1); printf( Anna tavoitepiste : ); scanf( %f%f, &x2, &y2); dx = x2 x1; dy = y2 y1; et = sqrt(dx*dx + dy*dy); printf( Matka on %f\n, et); return 0; } 15
Toinen ratkaisuyritys (koko ohjelma) int main(void) { float x1, y1, x2, y2, et; lue_piste(&x1, &y1, Anna lähtöpiste ); lue_piste(&x2, &y2, Anna tavoitepiste ); et = laske_matka(x1, y1, x2, y2); tulosta_matka(et); return 0; } 16
Lopullinen ratkaisu (koko ohjelma) int main(void) { Tpiste p1, p2; float suunta, et; lue_piste(&p1, Anna lähtöpiste ); lue_piste(&p2, Anna tavoitepiste ); et = laske_matka(p1, p2); tulosta_matka(et); return 0; } 17
Lisäesimerkki (Newtonin menetelmä) 1/3 Ohjelma laskee sille syötetyn luvun neliöjuuren. Tämä on esimerkki huonosta ohjelmointityylistä. Ohjelmasta voidaan lukea kuinka asiat on tehty. Tästä ei voida lukea sitä mitä tai miksi asioita tehdään. int main (void) { } float a, b; printf(\nenter a radicand ); scanf( %f, &a); printf( \nenter the first approximation); scanf( %f, &b); while (fabs(a-b*b) >=EPS) { b = (a/b + b) / 2.0; } printf( \nsquare root is %f, b) ; return 0; Ei ole käytetty abstraktiota 18
Lisäesimerkki (Newtonin menetelmä) 2/3 Tämä on esimerkki paremmasta ohjelmointityylistä. Pääohjelma on melko luettava ja siitä nähdään mitä ja miksi tehdään. Se kuinka asiat tehdään on piilotettu häiritsemästä ylemmän tason ajattelua. int main (void) { } float radicand, approximation; int good_enough; radicand = read("enter radicand :"); approximation = read("enter 1st approximation :"); good_enough = test(approximation, radicand); while (!good_enough) { approximation = improve(approximation, radicand); good_enough = test(approximation,radicand); } write(approximation, "The calculated square root is :" ); return 0; On käytetty abstraktiota 19
Lisäesimerkki (Newtonin menetelmä) 3/3 Alla on Newtonin menetelmän matemaattinen kuvaus: x i+1 = (a / x i + x i ) / 2, i = 0, 1, 2, 3,... x i 2 - a < 20