2. Lisää Java-ohjelmoinnin alkeita Muuttuja ja viittausmuuttuja Vakio ja literaalivakio Sijoituslause Syötteen lukeminen ja Scanner-luokka ict1td002 - Copyright Raine Kauppinen 26.8.2008
Muuttuja ja viittausmuuttuja (1/4) Edellä mainittiin, että String-tietotyyppi on muista mainituista, esimerkiksi int- tai double-tyypeistä poikkeava. Tämä liittyy siihen, että tietotyyppejä ja muuttujia on kahdenlaisia. Tietotyyppejä ovat alkeistyypit (int, double, boolean, char, byte, short, long ja float) ja abstraktit tietotyypit (esimerkiksi String). Vastaavasti on olemassa muuttujia ja viittausmuuttujia. ict1td002 - Copyright Raine Kauppinen 26.8.2008
Muuttuja ja viittausmuuttuja (2/4) Tavallisia muuttujia, joiden tietotyyppeinä esiintyy alkeismuuttujia, olemme jo käyttäneet usein, esimerkiksi int luku = 123; double dluku = 12.45; Sitä vastoin viittausmuuttujia, joiden tietotyyppinä esiintyy abstrakteja tietotyyppejä, olemme käyttäneet vähemmän, kuitenkin String on tälläinen, esimerkiksi: String mjono = ”Tekstiä”; ict1td002 - Copyright Raine Kauppinen 26.8.2008
Muuttuja ja viittausmuuttuja (3/4) Abstrakti tietotyyppi eroaa alkeistyypistä siten, että (Javassa) abstrakti tietotyyppi on itse asiassa luokka. String on siis Javan tarjoama valmis luokka, jota käytetään merkkijonojen tallentamiseen ja käsittelyyn. Abstraktin tietotyypin ideana on, että sen avulla voidaan käsitellä hyvin monimutkaisia rakenteita, esimerkiksi sellaisia, jotka koostuvat useista alkeistyypeistä. Esimerkiksi merkkijono koostuu useista merkeistä (char-alkeistyyppi). ict1td002 - Copyright Raine Kauppinen 26.8.2008
Muuttuja ja viittausmuuttuja (4/4) Viitausmuuttuja esitellään antamalla muuttujan tietotyypiksi luokan nimi (alla olevissa esimerkeissä ei aseteta alkuarvoa): String mjono; OmaLuokka olio; Myöhemmin tällä jaksolla opetellaan tarkemmin, miten omia luokkia käytetään viittausmuuttujina ja mitä näiden avulla tehdään. ict1td002 - Copyright Raine Kauppinen 26.8.2008
Vakio ja literaalivakio (1/2) Muuttujien lisäksi olemme käyttäneet paljon vakiota, esimerkiksi: 123 12.45 ”Tekstiä” ’a’ (Literaali)vakio on siis ohjelmakoodiin kirjoitettu osa, jolla ei ole tunnusta (nimeä) ja joka säilyy samana ohjelman suorituksen ajan. ict1td002 - Copyright Raine Kauppinen 26.8.2008
Vakio ja literaalivakio (2/2) Joskus on tarpeen myös nimetä vakio, jolloin käytetään muuttujaa, joka määritellään sellaiseksi, ettei sen arvoa voi ohjelman suorituksen aikana muuttaa. Tämä tapahtuu määreellä final: final double PII = 3.14; final String VAKIOTEKSTI = ”Tervetuloa”; Huomaa, että arvoltaan muuttumattoman (final-määreisen) muuttujan nimi on Javassa tapana kirjoittaa kokonaan isoilla kirjaimilla. ict1td002 - Copyright Raine Kauppinen 26.8.2008
Sijoituslause (1/8) Tähän mennessä olemme asettaneet muuttujille esittelyn yhteydessä alkuarvon, toisin sanoen olemme sijoittaneet muuttujalle esittelyn yhteydessä arvon, esimerkiksi: int luku = 123; Tähän mennessä olemme aina sijoittaneet alkuarvoksi vakion. Useimmissa ohjelmissa on tarpeen muuttaa muuttujien arvoja useaan kertaan suorituksen aikana, esimerkiksi laskutoimitusten tai muiden operaatioiden seurauksena. ict1td002 - Copyright Raine Kauppinen 26.8.2008
Sijoituslause (2/8) Yleisesti sijoituslause on muotoa tunnus = lauseke; , jossa tunnus on jokin aiemmin esitelty muuttuja ja lauseke kokonaisuus, jolla on sama tietotyyppi kuin ko. muuttujalla. Lauseke voi olla mm. literaalivakio, aritmeettinen lauseke tms. ja se voi esimerkiksi sisältää muita muuttujia. Seuraavalla kalvoilla on esimerkkejä sijoituslauseista. ict1td002 - Copyright Raine Kauppinen 26.8.2008
Sijoituslause (3/8) Muuttujan arvoksi sijoitetaan vakio: luku2 = 34; // luku2 on tyyppiä int dluku = 45.1; // dluku on tyyppiä double nimi = ”Pekka”; // nimi on tyyppiä String Muuttujan arvoksi sijoitetaan laskuoperaation tulos: luku2 = (34+54)/2; dluku = 45.1*12.5; ict1td002 - Copyright Raine Kauppinen 26.8.2008
Sijoituslause (4/8) Sijoituslauseita, joissa käytetään muita muuttujia: luku2 = (34+luku1)/luku3; dluku = 45.1*PII; nimi = VAKIOTEKSTI+”, Pekka”; Saman muuttujan arvoa voidaan samassa ohjelmassa muuttaa useita kertoja eri sijoituslauseilla; muuttujan arvona on viimeiseksi suoritetun sijoituslauseen mukainen arvo. ict1td002 - Copyright Raine Kauppinen 26.8.2008
Sijoituslause (5/8) Sijoituslause on syytä opetella ajattelemaan ja lukemaan muodossa ”saa arvon”, esimerkiksi luku = 0; luetaan ”luku saa arvon nolla”, jottei sijoitus sekoitu ehtolauseiden yhteydessä opittavaan vertailuun. (Alku)arvon asettaminen muuttujan esittelyn yhteydessä on myös sijoitus, mutta nämä voi myös erottaa: int luku; // muuttujan esittely luku = 0; // (alku)arvon asetus ict1td002 - Copyright Raine Kauppinen 26.8.2008
Luentoesimerkki 2.1 Tee ohjelma, joka laskee ja tulostaa näytölle pallon tilavuuden, kun pallon säde r on a) 0,5 cm b) 2,0 cm c) 8,5 cm Pallon tilavuus lasketaan kaavalla tilavuus = (4/3)*pii*r3 Voit käyttää piin likiarvoa 3,14. Talleta ratkaisusi tiedostoon PallonTilavuus.java. ict1td002 - Copyright Raine Kauppinen 26.8.2008
Sijoituslause (7/8) Usein muuttujan arvoksi tarvitsee sijoittaa muuttujan entinen arvo lisättynä, kerrottuna tms. jonkin muun lausekkeen tuloksena. Tämä onnistuu sijoituslauseella esimerkiksi seuraavasti: luku = luku + 1; dluku = dluku * (15.67/maara); Tällaisiin usein käytettyihin sijoituksiin on myös lyhennemerkintöjä, joita on seuraavalla kalvolla. ict1td002 - Copyright Raine Kauppinen 26.8.2008
Sijoituslause (8/8) luku += 10; // luku = luku + 10; ict1td002 - Copyright Raine Kauppinen 26.8.2008
Syötteen lukeminen ja Scanner-luokka (1/5) Useimmat ohjelmat ovat interaktiivisia, eli ne suorituksensa aikana pyytävät tietoa (syötteitä) käyttäjältä, esimerkiksi näppäimistön kautta. Näppäimistöltä tulevan syötteen lukeminen on monimutkainen toimenpide, mutta Java tarjoaa tähän valmiita apuvälineitä, joista käytämme luokkaa Scanner. Scanner-luokka sisältää operaatiot mm. kokonaisluku-, desimaaliluku- ja merkkijonotyyppisten syötteiden lukemiseen esimerkiksi näppäimistöltä. ict1td002 - Copyright Raine Kauppinen 26.8.2008
Syötteen lukeminen ja Scanner-luokka (2/5) Scanner-luokka ei kuitenkaan ole automaattisesti käytettävissä (kuten esimerkiksi String-luokka on), vaan se pitää ensin määritellä käyttöön. Tämä tapahtuu import-määreellä ohjelman alussa, package määrityksen jälkeen: package osio1.vko2; import java.util.Scanner; … ict1td002 - Copyright Raine Kauppinen 26.8.2008
Syötteen lukeminen ja Scanner-luokka (3/5) Lisäksi ohjelmakoodissa tarvitsee määritellä ja alustaa Scanner-tyyppinen viittausmuuttuja: public void aja(){ Scanner syote = new Scanner(System.in); … } Alustuksessa määritellään syötteen tulevan näppäimistöltä (System.in) – huomaa, että vastaavasti Javan tulostuslause määrittelee tulostuksen menevän näytölle (System.out.println…). ict1td002 - Copyright Raine Kauppinen 26.8.2008
Syötteen lukeminen ja Scanner-luokka (4/5) Tämän jälkeen ko. viittausmuuttujan avulla voidaan näppäimistöltä lukea esimerkiksi merkkijonon vastaavan tyyppiseen muuttujaan: public void aja(){ Scanner syote = new Scanner(System.in); String mjono; System.out.prinln(”Anna syöte: ”); mjono = syote.nextLine(); System.out.prinln(”Syötit: ”+mjono); … } ict1td002 - Copyright Raine Kauppinen 26.8.2008
Luentoesimerkki 2.2 Tee ohjelma, joka kysyy käyttäjän asuinpaikan ja tulostaa näytölle tekstin ”X on mukava paikka.”, jossa X:n tilalle tulostaa käyttäjän syöttämä paikka. Talleta ratkaisusi tiedostoon AsuinPaikka.java. ict1td002 - Copyright Raine Kauppinen 26.8.2008
Syötteen lukeminen ja Scanner-luokka (5/5) Scanner-luokan avulla voi myös lukea esimerkiksi kokonaislukuja, desimaalilukuja ja muita tietotyyppejä sopivaa operaatiota käyttämällä (nextInt, nextDouble jne.). Lisätietoja Scanner-luokan käytöstä ja syötteen lukemisesta on osion kotisivulla olevassa dokumentissa scanner.doc. Tehdään kuitenkin vielä yksi ohjelma, jossa luetaan desimaalilukuja. ict1td002 - Copyright Raine Kauppinen 26.8.2008
Luentoesimerkki 2.3 Tee ohjelma, joka kysyy käyttäjältä pallon säteen ja laskee ja tulostaa näytölle kyseisen pallon tilavuuden. Pallon tilavuus lasketaan kaavalla tilavuus = (4/3)*pii*r3 Voit käyttää piin likiarvoa 3,14. Talleta ratkaisusi tiedostoon InteraktiivinenTilavuus.java. ict1td002 - Copyright Raine Kauppinen 26.8.2008