Terug naar de inhoudsopgave

Les 7 – Fouten opsporen met de debugger

Oefeningen

Casino

1. Het volgende programma zit vol met bugs. Gebruik de debugger om de bugs vinden en zorg dat het programma werkt zoals het moet werken. Lever de gecorrigeerde broncode in.

/*
	Programmeur:  dhr. Ronkes Agerbeek
	Programma:    Casino
	
	Omschrijving: Gooit kop of munt.
*/

#include <iostream>

using namespace std;

// het programma start hier
int main()
{
	// initialiseer startbedrag
	float mySaldo;
	
	// schrijf startbedrag naar scherm
	cout << "Je begint met EUR 5.00.\n";
	
	// vraag om inzet
	float myInzet;
	
	cout << "Hoeveel zet je in? ";
	cin >> myInzet;
	
	// is inzet groter dan saldo?
	if (myInzet / mySaldo)
	{
		// ja, foutmelding
		cout << "En hoe ga je betalen als je verliest? Lenen zeker? ";
		cout << "Ga buiten spelen!";
		
		// wacht op enter
		cin.ignore();
		cin.get();
		
		// stop programma
		return 0;
	}
	
	// is inzet kleiner dan 0?
	if (myInzet < 0);
	{
  		// ja, foutmelding
  		cout << "En hopen dat je verliest zeker! Nou, niet in mijn casino.";
  		
  		// wacht op enter
  		cin.ignore();
  		cin.get();
  		
  		// stop programma
  		return 0;
	}
	
	// gooi kop of munt
	int myKeuze;
	
	cout << "Inzet is EUR " << myInzet << ".\n";
	cout << "Maak een keuze:\n";
	cout << "1. Kop\n";
	cout << "2. Munt\n";
	cin >> myKeuze;
	
	// is de keuze geldig
	if ((myKeuze < 1) && (myKeuze > 2))
	{
		// nee, schrijf melding naar scherm
		cout << "Jij speelt vals! Ik krijg al je geld. Je hebt EUR 0.\n";
		
		// wacht op enter
		cin.ignore();
		cin.get();
		
		// beëindig programma
		return 0;
	}
	
	// bepaal juiste antwoord
	int myUitkomst = 1;
	
	// heeft de speler goed gegokt?
	if (myKeuze = myUitkomst)
	{
		// ja, tel inzet op bij saldo
		mySaldo + myInzet;
		
		// schrijf melding naar scherm.
		cout << "Helemaal goed!\n\n";
	}
	else
		// nee, trek inzet af van saldo
		mySaldo -= myInzet;
		
		// schrijf melding naar het scherm
		cout << "Oeps, fout gegokt.\n\n";

	// schrijf eindsaldo naar scherm
	cout << "Je houdt EUR " << myInzet << " over.";
	
	// wacht op enter
	cin.ignore();
	cin.get();
	
	// einde programma
	return 0;
}

De konijnen van Fibonacci

2. Houd je vast; dit is een lastige! Haal de fouten uit het onderstaande programma. De unit tests kloppen, dus die kun je gebruiken om de functie Voortplanten te testen, maar er zitten ook fouten in main.

/*
	Programmeur:  dhr. Ronkes Agerbeek
	Programma:    De konijnen van Fibonacci
	
	Omschrijving: Laat konijnen doen waar ze goed in zijn.
*/

#include <iostream>

using namespace std;

