Ylös Edellinen Seuraava Otsikkosivu Hakemisto Sisällys

10.11.1 break

Joskus kesken silmukan tulee vastaan tilanne, jossa silmukan suoritus haluttaisiin keskeyttää. Tällöin voidaan käyttää C- kielen break- lausetta, joka katkaisee sisimmän silmukan suorituksen.

java-silm\Break.java - silmukan katkaisu keskeltä

	private static void break_testi1() {
	  int summa=0,luku;
	  System.out.println("Anna lukuja.  Summaan niitä kunnes annat 0 tai summa>20");
	  do {
	    luku = Syotto.kysy("Summa on " + summa + ".  Anna luku",0);
	    if ( luku == 0 ) break;
	    summa += luku;
	  } while ( summa <= 20 );
	  System.out.println("Lukujen summa on " + summa);
	}

Koska 0:lla lisääminen ei muuta summaa, olisi tietenkin do- while - silmukan ehto voitu kirjoittaa muodossa

	    do {
	      luku = Syotto.kysy("Summa on " + summa + ".  Anna luku",0);
	      summa += luku;
	    } while ( luku != 0 && summa <= 20 );

mutta aina ei voida break - lausetta korvata näin yksinkertaisesti. Perus break - lauseen vika on lähinnä siinä, ettei siitä suoraan nähdä sisäkkäisten silmukoiden tapauksessa sitä, mihin saakka suoritus katkeaa. Epäselvissä tapauksissa silmukan katkaisu voidaan hoitaa nimeämällä silmukat ja ilmoittamalla break-lauseessa mikä silmukka katkaistaan:

java-silm\Break.java - ulomman silmukan katkaisu keskeltä

	  private static void break_testi3() {
	    int valisumma, loppusumma = 0,luku;
	    System.out.println("Anna lukuja.");
	    System.out.println("Summaan niitä kunnes annat 99.");
	    System.out.println("Antamalla 0, näet välisumman");
	    System.out.println("Välisumman näet myös jos välisumma > 20");
	    laskeloppusummaa: do {
	      valisumma = 0;
	      do {
	        luku = Syotto.kysy("Anna luku",0);
	        if ( luku == 0 ) break;
	        if ( luku == 99 ) break laskeloppusummaa;
	        valisumma += luku;
	      } while ( luku != 0 && valisumma <= 20 );
	      System.out.println("Lukujen välisumma on " + valisumma);
	      loppusumma += valisumma;
	      System.out.println("Kaikkien summa on " + loppusumma);
	    } while ( loppusumma < 100 );
	    System.out.println("Lukujen loppusumma on " + loppusumma);
	  }

Silmukka voidaan katkaista tietenkin myös muuttamalla silmukan lopetusehtoon vaikuttavia muuttujia. Varsinkin for- lauseen tapauksessa silmukan indeksin arvon muuttaminen muualla kuin kasvatus- lauseessa on todella väkivaltaista ja rumaa, eikä tällaista pidä mennä tekemään.

Hyvin usein aliohjelmassa break voidaan korvata return-lauseella.

Lisäksi näkyviä sisäkkäisiä silmukoita voidaan välttää tekemällä sisäsilmukasta oma aliohjelma:

	while ( ulkoehto ) {
	  while ( sisaehto ) {
	    hommia();
	  }
	}

Eli sisäkkäisten silmukoiden tilalle kirjoitetaan:

	void sisahommat() {
	  while ( sisaehto ) {
	    hommia();
	  }
	}
	...
	while ( ulkoehto ) {
	  sisahommat();
	}

Tehtävä 10.14 Tarvitaanko sisäkkäisiä silmukoita?

Tarvitaanko aliohjelmassa break_testi3 todella sisäkkäisiä silmukoita? Esitä ratkaisu jossa on vain yksi silmukka.

Ylös Edellinen Seuraava Otsikkosivu Hakemisto Sisällys