1. OPINTOJAKSON TAVOITTEET, SISÄLTÖ JA ESITIEDOT... 3 2. SUORITUSTAPA... 4



Samankaltaiset tiedostot
5. HelloWorld-ohjelma 5.1

Java-kielen perusteet

5. HelloWorld-ohjelma 5.1

Koottu lause; { ja } -merkkien väliin kirjoitetut lauseet muodostavat lohkon, jonka sisällä lauseet suoritetaan peräkkäin.

Java-kielen perusteet

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

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

Sisällys. 11. Javan toistorakenteet. Laskurimuuttujat. Yleistä

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

Ehto- ja toistolauseet

4. Lausekielinen ohjelmointi 4.1

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

Java-kielen perusteita

12. Javan toistorakenteet 12.1

Johdatus Ohjelmointiin

Pedacode Pikaopas. Java-kehitysympäristön pystyttäminen

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

Sisällys. 3. Pseudokoodi. Johdanto. Johdanto. Johdanto ja esimerkki. Pseudokoodi lauseina. Kommentointi ja sisentäminen.

14. Hyvä ohjelmointitapa 14.1

4. Lausekielinen ohjelmointi 4.1

Ohjelmoinnin perusteet Y Python

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

12. Javan toistorakenteet 12.1

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

13. Hyvä ohjelmointitapa (osa 1) 13.1

11. Javan toistorakenteet 11.1

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

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

Lohkot. if (ehto1) { if (ehto2) { lause 1;... lause n; } } else { lause 1;... lause m; } 15.3

1. Omat operaatiot 1.1

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

Sisällys. 15. Lohkot. Lohkot. Lohkot

Ohjelmoinnin perusteet Y Python

13. Loogiset operaatiot 13.1

Ohjelmoinnin perusteet Y Python

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

Java-kielen perusteita

ITKP102 Ohjelmointi 1 (6 op)

Ohjelmoinnin perusteet Y Python

Muuttujien roolit Kiintoarvo cin >> r;

7. Näytölle tulostaminen 7.1

IDL - proseduurit. ATK tähtitieteessä. IDL - proseduurit

ATK tähtitieteessä. Osa 3 - IDL proseduurit ja rakenteet. 18. syyskuuta 2014

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

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

Java-kielen perusteita

Sisällys. 12. Javan toistorakenteet. Yleistä. Laskurimuuttujat

Ohjelmoinnin perusteet Y Python

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

P e d a c o d e ohjelmointikoulutus verkossa

Java-kielen perusteet

11. Javan valintarakenteet 11.1

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

Lohkot. if (ehto1) { if (ehto2) { lause 1;... lause n; } } else { lause 1;... lause m; } 16.3

Ohjelmoinnin perusteet, syksy 2006

Ohjelmoinnin peruskurssi Y1

Lauseet. Ehdollinen lause. Tämän osan sisältö. Ehdollinen lause. Esimerkkejä. Yksinkertainen ehto. Lohkosulut ja sisennys. Ehdollinen lause if

Ohjelmoinnin perusteet Y Python

1 Tehtävän kuvaus ja analysointi

Metodien tekeminen Javalla

13. Loogiset operaatiot 13.1

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

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

Ohjelmoinnin perusteet Y Python

Tutoriaaliläsnäoloista

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

Harjoitustyö: virtuaalikone

Ohjelmoinnin perusteet Y Python

Ohjelmointi 1 / 2009 syksy Tentti / 18.12

LOAD R1, =2 Sijoitetaan rekisteriin R1 arvo 2. LOAD R1, 100

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

11. Javan valintarakenteet 11.1

Ohjelmointi 2 / 2010 Välikoe / 26.3

Ohjelmoinnin perusteet Y Python

2 Konekieli, aliohjelmat, keskeytykset

Tähtitieteen käytännön menetelmiä Kevät 2009 Luento 4: Ohjelmointi, skriptaus ja Python

Taulukot. Jukka Harju, Jukka Juslin

Javan perusteita. Janne Käki

Java kahdessa tunnissa. Jyry Suvilehto

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

Luento 5. Timo Savola. 28. huhtikuuta 2006

5/20: Algoritmirakenteita III

815338A Ohjelmointikielten periaatteet Harjoitus 5 Vastaukset

etunimi, sukunimi ja opiskelijanumero ja näillä


Ohjelmoinnin jatkokurssi, kurssikoe

ITKP102 Ohjelmointi 1 (6 op)

AS C-ohjelmoinnin peruskurssi 2013: C-kieli käytännössä ja erot Pythoniin

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

C-ohjelmoinnin peruskurssi. Pasi Sarolahti

MITÄ JAVASCRIPT ON?...3

811120P Diskreetit rakenteet

1. Olio-ohjelmointi 1.1

TAITAJA 2007 ELEKTRONIIKKAFINAALI KILPAILIJAN TEHTÄVÄT. Kilpailijan nimi / Nro:

815338A Ohjelmointikielten periaatteet Harjoitus 2 vastaukset

Python-ohjelmointi Harjoitus 2

Ohjelmoinnin peruskurssi Y1

ITKP102 Ohjelmointi 1 (6 op)

C-ohjelma. C-ohjelma. C-ohjelma. C-ohjelma. C-ohjelma. C-ohjelma. Operaatioiden suoritusjärjestys

Harjoitus 5 (viikko 48)

Transkriptio:

Sisällys 1. OPINTOJAKSON TAVOITTEET, SISÄLTÖ JA ESITIEDOT... 3 2. SUORITUSTAPA... 4 3. MATERIAALIT JA OHJELMISTOT... 4 3.1 Oppimateriaalit ja niiden lukujärjestys sekä ViLLE... 4 3.2 Oheismateriaali... 6 3.3 Java-kääntäjiä ja kehitysympäristöjä... 6 3.4 Luokat OmaIO ja Scanner... 7 4. OPISKELUN ETENEMINEN... 8 VIIKKO 45... 10 Lyhyt johdatus Javaan ja sen käyttöön esimerkeillä... 10 Javan perusohjausrakenteet ja perustyypit 10 Kaksi yksinkertaista Java-ohjelmaa 12 Ohjelmien kirjoittaminen sekä suorittaminen komentotulkilla ja DrJavalla (main-metodin parametrille String[]args ei anneta arvoja) 17 Harjoitustehtävät... 20 VIIKKO 46... 21 Peruskäsitteitä: tyypin käsite, perustyypit (kokonaisluvut, desimaaliluvut, looginen tieto ja merkkitieto) ja lausekkeet (aritmeettiset ja loogiset), asetuslause. Syöttötietojen antaminen ohjelmalle komentoriviltä ja luokkien Scanner ja OmaIO avulla.... 21 Alustus 21 Opintomonisteen asioita kootusti ja esimerkkejä 22 Syötteen antaminen ohjelmalle 30 Syötteen lukeminen näppäimistöltä ohjelman suorituksen aikana käyttäen luokkia OmaIO ja Scanner 30 Syötteen antaminen ohjelmalle main-metodin parametrin (String[] args) välityksellä ohjelman käynnistyksen yhteydessä: 1) suoritus käyttöjärjestelmän komentoriviltä (ja Integer.parseInt() sekä Double.parseDouble()) ja 2) käyttäen DrJavaa 32 Harjoitustehtävät... 33 VIIKKO 47... 35 Perusohjausrakenteet: peräkkäisyys, valintarakenne if, alkuehtoinen toistorakenne while. Useita esimerkkiohjelmia.... 35 Opintomonisteen asiat lyhyesti ja esimerkkejä 35 Esimerkkiohjelma: näppäimistöltä syötettyjen lukujen keskiarvo 39 Harjoitustehtävät... 43 1

