Ilkka Koivistoinen 13.02.2002

Edellinen

Seuraava

4.0 Koneen ja ihmisen välinen vuorovaikutus

Tietokoneen täytyy pystyä välittämään tietoja ohjelman ja ulkomaailman välillä. Käyttäjän täytyy usein ohjata ohjelman toimintaa. Syötön ja tulostuksen perusoperaatioilla pystyy rakentamaan yksinkertaisen vuorovaikutussuhteen ohjelman ja käyttäjän välille.

Ohjelma pystyy pyytämään käyttäjältä tietoa (lukuja, merkkejä). Käyttäjältä voidaan kysyä yksinkertaisia kysymyksiä, joihin voi vastata luvuin tai merkein. Esim. Haluatko poistaa tiedoston (K/e) (Oletusvastaus usein isolla!)? Tämä on varsin karkea malli, ja välttämättä ei kovin käyttäjäystävällinen.

Tämän kurssin alkuosan tehtävien suorittamiseen tällainen yksinkertainen vuorovaikutus on riittävä. Tietokoneen ja ihmisen välisen vuorovaikutuksen tutkimuksesta on kuitenkin kehittynyt tärkeä osa tietojenkäsittelyä ja ohjelmistoteollisuutta. Esimerkiksi tämän kurssin tietojen pohjalta pystyy hahmottamaan kuinka yksinkertainen tekstinkäsittelyohjelman itse tekstiä käsittelevä ydin loppujenlopuksi on, sen jopa voisi kuvitella pystyvänsä itse kirjoittamaan. Nykyisin Windows –ympäristössä ohjelman ja käyttäjän vuorovaikutus tapahtuu kysely-dialogien, hiiren, grafiikkanäytön yms. resurssien välityksellä. Tähän tekniikkaan palaamme olio-ja tapahatumapohjaisen ohjelmoinnin kurssiosalla käsiteltäessä Javan graafisia ohjelmointirajapintoja.

Oletetaan, että syöttö tapahtuu näppäimistöltä, ja että tulostus tehdään kuvaruudulle. Tämä on UNIX:ista periytyvä malli standardi syöte- ja tulostusvirrasta ja yleisimmin käytössä oleva tapa.

Javassa ohjelma ohjaa tietovirtoja out, in ja err. Tietovirta out on standardi tulostusvirta, jonka oletusarvo on näyttö. Tietovirta in on standardi syöttövirta, jonka oletusarvona on näppäimistö. Oletuksia voidaan muuttaa eli uudelleenohjata halutun mukaisesti. Standardi virhetulostusvirta err on tarkoitettu virheiden tulostamiseen. Huomaa, että Java käsittelee syöttö ja tulostusvirtoja olioina. Meillähän on ollut jo komento System.out.println() eli out on system –luokan omistama tietovirtaolio ja println puolestaan out –olion metodi. Lukemismetodit on ladattava luokkakirjastosta java.io.* import komennolla.

4. 1 Lukeminen (in) ja tulostus (out)

Näppäimistön luku Javassa on hieman hankalaa, koska in –olio ei osaa lukea näppäimistöltä muuta kuin tavuja (byte). Tarvittaessa tavut on muutettava String –luokan avulla merkkijonoiksi ja siitä edelleen luvuiksi. Tämä tuottaa kurssin tässä vaiheessa aivan liikaa hankaluuksia, joten kurssia varten on hankittu luokka Lue (katso huomautus sisällysluettelon alussa), joka pitää kopioida samaan hakemistoon, missä lähdekoodi sijaitsee ja sitten kääntää se class –tyypiksi. Sen jälkeen se saadaan käyttöön import Lue –komennolla. Utelias voi toki tutkia Lue.java –koodia ja muutella sitä mieleisemmäkseen (tämä koskee toki vain omaa kopiotasi!). Seuraavassa on esimerkki E6 eri tietotyyppien lukemisesta näppäimistöltä.(Lataa tästä itsellesi Lue.java ja käännä se itsellesi Lue.class -tiedostoksi. Kopioi se kaikkiin niihin kansioihin, jossa sinulla on java -ohjelmia)

Esimerkki E6.

