Terug naar de inhoudsopgave

Les 11 – Herhalen tot je een ons weegt

Een aantal lessen terug hebben we gezien hoe we statements kunnen herhalen met behulp van de for-lus. De for-lus is erg geschikt als we van tevoren kunnen bepalen hoe vaak de lus uitgevoerd moet worden. Soms weten we dat niet en hangt het aantal herhalingen af van wat er binnen de lus gebeurd.

De do-lus

Met de do-lus kunnen we herhalingen uitvoeren totdat er een bepaalde situatie optreedt. Het volgende programma vraagt telkens invoer aan de gebruiker. Zolang de gebruiker een getal groter dan 0 invoert, voert het programma de lus uit. Zodra de gebruiker een getal kleiner dan of gelijk aan 0 invoert, houdt de lus op en stopt het programma.

#include <iostream>

using namespace std;

// het programma start hier
void main()
{
	// declareer variabele om invoer op te slaan
	int myInput;
	
	// herhaal totdat invoer kleiner dan of gelijk is aan 0
	do
	{
		// vraag om invoer
		cin << myInput;
	} while (myInput > 0);
	
	// wacht op enter
	system("pause");
}
	

De code die herhaalt moet worden staat tussen accolades. Zolang het statement dat achter while staat waar is, wordt de lus uitgevoerd. In het voorbeeld: zolang het ingevoerde getal groter is dan 0, wordt de lus uitgevoerd.

Controleren op geldige invoer

Tot nu toe zijn we er altijd van uitgegaan dat de gebruiker juiste invoer levert. Dus als we een geheel getal verwachten, dan voert de gebruiker geen tekst in. In de praktijk gaat dat natuurlijk niet op. We zoeken dus een manier om te controleren of de invoer van de gebruiker geldig is.

Het volgende programma verwacht dat de gebruiker gehele getallen invoert. Zodra hij iets ongeldigs invoert - een tekst of een gebroken getal - dan stopt het programma.

#include <iostream>

using namespace std;

// het programma start hier
void main()
{
	// declareer variabele om invoer op te slaan
	int myInput;
	
	// herhaal zolang invoer geldig is
	do
	{
		// vraag om invoer
		cin >> myInput;
	} while (cin.good());
	
	// wacht op enter
	system("pause");
}
	

cin.good() geeft dus true als de invoer geldig is en false als de invoer ongeldig is. Je kunt ook gebruik maken van cin.bad() dat true teruggeeft als de invoer ongeldig is en false als de invoer geldig is.

Scope

Variabelen hebben een beperkt gebied waarbinnen ze geldig zijn. Dit noemen we de scope van de variabele. De scope van een variabele wordt bepaald door de plaats waar de variabele wordt gedeclareerd. De variabele is geldig binnen dezelfde accolades als zijn declaratie.

void main()
{
	int i;
	
	do
	{
		int j;
	} while (condition);
}
	

In bovenstaand stukje (pseudo)code is i geldig binnen de hele functie main en j alleen binnen de do-lus. Omdat de conditie die je bij while opgeeft buiten de accolades van de lus staat, mag hij de variabele j niet gebruiken, maar de variabele i wel.

Globale variabelen

Een variabele die ergens binnen accolades staat, noemen we een lokale variabele. We kunnen een variabele ook buiten alle accolades zetten. In dat geval spreken we van globale variabelen. In het onderstaand voorbeeld is myGlobal een globale variabele.

// declareer een globale variabele
int myGlobal;

// het programma start hier
void main()
{
	// declareer een lokale variabele
	int myLocal;
	
	// myLocal is geldig in deze functie
	myLocal = myGlobal; 	// dit is geen probleem
}
	

De scope van een globale variabele is het hele programma. Een globale variabele kun je dus overal in je programma gebruiken.

Bij de les