VIIKKO 48... 46 Metodit eli aliohjelmat.... 46 Alustus 46 Esimerkkejä 52 Harjoitustehtävät... 58 VIIKKO 49... 60 Lisää lauseita: lausekelause, for-toisto, loppuehtoinen toisto do while, monivalintalause switch sekä break- ja continue-lauseet.... 60 Alustus 60 Tarkennuksia opintomonisteeseen ja lisäesimerkkejä 60 Harjoitustehtävät... 66 VIIKKO 50... 67 Taulukot, useita esimerkkejä (mm. lukujen lukeminen taulukkoon, lineaarinen haku, lajittelu), metodikirjaston tekeminen.... 67 Taulukot 67 Metodi- eli aliohjelmakirjaston muodostaminen 81 Harjoitustehtävät... 84 LUENTOPÄIVÄ 12.12.2015... 85 Tyypin käsite, ohjausrakenteet, metodit ja niiden parametrit, taulukoiden perusteet, merkkijonot, useita esimerkkiohjelmia... 85 VIIKKO 51... 87 Johdatus olio-ohjelmoinnin perusteisiin: Luokat String, Random ja Math.... 87 Alustus 87 Luokkakirjasto (API eli Application Programming Interface) 88 Luokka String 89 Luokka Random 94 Harjoitustehtävät... 95 VIIKKO 1... 96 Jatketaan edellisen viikon asioita. Luokka Arrays staattisten listojen (taulukoiden) käsittelyyn: mm. lajittelu käyttäen kirjastometodia sort. Tekstitiedoston käsittely.... 96 Harjoitustehtävät... 97 LIITE. Luokka Scanner: lukeminen näppäimistöltä ja tektitiedostosta... 98 Näppäimistöltä lukeminen (näppäimistön syöttövirran läpikäynti) 98 Levyllä olevasta tekstitiedostosta lukeminen 103 2

1. OPINTOJAKSON TAVOITTEET, SISÄLTÖ JA ESITIEDOT Opintojaksolla laajennetaan ja konkretisoidaan opintojaksolla Tietojenkäsittelytieteen perusteet I (TTP I) annettua kuvaa algoritmien muodostamisesta. Kurssin tavoitteena on tutustua konkreettisesti Java-kieltä käyttäen ohjelmoinnin peruskäsitteisiin ja konstruktioihin sekä oppia tekemään yksinkertaisia sovelluksia. Kurssilla tutustutaan myös olioihin ja opetellaan käyttämään niitä, mutta omien luokkien muodostaminen ei kuulu kurssin aihealueeseen. Kurssilla tarkastellaan mm. seuraavia rakenteellisen ohjelmoinnin peruskäsitteitä: muuttujat, arvon käsite, tyypit, lausekkeet, lauseet, ohjausrakenteet, aliohjelman käsite, modulaarisuus, rekursio ja staattisen luokan käsite. Olioihin tutustutaan käyttämällä niistä yksinkertaisimpia (String, taulukko). Kurssin tarkoituksena on oppia ohjelmoinnin perusteet käyttäen apuna Java-ohjelmointikieltä. Näin ollen kyseessä on yleensä (olio-)ohjelmoinnin eikä pelkästään Java- kurssi. Huomaa siis, että esitetyt ratkaisumenetelmät eivät ole sidottuja tiettyyn ohjelmointikieleen. Kurssin aikana kannattaa palata useasti TTP I-kurssiin, jolla monet tällä kurssilla esitettävät asiat esitettiin yleisellä tasolla. Tämän kurssin yhtenä tavoitteena on antaa ohjelmoinnista sellainen kuva, jonka perusteella muiden (olio-)ohjelmointikielten opiskelu sujuu muitta mutkitta. Oliokielien ongelma on se, että yksinkertaisiakaan ohjelmia ei voi täysin ymmärtää ellei luokkien ja olioiden maailma ole jollakin tasolla tuttu. Näin ollen luokkien määrittelyissä on aluksi useita vieraita sanoja (määreitä), joiden merkitys avautuu vasta myöhemmin. Näin ollen opiskelussa noudatetaan spiraalilähestymistapaa, jossa kaikkia asioita ei tarvitse (eikä voi) täysin ymmärtää aluksi, vaan asioihin palataan myöhemmin toistuvasti, jolloin tietämys tarkentuu vähitellen. Lisäksi esimerkkien kautta oppiminen on tärkeä komponentti opiskelussa. Olio-ohjelmoinnin opiskelussa voidaan edetä joko menemällä heti 'luokkien ja olioiden maailmaan' tai unohtamalla aluksi oliot tarkastelemalla ensin perinteellistä ohjelmointia, jossa käsitellään vain primitiivistä tietoa (perustyypit, esim. luvut). Tällä kurssilla noudatetaan jälkimmäistä lähestymistapaa, koska tällöin ei tarvitse omaksua kaikkea yhdellä kertaa. Nimittäin olio-ohjelmoinnissa tarvitaan myös kaikki perinteellisen ohjelmoinnin välineet: algoritmeja ohjataan peräkkäis-, valinta- ja toistorakenteilla tallentamalla arvoja muistipaikkoihin. 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 luokan käsite. Näin ollen seuraavalla opintojaksolla olio-ohjelmoinnin perusteet (OOP) siirrymme motivoidusti olio-ohjelmoinnin peruskäsitteisiin: luokka ja olio. Läheskään kaikkia Javaan liittyviä asioita ei näin lyhyellä kurssilla keritä käsittelemään. Esimerkiksi appletteja (eli sovelmia) ei tällä kurssilla käsitellä. Toisaalta ohjelmoinnin kannalta ei ole tärkeintä se, että osaa piirtää ruudulle tietynlaisen kuvion, vaan perusasiat ja käsitteet, joita tarvitaan tietenkin myös piirtämisessä ja applettien tekemisessä. Niiden teko perustuu vahvasti luokkakirjastojen käyttöön (luokka Applet ja lukuisa joukko muita luokkia). Olioohjelmoinnissa onkin hyvin tärkeätä se, että osaa käyttää luokkakirjastoja. Tällä jaksolla tutustutaan vain luokkien String, Random ja Math kirjastometodeihin, mutta seuraavalla jaksolla OOP tarkastellaan luokkakirjastoja laajemmin. Esitiedot: Tämän opintojakson esitietoina vaaditaan opintojakso Tietojenkäsittelytieteen perusteet I tai vastaavat tiedot. 3

2. SUORITUSTAPA Opintojaksoon kuuluu tentti. Tenttioikeuden saa kun on tehnyt alla olevista tehtävistä vähintään 30% ja lisäksi AOPin ViLLE-tehtävien yhteismäärä on vähintään 200. Mitä enemmän teet kumpiakin tehtäviä, sitä enemmän saat tentissä hyvitystä. ViLLE-tehtävät ovat kuitenkin auki koko ajan, joten ne voi tehdä myös myöhemminkin, joskin oppimisen kannalta ne kannattaa tehdä aikataulun mukaisesti. ViLLE-tehtävistä saa hyvitystä (bonusta) vain ensimmäisessä tentissä sen mukaan mikä on saavutettu pistemäärä. Tentin läpäisemiseen vaaditaan n. 50 % maksimipistemäärästä. Yksi kysymys on (ainakin osaksi) essee, 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 ja Javan tiettyjen tärkeiden avainsanojen merkitys. Kysytyt ohjelmointitehtävät ovat hyvin paljon opintomonisteessa ja tässä opiskeluoppaassa esitettyjen esimerkkien ja harjoitustehtävien kaltaisia (vinkkejä löytyy kurssisivuilta). Tenttiin kannattaa valmistautua lukemalla erityisesti oppimateriaalin esimerkit, harjoitustehtävien malliratkaisut ja ViLLE-tehtävät. Ohjelmointitehtävissä on tärkeintä ohjelmien looginen toimivuus eikä niinkään syntaksi. 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 maagisuutta, 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). Tenttipäivät: Ensimmäinen tentti on ke 13.1.2016. Huomaa, että Turun tentti on yliopistonmäellä ja siihen tulee ilmoittautua viimeistään viikkoa ennen netin kautta (ks. kurssisivut). Muut tentit ilmoitetaan kurssisivuillamme. 3. MATERIAALIT JA OHJELMISTOT 3.1 Oppimateriaalit ja niiden lukujärjestys sekä ViLLE Opintojakson oppimateriaaleina käytetään opiskeluopasta (tämä moniste) sekä opintomonistetta Sami Pyöttiälä, Ville Leppänen ja Jorma Boberg: Algoritmien ja ohjelmoinnin peruskurssi Javakielellä, 2011. Opiskeluopas on laadittu lähes itseriittoiseksi, joskin viittauksia opintomonisteen esimerkkeihin ei voi ymmärtää, ellei opintomoniste ole käsillä. Näin ollen materiaaleissa (opintomoniste ja opiskeluopas) on hyvin paljon päällekkäisyyttä: monet asiat selostetaan kummassakin, mutta hiukan eri sanoin. Lisäksi monet asiat käsiteltiin jo jaksolla TTP I. Opintomoniste on 4