import Lue;
public class e6
{
   public static void main(String args[])
   {
     //Lue.rivi() lukee kokonaisen rivin String-tyyppisenä
     //Lue.kluku() lukee kokonaisluvun (int)
     //Lue.dluku() lukee liukuluvun (double)
     int luku;
     double x;
     String s;
     System.out.println("Anna kokonaisluku"); luku = Lue.kluku();
     System.out.println("Anna liukuluku"); x = Lue.dluku();
     System.out.println("Anna merkkijono"); s = Lue.rivi();
     System.out.println("Luvun "+luku+" neliö on "+luku*luku);
     System.out.println("Luvun "+x+" kuutio on "+x*x);
     System.out.println("Antamasi merkkijono on "+s);
   }
}

Tulosteena on likimain

Anna kokonaisluku
2
Anna liukuluku
3.0
Anna merkkijono
Kahvia, kiitos
Luvun 2 neliö on 4
Luvun 3.0 kuutio on 27.0
Antamasi merkkijono on Kahvia, kiitos

Halutessa voi käyttää myös muita syöttö ja tulostusmetodeja. Niiden käyttö vaatii jonkin verran omaehtoista opiskelua ja kokeilua. Syöttömetodien osalta tulee muistaa, että Java lukee näppäimistöltä tavun kerrallaan.

Tulostusmetodeja ovat

print() Tulostaa ilman rivinvaihtoa
println() print() + rivinvaihto
write() Tulostaa halutun määrän tavuja halutusta kohdasta

Syöttömetodit ovat

mark(int) Merkitsee annetun kohdan reset()-metodia varten (kokeile!)
markSupported() Testaa, onko merkitseminen mahdollista
read() Lukee seuraavan tavun
read(byte[]) Lukee useita tavuja
reset() Asettaa kursorin sijainnin viimeksi merkittyyn kohtaan
skip(long) Hyppää yli annetun määrän tavuja

java.in.BufferedInputStream –luokan metodit on tarkoitettu puskuroidun syöttötiedon käsittelemiseen. Tämän kurssin alkuaosan harjoituksissa vältetään olioihin pohjautuvia lukurutiineja. Kaikki lukurutiinit on tehty Lue –luokan metodeiksi ja niinpä mitään edelle olevista syöttömetodeista ei tarvita.

4.2 Esimerkki

Seuraava esimerkki täyttää Assembly –98 expon ilmoittautumiskortin. Lukurutiini Lue.class pitää olla siinä hakemistossa, missä alkuperäinen java –koodi sijaitsee. (Tällä ohjelmalla ei kyllä ihan vielä kannata ko. messuille lähteä!)

Esimerkki 9.

import Lue;
public class e9
{
  public static void main (String args[])
   {
    String nimi, osoite, postinumero, postitoimipaikka;
    System.out.print("Assembly 98 messut: Täytä seuraavat tiedot");
    System.out.print("Anna nimesi "); nimi=Lue.rivi();
    System.out.print("Anna osoitteesi "); osoite=Lue.rivi();
    System.out.print("Anna postinumero "); postinumero=Lue.rivi();
    System.out.print("Anna postitoimipaikka "); postitoimipaikka=Lue.rivi();
    System.out.println();
    System.out.println("***************************************");
    System.out.println("Assembly 98 messut. Osanottotiedot");
    System.out.println("Nimi : " + nimi );
    System.out.println("Osoite : " + osoite);
    System.out.println("Postinumero : " + postinumero);
    System.out.println("Postitoimipaikka : " + postitoimipaikka);
    System.out.println("***************************************");
   }
}

4.3 Tehtäviä

  1. Laadi ohjelma, joka kysyy nimesi sekä kaksi harrastustasi ja tulostaa tiedot.
  2. * Kirjoita ohjelma, joka kysyy tilaajan ja tilattavan kirjan tiedot ja tulostaa oheisen mallin mukaisen kirjatilauskortin.

    Tilaaja: Jukola Aapo

    Tekijä: Lindgren Astrid
    Teos: Peppi lähtee merille

  3. * Kirjoita ohjelma, joka lukee seuraavien alkuaineiden kemialliset merkit muuttujiin happi, vety, kalium, alumiini, kupari, hiili, typpi, jodi ja kalsium. Muuttujien arvot tulostetaan seuraavassa järjestyksessä

    kalsium, hiili, kupari
    happi, typpi
    vety, alumiini, kalium, jodi

  4. Tee ohjelma joka kysyy nimesi muuttujaan String nimi; Tulosta haluamasi i:s kirjain nimestä charAt() –metodilla. Tulosta myös merkkijono pituus eri syötteen arvoilla length() -metodilla. Mitä havaitset?

Vastaukset

Ilkka Koivistoinen 13.02.2002

Edellinen

Seuraava