11. Javan valintarakenteet 11.1
Sisällys If- ja if--lauseet. Orpo. Valintaa toisin: switch-lause. 11.2
Valintarakenteet Valintarakenteilla ilmaistaan formaalisti, kuinka algoritmin suoritus voi haarautua ehdosta riippuen. Tässä tärkein työkalu on if-lause, jolla kuvataan mitä täytyy tehdä, jos lauseen ehto on tosi. If-lauseen laajennos, if--lause, kuvaa kuinka algoritmi toimii, kun ehto on tosi ja epätosi. If-lause kuvaa yksi- ja -lause kaksihaaraista päätöstä. Sisäkkäisillä valintarakenteilla voidaan kuvata näitä monimutkaisempia päätöksiä. 11.3
If-lause Kuvaa yksittäisen päätöshaaran: lauseet suoritetaan vain ehdon toteutuessa. Sulkujen sisällä olevan ehto palauttaa totuusarvon true toteutuessaan. Aaltosulkeet voidaan jättää pois, jos rakenteeseen liittyy yksi lause (n = 1). Yleisesti: { lause 1;... lause n; Esimerkki: kyllä if (lkm > 0) { ka = summa / lkm; System.out.println(ka); ehto lause 1 lause n ei 11.4
If-lause // Tutkitaan ovatko luvut yhtä suuret. public class Samatko1 { public static void main(string[] args) { // Esitellään ja alustetaan luvut. int luku1 = 1; int luku2 = 1; // Tulostetaan, jos yhtä suuret. if (luku1 == luku2) System.out.println("Yhtä suuret."); Oheinen ohjelma tulostaa viestin vain, jos luvut ovat yhtä suuret. Eri suuruus jätetään huomiotta. Myös yksittäinen ohjausrakenteeseen liittyvä lause sisennetään. 11.5
If--lause Kuvaa kaksihaaraisen päätöksen. Lauseet suoritetaan vaihtoehtoisesti: ehdon ollessa tosi suoritetaan if-osa, muuten -osa. Jos n = 1 tai m = 1, voidaan aaltosulkeet jättää pois. Yleisesti: { lause 1;... lause n; { lause 1;... lause m; kyllä ei lause 1 ehto lause 1 lause n Esimerkki: lause m if (lkm > 0) { ka = summa / lkm; System.out.println(ka); System.out.println("Ei lukuja!"); 11.6
If--lause // Tutkitaan ovatko luvut yhtä suuret. public class Samatko2 { public static void main(string[] args) { // Esitellään ja alustetaan luvut. int luku1 = 1; int luku2 = 2; // Tulostetaan, jos yhtä suuret. if (luku1 == luku2) System.out.println("Yhtä suuret."); System.out.println("Eri suuret."); Oheinen ohjelma kertoo ovatko luvut yhtä vai eri suuret. Else-osa suoritetaan, kun lauseke luku1 == luku2 on epätotta (false). 11.7
Sisäkkäiset valintarakenteet If- ja if-lauseita voidaan yhdistää monimutkaisemmiksi valinnoiksi. Sisennys auttaa sisäkkäisyyden ymmärtämistä. public class PolttaaPolttaa { public static void main(string[] args) { int lampo = 26; if (lampo > 15) // > 15 if (lampo < 25) // 15 < lampo < 25 System.out.println("Sopiva."); // >= 25 System.out.println("Liian kuuma!"); // <= 15 System.out.println("Liian kylmä!"); 11.8
Orpo Valintarakenteita yhdistettäessä ei ole aina selvää mihin ifosaan -osa liittyy. Orpo -ongelma (dangling ): Onko lause x; lause y; lause x; vai lause x; lause y; lause y; 11.9
Orpo Javassa orpo -osa liittyy aina lähimpään vapaaseen if-osaan. lause x; lause y; Sisentämällä valintarakenteista saadaan luettavampia. Koodia muotoilemalla ei kuitenkaan voida määrätä mihin if-osaan orpo liittyy. Koottuja lauseita käyttämällä voidaan vaikuttaa oletussuoritusjärjestykseen. 11.10
Orpo lause x; lause y; Else liittyy jälkimmäiseen if-osaan. { lause x; lause y; Else liittyy ensimmäiseen if-osaan. 11.11
switch-lause switch (arvo) { case vakio 1: lause k;... case vakio 2: lause l;...... default: lause m;... Valinta arvojen tai vakioiden avulla. Arvon oltava char, byte, short tai int. Javan 1.7-versiosta alkaen String-tyyppi sallittu. Jos break-lause puuttuu jostakin valinnasta, niin tästä kohdasta alkanut suoritus jatkuu, kunnes kohdataan seuraava break-lause tai valintarakenne loppuu. break-lauseen unohtuminen jostakin valinnasta on varsin yleinen ohjelmointivirhe. default-osa suoritetaan, jos mitään muuta lauseen osaa ei suoriteta. Lause sopii hyvin erilaisten valikoiden toteuttamiseen. 11.12
switch-lause // Ohjelma, jossa on valikko. public class Rekisteri { public static void main(string[] args) { // Ohjelman tuntemat // komennot vakioina final char LISAA = 'l'; final char POISTA = 'p'; final char HAE = 'h'; final char LOPETA = 'e'; // Muuttuja, johon luetaan käyttäjän // näppäimistöltä antama valinta. char valinta; // Valitaan toiminto if--rakenteilla. if (valinta == LISAA) { System.out.println("Lisään..."); if (valinta == POISTA) { System.out.println("Poistan..."); if (valinta == HAE) System.out.println("Haen..."); if (valinta == LOPETA) { System.out.println("Lopetan..."); System.out.println("Virhe."); 11.13
switch-lause // Valitaan toiminto switch-rakenteella. switch (valinta) { case LISAA: System.out.println("Lisään..."); case POISTA: System.out.println("Poistan..."); case HAE: System.out.println("Haen..."); case LOPETA: System.out.println("Lopetan..."); default: System.out.println("Virhe."); 11.14