perusteellisempi eli asiat selitetään opiskeluoppaassa lyhyemmin puuttumatta kaikkiin yksityiskohtiin. Toisaalta opiskeluoppaassa on useita käytännöllisiä tarkennuksia ja esimerkkejä. Opintomonisteessa on viittauksia luentoihin, jotka eivät tietenkään koske meidän kurssia. Opintomonisteessa on etenkin alussa melko vaikeita esimerkkejä, joilla ei kannata opiskelua aloittaa (nämä mainitaan tässä oppaassa). Tässä oppaassa on useita yksinkertaisempia esimerkkejä. Tentissä osattavat asiat esitetään tässä oppaassa: tämän oppaan asiat ja oppaassa mainitut opintomonisteen kohdat, ellei erikseen ole mainittu, että asiaa ei vaadita. Suositus materiaalien lukujärjestyksestä: Etene opiskeluoppaan mukaisesti ja siirry opintomonisteeseen aina kun viitataan esimerkkiin, jota opiskeluoppaassa ei ole esitetty tai jos opiskeluoppaassa sanotaan: Lue opintomonisteen... Nimittäin opiskeluoppaassa on useat asiat tiivistetty ja sen lukeminen riittää ensimmäisellä lukukerralla. Älä siis lue opintomonistetta aluksi systemaattisesti, vaan tämä opiskeluopas on päämateriaali. Aloita tämän jälkeen viikon harjoitustehtävien tarkastelu. Lue sen jälkeen tarpeen mukaan opintomonisteen teksti, jolloin saat asioista tarkemman kuvan. Halutessasi voit tietenkin lukea materiaalit (opiskeluopas ja opintomoniste) siinä järjestyksessä kuin haluat, mutta lue kullakin viikolla kuitenkin ensin opiskeluoppaan kohta Alustus. Opintomoniste ja opiskeluopas ovat riittävät materiaalit, mutta tutustu tarvittaessa kurssisivuilla mainittuihin materiaaleihin, jotka ovat hyviä. Joka viikolla tulee käyttää havainnollistusohjelmaa ViLLE. Ensimmäisellä viikolla käsitellään jakson TTP I sivuilla olevaa ViLLEä sen jälkeen käsitellään pääasiassa AOPia varten tehtyjä ViLLE-tehtäviä ja linkki näihin löytyy AOPin sivuilta. Viikolle tarkoitetut tehtävät on merkitty kullekin viikolle ja ne olisi hyvä tehdä tällöin. Tehtävät ovat kuitenkin auki koko ajan, joten ne voi tehdä myös myöhemminkin, joskin oppimisen kannalta ne kannattaa tehdä aikataulun mukaisesti. ViLLE-tehtävistä saa hyvitystä (bonusta) sen mukaan paljon on saanut pisteitä ensimmäiseen tenttiin mennessä. Lisäksi jokaisen viikon aluksi tulee tutkia jakson TTP I sivujen ViLLEn kautta TTP I:illä käsiteltyjä tuttuja ohjelmia Javalla (valitse Rinnakkaisnäkymä ja kieleksi Java). Voit myös suorittaa TTP I:n ViLLEn tehtäviä uudestaan, koska aiemmin saamasi pisteet ovat tallennettu ja ne eivät vaikuta kurssiin AOP. 5

3.2 Oheismateriaali Koska Java on nykyään laajalle levinnyt myös korkeakoulujen opetukseen, on siihen liittyvää kirjallisuutta saatavilla paljon sekä kirjakaupoista että internetistä. Useimmissa kirjoissa käydään läpi Java-kielen syntaksi, mutta ei kuitenkaan ohjelmoinnin perusteita. Kirjat eivät näin ollen aina välttämättä sovi itsenäiseen opiskeluun. Muista kuitenkin, että ohjelmointia ei opita pelkästään lukemalla valmiita esimerkkiohjelmia, vaan ne tulee myös ymmärtää. On parempi tutustua perusteellisesti muutamaan hyvään lähteeseen kuin kahlata pintapuolisesti läpi useita lähteitä. Java-ohjelmointia (ja myös C++) käsitteleviä kirjoja vaivaa mammuttitauti: kirjat ovat lähes poikkeuksetta melkein 1000-sivuisia. Myös internetin käyttö voi johtaa 'loputtomaan suohon' ja lisäksi lukija ei voi olla varma kaikkien lähteiden hyvyydestä ja eikä edes oikeellisuudesta. Suomenkieliset kirjat ovat usein käännöksiä ja joskus kääntäjänä ei ole ollut ohjelmoinnin asiantuntija, jolloin kirjan luettavuus ja terminologia voi olla huonoa. Kurssisivuillamme luetellaan hyviä lähteitä. 3.3 Java-kääntäjiä ja kehitysympäristöjä Java-ohjelmointikieli kehitettiin Microsystemsillä ja JDK 1.0 (Java Development kit) ilmestyi syksyllä 1995. Uusin versio on JDK 8 (ilmestyi 2014), mutta tällä kurssilla riittää myös versiot 6 ja 7 (joita kutsutaan myös nimillä 1.6 ja 1.7). Ohjelmiston voi ladata verkosta ilmaiseksi useimpiin käyttöjärjestelmiin: Windows, Linux, Unix ja MacOS (katso installointiohjeet kurssisivuiltamme). JDK on yksinkertainen, komentorivipohjainen ohjelmankehitysympäristö, jonka mukana tulee ohjelmat: javac.exe: Java-kääntäjä java.exe: Java-tulkki appletviewer.exe: applettien (sovelmien) suoritusohjelma jdb.exe: debuggeri eli virheenjäljitysohjelma javadoc.exe: dokumentoinnin apuväline Kääntäjä tuottaa tavukoodia (byte code), jota Java-virtuaalikone (= tulkki) suorittaa. Ohjelman suoritus komentoriviltä (command prompt) käyttäen komentotulkkia: javac <ohjelman_nimi>.java java <ohjelman_nimi> <mahdolliset parametrit> joista edellinen tuottaa tavukoodiksi käännetyn tiedoston (<ohjelman_nimi>.class) ja jälkimmäinen käynnistää virtuaalikoneen, joka tulkitsee ja suorittaa ohjelman. Web-selaimissa on sisäänrakennettu Java-virtuaalikone (=ohjelma java.exe, jolla voidaan suorittaa käännettyjä Java-ohjelmia). Näin ollen selaimet osaavat suorittaa Java-appletteja. Virtuaalikone JRE (Java Runtime Environment) on saatavana myös erikseen. Java on suunniteltu erityisesti turvallisuutta (suojausta) silmälläpitäen, joka on tärkeää nimenomaan verkko-ohjelmoinnissa. Kaksi erityisesti suojattavaa kohdetta: Keskusmuisti: Ei mahdollista tehdä laittomia muistiviittauksia ohjelma-alueen ulkopuolelle. Levymuisti: Verkosta ladattavat appletit eivät oletusarvoisesti saa käsitellä asiakaskoneen levyä; tätä valvoo turvallisuusmanageri. 6