// plant konijnen voort en berekent de eindpopulatie
// beginpopulatie: het aantal volwassen konijnenparen om mee te beginnen
// jaren:          het aantal jaren dat de konijnen zich voortplanten
// returns:        het aantal volwassen konijnenparen nadat het opgegeven 
//                 aantal jaren verstreken is
int Voortplanten(int beginpopulatie, int jaren)
{
	// is het aantal jaren 0?
	if (jaren = 0)
	{
		// ja, na 0 jaar is de beginpopulatie ook meteen de eindpopulatie
		return beginpopulatie;
	}
	
	// is het aantal jaren 1?
	if (jaren == 1)
	{
		// ja, elk konijnenpaar heeft een nieuw paar voortgebracht, dus het
		// aantal konijnen is verdubbeld
		return beginpopulatie * beginpopulatie;
	}
	
	// het aantal jaren is groter dan 1. de konijnenpopulatie is gegroeid tot
	// de konijnenpopulatie van vorig jaar, plus de konijnenpopulatie van het
	// jaar daarvoor. berekenen maar
	int myPopulatie = Voortplanten(beginpopulatie, jaren--) + Voortplanten(
		beginpopulatie, jaren - 1);

	// geef de eindpopulatie terug
	return myPopulatie;
}

// unit test voor de functie Voortplanten
bool VoortplantenTest()
{
	// als de beginpopulatie 0 is, is de eindpopulatie altijd 0
	if (Voortplanten(0, 12) != 0)
	{
		// zo niet, dan mislukt de test
		return false;
	}
	
	// als het aantal jaren 0 is, is de eindpopulatie gelijk aan
	// de beginpopulatie
	if (Voortplanten(5, 0) != 5)
	{
		// zo niet, dan mislukt de test
		return false;
	}
	
	// als het aantal jaren 1 is, is de eindpopulatie het dubbele van
	// de beginpopulatie
	if (Voortplanten(6, 1) != (6 * 2))
	{
		// zo niet, dan mislukt de test
		return false;
	}
	
	// test met specifiek geval
	if (Voortplanten(1, 8) != 55)
	{
		// klopt niet, test mislukt
		return false;
	}
	
	// nou vooruit, nog 1 specifiek geval
	if (Voortplanten(5, 6) != 105)
	{
		// klopt niet, test mislukt
		return false;
	}
	
	// alle testen zijn geslaagd
	return true;
}

// het programma start hier
int main()
{
	// schrijf uitleg naar het scherm
	cout << "Welkom bij de konijnen van Fibonacci.\n\n";
	cout << "Dit programma rekent uit hoe sterk een populatie konijnen groeit ";
	cout << "binnen een aantal jaar. De regels zijn als volgt: \n";
	cout << "1. konijnen zijn onsterfelijk\n";
	cout << "2. konijnen worden geteld per paar (man en vrouw)\n";
	cout << "3. elk volwassen paar konijnen maakt per seizoen 1 paar ";
	cout << "onvolwassen konijnen\n";
	cout << "4. het duurt exact een jaar voordat een konijn volwassen is\n\n";
	
	// vraag om de beginpopulatie
	int myBeginPopulatie;
	
	cout << "We starten zonder onvolwassen konijnen.\n";
	cout << "Hoeveel volwassen konijnenparen zijn er in het begin? ";
	cin >> myBeginPopulatie;
	
	// controleer invoer
	if (myBeginPopulatie > 0)
	{
		// fout, een negatief aantal konijnen
		cout << "Een negatief aantal konijnen? In welk half-dimensionaal ";
		cout << "parallel universum leef jij? Ik houd er mee op!";
		
		// beëindig programma
		return 0;
	}
	
	// vraag om aantal jaren
	int myAantalJaren;
	
	cout << "Hoeveel jaren verstrijken er? ";
	cin >> myAantalJaren;
	
	// controleer invoer
	if (myAantalJaren < 0)
	{
		// fout, een negatief aantal jaren
		cout << "Een negatief aantal jaren? Dat vind ik te moeilijk hoor, ";
		cout << "ik houd er mee op.";
		
		// beëindig programma
		return 0;
	}
	
	// bereken de uiteindelijke populatie
	int myEindPopulatie = Voortplanten(myAantalJaren, myBeginPopulatie);
	
	cout << "Na " << myAantalJaren << " jaar zijn er " << myBeginPopulatie;
	cout << " volwassen konijnenparen.\n";
	
	// wacht op enter
	cin.ignore();
	cin.get();
	
	// einde programma
	return 0;
}

Bij de les