Helsingin yliopisto / Tietojenkäsittelytieteen laitos / 581258-1 Johdatus ohjelmointiin
Copyright © 1997 Arto Wikla. Tämän oppimateriaalin käyttö on sallittu vain yksityishenkilöille opiskelutarkoituksissa. Materiaalin käyttö muihin tarkoituksiin, kuten kaupallisilla tai muilla kursseilla, on kielletty.

2.3 Kirjoittamista ja lukemista

(Muutettu viimeksi 13.1.1998)

Tässä luvussa opetellaan ysinkertaiset välineet syöttöön ja tulostukseen: kirjoitetaan kuvaruudulle ja luetaan näppäimistöltä. Koska Java-kielessä ei ole valmiina yksinkertaista lukemisen välinettä, kurssia varten on laadittu luokka Lue, jonka avulla päästään harjoittelemaan algoritmien laatimista ilman "oikeiden" syöttövälineiden monimutkaisia yksityiskohtia.

Kirjoittamista

Ns. standarditulosvirtaan kirjoitetaan valmiiksi määritellyn luokan System välineillä. Muutamassa esimerkissä jo vähän tulosteltiinkin:
   System.out.println("Hoi maailma!");
   System.out.println( a/b );
   System.out.println(tulos);

Pitkähän tuo tulostusoperaatio on kirjoittaa, mutta onneksi sen käyttö on helppoa. Tulostettavana on aina korkeintaan yksi arvo. Jos haluaa tulostaa vaikkapa tekstejä ja lukuarvoja, niistä on tehtävä yksi merkkijono. Esimerkiksi lauseet:
     int kpl = 123;

     System.out.println("Lukumäärä on nyt" + kpl + "kappaletta.");
     System.out.println("Lukumäärä on nyt " + kpl + " kappaletta.");
tulostavat:
Lukumäärä on nyt123kappaletta.
Lukumäärä on nyt 123 kappaletta.

Operaatio print tulostaa ilman rivinvaihtoa. Edellisen esimerkin jälkimmäinen tulostus saadaan aikaan siis vaikkapa lausein:
     System.out.print("Lukumäärä on nyt ");
     System.out.print(kpl);
     System.out.println(" kappaletta.");
tai:
     System.out.print("Lukumäärä on nyt ");
     System.out.print(kpl);
     System.out.print(" kappaletta.");
     System.out.println();

Koska merkkijono alkaa ja loppuu lainausmerkkiin, tulostettava lainausmerkki ilmaistaan merkkiyhdistelmänä \". Myös eräille muille erikoistulostuksille on oma ilmauksensa, uusi rivi on \n, tabulaattori on \t ja takakeno on \\. Esimerkiksi lauseet:

     System.out.println("Hän sanoi \"kiitos\"!");

     System.out.println("Tyhjiä rivejä:\n\n\n");

     System.out.println("\tTabuloitu kerran");
     System.out.println("\t\tTabuloitu kahdesti");

     System.out.println("Takakeno: \\");
     System.out.println("Pari takakenoa: \\\\");
tulostavat:
Hän sanoi "kiitos"!
Tyhjiä rivejä:



        Tabuloitu kerran
                Tabuloitu kahdesti
Takakeno: \
Pari takakenoa: \\


Huom:Merkkijonoja ja lukuarvoja tulostettaessa on muistettava, että "+" voi tarkoittaa yhteenlaskua tai katenointia, järjestys ratkaisee. Lauseet:
   System.out.println("luku on "+2+3);
   System.out.println(2+3+" on luku");

   System.out.println(77+88);
   System.out.println(""+77+88);
tulostavat
luku on 23
5 on luku
165
7788

Lukemista

Koska Javassa lukeminen kielen perusvälineillä on melko mutkikasta - ohjelmoija joutuu itse mm. varautumaan tietojen syötössä tapahtuviin virheisiin - olen laatinut kurssin käyttöön yksinkertaisen apuvälineen, luokan Lue.

Yksi tapa saada tämä luokka käyttöön on kopioida tiedosto Lue.java siihen hakemistoon, jossa ohjelmiaan laatii. Ennen luokan käyttöä se on tietenkin käännettävä class-tiedostoksi (kts. luku 2.1). Joustavampia tapoja opitaan myöhemmin!