Itse ohjelma voidaan kirjoittaa millä tahansa merkkipohjaisella tekstieditorilla (esim. NotePad, mutta ei esim. Wordillä), jonka jälkeen sen voi kääntää ja suorittaa komentoriviltä kuten yllä on kerrottu. Tämä on hiukan monimutkaista ja sen vuoksi on olemassa ohjelman kehitysympäristöjä, joiden avulla ohjelmien kirjoittaminen ja suorittaminen käy helposti. Tällainen on esim. ilmainen DrJava, jonka käytöstä annetaan ohjeet alla ja kurssisivuilla. Lisäksi saatavilla on ilmaiset ammattimaiset kehitysympäristöt NetBeans ja Eclipse (ks. kurssisivut). Myös JCreator on hyvä ympäristö, mutta se on muuttunut koeajan jälkeen maksulliseksi, joskin maksu on vain 35$. Nämä kaikki ovat siis ohjelmia, joiden avulla voidaan kirjoittaa Java-ohjelma (ne sisältävät siis editorin eli tekstinkäsittelyohjelman), kääntää ohjelma ja suorittaa se valitsemalla kehitysympäristön valikosta niitä vastaavat toiminnot. Näin ollen meidän ei tarvitse käyttää edellä esitettyjä komentorivikomentoja (esim. kehitysympäristön toiminta käännä, Compile, saa aikaan komentorivikomennon javac <ohjelman nimi> ). Tarvittavien ohjelmien asennusohjeet annetaan kurssisivuillamme. Java-kieli, Java-appletit ja JavaScript-kieli sekoitetaan usein keskenään. Java-kieli on arkkitehtuuririippumaton olio-ohjelmointikieli, jolla ohjelmoimiseen tarvitaan erillinen kääntäjä, jolla ohjelmakoodi käännetään Javan virtuaalikoneelle sopivaan binäärimuotoon (tavukoodiohjelma; class-päätteisiksi tiedostoiksi). Tavukoodiohjelmat ovat alustariippumattomia, joten niitä voidaan ajaa eri käyttöjärjestelmien alaisuudessa käyttäen Javavirtuaalikonetta (JRE, Java Runtime Environment). Internet-selaimet osaavat suorittaa näitä class-tiedostoja. Java-sovelma (Java Applet) on epäitsenäinen, asiakaskoneessa selaimen yhteydessä suoritettava Java-ohjelma. Sovelmia ajetaan selaimessa, johon on asennettu Javavirtuaalikone (JRE). JavaScript on taas hyvin yksinkertainen skriptikieli, joka kirjoitetaan suoraan HTML-koodin sekaan eikä erillistä kääntäjää tarvita. 3.4 Luokat OmaIO ja Scanner Javan versiota 5.0 alemmissa versioissa lukeminen näppäimistöltä tuli toteuttaa melko vaikeasti ja sen vuoksi lähes jokainen Java-kirjan kirjoittaja kirjoitti lukemista ja kirjoittamista varten oman metodikirjaston 1 eli aliohjelmakirjaston (mekin teemme tällaisen taulukoiden käsittelyyn sivulla 2 82), johon oli kätketty monimutkaiset I/O-operaatiot. Luokka OmaIO.java on Ville Leppäsen kirjoittama metodikirjasto joka sisältää tarvittavat metodit näppäimistöltä lukemista ja ruudulle kirjoittamista varten. OmaIO-luokan sisältö on kuvattu kurssisivuilla ja yksinkertainen esimerkki sen käytöstä esitetään opiskeluoppaan sivulla 30. Jotta voisit käyttää ohjelmassasi luokan OmaIO metodeja, niin sinun tulee kopioida luokka OmaIO.java samaan hakemistoon, missä suoritettava ohjelmasi sijaitsee. Sen jälkeen sinun tulee kääntää (compile) se normaaliin tapaan, jolloin syntyy tiedosto OmaIO.class. Tämän jälkeen luokan metodeja voi kutsua mistä luokasta tahansa muodossa OmaIO.<luokan metodi>(<parametrilista>); esim. OmaIO.lueInt(); joka siis palauttaa näppäimistöltä syötetyn kokonaisluvun. Luokan useat metodit ovat parametrittomia (kuten yllä lueint) ja ylikuormitettuja (ks. s. 31). Metodit ovat sitkeitä eli ne 1 Javan yhteydessä sana 'metodi' tarkoittaa TTP I-jakson terminologian käsitettä moduuli. Usein näitä kutsutaan myös aliohjelmiksi tai rutiineiksi, joskin aliohjelman käsite on vanha ja hiukan suppeampi. 2 Pelkkä viittaus sivunumeroon tarkoittaa aina tämän opiskeluoppaan sivunumeroa. Jos viitataan opintomonisteeseen, se mainitaan erikseen: esim. opintomoniste s. 35 tai Luku 4.3, s. 39. 7

lukevat syöttöä niin kauan, kunnes annetaan kelvollinen arvo; esim. jos kutsutaan metodia OmaIO.lueInt(), niin desimaalipisteen sisältävä luku ei kelpaa, vaan metodi pyytää käyttäjää antamaan luvun uudestaan. Muita luokassa OmaIO olevia tarpeellisia metodeja: luedouble, luelong sekä LueString ja luerivi, joilla voidaan lukea tekstiä. Javan versiosta 5.0 lähtien Javassa on mukana luokka Scanner, jonka avulla voidaan lukea helposti näppäimistöä, mutta tehdä paljon muutakin. Luokkaa Scanner tarkastellaan tarkemmin tämän oppaan Liitteessä ja sen käytöstä on yksinkertainen esimerkki s. 31. Lisäksi kurssisivuilla on tarkemmat ohjeet luokan Scanner käytöstä. Tässä opiskeluoppaassa käytetään sekä luokkaa Scanner että OmaIO, mutta muutos näiden välillä voidaan tehdä helposti em. esimerkkien ja lopussa olevan Liitteen avulla. Luokan OmaIO käyttö on helpompaa, koska se sisältää lukulauseet monen tyyppiselle datalle ja lisäksi sen metodit ovat sitkeitä eli ohjelma ei kaadu virheelliseen syöttöön (kuten luokkaa Scanner käytettäessä), vaan metodi kysyy tällöin syötettä uudestaan. Erityisesti ohjelmointia opetellessa luokan OmaIO käyttö on perusteltua, koska tällöin voimme keskittyä pääasiaan eli algoritmeihin. Lisäksi luokan OmaIO käyttö opettaa samalla sen, miten itse tehtyä metodikirjastoa käytetään. 4. OPISKELUN ETENEMINEN Opintoryhmäkokoontumisten lisäksi järjestetään yksi lähiopetustilaisuus, jolloin 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 ja opintomonisteen avustamana, viikoittaisten harjoitustehtävien itsenäiseen laatimiseen ja niistä ryhmäkokoontumisissa annettavaan palautteeseen. Lisäksi Moodlessa annetaan vinkkejä tehtävien tekemiseen ja siellä voi keskustella myös. 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. Ohjelma tulee aina suunnitella ja laatia ensin paperilla ja vasta sitten näpytellä tietokoneeseen. Viikolle tarkoitetuista tehtävistä tulee suurin osa testata tietokoneella. Osassa tehtävistä pyydetään testaamaan ohjelmaa tietokonetta käyttäen ja näistä kertyvät myös bonukset, jos ohjelmasi toimii oikein! Opintoryhmäkokoontumisen yhteydessä käsitellään viikolle tarkoitetut harjoitustehtävät joiden yhteydessä varmistetaan, että viikon asiat on ymmärretty. Tällöin opiskelijan tulee olla itse aktiivinen ja kysyä viikon epäselvistä asioista ja esimerkeistä. Harjoitustehtävien käsittelyssä voidaan käyttää hyväksi erilaisia pienryhmätyöskentelyn muotoja (ks. opiskelijan käsikirja). Ryhmäkokoontumisessa tuutori jakaa vastuuopettajan laatimat harjoitustehtävien mallivastaukset ja ne julkaistaan myös Moodlessa. Mikäli opintoryhmäkokoontumisiin on suunniteltu jotakin muuta edellisen lisäksi, on siitä maininta viikoittaisen ohjelman kuvauksen yhteydessä. Etenkin juuri tämän opintojakson yhteydessä 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 8

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 TTP I asiat ovat hallinnassa. On tietenkin selvää, että arvioitu tuntimäärä vaihtelee hyvinkin paljon riippuen opiskelijasta. 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. Ryhmäkokoontumisia voidaan pitää Tietokoneluokassa. Tällöin tulee kuitenkin pitää huolta siitä, että viikolle tarkoitetut asiat tulee käsiteltyä. Nimittäin koneen käyttö saattaa helposti 'varastaa koko shown' ja aika saattaa kulua syntaksivirheiden parissa, jolloin viikolle tarkoitetut asiat jäävät vähemmälle huomiolla. Huomaa, että käsitteet ovat hyvin tärkeitä. Ne tarkoittavat tarkasti määriteltyä asiaa tai ominaisuutta. TTP I:ssä meillä oli jo mm. seuraavia käsitteitä: muuttuja, tyyppi, lause, lauseke, toistolause, valintalause,... Sinun kannattaa tehdä itsellesi käsiteluettelo, johon kirjaat aina vastaantulevat uudet käsitteet. 9

