Osa 1

Syötteen lukeminen

Syöte on ohjelman käyttäjän kirjoittamaa tekstiä, jota ohjelma lukee. Syöte luetaan aina merkkijonona. Syötteen lukemiseen käytetään Javan valmista Scanner-apuvälinettä. Apuväline tuodaan ohjelman käyttöön lisäämällä komento import java.util.Scanner; ennen pääohjelmarungon aloitusta (public class ...), ja itse apuväline luodaan komennolla Scanner lukija = new Scanner(System.in);.

import java.util.Scanner;

public class Ohjelma {

    public static void main(String[] args) {
        Scanner lukija = new Scanner(System.in);

        // Nyt käytössämme on "lukija"-niminen apuväline.
        // Lukijaa käytetään syötteen lukemiseen.
    }
}

Alla on esitelty ohjelma, joka kysyy käyttäjältä syötettä, lukee käyttäjän syöttämän merkkijonon, ja lopulta tulostaa käyttäjän syöttämän merkkijonon.

// Tuodaan lukemiseen käytettävä Scanner-apuväline käyttöön
import java.util.Scanner;

public class Ohjelma {

    public static void main(String[] args) {
        // Luodaan lukemiseen käytettävä apuväline, jonka nimeksi tulee lukija
        Scanner lukija = new Scanner(System.in);

        // Tulostetaan käyttäjälle viesti "Syötä viesti: "
        System.out.println("Syötä viesti: ");

        // Luetaan käyttäjän syöttämä merkkijono ja asetetaan se
        // ohjelman muistiin "String viesti = (luettu sisältö)"
        String viesti = lukija.nextLine();

        // Tulostetaan käyttäjän syöttämä viesti
        System.out.println(viesti);
    }
}

Tarkemmin ottaen lukeminen tapahtuu lukija-apuvälineeseen liittyvällä komennolla nextLine(). Kutsu lukija.nextLine() jää odottamaan käyttäjän kirjoittamaa merkkijonoa. Kun käyttäjä syöttää merkkijonon ja painaa enteriä, käyttäjän syöttämä merkkijono asetetaan merkkijonotyyppiseen muuttujaan (tässä muuttujan nimi on viesti). Muuttujaan viesti voi viitata ohjelmasta myöhemmin — yllä olevassa esimerkissä muuttujaan viesti viitataan tulostuskomennossa.

Kun ohjelma käynnistetään, tulostus on esimerkiksi seuraavanlainen. Alla olevassa esimerkissä käyttäjä on syöttänyt tekstin "Hei maailma" — esimerkeissä käyttäjän syöttämät tekstit merkitään punaisella.

Esimerkkitulostus

Syötä viesti: Hei maailma Hei maailma

Alla olevassa videossa näytetään käyttäjältä syötettä lukevan ohjelman tekoprosessi. Katso video ennen seuraavan ohjelmointitehtävän tekemistä. Kiinnitä erityisesti huomiota siihen, miten syöte annetaan ohjelman käynnissä ollessa TMC:n alalaidassa olevaan Output-ikkunaan.

Loading

Otetaan seuraavaksi askel taaksepäin ja tarkastellaan mitä ihmettä edellä käytetty String viesti = ... oikein tarkoittaa.

Merkkijonojen alkeet

Olemme käyttäneet merkkijonoja kahdella tapaa. Tulostuskomentoa harjoiteltaessa annoimme tulostettavan merkkijonon hipsuissa tulostuskomennolle, kun taas syötteen lukemista harjoiteltaessa luettu merkkijono tallennettiin muuttujaan.

Muuttujat ovat käytännössä nimettyjä lokeroita, jotka sisältävät tietyn tyyppistä tietoa ja joilla on nimi. Merkkijonomuuttuja esitellään ohjelmassa kertomalla muuttujan tyyppi (String) ja muuttujan nimi (esimerkiksi mjono). Muuttujan esittelyn yhteydessä muuttujaan asetetaan tyypillisesti myös arvo. Arvon asettaminen tapahtuu muuttujan esittelyä seuraavalla yhtäsuuruusmerkillä, jonka jälkeen tulee arvo sekä puolipiste.

Merkkijonomuotoinen muuttuja nimeltä viesti, jonka arvona on merkkijono "Hei maailma!", luodaan seuraavasti.

String viesti = "Hei maailma!";