Huom: Luokka Lue on tarkoitettu käytettäväksi Javan version 1.1.3 yhteydessä. Jos teet ohjelmiasi versiolla 1.0.2, käytä Lue-luokan sijaan luokkaa Lue102 (Lue102.java). Lue102 kääntyy ja toimii myös Java-versiossa 1.1.3 vaikka kääntäjä vähän varoitteleekin.

Lukuapuvälineiden toteutusta ei tietenkään vielä tarvitse ymmärtää, mutta kyllä niitä jo katsella saa. Kukapa ei olisi utelias...

Luokassa Lue on kolme lukemisen välinettä:

  1. Lue.rivi() lukee kokonaisen rivin String-tyyppisenä
  2. Lue.kluku() lukee kokonaisluvun (int)
  3. Lue.dluku() lukee liukuluvun (double)
(Luokassa on neljäskin väline: yksittäisen merkkiarvon lukeva metodi. Merkkityyppi opitaan myöhemmin.)

Kaikki kolme ns. palauttavat arvonaan luetun. Niitä siis käytetään lausekkeina eli niillä itsellään on arvo:

    int luku1;
    double luku2;
    String mjono;

    luku1 = Lue.kluku();
    luku2 = Lue.dluku();
    mjono = Lue.rivi();

Huom: Nuo tyhjät sulkeet operaatioiden yhteydessä ovat välttämättömät. Operaatiot on toteutettu luokan Lue ns. metodeina. Metodeista pian lisää.

Huom: Jos käytät Lue102-luokkaa, operaatiot kirjoitetaan muodossa Lue102.rivi(), jne.

Huom: Javassa on myös tulostusoperaatio

   System.out.flush();
jolla ns. tulostuspuskuri saadaan kirjoitettua tulostuslaitteelle. Jos käytät Lue102-luokkaa System.out.print(...) -operaation jälkeen, lisää heti print-operaation jälkeen tuo 'flush', jotta saat tekstin näkyviin.

Ensimmäiset oikeat ohjelmat

Tehdään ensin pikku kokeilu - eräänlainen tekoälyohjelma - kaikkien kolmen lukemisvälineen käytöstä (Viisas.java):
public class Viisas {           /* Viisas ohjelma, AW-97*/
  public static void main(String[] args) {

    String syottoRivi;
    int    kokonaisLuku;
    double liukuLuku;

    System.out.println("Mikä on nimesi?");
    syottoRivi = Lue.rivi();
    System.out.println("Mitä kokonaislukua ajattelet?");
    kokonaisLuku = Lue.kluku();
    System.out.println("Mitä reaalilukua ajattelet?");
    liukuLuku = Lue.dluku();

    System.out.print  ("Tiedän, että nimesi on "+syottoRivi);
    System.out.println(" ja että ajattelit lukuja "+
                       kokonaisLuku+" ja "+liukuLuku+".");
    System.out.println("Enkö olekin viisas!");
  }
}
Ohjelman suoritus voi näyttää vaikkapa seuraavalta:
Mikä on nimesi?
Arto
Mitä kokonaislukua ajattelet?
49
Mitä reaalilukua ajattelet?
3.14
Tiedän, että nimesi on Arto ja että ajattelit lukuja 49 ja 3.14.
Enkö olekin viisas!


Laaditaan vähän järkevämpi sovellus kolmen luvun keskiarvon laskemiseen. Ohjelma on vuorovaikutteinen (interactive) eli se keskustelee käyttäjän kanssa (Kolmekarvo.java):

public class KolmeKarvo { /* Sovellus 3 luvun keskiarvon laskentaan, AW-97*/
  public static void main(String[] args) {

    double luku1, luku2, luku3;
    double summa, karvo;

    System.out.println("\n  **** Keskiarvo-ohjelma ****\n");

    System.out.print("Anna 1. luku: ");
    luku1 = Lue.dluku();
    System.out.print("Anna 2. luku: ");
    luku2 = Lue.dluku();
    System.out.print("Anna 3. luku: ");
    luku3 = Lue.dluku();

    summa = luku1 + luku2 + luku3;
    karvo = summa/3;

    System.out.println("Lukujen keskiarvo on " + karvo);
  }
}
Tämän ohjelman suoritus voi näyttää seuraavanlaiselta:

  **** Keskiarvo-ohjelma ****

Anna 1. luku: 150.9
Anna 2. luku: -34.12
Anna 3. luku: 78.9
Lukujen keskiarvo on 65.22666666666667


Takaisin luvun 2 sisällysluetteloon.