VIIKKO 45 Lyhyt johdatus Javaan ja sen käyttöön esimerkeillä Lue ensin opintomonisteen luvut sivut 5-12 ja sen jälkeen alla oleva, joka on tämän viikon päämateriaali. Aluksi tarkastelemme ohjelmointiin ja Javaan liittyviä yleisiä asioita. Sen jälkeen esittelemme kaksi yksinkertaista Java-ohjelmaa sekä Javan perusrakenteet (perustyypit ja perusohjausrakenteet). Seuraavaksi kerrotaan miten ja millä ohjelmilla Java-ohjelmia kirjoitetaan ja suoritetaan. Opintomonisteen esimerkkejä ja s. 12 kuvaa ei voi tietenkään täysin ymmärtää tässä vaiheessa, mutta s. 12 kuvaa tulee tarkastella joka viikon asioiden yhteydessä. Kuvassa olevat käsitteet tulevat tutuksi tämän kurssin aikana. Opintojaksolla TTP I kirjoitettiin algoritmeja noudattamatta tarkkaa syntaksia ja usein lauseiden muoto oli liian epämääräinen tietokoneella suoritettavaksi. Kun algoritmi kirjoitetaan käyttäen todellista ohjelmointikieltä, joka annetaan tietokoneen suoritettavaksi, tilanne on aivan toinen. Nimittäin lauseet ja niiden osat tulee kirjoittaa täsmälleen annetun kieliopin mukaisessa muodossa käyttäen vaadittuja välimerkkejä. Tämä on jossakin mielessä helpottavaa: lauseiden syntaksi ja semantiikka on täysin määrätty, ja ohjelma joko toimii tai sitten ei (ensimmäinen versio ohjelmasta ei yleensä toimi, vaan se vaatii useita korjauskierroksia). Toisaalta se tuo mukanaan lukuisia tarkkoja syntaksisääntöjä, joiden tietäminen ei itse ohjelmoinnin kannalta ole se tärkein asia. Suurin virhe onkin kiinnittää aluksi liian paljon huomiota syntaksiin. Alla esitettyjä asioita kannattaa tarkastella jakson TTP I ViLLE-esimerkkien valossa. Javan perusohjausrakenteet ja perustyypit Seuraavaksi esitetään hyvin lyhyesti Javan perusrakenteet ja sen jälkeen esitetään kaksi esimerkkiohjelmaa, joiden avulla nämä asiat konkretisoidaan. Nämä kannattaa lukea erityisen huolellisesti. Opintomonisteessa (ja yleensä muissakin oppikirjoissa) näin ei menetellä, jolloin alkuun pääsemiseksi tulee tutustua moniin asioihin yksityiskohtaisesti ennen kuin pystyy kirjoittamaan ensimmäisen ei-triviaalin ohjelman. Tällöin punaista lankaa ei tahdo löytyä ja alkuun pääseminen voi kestää tuskallisen kauan. Kertaa ensin jakson TTP I luentopäivän materiaalissa olevat asiat, jossa esitetään lyhyesti imperatiivisen (eli käskevän) ohjelmoinnin yleiset periaatteet ja käsitteet: muuttuja, tyyppi, lauseke sekä lause ja eri lausetyypit (esim. valinta if ja toisto while). Näiden ymmärtäminen on ohjelmoinnin ja tämän kurssin perusta. Kuten jaksolla TTP I selvitettiin, jokaisen algoritmin kirjoittamiseen riittää peräkkäisyys-, valinta- (if-lause) ja alkuehtoinen toistorakenne (while-lause). Keskeisessä asemassa on asetuslause, jolla voidaan asettaa arvo muuttujalle (muistipaikalle). Jokaiseen muuttujaan (ja myös lausekkeeseen) liittyy tyypin käsite, joka kertoo minkälaisen arvon kyseiseen muuttujaan 10

saa tallentaa. Seuraavassa esitetään edellä mainittujen lauseiden syntaksi Javassa käyttäen opintojakson TTP I esitystapaa (< >). Nämä asiat käsitellään myöhemmin perusteellisesti. Lauseita: 1) Asetuslause on muotoa: 2) Valintalause (if-lause) on muotoa: tai Huomaa syntaksista: <muuttuja> = <lauseke>; esim. a = a + 1; if (<ehtolauseke>) <lause> if (<ehtolauseke>) <lause> else <lause> 3) Alkuehtoinen toisto (while-lause) on muotoa: while (<ehtolauseke>) <lause> esim. if (a>b) b = b - a; esim. if (a>b) b=b-a; else a=a-b; esim. while (k<10) k=k*a; k=k-1; 4) Lohko on muotoa: <yksi tai useampi lause> esim. k=k*a; k=k-1; Perustyyppejä: int (kokonaisluvut), double (desimaaliluvut), char (yksittäiset merkit), boolean (totuusarvo, arvona true tai false) esim. int k; double s=0.0; char ch; Lause tarkoittaa siis yhtä lausetta (statement) tai lohkoa (block). Lohko tarkoittaa yhtä tai useata lausetta, jotka ovat aaltosulkeiden eli merkkien ja (joita kutsutaan lausesuluiksi) välissä. Lohkoa kutsutaan myös kootuksi lauseeksi (compound statement tai block statement). Tämä on lohkon yksinkertaistettu määritelmä, koska lohkon sisällä voi olla myös muuttujien ja luokkien esittelyjä. Sääntö puolipisteistä käytöstä: Muuttujien esittelyjen ja lauseiden jälkeen kirjoitetaan puolipiste pois lukien lohko, while-, for- ja if-lauseet. Näin ollen esim. asetuslauseen perään tulee kirjoittaa puolipiste eli yllä lauseessa if (a>b) b = b - a; puolipiste päättää asetuslauseen. asetuslauseessa käytetään sijoitusoperaattorina 3 merkkiä =. Tämän takia yhtäsuuruuden testaukselle loogisissa lausekkeissa tarvitaan joku muu merkintä (se on = =). if-lauseessa ei kirjoiteta then-sanaa näkyviin, mutta tästä huolimatta puhumme if-lauseen then-haarasta, koska sehän juuri kirjoitetaan ehtolausekkeen jälkeen. Ehtolauseke on totuusarvoinen lauseke ja se tulee sekä if- että while-lauseessa kirjoittaa sulkujen ( ) sisälle. Lisäksi Javassa on monihaarainen valintarakenne (switch), loppuehtoinen toisto (do... while) ja definiitti toisto (for), jotka eivät kuitenkaan ole välttämättömiä, mutta helpottavat joskus ohjelman kirjoittamista. 3 TTP I:ssä käytimme merkkiparia :=, joka on parempi, koska asetuslauseessa ei ole kysymys yhtäsuuruudesta (esim. lause i = i+1 eli kasvata i:n arvoa yhdellä). 11

Ohjelman käsittelemä primitiivitieto (perustyypit) voidaan jakaa numeeriseen (arvona luku), loogiseen (arvona totuusarvo; tämän tyypin nimi on Javassa boolean) ja merkkitietoon (char). Numeerinen tieto voidaan jakaa edelleen kokonaislukuarvoiseen (esim. int) ja desimaalilukuarvoiseen (esim. double). Kummallekin on useita vaihtoehtoja, joita käytetään tarvittavan lukualueen ja tarkkuuden mukaan. Perustyyppien lisäksi voidaan käsitellä monimutkaisempia tietorakenteita; esim. taulukoita ja merkkijonoja (String), jotka ovat tietyn luokan alkioita eli olioita. Lisäksi voimme määritellä omia tietotyyppejä luokkien avulla tai käyttää Javan kirjastoluokkia ja muodostaa kyseisen tyypin alkioita (olioita). Kaksi yksinkertaista Java-ohjelmaa Alla on klassinen 4 HelloWorld-ohjelma, joka vain tulostaa tietyn vakiotekstin kuvaruudulle. Ohjelman avulla on tarkoitus selvittää yksinkertaisen Java-ohjelman rakenne. Ohjelmassa on vain yksi lause, joka saa aikaan tulostuksen. Jo näin yksinkertaisessa ohjelmassa on useita jokaiseen Java-ohjelmaan liittyviä asioita. Tarkastele alla esitettyjä asioita myös sitä seuraavan ohjelman Kertoma1 valossa. Ohjelma esitetään Javassa luokkana, joka sisältää main-metodin, joka sisältää varsinaisen ohjelmakoodin. main-metodi on aina luokan pääohjelma, josta ohjelman suoritus alkaa. Opintomonisteessa on lohkon aloittava lausesulku kirjoitettu aina edellisen rivin loppuun (eli sanan public alla oleva on sijoitettu sanan HelloWorld perään), kun taas tässä oppaassa se kirjoitetaan seuraavan rivin alkuun samalla kohdalle, mistä ko. lohko alkaa. Lisäksi alirakenteet ja lauseet sisennetään oikealle. public class HelloWorld /* Tulostaa tervehdyksen ruudulle */ public static void main (String[ ] args) System.out.println( Hello, World!"); Alla on selvitetty lyhyesti HelloWorld-ohjelman osat esiintymisjärjestyksessä (tässä vaiheessa kaikkia sanoja ja merkkejä ei voi vielä tuntea, mutta lue 'sujuvasti'): 1. rivi public class HelloWorld määritellään julkinen (public) luokka (class) ja annetaan sille itse keksitty nimi (HelloWorld). Tässä vain tunnus HelloWorld on käyttäjän valitsema. sen jälkeen seuraa luokan sisällön määrittely, joka on merkkien välissä, joka yllä on: /* Tulostaa tervehdyksen ruudulle */ public static void main (String[ ] args) System.out.println( Hello, World!"); Merkkiparien /* ja */ välissä oleva teksti (eli teksti Tulostaa tervehdyksen ruudulle) sisältää kommentin, jolla ei ole siis vaikutusta ohjelman suoritukseen 4 siis esiintyy lähes jokaisessa Java- ja C(++)-oppikirjassa. 12

