1. OPINTOJAKSON TAVOITTEET, SISÄLTÖ JA ESITIEDOT MATERIAALIT JA OHJELMISTOT... 5

Koko: px
Aloita esitys sivulta:

Download "1. OPINTOJAKSON TAVOITTEET, SISÄLTÖ JA ESITIEDOT... 4 2. MATERIAALIT JA OHJELMISTOT... 5"

Transkriptio

1 1. OPINTOJAKSON TAVOITTEET, SISÄLTÖ JA ESITIEDOT MATERIAALIT JA OHJELMISTOT SUORITUSTAVAT Tentistä Tietokonetyöstä OPISKELUN ETENEMINEN... 6 VIIKKO Luokka Object. Kirjastoluokkia osa I: String, StringBuffer, StringBuilder, StringTokenizer, DecimalFormat, Math ja Random. Pakkaukset ja import-lause Alustus 8 equals-metodi olioiden yhteydessä 14 Luokat StringBuffer ja StringBuilder 15 Luokka StringTokenizer ja luokan String metodi split 18 Tulostuksen muotoilu ja DecimalFormat 20 Merkkijonon ja tekstitiedoston läpikäynti käyttäen luokkaa Scanner 20 Random 22 Luokakirjastojen toteutukset 23 Harjoitustehtävät VIIKKO Kirjastoluokkia osa II: Integer (ja muut kuori- eli kääreluokat). Dynaamiset geneeriset listat: luokat Vector, ArrayList ja LinkedList. Automaattiset tyypinmuunnokset kuoriluokkien ja vastaavien perustyyppien välillä. for-each rakenne ja iteraattorit. Luokat Arrays ja Collections Integer 25 Tyypinmuunnokset sekä autoboxing ja unboxing 27 Johdanto dynaamisiin listoihin (oliokokoelmat) ja geneerisyyteen 29 Java 5.0:sta lähtien: Geneeriset luokat Vector <E>, ArrayList<E> ja LinkedList<E> 31 Esimerkki: Lisäyslajittelu 37 Taulukoiden ja listojen läpikäynti käyttäen ns. for-each lausetta (Java 5.0:sta lähtien) ja iteraattoria 39 Luokat Arrays ja Collections staattisten ja dynaamisten listojen käsittelyyn (mm. lajittelu käyttäen kirjastometodia sort) 41 Harjoitustehtävät VIIKKO Olio-ohjelmoinnin peruskäsitteet: oliot ja luokat, olioiden tietosisältö ja käyttäytyminen, luokan määrittely, olioiden luonti ja käsittely Alustus 43 Johdatus: tietueen käsitteestä luokan käsitteeseen käyttäen esimerkkinä henkilötietoja 44 Luokan Henkilo oikeaoppinen määrittely sekä this ja tostring 50 Harjoitustehtävät

2 VIIKKO Oman tietotyypin määrittely luokan avulla: Olio-ohjelmointiin liittyvät käsitteet ja niiden ilmaiseminen Javassa Alustus 55 Tietotyypin määrittely 56 Luokan tietokentät: esiintymämuuttuja / luokkamuuttuja tai -vakio 57 Luokassa määritellyt metodit: esiintymämetodi / luokkametodi 57 Näkyvyys 58 Kuinka luokan tietokenttiin ja metodeihin voidaan viitata 58 Käytännön ohjeita: main-metodin sisältävä luokka vs. muut luokat 60 Yhteenveto sopivista tietotyypin tietokenttien ja metodien määreistä, kun noudatamme kapselointiperiaatetta 60 Harjoitustehtävät VIIKKO Olio-ohjelmien suunnittelu, oliot koostuvat olioista, sisäluokka Olio-ohjelmoinnin idea lyhyesti 63 Tunnuksien nimeämiskäytäntö 63 Miksi tietosisältö pitäisi kätkeä? 64 Olioiden koostuminen olioista 64 Sisäluokka 65 Harjoitustehtävät LUENTOPÄIVÄ Joitakin Javan valmiita luokkia Olio-ohjelmoinnin periaatteita Kokoava esimerkki Luokka Tili 72 Luokka Pankki ja sen testaus 75 Perintä: Luokan Tili aliluokka ShekkiTili, staattinen ja dynaaminen tyyppi 82 Tehtäviä VIIKKO Periytyminen ja luokkahierarkia, abstrakti metodi ja luokka, rajapintaluokka ja Comparable<T>. Tietokonetyön valinta Alustus periytymisestä ja luokkahierarkiasta 90 Luokat Employee ja Boss 91 Polymorfismi ja dynaaminen sidonta 93 Abstrakti luokka ja metodi (abstract class and method) 94 Rajapintaluokka (Interface class) 97 Rajapintaluokka Comparable<T> 99 Harjoitustehtävät Tietokonetyön valinta

3 VIIKKO Poikkeukset. Määre final. Graafiset käyttöliittymät (GUI). Tietokonetyö Alustus 104 Poikkeukset Javassa 105 Javan poikkeusluokat 106 try catch lause 107 Esimerkki poikkeusten käsittelystä: metodi lueint luokkaa Scanner käyttäen 108 Määre final: sen merkitys eri tilanteissa 109 Harjoitustehtävät VIIKKO Tietokonetyö, hajautustaulu: luokka HashMap<K,V> Tietokonetyö 111 Luokka HashMap 111 Harjoitustehtävät Liite 1 ja 2. Kurssisivuilla. 3

4 1. OPINTOJAKSON TAVOITTEET, SISÄLTÖ JA ESITIEDOT Opintojaksolla laajennetaan opintojaksolla Algoritmien ja ohjelmoinnin peruskurssi (AOP) annettua kuvaa ohjelmoinnista tutustumalla olio-ohjelmointiin. Kurssin jälkeen opiskelija tuntee olio-ohjelmointikielten käsitteet ja osaa käyttää Javan luokkakirjastoa (esim. merkkijonojen käsittelyyn ja dynaamisten listojen suunnitellut luokat). Opiskelija osaa tehdä olio-ohjelmia, määritellä luokkien avulla omia tietotyyppejä sekä hyödyntää myös perintää ja tuntee poikkeusten käsittelyn perusteet. Keskeisin sisältö on kuitenkin omien tietotyyppien määrittelemisessä. Kurssilla opetetaan myös perintä ja siihen liittyvät käsitteet sekä johdannonomaisesti poikkeukset. Tavoitteena on antaa olio-ohjelmoinnista sellainen kuva, jonka perusteella muiden (olio-)ohjelmointikielten opiskelu sujuu muitta mutkitta. Olio-ohjelmoinnin opiskelussa voidaan edetä joko menemällä heti luokkien ja olioiden maailmaan tai unohtamalla aluksi oliot tarkastelemalla ensin ns. perinteellistä ohjelmointia, jossa käsitellään vain primitiivistä tietoa (ns. perustyypit, esim. luvut). Tällä opintokokonaisuudella noudatetaan jälkimmäistä lähestymistapaa, koska tällöin ei tarvitse haukata koko kakkua yhdellä kertaa. Nimittäin olio-ohjelmoinnissa tarvitaan myös kaikki perinteellisen ohjelmoinnin välineet: algoritmeja ohjataan peräkkäis-, valinta- ja toistorakenteilla tallettamalla arvoja muistipaikkoihin, joita käsiteltiin jaksolla AOP. Esimerkiksi tehtävissä laske syötettyjen lukujen keskiarvo ja tutki onko annettu luku alkuluku ei ole juurikaan sijaa olioille. Tämän jälkeen huomaamme, että maailma ei koostu pelkästään luvuista ja merkeistä, vaan että asioiden mallinnus tapahtuu paljon korkeammalla tasolla. Tarvitsemme siis keinon, millä voimme esittää, mallintaa (abstrahointi) ja käsitellä suurempia tietoja yhtenä kokonaisuutena. Tähän tarpeeseen vastaa abstraktin tietotyypin (ADT) käsite, joka olio-ohjelmoinnissa toteutetaan luokkana. Näin ollen tällä opintojaksolla Olioohjelmoinnin perusteet (OOP) siirrymme motivoidusti olio-ohjelmoinnin peruskäsitteisiin: luokka ja olio. Esitiedot: Tämän opintojakson esitietoina vaaditaan opintojakson Algoritmien ja ohjelmoinnin peruskurssi (AOP) tiedot. Jakso OOP jatkaa siitä, mihin jaksolla AOP jäätiin. Tällä jaksolla oletetaan, että Javan peruskontrollirakenteet, perustyypit, oliotyypit, taulukot, luokan String ja Random käsittely hallitaan, joskin tällä jaksolla syvennetään luokkien String ja Random ominaisuuksia. 4

