Rutiinin muodostaminen. 2. Rutiinin muodostaminen. specification) Määrittely (specification( Määrittelyn osapuolet. Hyvän ohjelman tunnusmerkit

Samankaltaiset tiedostot
Sopimuspohjainen olio-ohjelmointi

ITKP102 Ohjelmointi 1 (6 op)

Java-kielen perusteet

Informaatioteknologian laitos Olio-ohjelmoinnin perusteet / Salo

17. Javan omat luokat 17.1

ITKP102 Ohjelmointi 1 (6 op)

Tietorakenteet. JAVA-OHJELMOINTI Osa 5: Tietorakenteita. Sisällys. Merkkijonot (String) Luokka String. Metodeja (public)

17. Javan omat luokat 17.1

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

Metodien tekeminen Javalla

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

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

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

Sisältö. 22. Taulukot. Yleistä. Yleistä

1. Omat operaatiot 1.1

Sopimuspohjainen olio-ohjelmointi Java-kielellä

ITKP102 Ohjelmointi 1 (6 op)

Java-kielen perusteet

Rajapinta (interface)

Listarakenne (ArrayList-luokka)

Taulukot. Jukka Harju, Jukka Juslin

812341A Olio-ohjelmointi Peruskäsitteet jatkoa

Harjoitus Olkoon olemassa luokat Lintu ja Pelikaani seuraavasti:

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

20. Javan omat luokat 20.1

Sisällys. 20. Javan omat luokat. Java API. Pakkaukset. java\lang

Kompositio. Mikä komposition on? Kompositio vs. yhteyssuhde Kompositio Javalla Konstruktorit set-ja get-metodit tostring-metodi Pääohjelma

Sisällys. Yleistä attribuuteista. Näkyvyys luokan sisällä. Tiedonkätkentä. Aksessorit. 4.2

Taulukot. Taulukon käsittely. Tämän osan sisältö. Esimerkki. Taulukon esittely ja luonti. Taulukon alustaminen. Taulukon koko

Luokka Murtoluku uudelleen. Kirjoitetaan luokka Murtoluku uudelleen niin, että murtolukujen sieventäminen on mahdollista.

7. Näytölle tulostaminen 7.1

Olio-ohjelmointi Javalla

ITKP102 Ohjelmointi 1 (6 op), arvosteluraportti

Ohjelmointi 1 Taulukot ja merkkijonot

Harjoitus 4 (viikko 47)

2. Lisää Java-ohjelmoinnin alkeita. Muuttuja ja viittausmuuttuja (1/4) Muuttuja ja viittausmuuttuja (2/4)

Metodit. Metodien määrittely. Metodin parametrit ja paluuarvo. Metodien suorittaminen eli kutsuminen. Metodien kuormittaminen

Ohjelmointitaito (ict1td002, 12 op) Kevät Java-ohjelmoinnin alkeita. Tietokoneohjelma. Raine Kauppinen

Ohjelmointi 1 / 2009 syksy Tentti / 18.12

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

16. Javan omat luokat 16.1

Ohjelmoinnin jatkokurssi, kurssikoe

Mikä yhteyssuhde on?

Sisällys. Yleistä attribuuteista. Näkyvyys luokan sisällä ja ulkopuolelta. Attribuuttien arvojen käsittely aksessoreilla. 4.2

Sisällys. JAVA-OHJELMOINTI Osa 7: Abstrakti luokka ja rajapinta. Abstraktin luokan idea. Abstrakti luokka ja metodi. Esimerkki

14. Poikkeukset 14.1

14. Poikkeukset 14.1

Sisällys. 14. Poikkeukset. Johdanto. Johdanto

Pino S on abstrakti tietotyyppi, jolla on ainakin perusmetodit:

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Taulukot & Periytyminen

Ohjelmointi 2 / 2010 Välikoe / 26.3

12. Monimuotoisuus 12.1

Olion elinikä. Olion luominen. Olion tuhoutuminen. Olion tuhoutuminen. Kissa rontti = null; rontti = new Kissa();

Java-kielen perusteet

// Tulostetaan double-tyyppiseen muuttujaan "hinta" tallennettu // kertalipun hinta ja vaihdetaan riviä. System.out.printf("%.1f euros.

7. Oliot ja viitteet 7.1

Lyhyt kertaus osoittimista

Algoritmit 2. Luento 7 Ti Timo Männikkö

ITKP102 Ohjelmointi 1 (6 op)

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

Ohjelmointi 2 / 2011 Välikoe / 25.3

Javan perusteita. Janne Käki

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op. Tietorakenneluokkia 2: HashMap, TreeMap

// Tulostetaan double-tyyppiseen muuttujaan "hinta" tallennettu // kertalipun hinta ja vaihdetaan riviä. System.out.printf("%.1f euros.

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

Java kahdessa tunnissa. Jyry Suvilehto

Metodit Arvotyyppi. Metodit Arvotyyppi. Metodit Parametrit. Metodit Parametrit. Metodit Kuormittaminen. Metodit Kuormittaminen. Javan perusteet

18. Abstraktit tietotyypit 18.1

Vertailulauseet. Ehtolausekkeet. Vertailulauseet. Vertailulauseet. if-lauseke. if-lauseke. Javan perusteet 2004

Harjoitus 5 (viikko 48)

1 Tehtävän kuvaus ja analysointi

Sisällys. 12. Näppäimistöltä lukeminen. Yleistä. Yleistä

Ohjelmointitaito (ict1td002, 12 op) Kevät Java-ohjelmoinnin alkeita. Tietokoneohjelma. Raine Kauppinen

Javan perusteet. Ohjelman tehtävät: tietojen syöttö, lukeminen prosessointi, halutun informaation tulostaminen tulostus tiedon varastointi

Sisällys. 14. Poikkeukset. Johdanto. Johdanto

1. Mitä tehdään ensiksi?

9. Periytyminen Javassa 9.1

ITKP102 Ohjelmointi 1, syksy 2007

19. Olio-ohjelmointia Javalla 19.1

ITKP102 Ohjelmointi 1, syksy 2007

Sisällys. 19. Olio-ohjelmointia Javalla. Yleistä. Olioiden esittely ja alustus

Olio-ohjelmointi 2. välikoe HYV5SN

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Rajapinnat ja sisäluokat

Ohjelmointi 1 C#, kevät 2013, 2. tentti

Ohjelmointi 2 / 2008 Välikoe / Pöytätestaa seuraava ohjelma.

Ohjelmointiharjoituksia Arduino-ympäristössä

Osio2: Taulukot Jukka Juslin

Harjoitus 2 (viikko 45)

Java-API, rajapinnat, poikkeukset, UML,...

15. Ohjelmoinnin tekniikkaa 15.1

13. Loogiset operaatiot 13.1

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

8. Näppäimistöltä lukeminen 8.1

12. Näppäimistöltä lukeminen 12.1

YHTEYSSUHDE (assosiation)

15. Ohjelmoinnin tekniikkaa 15.1

Luokan sisällä on lista

Ohjelmoinnin perusteet Y Python

Sisällys. 7. Oliot ja viitteet. Olion luominen. Olio Java-kielessä

Ohjelmassa henkilön etunimi ja sukunimi luetaan kahteen muuttujaan seuraavasti:

Transkriptio:

2. Rutiinin muodostaminen Rutiinin muodostaminen roolit 1. Rutiinin määrittely 2. Sopimuspohjainen ohjelmointi 3. Määrittelyjen kirjoittaminen 4. Erikoistilanteiden hallinta analysointi luokat rutiinit rajaaminen yleisyys helppokäyttöisyys koodi Hyvän ohjelman tunnusmerkit Määrittely (specification( specification) Oikeellisuus Ymmärrettävyys Vankkuus Ohjelmaan kirjoitettu teksti Kuvaa jonkin ohjelmistokomponentin toimintaa ja merkitystä abstraktisti ja kompaktisti Määrittelyn osapuolet Tekijä henkilöt Ohjelma aika Ylläpitäjä Rutiinin määrittely Signatuuri nimi parametrit paluuarvo poikkeukset Toiminnan kuvaus sanallinen kuvaus alkuehto loppuehto (c) 2006-2008 Jouni Smed 1

Esimerkki: Neliöjuurirutiinin määrittely * Palauttaa x:n neliöjuuren. * @.pre x >= 0 * @.post Math.abs(RESULT * RESULT - x) * < 1.0e-10.0 & RESULT >= 0.0 public static double neliöjuuri(double x) Rutiinimäärittelyn merkitys 1(2) Kommunikointi rutiinin toteuttajan ja käyttäjän välillä toteutus on vapaasti muunneltavissa kutsuja ei tarvitse salattua tietoa Suunnittelu ja dokumentointi suunnittelu mahdollista pelkkiä rutiinimäärittelyjä käyttäen sama määrittelyformalismi koko projektissa Odotukset mihin toteuttaja sitoutuu? johtaa yleiskäyttöisyyteen Rutiinimäärittelyn merkitys 2(2) Toimivuus vastaako toteutus määrittelyä? Virheiden paikallistaminen määrittely antaa rajat korjausta varten iäkkäämpi koodi usein uutta luotettavampaa Luokkakokonaisuus piirteiden valinta ja roolit Periytymismekanismin oikea käyttö Sopimuspohjainen ohjelmointi Sopimuspohjainen ohjelmointi/suunnittelu = engl. programing/design by contract Määrittely muodostaa sopimuksen rutiinin (luokan tms.) asiakkaan ja toteuttajan välille Sopimuspohjaisuus Asiakas Toteuttaja Velvoitteet Alkuehdon on oltava voimassa ennen kutsua Toteutuksen on saatettava loppuehto voimaan Hyödyt Kutsun jälkeen loppuehto on voimassa Alkuehdon karsimia tilanteita ei tarvitse käsitellä Alkuehto Rutiini voi olla osittainen: alkuehdossa rajoituksia totaalinen: alkuehdossa ei rajoituksia Rajoitustyyppejä: argumenttien rajoittaminen operaation käytön rajoittaminen toteutukseen liittyvät ehdot Kutsujan on pystyttävä tarkistamaan asetetut rajoitukset! (c) 2006-2008 Jouni Smed 2

Loppuehto Kuvaus siitä miten rutiini käyttäytyy laillisten kutsun yhteydessä Loppuehdon väittämät: rutiinin toiminnan vaikutukset asiakkaalle olion sisäiseen esitysmuotoon liittyvät ehdot Tunnisteisiin, joita ei ole mainittu loppuehdossa, ei ole tehty muutoksia Esimerkki: Neliöjuurirutiinin määrittely * Palauttaa x:n neliöjuuren. * @.pre x >= 0 * @.post Math.abs(RESULT * RESULT - x) * < 1.0e-10.0 & RESULT >= 0.0 public static double neliöjuuri(double x) Neliöjuurifunktion toteutus Esimerkki: Tehtävä 2-7 (a) //-- Alkuehto assert x >= 0.0 : "Alkuehtorikkomus"; //-- Totetus double tulos; // Lasketaan neliöjuuren arvo muuttujaan tulos... //-- Loppuehto assert tulos >= 0.0 : "Loppuehtorikkomus"; assert Math.abs(tulos * tulos - x) < 1.0e-10.0 : "Loppuehtorikkomus"; //-- Paluuarvo return tulos; } Rutiini palauttaa tiedon, onko parametrina annettu kokonaisluku laillinen postinumero (ts. väliltä 00000 99999). Ratkaisuesimerkkejä * @.pre true * @.post RESULT == (0 <= n <= 99999) boolean onpostinumero(int int n) * @.pre n!= null * @.post RESULT == (n.length() == 5) * & FORALL(c : n; Character.isDigit(c)) boolean onpostinumero(string n) Esimerkki: Tehtävä 2-7 (b) Rutiini tarkistaa onko annetussa kokonaislukutaulukossa yhdelläkään alkiolla duplikaattia (ts. rutiini palauttaa true jos ja vain jos kukin luku esiintyy taulukossa vain kerran). (c) 2006-2008 Jouni Smed 3

Ratkaisuesimerkki Esimerkki: Tehtävä 2-7 (c) * @.pre t!= null * @.post RESULT == * FORALL(i : 0 <= i < t.length - 1; *!EXISTS(j : i < j < t.length; * t[i] == t[j])) boolean onduplikaatiton(int int[] t) Rutiini palauttaa annetun double-tyyppisiä alkioita sisältävän taulukon pienimmän alkion indeksin. Mikäli pienimmällä alkiolla on duplikaatteja, rutiini palauttaa niistä indeksiltään pienimmän alkion. Ratkaisuesimerkki * @.pre t!= null && t.length >= 1 * @.post * FORALL(i : 0 <= i < RESULT; t[result] < t[i]) & * FORALL(i : RESULT <= i < t.length; t[result] <= t[i]) int miniminindeksi(double double[] t) Onko tästä kaikesta nyt sitten mitään iloa? Tutkitaanpa seuraavien Java- rutiinien määrittelyjä String.charAt(.charAt(int) Arrays.fill(int[], int, int, int) Arrays.binarySearch(int[], int, int, int) String.charAt() * @.pre 0 <= index < length() * @.post RESULT == * (positiossa index * oleva merkki) public char charat(int index) Arrays.fill() * @.pre a!= null && (0 <= fromindex * <= toindex <= a.length) * @.post FORALL(i : fromindex <= i * < toindex; a[i] = val) public static void fill(int int[] a, int fromindex, int toindex, int val) (c) 2006-2008 Jouni Smed 4

Arrays.binarySearch() * @.pre a!= null && (a on lajiteltu ei-laskevaan * järjestykseen) * @.post * EXISTS(i : 0 <= i < a.length; a[i] == key)? * a[result] == key : * (FORALL(i : 0 <= i < -(RESULT + 1); * a[i] < key) & * FORALL(i : -(RESULT + 1) <= i < a.length; * key < a[i])) public static int binarysearch(int int[] a, int fromindex, int toindex, int key) (c) 2006-2008 Jouni Smed 5