sen jälkeen määritellään pääohjelma eli metodi main, josta ohjelman suoritus aina alkaa. Määrittely alkaa aina seuraavasti 5 : public static void main Tämä tarkoittaa, että pääohjelma main on luokan HelloWorld julkinen metodi. main-metodin parametri kirjoitetaan sulkujen sisään main-sanan jälkeen: (String[ ] args) eli parametrina on taulukko (joskin tunnuksen args sijasta voi käyttää mitä tunnusta tahansa kuten seuraavassa kohdassa todetaan), jonka jokainen komponentti on merkkijono 6. Kun ohjelma suoritetaan voidaan sille antaa parametreja (tähän palataan opiskeluoppaan sivulla 32 kun esitellään ohjelma Kertoma2) tai n:n arvo voidaan lukea näppäimistöltä (s. 31). HelloWorld ohjelmassa main-metodille ei anneta parametreja komentoriviltä suoritusvaiheessa, jolloin args on tyhjä. Huomaa, että yllä args on tunnus (lyhennys sanasta arguments eli argumentit), joten sen tilalla voisi käyttää mitä tunnusta tahansa (esim. parametrit). Kuitenkin yleisesti (siis esiintyy lähes jokaisessa Java-oppikirjassa) kyseinen tunnus on nimeltään args, jolloin lukija voi saada harhakuvan, että siinä kohtaa tulee todella olla aina args. main-metodin runko on lohko eli se alkaa aaltosulkeella ja loppuu aaltosulkeeseen : System.out.println( Hello, World!"); Lohko koostuu tässä vain yhdestä tulostuslauseesta (yleensä tässä kohtaa on tietenkin useita lauseita), joka kirjoitetaan on merkkien ja väliin. System.out.println(... ) on standarditulostusmetodi, jonka seurauksena ruudulle tulostuu parametrina annettu merkkijono (lainausmerkkien välissä oleva teksti) eli tässä Hello World! koska Javassa isot ja pienet kirjaimet ovat eri merkkejä (toisin kuin monissa muissa ohjelmointikielissä; esim. Pascalissa), tulee ohjelmassa olevat varatut sanat ja tunnukset kirjoittaa juuri kuten yllä on kirjoitettu. Ei siis saa kirjoittaa esim. Public, Main, string, system.out.println... Tunnisteet summa ja Summa ovat siis erit. 5 määreisiin public ja static palataan myöhemmin. 6 merkkijono on luokan String alkio (esiintymä, olio) 13

Näin ollen pelkkä main-metodin sisältävä ohjelma (luokka) on aina muotoa public class Xyz /* tähän kirjoitetaan kommentti siitä, mitä ohjelma tekee */ <tässä voidaan esitellä muuttujia tai vakioita, ks. alla oleva Huom 1.> public static void main (String[ ] args) <tähän kirjoitetaan tarvittavat muuttujien esittelyt ja lauseet> missä Xyz on luokan nimi (valitse kuvaavaksi, iso alkukirjain!). Kyseinen tiedosto pitää tallentaa levylle muodossa Xyz.java. Kun se käännetään, muodostuu tiedosto Xyz.class, joka on suorituskelpoinen. Huom 1. Jos luokan avulla ei määritellä uutta tietotyyppiä (kuten on tilanne kaikissa meidän ohjelmissa tällä kurssilla), niin ennen main-metodia esitellyt muuttujat kirjoitetaan varustettuna määreellä static, esim. static int maara=10; Tällöin tämä muuttuja on käytettävissä kaikissa luokan Xyz metodeissa. Ne ovat siis luokan Xyz globaalisia muuttujia. Huom 2. Sana public ei ole yllä pakollinen luokan eikä main-metodin määrittelyn alussakaan, mutta sillä on tietenkin tietty merkitys. public: asia (luokka, metodi, muuttuja) on julkinen eli sitä voi käyttää tai siihen voi viitata mistä luokasta tahansa. Jos sana public puuttuu, niin ko. asia on käytettävissä saman hakemiston sisällä. Käytännössä tämä riittää meidän ohjelmissa, mutta siitä huolimatta kirjoitamme määreen public aina näkyviin. Esimerkki. Seuraavassa on lisäksi tuttu n-kertoman laskeva ohjelma täydellisenä (suorituskelpoisena). Se sisältää jo kunnon ohjelman aineksia: muuttuja ja sen tyypin esittely, asetuslause ja alkuehtoinen toistorakenne. Tässä ohjelmassa asetetaan n:n arvoksi ohjelmassa vakio 6, joten tämä ohjelma ei ole vielä yleinen. Tähän samaan ohjelmaan palataan myöhemmin, jolloin teemme ohjelmasta version, jossa n annetaan parametrina main-metodille komentoriviltä kun annetaan ohjelman suorituskäsky (Kertoma2, s. 32), luetaan näppäimistöltä ohjelman suorituksen aikana (s. 31). Tässä vaiheessa ohjelman kaikkia määreitä (sanoja) ei voi vielä täysin ymmärtää. Kielen varatut sanat on tässäkin lihavoitu. Ohjelma kirjoitetaan varustettuna runsailla kommenteilla. Merkkiparin // jälkeinen teksti rivin loppuun saakka on kommenttia eli on siis tarkoitettu ohjelman lukijalle eikä siis vaikuta ohjelman toimintaan. Jos halutaan kirjoittaa kommentteja usealle riville, tulee käyttää kommentointitapaa, jossa kerrotaan mistä kommentti alkaa ja mihin se päättyy: /* */. 14

public class Kertoma1 /** Ohjelma, joka laskee ja tulostaa n-kertoman, kun n:lle annetaan vakioarvo ohjelman sisällä. */ // main-metodin määrittely alkaa public static void main (String[ ] args) int n, k, i; // esitellään kokonaislukutyyppiset muuttujat n, k ja i n = 6; // annetaan muuttujalle n alkuarvoksi 6 k = 1; // annetaan muuttujalle k alkuarvoksi 1 i = n; // annetaan muuttujalle i alkuarvoksi n:arvo eli 6 while (i>0) // silmukan runko alkaa; silmukan runkoa toistaan niin kauan kuin i>0 k = k * i; // k saa uuden arvon, joka on sama kuin k:n vanha arvo kerrottuna i:llä i = i -1; // i:n arvoa vähennetään yhdellä // silmukan runko päättyy System.out.println(n + "-kertoma on " + k); // tulostus, + selostetaan myöhemmin // main-metodin loppu // luokan Kertoma1 määrittelyn loppu Yllä on jokaisen lauseen perässä kommentti, koska nyt vasta opettelemme ohjelmointia. Kuitenkaan näin yksinkertaisessa ohjelmassa ei jokaista lausetta kommentoida, joskin rakenteen lopun jälkeen, joka päättyy siis merkkiin, on hyvä kirjoittaa kommenttina minkä rakenteen loppu on kyseessä. Lisäksi ohjelman alkuun tulee kirjoittaa mitä ohjelma tekee. Yllä on määritelty muuttujat n, k ja i, jotka ovat tyyppiä int. Niihin voidaan tallentaa vain kokonaisluku. Huomaa, että while-lauseen (ja myös if-lauseen) ehtolauseke (i>0) kirjoitetaan aina sulkeiden sisään. Koska silmukan runko koostuu kahdesta yksinkertaisesta lauseesta, tulee ne kirjoittaa lausesulkujen ja sisään, jolloin niistä saadaan lause, lohko eli koottu lause. Sisennys ja aaltosulkeiden sijainti. Vaikka lauseiden sisennystapa ja aaltosulkeiden sijainti riveillä on ohjelman kirjoittajan valittavissa, niin edellä käytetty tapa on yleisesti käytetty: lohkon aloittava on avainsanan (esim. while) sisältävän rivin alapuolella samalla kohtaa, ja lopettava on omalla rivillään avainsanan kanssa tasattuna samaan sarakkeeseen. Lohkon lauseet ja määrittelyt sisennetään oikealle. Tätä tapaa käytetään tässä oppaassa. Toinen yleinen tapa on kirjoittaa lohkon aloittava avainsanan jälkeen samalle riville. Näin tehdään opintomonisteessa. Yllä oleva ohjelma Kertoma1 voidaan kirjoittaa siis muodossa: public class Kertoma1 /** Ohjelma, joka laskee ja tulostaa n-kertoman, kun n:lle annetaan vakioarvo ohjelman sisällä. */ public static void main (String[ ] args) int n, k, i; n = 6; k = 1; i = n; while (i>0) k = k * i; i = i -1; // while:n loppu System.out.println(n + "-kertoma on " + k); // main-metodin loppu // luokan loppu 15

Huom. Lause System.out.println(n + "-kertoma on " + k); tarkoittaa sitä, että tulostetaan sulkeiden sisällä olevan merkkijonolausekkeen arvo. Jos se ei ole suoraan merkkijonomuotoinen (eli " " tai merkkijonomuuttujista koostuva lauseke) kuten esim. edellä HelloWorld-ohjelman, niin Java muuntaa sulkeiden sisällä olevan lausekkeen merkkijonoksi. Tässä tapauksessa se muodostuu n:n arvosta, jota seuraa lainausmerkkien välissä oleva teksti ja jota seuraa k:n arvo. Näin ollen + ei tarkoita tässä yhteenlaskua, vaan sen avulla liitetään kaksi merkkijonoa peräkkäin, jos jompikumpi (tai molemmat) 'yhteenlaskettavista' on merkkijonotyyppinen (eli tekstiä). Näin ollen ohjelma tulostaa: 6-kertoma on 720. Yllä olevan ohjelman algoritminen osa int n, k, i; n = 6; k = 1; i = n; while (i>0) k = k * i; i = i -1; on TTP I-kurssin pseudokoodia käyttäen seuraava: n := 6 k := 1 i := n WHILE i>0 DO k := k * i i := i -1 ENDWHILE Tässä algoritminpätkässä pseudokoodin ja Javan ero on pieni. Pseudokoodissa emme määritelleet vielä muuttujien tyyppiä eli tietoa siitä mitä tietoa muuttujassa säilytetään lauseiden perään ei kirjoitettu puolipistettä, vaan ne kirjoitettiin vain eri riveille asetusoperaattori on := ja Javassa = WHILE-lauseen syntaksi on erilainen ja pseudokoodissa lausesulkuja ei tarvita, koska rakenteen päättävä ENDWHILE kertoo silmukan rungon lopun. Javassa runko tulee koota lohkoksi, koska se sisältää tässä useita lauseita. ja Javassa lauseet sisennetään oikealle samalla tavalla. Sisennykset eivät ole kummassakaan pakollisia, koska ohjelman rakenne on yksikäsitteinen. Tästä huolimatta sisennyksiä tulee käyttää systemaattisesti, jotta ohjelmakoodi on selkeää. Huomaa kuitenkin, että esim. ohjelmointikielessä Python ei käytetä lausesulkuja lainkaan, vaan lohkot ilmaistaan aina sisennyksellä, joten Pythonissa sisennykset ovat pakollisia. 16

Ohjelmien kirjoittaminen sekä suorittaminen komentotulkilla ja DrJavalla (main-metodin parametrille String[]args ei anneta arvoja) ohjelman osien kirjoittamiseen välilyöntien ja rivinvaihtojen suhteen tulee noudattaa (kuuluisaa) talonpoikaisjärkeä: yhteenkuuluvat osat tulee kirjoittaa yhteen (esim. main, int, jne.), mutta muuten välilyöntejä ja rivinvaihtoja voi käyttää mielensä mukaan (esim. asetuslauseessa yhtäsuuruusmerkin ja aritmeettisten operaattoreita voi seurata ja edeltää nolla tai useampi välilyönti). lohkon päättävän lausesulun jälkeen on hyvä kirjoittaa kommenttina, minkä rakenteen loppu on kyseessä. Merkkiparin // jälkeinen teksti rivin loppuun saakka on kommenttia. ohjelman ulkoasu on tarkoitettu ihmiselle eikä koneelle. Niinpä Java-kääntäjälle kelpaa, vaikka ohjelma annetaan sille muodossa 7 (otetaan kommentitkin pois): public class Kertoma1public static void main(string[]args)int n,k,i;n=6;k=1;i=n;while(i>0)k= k*i;i=i 1;System.out.println(n+" kertoma on " + k); yleensä ohjelman lauseet kirjoitetaan omille riveilleen, mutta joskus voi riville kirjoittaa myös useita lyhyitä lauseita, jos ohjelma on silti selkeä. Esimerkiksi yllä voitaisiin while-silmukan rungon lauseet kirjoittaa samalle riville. Yhteen tiedostoon kirjoitetaan yleensä yksi luokan määrittely. Jos yhteen tiedostoon kirjoitetaan useita luokkia, voi niistä ainoastaan yksi olla public. Tiedoston nimen tulee olla sama kuin (julkisen) luokan nimi ja jatkeena on.java (näin ollen yllä olevat luokat tulee tallentaa levylle nimi HelloWorld.java ja Kertoma1.java). Ohjelma kirjoitetaan jollakin tekstieditorilla ja se tallennetaan tekstitiedostona.. Kuten yllä todettiin, niin ohjelma (=luokka, jossa on main-metodi; esim. yllä Kertoma1) tulee tallentaa tarkalleen samalla nimellä kuin luokan nimi (jatkeena.java) erottaen pienet ja isot kirjaimet (Kertoma1.java) DrJava on helppokäyttöinen Windows-pohjainen (ja myös Macille) tekstieditori, jonka alaisuudessa voidaan sekä kirjoittaa, kääntää sekä suorittaa Java-sovelluksia (ohjelmia) ja sovelmia (appletteja). Se tuntee Javan syntaksin, joka helpottaa ohjelman kirjoittamista (esim. sisennykset tulevat automaattisesti). Jos sinulla ei ole käytössä tällaista ohjelmaa, voit kirjoittaa ohjelmasi millä tahansa ascii-editorilla (esim. NotePad) ja suorittaa ohjelmasi erikseen komentotulkissa (command prompt / dos). 7 Tästä ei voi 'nipistää' pois enää yhtään merkkiä; esimerkiksi tyypintunnuksen int ja muuttujan n väliin on pakko kirjoittaa välilyönti, koska muuten kääntäjä ei ymmärrä sitä. 17

Tarkastellaan yllä olevan ohjelman Kertoma1 kirjoittamista, kääntämistä ja suorittamista. Ensin kannattaa luoda hakemisto, johon tallennat kaikki Java-ohjelmasi. a) Käytetään DrJavaa 1. Käynnistä DrJavan exe-tiedosto. Valitse File/New Java Class, jolloin systeemi kysyy tiedoston nimen ja siksi pitää antaa sama kuin luokan nimi eli tässä tapauksessa Kertoma1. Editori generoi automaattisesti luokan rungon. Kirjoita kohtaan /* ADD YOUR CODE HERE */ luokan Kertoma1 koodi. Koodin voi siirtää myös leikepöydän kautta, mutta ensimmäisellä kertaa on parempi kirjoittaa koodi itse, jotta näet miten editori toimii. Tallenna se File/Save as hakemistoon, jossa säilytät java-ohjelmiasi. Tästä tulee työhakemisto (Working Directory). 2. Käännä ohjelma valitsemalla Compile jolloin lähdekoodi muutetaan tavukoodiksi, jos ohjelmassa ei ole syntaksivirheitä. 3. Jos ohjelman käännös onnistui (ei tule virheilmoituksia), niin silloin muodostuu tiedosto Kertoma1.class. Se suoritetaan valitsemalla Run. Muulloin ohjelmaa tulee korjata ja mennä sen jälkeen vaiheeseen 2. b) Suoritetaan ohjelma komentoriviltä (command prompt: windows/linux/unix): Komentotulkkia käsitellään jakson TTV Teeman 1 harjoitustehtävissä. Windowsissa sen saa käyttöön seuraavasti: valitse Start (Käynnistä) / Programs (Ohjelmat) / Accessories (Apuohjelmat) / Command Prompt. Komennot kirjoitetaan käyttäen näppäimistöä ja komentotulkki (jolloin komentotulkki-ikkuna sulkeutuu) lopetetaan kirjoittamalla komento exit. Komennon kirjoituksen jälkeen tulee paina Enter (Return), jonka jälkeen tietokone suorittaa annetun komennon. 1. Kirjoitetaan ohjelma tekstieditorissa ja tallennetaan se nimellä Kertoma1.java valittuun hakemistoon. 2. Siirrytään komentotulkissa samaan hakemistoon, jossa tiedosto Kertoma1.java sijaitsee. Käännetään ohjelma kirjoittamalla 8 (alla > on komentotulkin antama merkki, joka ilmaisee sen, että komentotulkki on valmis vastaanottamaan komennon): > javac Kertoma1.java 3. Jos ohjelman käännös onnistui (ei tule virheilmoituksia), niin silloin muodostuu tiedosto Kertoma1.class. Se suoritetaan komennolla > java Kertoma1 Muulloin ohjelma Kertoma1.java tulee ottaa johonkin tekstieditoriin ja korjata sitä. Korjauksen jälkeen mennään vaiheeseen 2. Huom. Jos path-määreessä (tai ympäristömuuttujassa) ei ole polkua siihen hakemistoon, missä tiedostot javac.exe ja java.exe sijaitsevat, tulee yllä kirjoittaa ko. komentojen eteen myös polku 8 Ks. myös seuraava path-määrettä koskeva Huom. 18