Muuttujan luominen luo ohjelman käyttöön paikan, jonka sisältöön voi myöhemmin viitata. Viittaaminen tapahtuu muuttujan nimen avulla. Esimerkiksi merkkijonomuuttujan luominen ja tulostaminen tapahtuu seuraavalla tavalla.

String viesti = "Hei maailma!";
System.out.println(viesti);
Esimerkkitulostus

Hei maailma!

Ohjelmointikielen hipsuissa oleva merkkijono on ns. merkkijonoliteraali, eli määrätyn muotoinen merkkijono. Tyypillinen virhe ohjelmoidessa on yrittää asettaa muuttujaan hipsut: mikäli ohjelmassa olisi hipsut merkkijonomuuttujan viesti nimen ympärillä, tulostaisi ohjelma tekstin "viesti" muuttujan viesti arvon eli tekstin "Hei maailma!" sijaan.

String viesti = "Hei maailma!";
System.out.println("viesti");
Esimerkkitulostus

viesti

Katenointi eli merkkijonojen yhdistäminen

Tulostettavan merkkijonon voi koostaa useammista merkkijonoista +-merkin avulla. Esimerkiksi alla oleva ohjelma tulostaa viestin "Hei maailma!" yhdelle riville.

public class Ohjelma {

    public static void main(String[] args) {
        System.out.println("Hei " + "maailma!");
    }
}

Edellistä esimerkkiä noudattaen myös merkkijonomuuttujan arvon ja merkkijonoliteraalin arvo voidaan yhdistää.

public class Ohjelma {

    public static void main(String[] args) {
        String viesti = "Hei maailma!";

        System.out.println(viesti + " ... ja maailmankaikkeus!");
    }
}
Esimerkkitulostus

Hei maailma! ... ja maailmankaikkeus!

Sama onnistuu myös useammalla osalla.

public class Ohjelma {

    public static void main(String[] args) {
        String alku = "My name is ";
        String loppu = ", James Bond";

        System.out.println(alku + "Bond" + loppu);
    }
}
Esimerkkitulostus

My name is Bond, James Bond

Loading

Merkkijonojen lukeminen

Lukemiseen käytettävä komento lukija.nextLine(); lukee käyttäjän syötteen ja palauttaa merkkijonon. Mikäli merkkijonoa halutaan käyttää ohjelmassa, tulee se säilöä merkkijonomuuttujaan — String viesti = lukija.nextLine();. Muuttujassa olevaa arvoa voi käyttää monta kertaa. Alla olevassa esimerkissä käyttäjän syöttämä viesti tulostetaan kahteen kertaan.

// Tuodaan lukemiseen käytettävä Scanner-apuväline käyttöön
import java.util.Scanner;

public class Ohjelma {

    public static void main(String[] args) {
        // Luodaan lukemiseen käytettävä apuväline, jonka nimeksi tulee lukija
        Scanner lukija = new Scanner(System.in);

        // Tulostetaan käyttäjälle viesti "Syötä viesti: "
        System.out.println("Syötä viesti: ");

        // Luetaan käyttäjän syöttämä merkkijono ja asetetaan se
        // ohjelman muistiin "String viesti = (luettu sisältö)"
        String viesti = lukija.nextLine();

        // Tulostetaan käyttäjän syöttämä viesti kahteen kertaan
        System.out.println(viesti);
        System.out.println(viesti);
    }
}
Esimerkkitulostus

Syötä viesti: Tämä tulostetaan kahteen kertaan... Tämä tulostetaan kahteen kertaan... Tämä tulostetaan kahteen kertaan...

Loading

Luettu merkkijono osana tulostusta

Huomasimme ohjelmointitehtävässä "Hei Ada Lovelace!", että merkkijonoliteraaleja ja merkkijonomuuttujia voidaan yhdistää +-merkillä. Alla oleva esimerkki näyttää ohjelman, missä käyttäjältä luetaan merkkijono, joka tulostetaan merkkijonoliteraaliin yhdistettynä.

import java.util.Scanner;

public class Ohjelma {

    public static void main(String[] args) {
        Scanner lukija = new Scanner(System.in);

        System.out.println("Syötä viesti: ");

        String viesti = lukija.nextLine();

        System.out.println("Viestisi oli " + viesti);
    }
}
Esimerkkitulostus

Syötä viesti: selkeä Viestisi oli selkeä

