H11 Herhaling

Leerdoelen

Na het bestuderen van dit hoofdstuk wordt van je verwacht dat je weet

  • hoe je lussen (loops) gebruikt
  • hoe je het for-,
  • het while- &
  • het do-while statement kunt gebruiken
  • wat wordt bedoeld met het "nesten" van lussen

Praktijk

Inleiding

Waar de computer echt goed in is, is steeds hetzelfde doen. En dat kan ook erg nuttig zijn. Bijvoorbeeld als uit een lijst met namen alle Jansens geselecteerd moeten worden, betekent dat hij per naam steeds moet kijken of de naam hetzelfde als Jansens is. Zo ja, dan moet die naam geselcteerd worden, zo nee, dan gaat de computer naar de volgende naam. Zo'n herhaling wordt ook wel iteratie of lus (in het Engels loop) genoemd.

Het for-statement

In het volgende voorbeeld worden 10 lijnen en 10 cijfers op het beeldscherm getekend. Dit gebeurt door middel van twee opdrachten in een herhalingslus.

// Voorbeeld 11.1

import java.awt.*;
import java.applet.*;


public class For extends Applet {
	
    public void init() {}

    public void paint(Graphics g) {
        int teller;
        int y = 0;
		
        for(teller = 0; teller < 10; teller++) {
            y += 20;
            g.drawLine(50 , y, 300, y );
            g.drawString("" + teller, 305, y );
        }
    }
}

De regel waar het omgaat is:
for(teller = 0; teller < 10; teller ++);
Het for-statement bestaat naast de naam for uit drie onderdelen:

Het while-statement

Wat er eigenlijk gebeurt met een for-statement, is dat deze wordt omgezet in een while-lus. Het volgend voorbeeld heeft precies dezelfde uitvoer als het vorige voorbeeld:

 Voorbeeld 11.2

import java.awt.*;
import java.applet.*;


public class For extends Applet {
	
    public void init() {}

    public void paint(Graphics g) {
        int teller = 0;
        int y = 0;
		
        while(teller < 10) {
            y += 20;
            g.drawLine(50 , y, 300, y );
            g.drawString("" + teller, 305, y );
            teller++;
        }
    }
}

Ook hier wordt de teller eerst op 0 gesteld, alleen nu in een aparte opdracht. Achter while staat nu tussen ronde haken de voorwaarde: teller < 10 en aan het einde van de lus wordt de teller opgehoogd: teller ++; ook weer in een aparte opdracht. De body van de lus staat evenals bij het for-statement tussen accolades.

Het do-while-statement

Het onderstaande voorbeeld geeft precies dezelfde uitvoer als de twee vorige voorbeelden.

 Voorbeeld 11.3

import java.awt.*;
import java.applet.*;


public class For extends Applet {
	
    public void init() {}

    public void paint(Graphics g) {
        int teller = 0;
        int y = 0;
		
        do {
            y += 20;
            g.drawLine(50 , y, 300, y );
            g.drawString("" + teller, 305, y );
            teller++;
        } while (teller < 10);
    }
}

Eerst wordt weer de teller op 0 gesteld. Op de volgende regel staat nu niet while, maar do. De body van de lus staat wederom tussen accolades. De teller wordt aan het einde van de lus opgehoogd met 1 en vervolgens staat het while-statement met daarachter de voorwaarde. Het verschil tussen een while-lus en een do-while-lus is dat de laatste minimaal één keer wordt doorlopen omdat controle van de voorwaarde achteraf plaatsvindt en een while-lus minimaal nul keer wordt doorlopen omdat de voorwaarde vooraf gecontroleerd wordt.

Lussen in het algemeen

Belangrijk is, dat de voorwaarde meteen geëvalueerd wordt als de variabele die in de voorwaarde van de lus staat, gewijzigd wordt. Als dat niet gebeurt, wordt het gedrag van de lus onvoorspelbaar. Bij het for-statement gebeurt dat automatisch, bij de while- en do-while-statement moet de programmeur daar zelf opletten.