(esim 9. C:\Program Files\Java\jdk1.8.0\bin\javac Kertoma1.java). Helpompi tapa on tietenkin asettaa path-määre 10. Se voidaan asettaa pysyvästi muuttamalla path-ympäristömuuttujaa tai antaa vastaava käsky komentotulkissa: esim. path C:\Program Files\Java\jdk1.8.0\bin, jolloin komennot javac ja java toimivat oletpa missä hakemistossa tahansa. Huom. Jos Java-systeemisi ei toimi, niin syynä tähän on puutteelliset path- tai classpathmääritykset. Näiden asettamisesta annetaan ohjeet kurssisivuillamme. DrJavassa voi valita alhaalta Interactions, jolloin näkyy >. Tässä voi suorittaa ohjelmia samaan tapaan kuin komentoriviltä. Lisäksi tähän voi kirjoittaa Javan-lauseita ja saada välittömästi palautteen: esim. > int a = 10; > int b = a*a; > b 100 Tämä on näppärä ja nopea tapa testata lauseiden toimintaa. 9 Huom. Tässä oletetaan, että koneessa on Java 1.8.0 (eli JDK 8:n versio 0), joka installoituu hakemistoon C:\Program Files\Java\jdk1.8.0. Sen alla on hakemisto bin, jossa ovat ohjelmat javac.exe (ohjelman kääntäminen) ja java.exe (suoritus). Jos sinulla on eri versio, tulee hakemiston nimi muuttaa vastaavaksi. 10 Esim. Path c:\windows; c:\windows\command; C:\Program Files\Java\jdk1.8.0\bin (ja paljon muutakin) 19