5 2. MATERIAALIT JA OHJELMISTOT Opintojaksolla ei ole käytössä opintomonistetta, vaan päämateriaali on tämä opiskeluopas ja sen lisäksi harjoitustehtävät ja niiden malliratkaisut, jotka ovat usein laajoja. jakson Algoritmien ja ohjelmoinnin peruskurssin opintomonisteen tiettyjä osia käsitellään tällä kurssilla uudestaan perusteellisemmin. Liite 1, joka on kurssisivuilla (se on ote Ville Leppäsen opintomonisteesta Ohjelmointi I). Liite 1 sisältää viittauksia kohtiin, joita liitteessä ei ole, mutta nämä eivät ole oleellisia tämän kurssin kannalta. Liite 2, joka on kurssisivuilla (se on ote kirjasta Simo Silander, Vesa Ollikainen, Juha Peltomäki: Java, ISBN: Julkaistu: 03/2010, Sivuja: 498 (ks. kurssisivut). Kurssisivuille tulee kurssin edetessä lisämateriaalia, joista osa vaaditaan myös tentissä. Vaadittavat osat on merkitty selvästi kurssisivuilla. Kurssisivuilla on useita linkkejä, joita voi käyttää opiskelun apuna. Java-ohjelmointiympäristönä olisi hyvä käyttää JCreatoria tai jotain muuta kehittyneempää ympäristöä, esim. NetBeans. Esim. JCreatorin avulla voidaan havainnollistaa luokan rakennetta käyttäen Class View näkymää: tietokentät ja metodit näkyvät omassa ikkunassaan eri värisinä. Myös NetBeans (Members view) ja Eclipse näyttävät nämä ja vieläpä tarkemmin. Myös DrJavaa voi käyttää, joskin siinä ei ole edellä mainittuja ominaisuuksia. 3. SUORITUSTAVAT Opintojaksoon kuuluu tentti ja yksi tietokoneella tehtävä tietokonetyö. 3.1 Tentistä Tenttioikeuden saa jos on tehnyt hyväksytysti vähintään 30% tehtävistä. Tentin läpäisemiseen vaaditaan n. 50 % maksimipistemäärästä. Tentissä on myös ns. essee-kysymyksiä, jossa ei ole tärkeintä pelkästään muistaa kaikki aiheeseen liittyvät asiat, vaan ymmärtää ne, ja esittää ne jäsentyneesti. Essee-kysymyksessä pyydetään pääasiassa selittämään tiettyjä käsitteitä/asioita tai Javan tiettyjen tärkeiden avainsanojen merkitys. Kysytyt ohjelmointitehtävät ovat hyvin 5

6 paljon tässä opiskeluoppaassa esitettyjen esimerkkien ja tehtävien kaltaisia. Tenttiin kannattaa valmistautua lukemalla erityisesti oppimateriaalin esimerkit ja harjoitustehtävät. Huomaa, että ohjelmien teko tentissä melko lyhyessä ajassa ei kerta kaikkiaan onnistu, ellei omaa minkäänlaista ohjelmointirutiinia. Sen vuoksi tenttiin valmistautuessa kannattaa yrittää ratkaista harjoitustehtäviä uudestaan katsomatta valmista ratkaisua, testata niitä koneella ja tutkia tarkasti niiden toimintaa eikä pelkästään lukea valmiita ohjelmia. Valmiin ohjelman ymmärtäminen ei vielä takaa sitä, että pystyisi itse tuottamaan vastaavan toimivan ohjelman; ei, kaukana siitä. Ohjelmien toiminnassa ei ole mitään selittämätöntä, vaan jokaisen lauseen suoritus muuttaa ohjelman tilaa (eli ohjelmien muuttujien arvoja) lauseen toiminnan määräämällä tavalla edeten ohjelman ensimmäisestä lauseesta aina viimeiseen lauseeseen saakka. Yritä aina ymmärtää jokaisen lauseen suorituksen aiheuttama muutos ohjelman tilaan (eli muuttujien arvoihin). Tentissä annetaan lainaksi joitakin Javan kirjastoluokkien kuvauksia. Ne ovat myös kurssisivuilla, joten tutustu niihin etukäteen. Tenttipäivät: Ensimmäinen on maanantaina Muut ilmoitetaan kurssisivuillamme. Huom. Jakso AOP tulee olla suoritettu kokonaisuudessaan ennen kun voi tenttiä OOPin. Jakson OOP tietokonetyön suunnitelma tulee palauttaa sähköpostitse ennen tenttiä ja olisi hyvä jos koodikin olisi lähes valmis. Katso kurssisivuilla esitetyt vaatimukset tenttien suhteen. 3.2 Tietokonetyöstä Tehtävän määrittelyt ja viimeinen palautuspäivämäärä kerrotaan kurssisivuilla linkin Tiekonetyö takana. Huomaa, että voitte itse valita työn yksin tai pareittain. Työstä tehdään ensin suunnitelma, jonka muoto kerrotaan kurssisivuilla ja esimerkki suunnitelmasta on s. 66 Murtoluku-tehtävässä. Töitä ohjataan kuten kurssisivuilla kerrotaan. Saat palautteen työstäsi sähköpostitse. Huomaa, että luentopäivällä käsiteltävä pankkisovellus on hyvä lähtökohta tietokonetyölle. Työn nopeata tekemistä kannustetaan antamalla myös ylimääräisiä bonuksia (katso kahden viimeisen viikon Harjoitustehtävät). 4. OPISKELUN ETENEMINEN Opintoryhmäkokoontumisten lisäksi järjestetään yksi lähiopetustilaisuus, jolloin yliopiston opettaja kertaa siihen mennessä käsitellyistä asioista tärkeimmät. Lisäksi tällöin opiskelijoilla on mahdollisuus kysyä opintojakson epäselviksi jääneistä kohdista. Opiskelu perustuu itseopiskeluun opiskeluoppaan avustamana, viikoittaisten harjoitustehtävien itsenäiseen laatimiseen ja niistä annettavaan palautteeseen. Lisäksi Moodlessa annetaan vinkkejä tehtävien tekemiseen ja siellä voi myös keskustella tehtävistä. 6

7 Harjoitustehtävät on jaettu aiheen perusteella kullekin viikolle niin, että ne kattavat viikon asiat. Harjoitustehtävien huolellinen läpikäynti on opiskelun keskeisin osa. Koska opintoryhmäkokoontumisten sisältö on aina hyvin samantapainen, ei niiden sisältöä ole aina esitetty ohjelman yhteydessä. Opintoryhmäkokoontumisen yhteydessä käsitellään viikolle tarkoitetut harjoitustehtävät joiden yhteydessä varmistetaan, että viikon asiat ja tässä oppaassa esitetyt esimerkit on ymmärretty. Tällöin opiskelijan tulee olla itse aktiivinen ja kysyä viikon epäselvistä asioista ja esimerkeistä. Ryhmäkokoontumisissa tuutori jakaa vastuuopettajan laatimat harjoitustehtävien mallivastaukset ja ne tulevat myös Moodleen takautuvasti. Mikäli opintoryhmäkokoontumisiin on suunniteltu jotakin muuta edellisen lisäksi, on siitä maininta viikoittaisen ohjelman kuvauksen yhteydessä. Ohjelmoinnin oppimisessa ei voi liikaa korostaa itsenäisen opiskelun osuutta. Viikolle merkittyjen harjoitustehtävien miettiminen, tekeminen ja koneella suorittaminen on todella tärkeätä. Laskemalla suoraan opintojakson laajuus opintopisteinä ja sen kesto, niin voimme arvioida, että opiskelijan tulisi käyttää tämän opintojakson opiskeluun keskimäärin n. 14 tuntia viikossa (ryhmäkokoontuminen mukaan lukien) ja kokemuksieni mukaan tämä on aika oikeaan osuva arvio. Tämä arvio edellyttää sen, että jakson AOP asiat ovat hallinnassa. On tietenkin selvää, että arvioitu tuntimäärä vaihtelee hyvinkin paljon riippuen opiskelijasta. Huomaa taas, että käsitteet ovat hyvin tärkeitä. Ne tarkoittavat tarkasti määriteltyä asiaa tai ominaisuutta. AOP:ssa meillä oli jo mm. seuraavia käsitteitä: muuttuja, tyyppi, perus- eli primitiivityyppi, olio- eli viittaus- eli viitetyyppi), lause, lauseke, lausekelause, toistolause, valintalause, metodi, muodollinen parametri, todellinen parametri, esiintymämetodi, luokkametodi (eli staattinen metodi). Tällä kurssilla oletetaan että yo. käsitteet hallitaan. Sinun kannattaa tehdä itsellesi käsiteluettelo, johon kirjaat aina vastaantulevat uudet käsitteet. Ohjelmointia opeteltaessa on erittäin tärkeätä testata ohjelmia koneella. Pelkällä ohjelmien lukemisella ei opi ohjelmoimaan. Sen vuoksi sinun kannattaakin kirjoittaa ohjelmia koneella, muuttaa niitä usealla eri tavalla ja katsoa mitä muutoksesi saa aikaan. Tällöin on kuitenkin erityisen tärkeätä se, että ymmärrät miten ohjelma toimii. Huom. Viikolla 8 ei ole ohjelmaa lainkaan. 7

8 VIIKKO 4 Luokka Object. Kirjastoluokkia osa I: String, StringBuffer, StringBuilder, StringTokenizer, DecimalFormat, Math ja Random. Pakkaukset ja import-lause. Alustus Jaksolla AOP luokat sisälsivät vain metodeja ja luokissa oli aina main-metodi. Tällöin luokilla ei mallinnettu tietotyyppejä eli tarkastelimme tällöin 'perinteellisiä' ohjelmia. Tämän ja seuraavan viikon tärkeä tavoite on valaista ja tutustuttaa valmiiden luokkien Javan luokkakirjaston käyttöön. Kuten muistanette, luokkakirjaston (API eli Application Programming Interface) käyttö on keskeinen osa olio-ohjelmointia. Seuraavassa sanomme kaikkien valmiina olevien luokkien (joita voimme siis käyttää suoraan omissa ohjelmissamme) joukkoa siis luokkakirjastoksi ja sen yksittäistä luokkaa (esim. String) kirjastoluokaksi. Viikkoina 4 ja 5 käsittelemme luokkia, joissa on main-metodi ja luokat eivät vielä määrittele omia tietotyyppejä. Sen sijaan viikkojen 4 ja 5 jälkeen käsitellään olio-ohjelmoinnin peruskäsitteet (näitä asioita ja käsitteitä tulee tietenkin esille jo viikoilla 4 ja 5) ja määrittelemme itse luokkia, jotka mallintavat tiettyjä asioita ja määrittelevät tietotyypin (eivätkä sisällä main-metodia). Tämän viikon materiaali on suoraa jatkoa jakson AOPin viimeiselle viikolle ja tässä esitetään kertauksena useita jakson AOP asioita. Kertaa siis aluksi jakson AOP viimeisen viikon sisältö. Perus- ja oliotyyppisen muuttujan ero ja asetuslauseen toiminta tulee myös kerrata lukemalla AOP-opintomonisteen luku Edellisellä kurssilla meillä oli käytössä luokan String lyhennetty kuvaus. Niin nytkin, mutta tällä kurssilla keskeisenä kuvauksien lähteinä ovat java-kansioissa (hakemistoissa) olevat englanninkieliset kuvaukset, joiden tiivistelmä on käytössä myös tentissä. Jaksolla AOP kerrottiin, että Javassa muuttujat ovat joko perustyyppisiä (esim. int) tai viittauseli oliotyyppisiä (esim. taulukot, String ja itse tehtyjen luokkien mukaiset oliot). On hyvä huomata, että vaikka taulukot ovat oliotyyppisiä, niin niiden käsittely ei ole samanlaista kuin muiden olioiden käsittely. Nimittäin taulukko-olioiden sisällön tarkastelemiseksi tai muuttamiseksi ei tarvitse käyttää mitään tiettyä metodia, vaan taulukon komponentteihin viitataan Javassa (perinteellisesti) hakasuljenotaatiolla; esim. vek[2]. Näin ollen taulukoiden 8

