Ilkka Koivistoinen 13.02.2002

Edellinen

Seuraava

6 Ohjauslauseet
(Katso myös http://java.sun.com/docs/books/tutorial/java/nutsandbolts/if.html))

Ohjauslauseilla ohjataan ohjelman kulkua. Ohjauslauseilla voidaan toteuttaa vaihtoehtoisia ohjelmalohkoja ja toisaalta toistaa ohjelmasilmukoita. Seuraavassa on käsitelty ehto-, tapaus- ja toistolauseet.

6.1 Ehdollisuus

Java ohjelmassa haarautuminen tehdään if - else ehtolauseella.

Syntaksi


    if (ehto)
        lause1;
    else
        lause2;

tai

    if (ehto)
        lause1;

Jos ehto on tosi, suoritetaan lause1 ja jos se ei ole tosi, suoritetaan lause 2. Else –vaihtoehto ei ole pakollinen. Haarautumisrakenteen yhteydessä korostuu koodin luettavuuden merkitys. Käytä aina riittävästi sisennystä oikeassa kohdassa.

Huomaa, että kussakin haarassa toteutetaan vain yksi lause. Se voi olla myös koottu lause {}; joka siis muodostaa yhden loogisen kokonaisuuden.

Koottua lausetta (block) käytettäessä tulee muistaa yksi tärkeä asia. Kootussa lauseessa määritelty muuttuja ei näy kootun lauseen ulkopuolelle ts. muuttujan näkyvyysalue on se koottu lause, jossa muuttuja on määritelty.

    int x=10;

    {  // koottu lause alkaa
        int y=40;
        y=y+40;
    }  // koottu lause loppuu

Muuttujaa x voidaan käyttää normaalisti. Sen sijaan muuttujaa y ei voida käyttää kootun lauseen ulkopuolella, koska sitä ei ole siellä määritelty.

Esimerkki kootusta lauseesta. Mikäli ehto1 on tosi, suoritetaan lauseet lause11, lause12 ja lause13. Muulloin suoritetaan lause2.

if (ehto1)
{
   lause11;
   lause12;
   lause13;
}
else
   lause2;

Esimerkkejä. Seuraavassa haarautumiskomentoja ja niihin liittyvien muuttujien määrittelyt

int L;

if (L<2) System.out.println("Luku L on pienempi kuin kaksi");
if (L<=2) System.out.println("Luku L on pienempi tai yhtäsuuri kuin kaksi");
if (L>2) System.out.println("Luku L on suurempikuin kaksi");
if (L>=2) System.out.println("Luku L on suurempi tai yhtäsuuri kuin kaksi");
if (L!=2) System.out.println("Luku L on erisuuri kuin kaksi");

char a ; …

if (kirjain=='a') System.out.println("kirjain on a");
else System.out.println("kirjain ei ole a");

String jono1, jono2 …

if (jono1.equals(jono2)) System.out.println("merkkijonot ovat samoja");
else System.out.println("Kyseessä on eri merkkijonot");
//ei käy jono1==jono2. Tämä on yleensä aina epätosi

if (jono1.length()==0) System.out.println("merkkijono1 on tyhjä");
if (jono2.length()!=0) System.out.println("merkkijono2 ei ole tyhjä");

Esimerkki: Tee ohjelma, joka laskee tuotteen alennetun hinnan, kun alle 1000 mk:n hintaisen tuotteen alennus on 15% ja muuten 25%.

Esimerkki 13.

import java.io.*;
import Lue;
public class e13 // Alennus -ohjelma
{
   public static void main(String args[])
   {
     double alepros1=0.15; // voisi olla myös double alepros1=0.15, alepros2=0.25,...
     double alepros2=0.25;
     double rajahinta=1000.0;
     double hinta,alepros,alehinta;
     System.out.println("anna hinta(mk)");
     hinta=lue.dluku();

     if (hinta<rajahinta) alepros=alepros1;
     else alepros=alepros2;

     alehinta=(1.0-alepros)*hinta;
     System.out.println("alennettu hinta on "+alehinta+" mk");
   }
}

Ohjelmaa on ajettu kahdella eri hinnalla seuraavasti

ajo1: anna hinta(mk)
200
alennettu hinta on 170.0 mk

ajo2: anna hinta(mk)
1200
alennettu hinta on 900.0 mk

6.1.1 Loogisten operaattorien käyttö

Haarautumiskomennossa esiintyvä ehto voi rakentua useasta eri osasesta. Esimerkiksi edellä olevaan ohjelmaan alennus voitaisiin sisällyttää ehdot: Jos hinta on alle 1000 mk, niin alennus on 15% ja jos hinta on suurempi tai yhtä suuri kuin 1000 mutta pienempi kuin 2000 mk niin alennus on 25%. Muulloin alennus on 30%. Tämä rakenne olisi muotoa

if (hinta<1000) alepros:=0.15;
if (hinta >=1000 && hinta<2000) alepros:=0.25;
if (hinta> 2000) alennus:=0,3;

tai

if (hinta<1000) alepros:=0.15;
else
   if (hinta >=1000 && hinta<2000) alepros:=0.25;
   else
     alennus:=0,3;

joka kirjoitetaan yleensä muotoon

if (hinta<1000) alepros:=0.15;
else if (hinta >=1000 && hinta<2000) alepros:=0.25;
else alennus:=0,3;

Esimerkki.

int syntymakuukausi;

if (syntymakuukausi ==6 || syntymakuukausi ==7 || syntymakuukausi == 8)
  System.out.println("Olet syntynyt kesällä");
else System.out.println("Et ole syntynyt kesällä");

&&, || ja ! operaattoreita voi yhdistellä tarpeen mukaan. Operaattoreiden suoritusjärjestystä ohjataan suluilla. Seuraavassa esimerkissä tutkitaan onko annettu piste kuvaruudulla, kun kuvaruudun vasemman ylänurkan (x,y) koordinaatit ovat (0,0) ja oikean alanurkan (800,600).

Esimerkki 14.wpe2A.jpg (3639 bytes)

import Lue;
public class e14
//TestaaOnko800_600Kuvaruudulla;
{
   public static void main(String args[])
   {
     int x,y;
     System.out.println("Anna pisteen x ja y koordinaatit");
     x=Lue.kluku(); y=Lue.kluku();
    
     if ( (x>=0 && x<=800) && (y>=0 && y<=600 ) )
       System.out.println("On ruudussa");
     if (x<0 && (y>=0 && y<=600) ) System.out.println("menee vasemmalta ohi");
     if (x>800 && (y>=0 && y<=600) ) System.out.println("menee oikealta ohi");
     if ( (x>=0 && x<=800) && y<0) System.out.println("menee ylhäältä ohi");
     if ( (x>=0 && x<=800) && y>600) System.out.println("menee alhaalta ohi");
     // Miten testaat kulmasta ohi menon?
   }
}

6.1.2 Tehtäviä:

  1. Tee ohjelma joka kysyy marimekkovillapaidan hintaa ja laskee siitä käteisalennuksen 10% jos hinta oli vähintään 100 mk. Alle 100 mk ostoksista ei anneta alennusta. Ohjelma tulostaa lopullisen hinnan.
  2. * Kirjoita ohjelma tunnussana, joka kysyy tunnussanaa ja tulostaa oikein, jos annettu tunnussana oli 123XyZ. Muulloin ohjelma ilmoittaa virheellisestä tunnussanasta.
  3. Laadi ohjelma joka kysyy kahta kirjainta, ja ilmoittaa olivatko kirjaimet samat vai erit. (Voit käyttää String -luokan toUpperCase –metodia, jos haluat. Tällöin merkit pitää lukea merkkijonona)
  4. Tee ohjelma joka laskee annetun reaaliluvun itseisarvon. (joko if – else rakenteena tai Math –luokan abs() –metodilla. Esim. float x = Math.abs(6.0);)
  5. Tee ohjelma joka ilmoittaa annetusta kokonaisluvusta, onko se parillinen vai pariton (Vihje: Tutki jakojäännöstä tai käytä Math –luokan sopivaa metodia)
  6. Tee ohjelma joka kysyy kahta lukua ja ilmoittaa olivatko ne samanmerkkisiä vai erimerkkisiä (Vihje: Tutki lukujen tuloa)
  7. * Tee ohjelma joka kysyy Suomen suurinta saarta, ja vastaa OIKEIN, jos vastauksena annettiin SOISALO. Muulloin ohjelma vastaa VÄÄRIN (Vihje: Käytä toUpperCase –metodia ennen testaamista. Mitä hyötyä siitä on?).
  8. Tee ohjelma joka testaa, onko annettu luku jaollinen 3:lla ja 5:llä.
  9. * Tee ohjelma joka kysyy toisen asteen yhtälön kertoimia ja ilmoittaa, montako ratkaisua yhtälöllä on.
  10. * Tee ohjelma joka kysyy lineaarisen yhtälöparin kertoimet a,b, c,d, sekä vakiot e, f ja ilmoittaa onko yhtälöparilla ratkaisua. (kokeile saatko ohjelmoitua itse ratkaisun, jos sellainen on olemassa)
  11. Tee ohjelma joka kysyy kappaleen massaa, lähtökitkakerrointa ja vetävää voimaa ja ilmoittaa lähteekö kappale liikkeelle.
  12. * Tee ohjelma, joka laskee annetun pisteen etäisyyden annetusta suorasta.

Vastaukset

Ilkka Koivistoinen 13.02.2002

Edellinen

Seuraava