Harjoitustehtävät Tehtävät 1-2 voi merkitä tehdyiksi, jos olet installoinut Javan ja DrJavan koneeseesi ja että sillä voi suorittaa Java-ohjelmia. Jos lähetät tehtäväsi, niin tehtävien 1-4 osalta riittää esittää kuvaruutukaappaukset tehtävien 3 ja 4 suorituksista. Tässä siis pitää näkyä, että ohjelmaa on muutettu ja suoritettu monta kertaa, jolloin nähdään myös, että asennukset on suoritettu oikein. DrJavan sijasta voit käyttää mitä tahansa kehitysympäristöä. Tässä käydään läpi vain perusasiat ja ensi viikolla harjoitellaan lisää ohjelmien suorittamista. Huom. Jos ohjelmaa käännettäessä saat virhelistan, niin korjaa niistä ensin ensimmäinen (tai pari ensimmäistä jos osaat) ja käännä ohjelmasi uudestaan. Nimittäin ensimmäisestä virhekohdasta aiheutuu yleensä useita virheilmoituksia ja näin ollen voit saada pitkän virhelistan, vaikka ohjelmassasi olisi vain yksi virhe! 1. -2. Asenna Java ja DrJava koneeseesi kurssisivuilla olevien ohjeiden mukaan. 3. Kirjoita luokka Kertoma1.java käyttäen DrJavaa kuten edellä on neuvottu. Laita rivinumerot näkyviin (DrJava: Edit/Preferences/Display Options ja laita ruksi kohtaan Show All Line Numbers). Tee tahallasi useita virheitä (jätä esim. puolipiste pois) ja tutki kääntäjän antamia virheilmoituksia. Kääntäjä antaa rivinumeron, jolla virhe esiintyy sekä myös kuvauksen virheestä. Korjaa virheet ja suorita toimiva ohjelma. Muuta ohjelmaasi (aseta esim. n=8), käännä ja suorita ohjelmasi uudestaan. 4. Kirjoita DrJavaa käyttäen uusi ohjelma, joka tulostaa kuvaruudulle tekstin "Hei ihminen, minä olen tietokone". Ohje: tallenna editorissa oleva ohjelma (Kertoma1) jollain nimellä (huom. iso alkukirjain) ja muuta luokan nimi vastaavasti. Tee sen jälkeen muutokset itse ohjelmakoodiin, käännä, 5. Vertaa Javan syntaksia verrattuna TTP I:n pseudokieleen TTP I-sivuilla olevan ViLLEn avulla. Valitse esimerkin kohdalla Rinnakkaisnäkymä ja valitse kieleksi Java. Kerro tärkeimmät eroavaisuudet. Huomaa tässä vaiheessa erityisesti: tyypin antaminen muuttujan esittelyn yhteydessä, asetuslauseessa käytettävä =, if-lauseen ja toistolauseiden muoto, funktion otsikkorivi, puolipisteiden käyttö. 20

VIIKKO 46 Peruskäsitteitä: tyypin käsite, perustyypit (kokonaisluvut, desimaaliluvut, looginen tieto ja merkkitieto) ja lausekkeet (aritmeettiset ja loogiset), asetuslause. Syöttötietojen antaminen ohjelmalle komentoriviltä ja luokkien Scanner ja OmaIO avulla. Opintomonisteen luku 2. Opintomoniste on tämän viikon asioiden osalta hyvin tarkka ja käsitteitä on paljon (ja luettavaa on paljon). Näin ollen voitkin pitää alla olevaa tämän viikon päämateriaalina ja siirry opintomonisteeseen vain tarpeen mukaan (jos et ymmärrä asiaa) tai jos niin alla kehotetaan. Huomaa, että voit kirjoittaa yksinkertaisia Java-ohjelmia, vaikka et ole tietoinen kaikista alla olevista yksityiskohdista, jos käytät vain tyyppejä int ja double, et yhdistele lausekkeeseen eri tyyppisiä arvoja ja käytät lausekkeissa sulkeita varmistaen näin, että lausekkeen osat lasketaan siinä järjestyksessä kuin haluat. Luvun 2.8.1 asioita käsitellään yksinkertaisemmalla syöttörivillä (komentoriviparametrilla), joten sinun kannattaa lukea vastaava asia ensin alta. Myös opintomonisteen sivulla 33 olevan esimerkin voi tällä viikolla tarkastella hyvin kevyesti, mutta palaa siihen viimeisen viikon yhteydessä (esimerkki käydään läpi myös luentopäivällä). Luvussa 2 tarkastellaan myös taulukoita, mutta me tarkastelemme niitä paljon perusteellisemmin viikolla 50. Alustus Luvussa 2 esitetään Java-ohjelmoinnin peruskäsitteitä, joita ovat mm. tunnus eli tunniste (identifier), varattu sana, literaali eli vakio, muuttuja, muuttujan arvo, määrittely- eli näkyvyysalue, tyyppi, lause, asetus- eli sijoituslause, nimetty vakio, lauseke sekä operaattori. Java (kuten lähes kaikki imperatiiviset kielet) on vahvasti tyypitetty kieli: kaikkien ohjelmassa esiintyvien muuttujien tyyppi tulee aina ilmoittaa muuttujia esiteltäessä. Muuttujan tyyppi 11 kertoo sen millaista tietoa kyseiseen muuttujaan tallennetaan, ja lisäksi se määrittelee kyseisen muuttujan arvoalueen. Itse asiassa tyyppi määrittelee kaikki mahdolliset arvot mitä muuttuja voi saada arvokseen. Vakioiden (eli literaalien) tyyppi nähdään niiden esityksestä. Esimerkiksi 2 on kokonaislukuvakio (tyyppiä int), kun taas 2.0 on desimaalilukuvakio (tyyppiä double). Tyyppi edustaa alkiojoukkoa (arvoja, joita ko. tyyppisiin muuttujiin voidaan asettaa). Kahdenlaisia tyyppejä: a) perustyypit b) oliotyypit. 11 Kertaa TTP I-opintomonisteesta tyyppiä koskevat asiat. 21