9 käsittely ei näytä siltä, että ne olisivat olioita, joskin new:n käyttö taulukkoa luotaessa paljastaa, että kyseessä on olio. Myös luokan String-olioille voidaan suorittaa operaatioita, jotka eivät noudata yleisiä olion käsittelyperiaatteita: oliota voidaan käsitellä vain ko. luokan metodien avulla. Esimerkiksi vakiomerkkijono voidaan luoda ilman new:tä ja luokan konstruktoria; esim. String st= java ; Lisäksi String-tyyppisiä merkkijonoja voidaan liittää peräkkäin eli katenoida käyttäen + operaattoria. Lisäksi voimme muodostaa lausekkeita, joissa on sekaisin lukutyyppisiä ja Stringtyyppisiä arvoja, jolloin tuloksena on String-tyyppinen olio. Näin olemme jo tehneet tulostuslauseissa, mutta niin voidaan menetellä muuallakin: voimme esim. kirjoittaa 1 : String st = y ; jossa yhdistetään kolme erityyppistä (double, String, char) arvoa. Tuloksena on String-olio y. Yhdistyksen tyypinmuunnoksien ehtona on se, että lausekkeessa tulee olla mukana vähintään yksi String-tyyppinen lauseke ja tämähän saadaan helposti aikaan liittämällä lausekkeeseen tarvittaessa tyhjä merkkijono (kaksi lainausmerkkiä peräkkäin). Kaikki nämä temput ovat kiellettyjä muiden oliotyyppien (esim. StringBuffer) yhteydessä. Taulukoiden ja osin myös merkkijonojen käsittely ovat kielikohtaisia eivätkä tue aina yleisiä olio-ohjelmoinnin periaatteita. Sen sijaan kaikkia muita oliotyyppisiä muuttujia käsitellään aina luokan metodien avulla ja metodin kutsu kohdistetaan ko. luokan mukaiseen olioon käyttäen ns. pistenotaatiota: esim. st.charat(2), missä st on String-tyyppinen muuttuja (olio) ja charat on kirjastoluokan String metodi. Kyseinen lauseke palauttaa merkkijonon st kohdassa 2 olevan merkin. Ensiksi olio täytyy kuitenkin luoda 1) käyttäen new-lauseketta tai 2) luokan Stringoliota luotaessa suoraan asetuslauseella käyttämättä new-lauseketta. Javaan kuuluu lukuisa määrä valmiita kirjastoluokkia, jotka ovat ohjelmoijan käytettävissä. Jaksolla AOP käsiteltiin jo luokkia String, Random ja Math (kertaa nämä asiat jakson AOP opintomonisteesta ja opiskeluoppaasta) ja tällä viikolla keskitytään näiden lisäksi kirjastoluokkiin StringBuffer, StringBuilder ja StringTokenizer, joiden avulla voidaan käsitellä merkkijonoja (tekstiä). On tärkeätä ymmärtää, että jokainen kirjastoluokka (poislukien metodikirjastot, esim. Math) määrittelee tietotyypin. Kyseessä on jonkin abstraktin tietotyypin valmis implementointi Javan luokan avulla. Esimerkiksi merkkijonojen käsittelyyn on useita erilaisia tietotyyppejä, jotka tarjoavat erilaisia ja eri tavalla implementoituja työkaluja (metodeja) merkkijonojen käsittelyyn. Kaikkien luokkien yliluokka on Object. Se sisältää useita metodeja, jotka kuitenkin ovat usein uudelleenmääriteltyjä sen aliluokissa (esim. luokassa String), koska luokan Object metodit ovat usein liian yleisiä ja eivät sovellu suoraan aliluokkaan sellaisenaan. Jokainen Javan luokka (siis myös meidän itse määrittelemät tietotyypit) perii 2 automaattisesti luokan Object kaikki metodit. Perintä tarkoittaa sitä, että aliluokka saa käyttöönsä perittävän luokan määrittelemiä 1 Tämä näyttää aivan järjettömältä! 2 Luokkahierarkiaan ja luokkien väliseen perintään palataan myöhemmin tarkemmin. 9

10 toiminnallisuuksia ja ominaisuuksia. Luokka Object sisältää muun muassa metodin tostring, joka palauttaa olion merkkijonoesityksen. Näin ollen se periytyy kaikkiin luokkiin. Kuitenkin sen tuottama merkkijono on usein aika kelvoton ja siksi se määritellään aliluokassa uudelleen niin, että se tuottaa aliluokalle sopivan merkkijonon. Tästä saadaan esimerkkejä jo tällä viikolla ja myös itse määrittelemämme tietotyypin Henkilo yhteydessä. Opiskeluohje: Liite 1 sisältää näiden tietotyyppien ja niiden tärkeimpien metodien kuvaukset. Lue ensin alla oleva alla ja sen jälkeen Liitteen 1 s (voit lukea niitä myös rinnakkain), mutta huomaa, että metodien kuvaukset ovat Liitteessä 1. Luokan String metodien vahvasti yksinkertaistettu kuvaus on jakson AOP opintomonisteessa, mutta kaikkien luokkien täydellinen kuvaus löytyy koneessasi (ja netissä) olevien kirjastoluokkien kuvauksista. Ns. pakkaus (package) on Javan väline esittää jollain tavalla yhteenkuuluvat luokat (tai oikeastaan niitä vastaavat class-tiedostot) kokonaisuutena. Tämä esitetään kirjoittamalla luokan alkuun package-määre. Pakkaus ei liity olio-ohjelmointiin, vaan se on käytännön ohjelmistotuotannon väline. Omien pakkausten määrittely ja käyttö eivät kuulu tämän kurssin vaatimuksiin. Yksinkertaisimmillaan pakkaus on hakemisto, johon luokat on sijoitettu. Tietyn pakkauksen saa käyttöönsä missä luokassa tahansa kirjoittamalla luokkaan import-lauseen. Myös valmisluokat on koottu pakkauksiksi. Toisia valmisluokkia voidaan käyttää suoraan ilman mitään erityisiä toimenpiteitä (nämä luokat kuuluvat pakkaukseen java.lang 3 ), kun taas toisten valmisluokkien käyttö vaatii import -lauseen, joka kirjoitetaan ennen sen luokan määrittelyä, jossa kirjastoluokkaa käytetään. Ensiksi mainittuja luokkia edustaa mm. luokat String, StringBuffer, Math ja Integer. Sen sijaan luokan Random käyttö vaatii import-lauseen: import java.util.random; ja luokan StringTokenizer käyttö vaatii import-lauseen 4 : import java.util.stringtokenizer; tai import java.util.*; jolloin saa käyttöönsä kummankin ja paljon muutakin eli kaikki pakkauksen java.util luokat. *:n käyttö ei vaikuta ohjelman tehokkuuteen tai kokoon eli kaikki luokkia ei ladata. Pakkaukset java.util ja java.lang ovat pakkauksen java alipakkauksia. Jos tiedoston alussa ei ole package-määrettä, class-tiedostot asetetaan ns. nimettömään pakkaukseen. Se on Java-toteutuksissa nykyhakemisto, so. hakemisto, jossa class-tiedosto sijaitsee. Tällöin ohjelmoija voi käyttää luokassa vain tässä hakemistossa olevia luokkia. Lisätietoja ja esimerkkejä pakkauksista on mm. kursssivujen kohdassa Muita hyödyllisiä linkkejä". Luokan esiintymä eli olio luodaan kirjoittamalla: new <konstruktorin kutsu>; missä konstruktorin nimi on aina sama kuin luokan nimi. Mahdolliset konstruktorimetodit esitetään luokkakirjastossa ja huomaa, että niitä on yleensä useita (metodin ylikuormitus!) ja että ne ovat usein parametrisoitu. Katso String-olioiden luontiesimerkkejä jaksolta AOP. Luokkakirjastossa luokkien kuvauksessa on annettu luokan 3 Jos installoit Javan dokumentaation, näiden luokkien kuvaukset löytyvät koneesi java-kansion alta kansiosta..\docs\api\java\lang tai netistä. Luokkien kuvaukset ovat html-tiedostoja, jotka voi avata kaksoisklikkaamalla. 4 Näiden luokkien kuvaukset löytyvät taas kansiosta..\docs\api\java\util 10

11 tietokenttien (Field Summary), konstruktorien (Constuctor Summary) ja metodien (Method Summary) kuvaukset. Tietokenttien ja metodien kuvauksessa voi olla määre static, jolloin se on ns. luokkamuuttuja tai luokkametodi 5. Näitä käytetään muodossa <luokan nimi>.<kentän nimi tai metodi kutsu> Tällöin ei luoda luokan oliota, vaan metodia käytetään perinteellisen aliohjelman tavoin. Jos taas kuvauksessa ei ole määrettä static, niin kyseessä on ns. esiintymämetodi, joita käytetään muodossa <olio>.<metodin kutsu> Näistä puhutaan lisää myös seuraavan esimerkin yhteydessä. Olioita käsitellään kohdistamalla olioon luokan metodin kutsu edellä mainitulla tavalla (poikkeuksena taulukoiden käsittely ja String-olioiden jotkut toiminnot) ja sen vuoksi esiintymämetodeja sanotaan myös olioiden metodeiksi (kuten Liitteessä 1). Terminologia vaihtelee jonkun verran eri lähteissä. Tässä oppaassa puhutaan aina esiintymämuuttujista ja esiintymämetodeista, mutta muualla saattaa termin esiintymä tilalla olla ilmentymä tai instanssi (vastaava eng. kielinen termi on instance) eli voidaan puhua esim. ilmentymämetodista. Huomaa siis, että ominaisuus: "onko kuvauksessa määre static tai ei ole" määrää sen onko kyseessä luokka- vai esiintymämetodi, joka määrää taas sen miten metodia käytetään (kutsutaan). Huom. Liitteessä 1 on vain osa luokkien kuvauksista ja ne eivät siis sisällä kaikkia luokkien metodeja. Opettele siis heti lukemaan tietokoneessasi olevia kirjastoluokkien kuvauksia. Kun luet alla olevaa, niin katso luokkakirjastosta käytetyn konstruktorin tai metodin kuvaus. Aloitamme yksinkertaisilla AOP-kurssin tasoisilla esimerkeillä, jotka käsittelevät luokkaa String. 5 Sanan luokka käyttö tässä yhteydessä (esim. luokkamuuttuja) viittaa siihen, että ko. asiaa käytetään ilman luokan oliota. Sen sijaan sana esiintymä (esim. esiintymämetodi), viittaa siihen että, ko. asiaa voidaan käyttää vain luokan olion esiintymän kanssa. Myöhemmin kun määrittelemme omia tietotyyppejä, otamme käyttöön myös termin esiintymämuuttuja. 11