Verder is het mogelijk dat in de body van een lus nog een lus voorkomt en nog één en nog één. Dat wordt het nesten van lussen genoemd. Hetzelfde geldt overigens voor het if-else-statement. Doe dit zo weinig mogelijk, want de broncode wordt onleesbaar en dus niet meer onderhoudbaar. Als iets dergelijks op te lossen is door voorwaarden te combineren met logische operatoren, dan verdient die werkwijze de voorkeur. Er zijn echter situaties waarin het nesten van lussen niet voorkomen kan worden.

Een lus kent altijd één of meerdere voorwaarden. Deze voorwaarden werken op dezelfde manier als bij het if-then-statement. Ook het gebruik van de logische operatoren is hetzelfde.

In de voorbeelden hierboven is de teller van de lus steeds met één opgehoogd. Dat hoeft natuurlijk niet bij elke lus zo te zijn: Hij kan ook met 2 of 3 worden opgehoogd, of de teller kan bij 10 beginnen en eindigen als hij gelijk is aan 0. Ook kan een lus verlaten worden als aan een andere voorwaarde is voldaan. Bijvoorbeeld bij zoeken naar de naam Jansens zal de lus verlaten worden zodra de naam is gevonden.

Het kan voorkomen dat je een oneindige lus hebt gemaakt. Dat betekent dat de computer steeds bezig is de opdrachten in de lus uit te voeren en altijd aan de voorwaarde voldoet. Sluit dan de browser als het in een browser gebeurt of beëindig de taak in taakbeheer (ctrl+shift+esc).

Vragen

  1. Wat is het verschil tussen een while- en do-while-lus?

  2. Is de for-lus eigenlijk een do-while-lus of een while-lus?

  3. Wat is het nesten van lussen?

  4. Bekijk de volgende broncode

    int eind = 5;
    for(int x = 10;  x < eind;  x++) {
         ....
         ....
    }
    

    Wordt de lus uitgevoerd? Geef een verklaring voor je antwoord

Opdracht 11.1

Schrijf een applet, waarin 10 verticale lijnen worden getoond.

Opdracht 11.2

Schrijf een applet, waarin tien getallen van 20 tot 10 worden getoond.

Opdracht 11.3

Geef de rij van Fibonacci. De eerste twee getallen van de rij zijn 1 en de volgende zijn de som van de twee voorgangers.
1, 1, 2, 3, 5, 8, 13, 21, en zo voort...

Opdracht 11.4

Maak een applet waarin de tafel van drie getoond wordt.

Opdracht 11.5

Teken vijf vierkanten volgens onderstaand figuur:

Opdracht 11.6

Teken vijf concentrische cirkels zoals in het volgende figuur:

Opdracht 11.7

Teken 50 concentrische cirkels zoals onderstaand figuur.

Opdracht 11.8

Schrijf een applet waarin minimaal 100 cirkels worden getoond die hetzelfde beginpunt hebben, maar elke cirkel wordt iets groter dan de vorige.

Opdracht 11.9

Schrijf een applet waarin een schaakbord op het scherm wordt getekend. Een schaakbord heeft 8 bij 8 vakken om en om wit en zwart. Zie nadere uitleg

Praktijkopdracht

Deze praktijkopdracht bevat twee opdrachten die over tafels gaan. Een tafel op het scherm ziet er als volgt uit:
1 x 1 = 1
2 x 1 = 2
enz...

  1. Schrijf een applet in Java, waarin de gebruiker een getal invoert en als de gebruiker op de Ok-knop klikt, verschijnt de tafel van dat getal in het venster. Dus als de gebruiker een 9 heeft ingetikt, verschijnt de tafel van 9. Als de gebruiker opnieuw een getal intikt, wordt die tafel weergegeven.

  2. Schrijf een applet in Java, waarin de tafels van 1 tot en met 10 worden weergegeven. Als één tafel op het scherm zichtbaar is en de gebruiker klikt op de Ok-knop, dan wordt de volgende tafel zichtbaar.