Loading

Ohjelman suoritus odottaa syötettä

Kun ohjelman suoritus kohtaa kohdan, missä käyttäjältä halutaan lukea syötettä (komento lukija.nextLine()), ohjelman suoritus jää odottamaan. Suoritus jatkuu vasta kun käyttäjä kirjoittaa syötteen ja painaa enteriä.

Alla olevassa esimerkissä ohjelma pyytää käyttäjältä kolmea merkkijonoa. Ensin ohjelma tulostaa merkkijonon Syötä ensimmäinen merkkijono:, jonka jälkeen ohjelma jää odottamaan käyttäjän syötettä. Kun käyttäjä syöttää tekstin, ohjelma tulostaa merkkijonon Syötä toinen merkkijono:, jonka jälkeen ohjelma jää taas odottamaan käyttäjän syötettä. Tämä jatkuu myös kolmannen kerran, jonka jälkeen ohjelma tulostaa käyttäjän syöttämät tekstit.

import java.util.Scanner;

public class Ohjelma {

    public static void main(String[] args) {
        Scanner lukija = new Scanner(System.in);

        System.out.println("Syötä ensimmäinen merkkijono:");
        String eka = lukija.nextLine();
        System.out.println("Syötä toinen merkkijono:");
        String toka = lukija.nextLine();
        System.out.println("Syötä kolmas merkkijono:");
        String kolmas = lukija.nextLine();

        System.out.println("Syötit:");
        System.out.println(eka);
        System.out.println(toka);
        System.out.println(kolmas);
    }
}
Esimerkkitulostus

Syötä ensimmäinen merkkijono: eka Syötä toinen merkkijono: toka Syötä kolmas merkkijono: kolmas Syötit: eka toka kolmas

Loading

Edellisessä esimerkissä säilöimme käyttäjän syötteet kolmeen erilliseen merkkijonomuuttujaan. Tämä on mahdollista kunhan muuttujien nimet poikkeavat toisistaan (alla nimet ovat eka, toka ja kolmas).

import java.util.Scanner;

public class Ohjelma {

    public static void main(String[] args) {
        Scanner lukija = new Scanner(System.in);

        System.out.println("Syötä ensimmäinen merkkijono:");
        String eka = lukija.nextLine();
        System.out.println("Syötä toinen merkkijono:");
        String toka = lukija.nextLine();
        System.out.println("Syötä kolmas merkkijono:");
        String kolmas = lukija.nextLine();

        System.out.println("Syötit:");
        System.out.println(eka);
        System.out.println(toka);
        System.out.println(kolmas);
    }
}

Useampaa merkkijonoa käyttämällä voi luoda laajempia tekstejä, joissa sisältö vaihtelee käyttäjän syöttämän syötteen mukaan. Alla olevassa esimerkissä käyttäjälle kerrotaan hieman enemmän hänen syöttämistä teksteistä — huomaa myös, että muuttujien järjestystä tulostuksessa voi halutessaan vaihdella: alla tulostetaan ensin viimeisenä luettu muuttuja.

import java.util.Scanner;

public class Ohjelma {

    public static void main(String[] args) {
        Scanner lukija = new Scanner(System.in);

        System.out.println("Syötä ensimmäinen merkkijono:");
        String eka = lukija.nextLine();
        System.out.println("Syötä toinen merkkijono:");
        String toka = lukija.nextLine();
        System.out.println("Syötä kolmas merkkijono:");
        String kolmas = lukija.nextLine();

        System.out.println("Syötit viimeisenä merkkijonon " + kolmas + ", jota ");
        System.out.println("edelsi merkkijono " + toka + ".");
        System.out.println("Ensimmäisenä oli " + eka + ".");

        System.out.println("Kaikki yhdessä: " + eka + toka + kolmas);
    }
}
Esimerkkitulostus

Syötä ensimmäinen merkkijono: yksi Syötä toinen merkkijono: kaksi Syötä kolmas merkkijono: kolme Syötit viimeisenä merkkijonon kolme, jota edelsi merkkijono kaksi. Ensimmäisenä oli yksi. Kaikki yhdessä: yksikaksikolme

Loading
Pääsit aliluvun loppuun! Jatka tästä seuraavaan osaan:

Muistathan tarkistaa pistetilanteesi materiaalin oikeassa alareunassa olevasta pallosta!