12 Esimerkki. Tehdään ohjelma, joka tulostaa annetun merkin esiintymien sijainnit annetussa merkkijonossa. Merkkijono luetaan String-tyyppiseen muuttujaan kohde ja tarkasteltava merkki char-tyyppiseen muuttujaan c käyttäen luokkaa OmaIO. Merkkijono kohde käydään läpi merkeittäin silmukassa. Esimerkiksi jos kohde= java ja c= a, niin sijainnit ovat 1 ja 3. public class FindPositions /** Tulostetaan annetun merkin esiintymät annetussa merkkijonossa. */ public static void main(string[] args) System.out.println("Anna merkkijono"); String kohde = OmaIO.lueString( ); System.out.println("Anna etsittava merkki "); char c = OmaIO.lueChar( ); System.out.println("Etsitaan merkin " + c + esiintymat merkkijonosta " + kohde); for (int i=0; i<kohde.length( ); i++) if (kohde.charat(i)==c) System.out.println("Loytyi kohdasta " + i + "."); // if // for // main // class FindPositions Edellä for-lauseen runko ja if-lauseen then-haara koostuvat vain yhdestä lauseesta, joten niiden ympärillä ei tarvittaisi lausesulkuja ja. Yllä charat on luokan String esiintymämetodi ja sen ulkoinen kuvaus luokkakirjastossa (APIdokumentointi ) on: char charat(int index) Returns the char value at the specified index. Vasemmalla on metodin tulostyyppi, joka on tässä char. Koska tässä ei ole sanaa static ennen tyyppiä char, niin kyseessä on esiintymämetodi. Näin ollen metodin kutsu kohdistetaan aina luokan String-olioon ja näin ollen lausekkeen kohde.charat(i) arvo on tyyppiä char. Metodin nimi on siis charat ja sillä on yksi int-tyyppinen parametri, jolla viitataan merkkijonon tiettyyn positioon ja tässäkin merkkijonon indeksointi alkaa nollasta. Klikkaamalla metodin nimeä saa näkyviin tarkemman kuvauksen metodista (tässä tapauksessa lyhyt kuvaus on kuitenkin riittävä): 12

13 public char charat(int index) Metodin otsikkorivi Returns the char value at the specified index. An index ranges from 0 to length() - 1. The first char value of the sequence is at index 0, the next at index 1, and so on, as for array indexing. If the char value specified by the index is a surrogate, the surrogate value is returned. Specified by: Parameters: Returns: Throws: charat in interface CharSequence (CharSequence on interface eli rajapintaluokka, käsitellään myöhemmin) index - the index of the char value. the char value at the specified index of this string. The first char value is at index 0. IndexOutOfBoundsException - if the index argument is negative or not less than the length of this string. Nostaa poikkeuksen eli virheen (käsitellään myöhemmin), jos index<0 tai index>=kohdemerkkijonon pituus. Seuraavassa on vielä ratkaisu, jossa lukemiseen ei käytetä itsetehtyä luokkaa OmaIO, vaan Javan versiosta 5.0:sta lähtien 6 mukana olevaa kirjastoluokkaa Scanner. Luokkaa Scanner on käsitelty tarkemmin edellisellä kurssin AOP opiskeluoppaan liitteessä ja se löytyy myös OOPin sivuilta. import java.util.scanner; public class FindPositions2 /* Tulostetaan annetun merkin esiintymät annetussa merkkijonossa. */ public static void main(string[] args) Scanner lukija = new Scanner(System.in); System.out.println("Anna merkkijono"); String kohde = lukija.nextline(); System.out.println("Anna etsittava merkki "); char c = (lukija.nextline()).charat(0); // rivin ensimmäinen ja ainoa merkki System.out.println("Etsitaan merkin " + c +" esiintymat merkkijonosta " + kohde); 6 Javan kehitystyössä on yleensä voimassa seuraava ominaisuus: uudesta versiosta ei poisteta aiemman version ominaisuuksia. Tällä taataan vanhojen Java-ohjelmien toimivuus uudessa ympäristössä. 13

14 for (int i=0; i<kohde.length( ); i++) if (kohde.charat(i)==c) System.out.println("Loytyi kohdasta " + i + "."); // if // for // main // class FindPositions2 Lauseke (lukija.nextline()).charat(0) voidaan kirjoittaa myös ilman sulkeita muodossa lukija.nextline().charat(0), koska lauseketta jäsennetään vasemmalta oikealle. Tässä lauseke lukija.nextline() on tyyppiä String ja siihen kohdistetaan luokan String metodi charat. Huomaa, että luokassa Scanner ei ole metodia yhden merkin lukemiseen, joten yhden merkin lukeminen tulee suorittaa tässä esitetyllä tavalla. Edellä tarkasteltava merkki tallennettiin char-tyyppiseen muuttujaan c ja se onkin luonnollista. Voimme tarkastella sitä myös yhden merkin mittaisena String-tyyppisenä merkkijonona (alla muuttuja st). Tällöin meidän tulee tutkia onko ko. merkin muodostava merkkijono st alkuperäisen merkkijonon kohde osajono eli onko kohde.substring(i,i+1) sama kuin st. Merkkijonojen yhtäsuuruutta tulee tutkia luokan String metodilla equals eli meidän tulee kirjoittaa: st.equals(kohde.substring(i,i+1)). Voimme siis kirjoittaa: public static void main(string[] args) Scanner lukija = new Scanner(System.in); System.out.println("Anna merkkijono"); String kohde = lukija.nextline(); System.out.println("Anna etsittava merkki "); String st = lukija.nextline(); System.out.println("Etsitään merkin " + st + " esiintymät merkkijonosta " + kohde); for (int i=0; i<kohde.length( ); i++) if (st.equals(kohde.substring(i,i+1))) System.out.println("Löytyi kohdasta " + i + "."); // for // main (*** esimerkin loppu ***) equals-metodi olioiden yhteydessä Kaikilla luokilla on metodi equals, joka on määritely valmisluokassa Object, joka on kaikkien luokkien (myös itsetehtyjen) yliluokka. Metodi equals on kuitenkin määritelty luokassa Object niin, että se tarkoittaa vain viittauksien yhtäsuuruutta eli ==. Näin ollen se ei ole sellaisenaan käyttökelpoinen, joten joissakin luokissa se on uudelleenmääritelty paremmin. Esim. luokassa String equals tarkoittaa merkkijonojen samuutta kuten nähtiin edellisessä esimerkissä. Monissa muissa luokissa kuten esim. jatkossa esitellyissä muissa merkkijonoluokissa StringBuffer ja 14

15 StringBuilder kuten myös seuraavalla viikolla käsiteltävien dynaamisten listojen implementoinnissa metodia ei ole uudelleenmääritelty, joten tarvittaessa equals metodi tulee kirjoittaa itse. Luokat StringBuffer ja StringBuilder Luokan StringBuffer oliot ovat merkkijonoja (puhutaan myös merkkijonopuskuriolioista), mutta niiden sisältöä voi muuttaa eli luokassa StringBuffer on metodeja, joilla voimme muuttaa ko. luokan olioita. Luokan String alkiot ovat siis mutatoitumattomia, kun taas luokan StringBuffer oliot ovat mutatoituvia. Esimerkiksi jos halutaan muuttaa tietyssä merkkijonossa tiettyjä merkkejä toisiksi luomatta uutta oliota, niin on järkevää määritellä kyseinen merkkijono luokan StringBuffer olioksi. Luokan olion luonti ja olion viittauksen asetus muuttujaan suoritetaan seuraavasti: StringBuffer <muuttujan nimi> = new StringBuffer(<String-tyyppinen olio>); missä <String-tyyppinen olio> on String-tyyppinen vakio, lauseke tai muuttuja. Tyypit String ja StringBuffer (ja vastaavasti StringBuilder) eivät ole sijoitusyhteensopivia eli String-tyyppiseen muuttujaan ei voi suoraan sijoittaa StringBuffer-tyyppistä alkiota (eikä päinvastoinkaan). Tarvittaessa meidän tulee tehdä tyypin muunnos ja luoda uusi halutun luokan olio, jonka sisältö vastaa alkuperäisen olion sisältöä. Muutos tehdään seuraavasti: String-oliosta vastaava StringBuffer-tyyppinen olio: Olkoon st luokan String olio (tai merkkijonovakio). Tällöin voimme luoda uuden StringBuffer-tyyppisen olion stb kirjoittamalla StringBuffer stb = new StringBuffer(st); Jos tässä jätetään argumentti st pois, niin silloin olion sisältönä on tyhjä merkkijono. StringBuffer-oliosta vastaava String-tyyppinen olio: Olkoon stb luokan StringBuffer olio. Tällöin voimme luoda uuden String-tyyppisen olion st kirjoittamalla String st = new String(stb); Vaihtoehtoisesti voimme kirjoittaa String st = stb.tostring( ); Tässä on myös hyvä huomata, että eksplisiittiset tyypinmuunnokset eivät onnistu kirjastoluokkien tyyppien välillä samaan tapaan kuin perustyypeillä (esim. double vs. int); esim. emme voi kirjoittaa StringBuffer stb = (StringBuffer) st; Lisäksi on hyvä huomata, että luettaessa merkkijono on se aina tyyppiä String ja jos siitä halutaan muodostaa luokan StringBuffer olio, tulee käyttää em. tyypin muunnosta. 15

16 Lisäksi luokasta String tutut operaatiot + (katenointi) ja olion luonti ilman new:tä ei onnistu luokassa StringBuffer, vaan ne tulee suorittaa oikeaoppisesti käyttäen luokan metodeja. Myöskään merkkijonovakiota ei voi asettaa suoraan StringBuffer-olion arvoksi, koska merkkijonovakio on aina tyyppiä String. Liitteessä 1 on suomennettuna joitakin luokan StringBuffer metodeja ja niiden toiminta. Kattavampi kuvaus löytyy luokkakirjastosta. Esimerkki. Alla on esimerkki merkkijonon kääntämisestä kun metodi käännä saa argumenttinaan sekä palauttaa StringBuffer-tyyppisen olion. Tämä sama metodi esitettiin myös jakson AOP opiskeluoppaassa, mutta tällöin alkiot olivat String-tyyppisiä. Tämän metodin tekeminen on turhaa, koska luokassa StringBuffer on valmiina metodi reverse, joka tekee saman asian. Ohjelmasta näet kuitenkin metodien käännä ja reverse erilaisen soveltamistavan: Metodia käännä ei kohdisteta olioon, koska se on ns. luokkametodi (määreenä on static). Tällöin käännettävä merkkijono (muuttuja kohde) annetaan metodille parametrina. Sen sijaan reverse on luokan StringBuffer esiintymämetodi (luokkakirjastossa metodin reverse kuvauksessa ei ole määrettä static), joten sitä käytetään olio-ohjelmoinnin periaatteiden mukaisesti: metodi kohdistetaan johonkin ko. luokan olioon kirjoittamalla <olio>.<metodin kutsu> eli kuten alla: kohde.reverse( ). Metodissa käännä käytetään metodia append, joka lisää yhden merkin nykyisen olion perään. Tässä meillä on siis käytössä vain yksi olio, joka mutatoituu (muuttuu) ohjelman suorituksen aikana. Metodin append kuvaus kirjastoluokassa StringBuffer on muotoa: StringBuffer append(char c) Appends the string representation of the char argument to this sequence Kun klikkaamme append-sanaa saamme tarkemman kuvauksen: public StringBuffer append(char c) Appends the string representation of the char argument to this sequence. The argument is appended to the contents of this sequence. The length of this sequence increases by 1. The overall effect is exactly as if the argument were converted to a string by the method String.valueOf(char) and the character in that string were then appended to this character sequence. Parameters: Returns: c - a char. a reference to this object. // reference = viittaus 16

17 Huom. Vaikka append on esiintymämetodi (koska sana static puuttuu metodin otsikkoriviltä), niin se on funktio, jonka soveltaminen palauttaa StringBuffer-olion. Soveltaminen on siis lausekelause, jota voi käyttää lauseena tai lausekkeena. Esimerkiksi alla kutsulla apu.append(st.charat(i)) on myös arvo, joka on sama kuin apu:n muuttunut sisältö. Tätä arvoa ei useinkaan ole tarvetta asettaa minkään toisen muuttujan arvoksi, vaikka se mahdollista onkin. public class Kaanna_buffer public static void main(string[] args) System.out.println( Anna merkkijono ); String st = OmaIO.lueString(); // String-tyyppisestä oliosta st luodaan StringBuffer-tyyppinen olio nimeltä kohde StringBuffer kohde = new StringBuffer(st); System.out.println(käännä(kohde)); System.out.println(kohde.reverse( )); // end main /** Metodi palauttaa merkkijonon st käännettynä. * Alkuehto: st tulee olla luotu, mutta se voi olla tyhjä. */ public static StringBuffer käännä(stringbuffer st) // luodaan ensin uusi olio, jonka sisältönä on tyhjä merkkijono StringBuffer apu=new StringBuffer( ); // lisätään sen loppuun st:n merkit yksitellen lopusta alkaen for (int i=st.length( )-1; i>=0; i--) apu.append(st.charat(i)); // ks. yllä oleva Huom. return apu; // metodi käännä // class Kaanna_buffer Lause apu.append(st.charat(i)); lisää merkkijonon apu perään merkin st.charat(i) eli merkkijonon st positiossa i olevan merkin. (*** esimerkin loppu ***) Java 5.0:sta lähtien mukana on myös luokka StringBuilder, joka on kuin luokka StringBuffer, mutta luokan StringBuilder kuvauksessa suositellaan sen käyttöä StringBufferin sijasta tehokkuuden vuoksi. Katso luokkakirjastosta sen kuvaus. Kuten jo aiemmin todettiin, luokkien StringBuilder ja StringBuffer osalta tulee huomioida myös seuraava: metodi equals antaa arvon true vain silloin kun viitataan samaan olioon (siis toimii samoin kuin ==). 17

18 Luokka StringTokenizer ja luokan String metodi split Luokkaa StringTokenizer käytetään osien (tokens eli tokenien) erottamiseen ja poimimiseen merkkijonosta, jossa on käytetty tiettyjä erotinmerkkejä. Erotinmerkit voidaan antaa konstruktorille parametrina olion luonnin yhteydessä. Esimerkiksi StringTokenizer stok = new StringTokenizer(<merkkijono josta etsitään>, <erotinmerkit merkkijonona>); Jos erotinmerkkejä ei anneta, niin oletuksena on ns. white-space merkit (välilyönti, tabulaattori, enter). Lisäksi konstruktorille voidaan antaa kolmas parametri (ks. alla olevan esimerkin muuttujan st4 luonti). Esimerkki. Esitämme esimerkkiohjelman, jossa havainnollistetaan luokan metodien toimintaa. Metodissa luodaan läpikäytävä merkkijono-olio st2 käyttäen konstruktoria StringTokenizer(String str, String delim) Constructs a string tokenizer for the specified string. jossa erotinmerkki delim annetaan merkkijonona. Ohjelmassa käytetään myös luokan StringTokenizer esiintymämetodia nexttoken: String nexttoken() Returns the next token from this string tokenizer. Metodin nexttoken kutsu kohdistetaan StrngTokenizer-olioon ja kutsu palauttaa merkkijonon seuraavan osan. 18

19 Katso rivien perässä olevat kommentit. import java.util.*; public class Tokenit public static void main(string[] args) StringTokenizer st1= new StringTokenizer("a b 1"); System.out.println(st1.countTokens()); // tulostuu 3 String s = st1.nexttoken(); // s="a" s = st1.nexttoken(); // s="b" s = st1.nexttoken(); // s="1" StringTokenizer st2 = new StringTokenizer("xx, yy,11", ","); s = st2.nexttoken(); // s="xx" s = st2.nexttoken(); // s=" yy" int i = Integer.parseInt(st2.nextToken()); // i=11 (tyypin muunnos!) /* jotta yllä oleva lause toimisi, niin merkkijonossa ei saa olla merkkien 11 kummallakaan puolella tyhjiä */ StringTokenizer st3 = new StringTokenizer(" ","+-"); // sekä + että - ovat erottimia s = st3.nexttoken(); // s="23" char ch = st3.nexttoken().charat(0); // ch='4' s = st3.nexttoken(); // s="5" StringTokenizer st4 = new StringTokenizer(" ","+-", true); // true saa aikaan sen, että myös erotinmerkki tulkitaan tokeniksi s = st4.nexttoken(); // s="23" ch = st4.nexttoken().charat(0); // ch='+' s = st4.nexttoken(); // s="444" // main // class Tokenit (*** esimerkin loppu ***) Luokassa String on myös kätevä metodi split, jolla kohdemerkkijono voidaan palastella merkkijonotaulukkoon. Tehokkuussyistä tätä metodia suositellaan käytettävän luokan StringTokenizer metodien sijasta. Lisäksi splitin käyttö on usein helpompaa. Tarkastellaan metodia esimerkin avulla, joten olkoon String st= 123,456,7 ; Metodin split argumenttina on ns. säännöllinen lauseke (regular expression) 7 String-tyyppisenä, joka määrää sen mistä kohdin palastelu tehdään: yksi merkki: esim. lause String[ ] s = st.split(, ); pilkkoo st:n palasiin pilkkujen kohdilta, jolloin s[0]= 123, s[1]= 456, s[2]= 7 useita peräkkäisiä merkkejä: esim. lauseen String[ ] s = st.split( 456 ); jälkeen s[0]= 123, ja s[1]=,7 lista vaihtoehtoisista merkeistä, joiden kohdalta suoritetaan paloittelu. Ne annetaan hakasulkeiden sisällä peräkkäin: esim. lauseen String[ ] s = st.split( [25] ); jälkeen s[0]= 1 ja s[1]= 3,4 ja s[2]= 6,7. yksi tai useampi välilyönti peräkkäin: split( + ) (plussan edessä on yksi välilyönti) 7 Ei vaadita yleisesti tällä kurssilla. Alla olevien esimerkkien tapaukset riittää osata. 19

20 Seuraavaksi mennään hiukan teknisempään mutta käytännössä hyvinkin tarpeelliseen asiaan: desimaalilukujen muotoilu. Tätä ei kuitenkaan vaadita tentissä. Asiasta esitetään vain esimerkkejä. Tulostuksen muotoilu ja DecimalFormat Usein desimaaliluvuissa on tulostuksen yhteydessä liian paljon desimaaleja; meille riittäisi esimerkiksi vain kaksi desimaalia. Jakson AOP harjoitustehtävissä esiteltiin tulostuslause printf, joilla voidaan muotoilla (formatoida) desimaaliluku haluttuun muotoon. Esimerkiksi olkoon: double d=1.236; System.out.printf("d=%8.2f", d); Tämä saa aikaan tulostuksen d= ja sen jälkeen luku d tulostetaan 8 merkin levyiseen kenttään kahdella desimaalilla. Tässä voi kirjoittaa myös esim. %2.2f, jolloin desimaaliluvun eteen tulee vain yksi välilyönti ja tarkkuus on edelleen 2 desimaalia. Tässä siis tapahtuu automaattinen kentän laajennus, koska 2 on liian pieni luku koko kentän leveydeksi. Lisäksi jos luvussa on enemmän desimaaleja kuin mitä tulostetaan, niin muunnoksessa suoritetaan pyöristys (jos siis ensimmäinen poisjäänyt desimaali on >=5). Joskus on tarvetta muodostaa desimaaliluvusta String-tyypin olio, joka vastaa luvun esitystä mutta vähemmillä desimaaleilla. Tällöin voimme käyttää luokkaa DecimalFormat, joka vaatii import-lauseen import java.text.decimalformat; Tämän luokan käyttö käy ilmi seuraavasta esimerkistä: DecimalFormat f = new DecimalFormat("0.00"); // ja oliohan tämä formatoijakin on! double d=1.236; String st = d= +f.format(d); Tässä f.format(d) palauttaa (johtuen kielivalinnasta kuten Scannerin yhteydessäkin) Stringtyyppisen arvon 1,24, joten jos haluaa desimaalipisteen pilkun tilalle, niin tulee kirjoittaa f.format(d).replace(,,. ) eli korvataan pilkku pisteellä. Tässäkin tapahtuu automaattinen kentän laajennus, jos muotoilussa (edellä "0.00") on liian vähän nollia desimaalipisteen edessä muotoiltavaan lukuun nähden. Merkkijonon ja tekstitiedoston läpikäynti käyttäen luokkaa Scanner Luokkaa Scanner (ks. jakson AOP opiskeluoppaan lopussa oleva Liite) voi käyttää merkkijonon skannaukseen samaan tapaan kuin luokkaa StringTokenizer. Läpikäytäessä merkkijonoa, voi erotinmerkin valita itse. Tarkastellaan esimerkkinä merkkijonossa olevien lukujen läpikäyntiä. Olkoon s merkkijono, joka sisältää double-lukuja, jotka on erotettu #- merkeillä; esim. s= 1,5#2,89#3,13 (huomaa desimaalipilkku!). Nyt luomme luokan Scanner olion, jolle annetaan parametrina se merkkijono, joka käydään läpi. Koska erotinmerkkinä on nyt #, niin meidän tulee kertoa ko. oliolle, että oletuserottimen sijasta erottimena on #. Merkkijonossa ei saa olla kuitenkaan esim. ylimääräisiä välilyöntejä. 20

1. OPINTOJAKSON TAVOITTEET, SISÄLTÖ JA ESITIEDOT... 4 2. MATERIAALIT JA OHJELMISTOT... 5

1. OPINTOJAKSON TAVOITTEET, SISÄLTÖ JA ESITIEDOT... 4 2. MATERIAALIT JA OHJELMISTOT... 5 1. OPINTOJAKSON TAVOITTEET, SISÄLTÖ JA ESITIEDOT... 4 2. MATERIAALIT JA OHJELMISTOT... 5 3. SUORITUSTAVAT... 5 3.1 Tentistä... 5 3.2 Tietokonetyöstä... 6 4. OPISKELUN ETENEMINEN... 6 VIIKKO 3... 8 Luokka

Lisätiedot

Luokkakirjastot. esiintymämetodien käytöstä:

Luokkakirjastot. esiintymämetodien käytöstä: Luokkakirjastot Esimerkkejä Jokainen olio on jotain tyyppiä ja ko. tyyppistä oliota voidaan käsitellä ko. luokan metodeilla Merkkijonojen käsittely: String, StringBuffer, StringBuilder, StringTokenizer,..

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

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

Ohjelmassa henkilön etunimi ja sukunimi luetaan kahteen muuttujaan seuraavasti: 1 (7) Tiedon lukeminen näppäimistöltä Scanner-luokan avulla Miten ohjelma saa käyttöönsä käyttäjän kirjoittamaa tekstiä? Järjestelmässä on olemassa ns. syöttöpuskuri näppäimistöä varten. Syöttöpuskuri

Lisätiedot

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op. Standardi- ja tietorakenneluokkia

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op. Standardi- ja tietorakenneluokkia Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Standardi- ja tietorakenneluokkia Standardi- ja tietorakenneluokkia Javan API, ArrayList Ohjelmointirajapinta (Application Programming Interface, API)

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

20. Javan omat luokat 20.1

20. Javan omat luokat 20.1 20. Javan omat luokat 20.1 Sisällys Application Programming Interface (API). Pakkaukset. Merkkijonoluokka String. Math-luokka. Kääreluokat. 20.2 Java API Java-kielen Application Programming Interface (API)

Lisätiedot

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

Sisällys. 20. Javan omat luokat. Java API. Pakkaukset. java\lang Sisällys 20. Javan omat luokat Application Programming Interface (API). Pakkaukset. Merkkijonoluokka String. Math-luokka. Kääreluokat. 20.1 20.2 Java API Java-kielen Application Programming Interface (API)

Lisätiedot

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

Javan perusteet. Ohjelman tehtävät: tietojen syöttö, lukeminen prosessointi, halutun informaation tulostaminen tulostus tiedon varastointi 1 Javan perusteet Ohjelmointi IPO-malli Java lähdekoodista suoritettavaksi ohjelmaksi Vakio Muuttuja Miten Javalla näytetään tietoa käyttäjälle, miten Javalla luetaan käyttäjän antama syöte Miten Javalla

Lisätiedot

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

2. Lisää Java-ohjelmoinnin alkeita. Muuttuja ja viittausmuuttuja (1/4) Muuttuja ja viittausmuuttuja (2/4) 2. Lisää Java-ohjelmoinnin alkeita Muuttuja ja viittausmuuttuja Vakio ja literaalivakio Sijoituslause Syötteen lukeminen ja Scanner-luokka 1 Muuttuja ja viittausmuuttuja (1/4) Edellä mainittiin, että String-tietotyyppi

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

Ohjelmointitaito (ict1td002, 12 op) Kevät 2008. 1. Java-ohjelmoinnin alkeita. Tietokoneohjelma. Raine Kauppinen raine.kauppinen@haaga-helia.

Ohjelmointitaito (ict1td002, 12 op) Kevät 2008. 1. Java-ohjelmoinnin alkeita. Tietokoneohjelma. Raine Kauppinen raine.kauppinen@haaga-helia. Ohjelmointitaito (ict1td002, 12 op) Kevät 2008 Raine Kauppinen raine.kauppinen@haaga-helia.fi 1. Java-ohjelmoinnin alkeita Tietokoneohjelma Java-kieli ja Eclipse-ympäristö Java-ohjelma ja ohjelmaluokka

Lisätiedot

Java-kielen perusteita

Java-kielen perusteita Java-kielen perusteita Käyttäjän kanssa keskusteleva ohjelma 1 Kirjoittaminen konsolinäkymään //Java ohjelma, joka tulostaa konsoli-ikkunaan public class HeiMaailma { public void aja() { // kirjoitus ja

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

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

17. Javan omat luokat 17.1

17. Javan omat luokat 17.1 17. Javan omat luokat 17.1 Sisällys Application Programming Interface (API). Pakkaukset. Merkkijonoluokka String. Math-luokka. Kääreluokat. 17.2 Java API Java-kielen Application Programming Interface (API)

Lisätiedot

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

Ohjelmointitaito (ict1td002, 12 op) Kevät Java-ohjelmoinnin alkeita. Tietokoneohjelma. Raine Kauppinen Ohjelmointitaito (ict1td002, 12 op) Kevät 2009 Raine Kauppinen raine.kauppinen@haaga-helia.fi 1. Java-ohjelmoinnin alkeita Tietokoneohjelma Java-kieli ja Eclipse-kehitysympäristö Java-ohjelma ja luokka

Lisätiedot

16. Javan omat luokat 16.1

16. Javan omat luokat 16.1 16. Javan omat luokat 16.1 Sisällys Johdanto. Object-luokka: tostring-, equals-, clone- ja getclass-metodit. Comparable-rajapinta: compareto-metodi. Vector- ja ArrayList-luokat. 16.2 Javan omat luokat

Lisätiedot

Tietojen syöttäminen ohjelmalle. Tietojen syöttäminen ohjelmalle Scanner-luokan avulla

Tietojen syöttäminen ohjelmalle. Tietojen syöttäminen ohjelmalle Scanner-luokan avulla Tietojen syöttäminen ohjelmalle Tähän mennessä on käsitelty Javan tulostuslauseet System.out.print ja System.out.println sekä ohjelman perusrakenneosat (muuttujat, vakiot, lauseet). Jotta päästään tekemään

Lisätiedot

Rajapinta (interface)

Rajapinta (interface) 1 Rajapinta (interface) Mikä rajapinta on? Rajapinta ja siitä toteutettu luokka Monimuotoisuus ja dynaaminen sidonta Rajapinta vs periytyminen 1 Mikä rajapinta on? Rajapintoja käytetään, kun halutaan määritellä

Lisätiedot

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python Ohjelmoinnin perusteet Y Python T-106.1208 1.4.2009 T-106.1208 Ohjelmoinnin perusteet Y 1.4.2009 1 / 56 Tentti Ensimmäinen tenttimahdollisuus on pe 8.5. klo 13:00 17:00 päärakennuksessa. Tämän jälkeen

Lisätiedot

17. Javan omat luokat 17.1

17. Javan omat luokat 17.1 17. Javan omat luokat 17.1 Sisällys Application Programming Interface (API). Pakkaukset. Merkkijonoluokka String. Math-luokka. Kääreluokat. 17.2 Java API Java-kielen Application Programming Interface (API)

Lisätiedot

Sisällys. 12. Näppäimistöltä lukeminen. Yleistä. Yleistä 12.1 12.2 12.3 12.4

Sisällys. 12. Näppäimistöltä lukeminen. Yleistä. Yleistä 12.1 12.2 12.3 12.4 Sisällys 12. Näppäimistöltä lukeminen Arvojen lukeminen näppäimistöltä yleisesti. Arvojen lukeminen näppäimistöltä Java-kielessä.. Luetun arvon tarkistaminen. Tietovirrat ja ohjausmerkit. Scanner-luokka.

Lisätiedot

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

Metodit. Metodien määrittely. Metodin parametrit ja paluuarvo. Metodien suorittaminen eli kutsuminen. Metodien kuormittaminen Metodit Metodien määrittely Metodin parametrit ja paluuarvo Metodien suorittaminen eli kutsuminen Metodien kuormittaminen 1 Mikä on metodi? Metodi on luokan sisällä oleva yhteenkuuluvien toimintojen kokonaisuus

Lisätiedot

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

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Taulukot & Periytyminen Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Taulukot & Periytyminen Taulukot: Array Taulukko Javassa pitää aina perustaa (new) Yksinkertaisessa tilanteessa taulukon koko tiedetään etukäteen ja

Lisätiedot

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

Vertailulauseet. Ehtolausekkeet. Vertailulauseet. Vertailulauseet. if-lauseke. if-lauseke. Javan perusteet 2004 Vertailulauseet Ehtolausekkeet Ehdot, valintalausekkeet Boolean-algebra == yhtäsuuruus!= erisuuruus < pienempi suurempi >= suurempi tai yhtäsuuri Esimerkkejä: int i=7; int j=10;

Lisätiedot

Olio-ohjelmointi Javalla

Olio-ohjelmointi Javalla 1 Olio-ohjelmointi Javalla Olio-ohjelmointi Luokka Attribuutit Konstruktori Olion luominen Metodit Olion kopiointi Staattinen attribuutti ja metodi Yksinkertainen ohjelmaluokka Ohjelmaluokka 1 Olio-ohjelmointi

Lisätiedot

Java-kielen perusteet

Java-kielen perusteet Java-kielen perusteet String-merkkijonoluokka 1 Ohjelmointikielten merkkijonot Merkkijonot ja niiden käsittely on välttämätöntä ohjelmoinnissa Valitettavasti ohjelmointikielten tekijät eivät tätä ole ottaneet

Lisätiedot

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

8. Näppäimistöltä lukeminen 8.1 8. Näppäimistöltä lukeminen 8.1 Sisällys Arvojen lukeminen näppäimistöltä Java-kielessä. In-luokka. In-luokka, käännös ja tulkinta Scanner-luokka. 8.2 Yleistä Näppäimistöltä annettujen arvojen (syötteiden)

Lisätiedot

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

Tietorakenteet. JAVA-OHJELMOINTI Osa 5: Tietorakenteita. Sisällys. Merkkijonot (String) Luokka String. Metodeja (public) Tietorakenteet JAVA-OHJELMOINTI Osa 5: Tietorakenteita Eero Hyvönen Tietojenkäsittelytieteen laitos Helsingin yliopisto Olioita ja tietoja voidaan organisoida määrämuotoisiksi tietorakenteiksi Hyödyllisiä

Lisätiedot

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

8. Näppäimistöltä lukeminen 8.1 8. Näppäimistöltä lukeminen 8.1 Sisällys Arvojen lukeminen näppäimistöltä Java-kielessä. In-luokka. In-luokka, käännös ja tulkinta Scanner-luokka. 8.2 Yleistä Näppäimistöltä annettujen arvojen (syötteiden)

Lisätiedot

Java kahdessa tunnissa. Jyry Suvilehto

Java kahdessa tunnissa. Jyry Suvilehto Java kahdessa tunnissa Jyry Suvilehto Ohjelma Ohjelmointiasioita alkeista nippelitietoon n. 45 min Tauko 10 min Oliot, luokat ja muut kummajaiset n. 45 min Kysykää Sisältöä ei oikeasti ole 2x45 min täytteeksi,

Lisätiedot

Java-kielen perusteita

Java-kielen perusteita Java-kielen perusteita valintalauseet 1 Johdantoa kontrollirakenteisiin Tähän saakka ohjelmissa on ollut vain peräkkäisyyttä eli lauseet on suoritettu peräkkäin yksi kerrallaan Tarvitsemme myös valintaa

Lisätiedot

812341A Olio-ohjelmointi Peruskäsitteet jatkoa

812341A Olio-ohjelmointi Peruskäsitteet jatkoa 812341A Olio-ohjelmointi 2106 Peruskäsitteet jatkoa Luokkakohtaiset piirteet n Yhteisiä kaikille saman luokan olioille n Liittyvät luokkaan, eivät yksittäiseen olioon n Kaikki ko. luokan oliot voivat käyttää

Lisätiedot

Metodien tekeminen Javalla

Metodien tekeminen Javalla 1 Metodien tekeminen Javalla Mikä metodi on? Metodin syntaksi Metodi ja sen kutsuminen Parametreista Merkkijonot ja metodi Taulukot ja metodi 1 Mikä metodi on? Metodilla toteutetaan luokkaan toiminnallisuutta.

Lisätiedot

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

// Tulostetaan double-tyyppiseen muuttujaan hinta tallennettu // kertalipun hinta ja vaihdetaan riviä. System.out.printf(%.1f euros. Lue kukin tehtävänanto huolellisesti ja kokonaisuudessaan ennen kuin aloitat vastaamisen. Kustakin tehtävästä voi saada 0 6 pistettä. Tentin läpipääsyraja on 12 / 24 pistettä. Ratkaisut palautetaan WETO-järjestelmään

Lisätiedot

Java-kielen perusteet

Java-kielen perusteet Java-kielen perusteet Tunnus, varattu sana, kommentti Muuttuja, alkeistietotyyppi, merkkijono, Vakio Tiedon merkkipohjainen tulostaminen Ohjelmointi (ict1tx006) Tunnus (5.3) Javan tunnus Java-kirjain Java-numero

Lisätiedot

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

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op. Tietorakenneluokkia 2: HashMap, TreeMap Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Tietorakenneluokkia 2: HashMap, TreeMap Tietorakenneluokkia ja -rajapintoja Java tarjoaa laajan kokoelman tietorakennerajapintoja ja - luokkia. Aiemmin

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

Alkuarvot ja tyyppimuunnokset (1/5) Alkuarvot ja tyyppimuunnokset (2/5) Alkuarvot ja tyyppimuunnokset (3/5)

Alkuarvot ja tyyppimuunnokset (1/5) Alkuarvot ja tyyppimuunnokset (2/5) Alkuarvot ja tyyppimuunnokset (3/5) Alkuarvot ja tyyppimuunnokset (1/5) Aiemmin olemme jo antaneet muuttujille alkuarvoja, esimerkiksi: int luku = 123; Alkuarvon on oltava muuttujan tietotyypin mukainen, esimerkiksi int-muuttujilla kokonaisluku,

Lisätiedot

Listarakenne (ArrayList-luokka)

Listarakenne (ArrayList-luokka) Listarakenne (ArrayList-luokka) Mikä on lista? Listan määrittely ArrayList-luokan metodeita Listan läpikäynti Listan läpikäynti indeksin avulla Listan läpikäynti iteraattorin avulla Listaan lisääminen

Lisätiedot

Informaatioteknologian laitos Olio-ohjelmoinnin perusteet / Salo 15.2.2006

Informaatioteknologian laitos Olio-ohjelmoinnin perusteet / Salo 15.2.2006 TURUN YLIOPISTO DEMO III Informaatioteknologian laitos tehtävät Olio-ohjelmoinnin perusteet / Salo 15.2.2006 1. Tässä tehtävässä tarkastellaan erääntyviä laskuja. Lasku muodostaa oman luokkansa. Laskussa

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

14. Poikkeukset 14.1

14. Poikkeukset 14.1 14. Poikkeukset 14.1 Sisällys Johdanto. Tarkistettavat ja tarkistamattomat poikkeukset. Poikkeusten tunnistaminen ja sieppaaminen try-catchlauseella. Mitä tehdä siepatulla poikkeuksella? Poikkeusten heittäminen.

Lisätiedot

Harjoitus 7. 1. Olkoon olemassa luokat Lintu ja Pelikaani seuraavasti:

Harjoitus 7. 1. Olkoon olemassa luokat Lintu ja Pelikaani seuraavasti: Harjoitus 7 1. Olkoon olemassa luokat Lintu ja Pelikaani seuraavasti: class Lintu //Kentät private int _siivenpituus; protected double _aivojenkoko; private bool _osaakolentaa; //Ominaisuudet public int

Lisätiedot

Sisällys. 14. Poikkeukset. Johdanto. Johdanto

Sisällys. 14. Poikkeukset. Johdanto. Johdanto Sisällys 14. Poikkeukset Johdanto. Tarkistettavat ja tarkistamattomat poikkeukset. Poikkeusten tunnistaminen ja sieppaaminen try-catchlauseella. Mitä tehdä siepatulla poikkeuksella? Poikkeusten heittäminen.

Lisätiedot

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

Ohjelmointi 2 / 2008 Välikoe / Pöytätestaa seuraava ohjelma. Välikoe / 20.3 Vastaa neljään (4) tehtävään. Jos vastaat 5:een, 4 huonointa arvostellaan. Kunkin tehtävän vastaus eri konseptille. 1. Pöytätesti Pöytätestaa seuraava ohjelma. Tutki ohjelman toimintaa pöytätestillä

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

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

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

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

12. Näppäimistöltä lukeminen 12.1 12. Näppäimistöltä lukeminen 12.1 Sisällys Arvojen lukeminen näppäimistöltä yleisesti. Arvojen lukeminen näppäimistöltä Java-kielessä. In-luokka. Luetun arvon tarkistaminen. Tietovirrat ja ohjausmerkit.

Lisätiedot

Tehtävä 1. Tehtävä 2. Arvosteluperusteet Koherentti selitys Koherentti esimerkki

Tehtävä 1. Tehtävä 2. Arvosteluperusteet Koherentti selitys Koherentti esimerkki Tehtävä 1 Koherentti selitys Koherentti esimerkki ½p ½p Tehtävä 2 Täysiin pisteisiin edellytetään pelaajien tulostamista esimerkin järjestyksessä. Jos ohjelmasi tulostaa pelaajat jossain muussa järjestyksessä,

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

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

Luokka Murtoluku uudelleen. Kirjoitetaan luokka Murtoluku uudelleen niin, että murtolukujen sieventäminen on mahdollista. 1 Luokka Murtoluku uudelleen Kirjoitetaan luokka Murtoluku uudelleen niin, että murtolukujen sieventäminen on mahdollista. Sievennettäessä tarvitaan osoittajan ja nimittäjän suurin yhteinen tekijä (syt).

Lisätiedot

Sisällys. 14. Poikkeukset. Johdanto. Johdanto

Sisällys. 14. Poikkeukset. Johdanto. Johdanto Sisällys 14. Poikkeukset Johdanto. Tarkistettavat ja tarkistamattomat poikkeukset. Miten varautua poikkeukseen metodissa? Poikkeusten tunnistaminen ja sieppaaminen try-catchlauseella. Mitä tehdä siepatulla

Lisätiedot

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python Ohjelmoinnin perusteet Y Python T-106.1208 2.3.2011 T-106.1208 Ohjelmoinnin perusteet Y 2.3.2011 1 / 39 Kertausta: tiedoston avaaminen Kun ohjelma haluaa lukea tai kirjoittaa tekstitiedostoon, on ohjelmalle

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

7/20: Paketti kasassa ensimmäistä kertaa

7/20: Paketti kasassa ensimmäistä kertaa Ohjelmointi 1 / syksy 2007 7/20: Paketti kasassa ensimmäistä kertaa Paavo Nieminen nieminen@jyu.fi Tietotekniikan laitos Informaatioteknologian tiedekunta Jyväskylän yliopisto Ohjelmointi 1 / syksy 2007

Lisätiedot

9. Periytyminen Javassa 9.1

9. Periytyminen Javassa 9.1 9. Periytyminen Javassa 9.1 Sisällys Periytymismekanismi Java-kielessä. Piirteiden näkyvyys periytymisessä. Ilmentymämetodien korvaaminen. Luokkametodien peittäminen. Super-attribuutti. Override-annotaatio.

Lisätiedot

14. Poikkeukset 14.1

14. Poikkeukset 14.1 14. Poikkeukset 14.1 Sisällys Johdanto. Tarkistettavat ja tarkistamattomat poikkeukset. Miten varautua poikkeukseen metodissa? Poikkeusten tunnistaminen ja sieppaaminen try-catchlauseella. Mitä tehdä siepatulla

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

Sisältö Johdanto. Tiedostojen lukeminen. Tiedostojen kirjoittaminen. 26.2

Sisältö Johdanto. Tiedostojen lukeminen. Tiedostojen kirjoittaminen. 26.2 26. Tiedostot 26.1 Sisältö Johdanto. Tiedostojen lukeminen. Tiedostojen kirjoittaminen. 26.2 Johdanto Tiedostoja on käsitelty uudelleenohjattujen standardisyöte- ja tulostusvirtojen avulla. Tiedostoja

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

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

Ohjelmointi 1 / 2009 syksy Tentti / 18.12

Ohjelmointi 1 / 2009 syksy Tentti / 18.12 Tentti / 18.12 Vastaa yhteensä neljään tehtävään (huomaa että tehtävissä voi olla useita alakohtia), joista yksi on tehtävä 5. Voit siis valita kolme tehtävistä 1 4 ja tehtävä 5 on pakollinen. Vastaa JOKAISEN

Lisätiedot

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python Ohjelmoinnin perusteet Y Python T-106.1208 20.1.2010 T-106.1208 Ohjelmoinnin perusteet Y 20.1.2010 1 / 40 Arvon pyytäminen käyttäjältä Käyttäjän antaman arvon voi lukea raw_input-käskyllä. Käskyn sulkujen

Lisätiedot

Sisältö. Johdanto. Tiedostojen lukeminen. Tiedostojen kirjoittaminen. 6.2

Sisältö. Johdanto. Tiedostojen lukeminen. Tiedostojen kirjoittaminen. 6.2 6. Tiedostot 6.1 Sisältö Johdanto. Tiedostojen lukeminen. Tiedostojen kirjoittaminen. 6.2 Johdanto Tiedostoja on käsitelty uudelleenohjattujen standardisyöteja tulostusvirtojen avulla. Tiedostoja voidaan

Lisätiedot

Harjoitus 4 (viikko 47)

Harjoitus 4 (viikko 47) Kaikki tämän harjoituksen tehtävät liittyvät joko suoraan tai epäsuorasti kurssin toiseen harjoitustyöhön. Saa hyvän alun harjoitustyön tekoon, kun ratkaiset mahdollisimman monta tehtävää. Mikäli tehtävissä

Lisätiedot

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

Java-API, rajapinnat, poikkeukset, UML,... Java-API, rajapinnat, r poikkeukset, UML,... Janne Käki 12.10.2006 Keskeisimmät Java-API:n pakkaukset API = Application Programming Interface eli sovellusohjelmointirajapinta (!) pakkaus (engl. package)

Lisätiedot

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

Sisältö. 22. Taulukot. Yleistä. Yleistä Sisältö 22. Taulukot Yleistä. Esittely ja luominen. Alkioiden käsittely. Kaksiulotteinen taulukko. Taulukko metodin parametrina. Taulukko ja HelloWorld-ohjelma. Taulukko paluuarvona. 22.1 22.2 Yleistä

Lisätiedot

12. Javan toistorakenteet 12.1

12. Javan toistorakenteet 12.1 12. Javan toistorakenteet 12.1 Sisällys Yleistä toistorakenteista. Laskurimuuttujat. While-, do-while- ja for-lauseet. Laskuri- ja lippumuuttujat. Tyypillisiä ohjelmointivirheitä. Silmukan rajat asetettu

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

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python Ohjelmoinnin perusteet Y Python T-106.1208 9.2.2009 T-106.1208 Ohjelmoinnin perusteet Y 9.2.2009 1 / 35 Listat Esimerkki: halutaan kirjoittaa ohjelma, joka lukee käyttäjältä 30 lämpötilaa. Kun lämpötilat

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

Sisällys. 6. Metodit. Oliot viestivät metodeja kutsuen. Oliot viestivät metodeja kutsuen

Sisällys. 6. Metodit. Oliot viestivät metodeja kutsuen. Oliot viestivät metodeja kutsuen Sisällys 6. Metodit Oliot viestivät metodeja kutsuen. Kuormittaminen. Luokkametodit (ja -attribuutit).. Metodien ja muun luokan sisällön järjestäminen. 6.1 6.2 Oliot viestivät metodeja kutsuen Oliot viestivät

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

1 Tehtävän kuvaus ja analysointi

1 Tehtävän kuvaus ja analysointi Olio-ohjelmoinnin harjoitustyön dokumentti Jyri Lehtonen (72039) Taneli Tuovinen (67160) 1 Tehtävän kuvaus ja analysointi 1.1 Tehtävänanto Tee luokka, jolla mallinnetaan sarjaan kytkettyjä kondensaattoreita.

Lisätiedot

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

Sisältö. 2. Taulukot. Yleistä. Yleistä Sisältö 2. Taulukot Yleistä. Esittely ja luominen. Alkioiden käsittely. Kaksiulotteinen taulukko. Taulukko operaation parametrina. Taulukko ja HelloWorld-ohjelma. Taulukko paluuarvona. 2.1 2.2 Yleistä

Lisätiedot

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

// Tulostetaan double-tyyppiseen muuttujaan hinta tallennettu // kertalipun hinta ja vaihdetaan riviä. System.out.printf(%.1f euros. Lue kukin tehtävänanto huolellisesti ja kokonaisuudessaan ennen kuin aloitat vastaamisen. Kustakin tehtävästä voi saada 0 6 pistettä. Tentin läpipääsyraja on 12 / 24 pistettä. Ratkaisut palautetaan WETO-järjestelmään

Lisätiedot

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

Yleistä. Nyt käsitellään vain taulukko (array), joka on saman tyyppisten muuttujien eli alkioiden (element) kokoelma. 2. Taulukot 2.1 Sisältö Yleistä. Esittely ja luominen. Alkioiden käsittely. Kaksiulotteinen taulukko. Taulukko operaation parametrina. Taulukko ja HelloWorld-ohjelma. Taulukko paluuarvona. 2.2 Yleistä

Lisätiedot

11. Javan toistorakenteet 11.1

11. Javan toistorakenteet 11.1 11. Javan toistorakenteet 11.1 Sisällys Laskuri- ja lippumuuttujat. Sisäkkäiset silmukat. Tyypillisiä ohjelmointivirheitä: Silmukan rajat asetettu kierroksen verran väärin. Ikuinen silmukka. Silmukoinnin

Lisätiedot

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

Sisällys. 19. Olio-ohjelmointia Javalla. Yleistä. Olioiden esittely ja alustus Sisällys 19. Olio-ohjelmointia Javalla Olioiden esittely ja alustus. Metodit Yleistä metodeista. Mihin metodeja tarvitaan? Metodien määrittely. Omat metodit: nimeäminen, paikka, kutsuminen, parametrit

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

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

Ohjelmointi 1 C#, kevät 2013, 2. tentti ITKP102 Ohjelmointi 1 C# 15.5.2013 1 / 6 Ohjelmointi 1 C#, kevät 2013, 2. tentti Tentaattori Antti-Jussi Lakanen Tässä tentissä saa olla mukana omia muistiinpanoja yhden arkin verran. Tentin valvojalla

Lisätiedot

Harjoitus 5 (viikko 48)

Harjoitus 5 (viikko 48) Moni tämän harjoituksen tehtävistä liittyy joko suoraan tai epäsuorasti kurssin toiseen harjoitustyöhön. Harjoitustyö edistyy sitä paremmin, mitä enemmän tehtäviä ratkaiset. Mikäli tehtävissä on jotain

Lisätiedot

Sisältö. Johdanto. Tiedostojen lukeminen. Tiedostojen kirjoittaminen. 6.2

Sisältö. Johdanto. Tiedostojen lukeminen. Tiedostojen kirjoittaminen. 6.2 6. Tiedostot 6.1 Sisältö Johdanto. Tiedostojen lukeminen. Tiedostojen kirjoittaminen. 6.2 Johdanto Tiedostoja on käsitelty uudelleenohjattujen standardisyöte- ja tulostusvirtojen avulla. Tiedostoja voidaan

Lisätiedot

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin peruskurssi Y1 Ohjelmoinnin peruskurssi Y1 CS-A1111 26.9.2018 CS-A1111 Ohjelmoinnin peruskurssi Y1 26.9.2018 1 / 21 Oppimistavoitteet: tämän luennon jälkeen Osaat kirjoittaa for-käskyn avulla ohjelman, joka toistaa haluttua

Lisätiedot

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op. Poikkeukset ja tietovirrat: Virhetilanteiden ja syötevirtojen käsittely

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op. Poikkeukset ja tietovirrat: Virhetilanteiden ja syötevirtojen käsittely Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Poikkeukset ja tietovirrat: Virhetilanteiden ja syötevirtojen käsittely Poikkeukset Poikkeuksella tarkoitetaan yllättävää ajonaikaista tilannetta, joka

Lisätiedot

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin peruskurssi Y1 Ohjelmoinnin peruskurssi Y1 CSE-A1111 30.9.2015 CSE-A1111 Ohjelmoinnin peruskurssi Y1 30.9.2015 1 / 27 Mahdollisuus antaa luentopalautetta Goblinissa vasemmassa reunassa olevassa valikossa on valinta Luentopalaute.

Lisätiedot

Poikkeustenkäsittely

Poikkeustenkäsittely 1 Poikkeustenkäsittely Mitä poikkeustenkäsittely tarkoittaa? Poikkeuksen käsitteleminen Poikkeusluokkien hierarkia Poikkeuksen heittäminen 1 Mitä poikkeustenkäsittely tarkoittaa? Poikkeus (Exception) on

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

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

14. Hyvä ohjelmointitapa 14.1

14. Hyvä ohjelmointitapa 14.1 14. Hyvä ohjelmointitapa 14.1 Yleistä Ohjelman elinkaari ei tyypillisesti pääty sen toteuttamiseen; ohjelmaa voidaan käyttää ja ylläpitää jopa vuosikymmeniä. Jotta koodin muuttaminen on mahdollista, sen

Lisätiedot

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

Olion elinikä. Olion luominen. Olion tuhoutuminen. Olion tuhoutuminen. Kissa rontti = null; rontti = new Kissa(); Sisällys 7. Oliot ja viitteet Olio Java-kielessä. Olion luominen, elinikä ja tuhoutuminen. Viitteiden käsittelyä: sijoitus, vertailu ja varautuminen null-arvoon. Viite metodin paluuarvona.. 7.1 7.2 Olio

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

Ohjelmointi 2 / 2010 Välikoe / 26.3

Ohjelmointi 2 / 2010 Välikoe / 26.3 Ohjelmointi 2 / 2010 Välikoe / 26.3 Välikoe / 26.3 Vastaa neljään (4) tehtävään ja halutessa bonustehtäviin B1 ja/tai B2, (tuovat lisäpisteitä). Bonustehtävät saa tehdä vaikkei olisi tehnyt siihen tehtävään

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

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

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

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Rajapinnat ja sisäluokat Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Rajapinnat ja sisäluokat Rajapinnat Java-kieli ei tue luokkien moniperintää. Jokaisella luokalla voi olla vain yksi välitön yliluokka. Toisinaan olisi

Lisätiedot