Waar of niet waar? Mijnheer Boole.


Het werk van de heer Boole is van groot belang voor de computerwetenschappen en de digitale elektronica. In dit programma zullen we daar een glimp of 2 van opvangen.
We berekenen weer gemiddelden, maar nu van rationele getallen (type double dus). En we introduceren een variabele van het type bool ofte boolean (hint).

Een voorbeeld van het programma in actie:

Gemiddelde van double getallen.

Gemiddelde van double getallen.

De code:

Ode aan George Boole.

Ode aan George Boole.

Op lijn tien definiëren we de booleaanse variabele “vlag”. We initialiseren hem meteen met de waarde false. Een vlag is iets wat veel gebruikt wordt in software, het is onder meer een manier om aan te geven of iets al dan niet gebeurd is. Booleaanse variabelen kunnen enkel de waarde “true” of “false” bezitten. Hoewel… C++ is, in tegenstelling tot veel andere talen nogal flexibel wat dat betreft, de waarde “false” is eigenlijk gelijk aan nul, en alles wat niet nul is, is “true” (doe maar eens een cout van vlag, ergens tussendoor). Toch is het aan te raden om steeds expliciet “true” of “false” te schrijven, dat maakt het programma een stuk leesbaarder (voor mensen dan, voor de computer maakt het niet uit).

De volgende interessante lijn is lijn 20. Zoals we reeds weten gebruiken we een if…else constructie om beslissingen te nemen, aan de hand van een voorwaarde die waar of vals kan zijn. Wat tussen de haakjes staat na een if – in dit geval: !(cin >> invoer) – resulteert altijd (na evaluatie door de computer) in een booleaanse waarde, “false” of “true” dus. Als het “true” is, wordt het if blok uitgevoerd, als het “false” is, wordt het else blok uitgevoerd, tenminste als er een else blok is. De else instructie is namelijk niet verplicht maar optioneel bij een if instructie. Zonder else wordt dan gewoon de eerstvolgende instructie na het if blok verwerkt. We zien nog wel voorbeelden, dus geen zorgen maken. 🙂

De voorwaarde !(cin >> invoer) is in feite nogal een complexe instructie op zich. Binnen de haakjes zien we: cin >> invoer. Dat wil dus zeggen dat we de invoerstroom (wat u intikt) doorgeven aan de variabele invoer. De variabele invoer is van het type double, dus zolang als u double getallen (en integers, want die passen ook in double) ingeeft, is er niets aan de hand. De functie cin geeft echter niet alleen de input door aan een variabele, het geeft ook een booleaanse waarde terug. Als er niets fout loopt, u geeft netjes een getal in, dan zal cin een waarde “true” teruggeven, om te melden dat alles verliep zoals verwacht. Maar als u bijvoorbeeld een letter of een tekst wilt doorgeven aan de variabele invoer, dan zal cin een waarde false teruggeven, want een letter of een tekst past niet in een variabele van het type double. De operatie van het doorgeven faalt dus, en cin geeft een waarde “false” terug om dit aan te geven.

Met andere woorden, als u een getal ingeeft wordt de voorwaarde !(cin >> invoer) voor de computer gelijk aan !(true). In alle andere gevallen wordt de voorwaarde !(false).

Het uitroepteken is een negatie. Er staat dus: niet(true) of niet(false). Uiteraard is niet(true) == false en niet(false) == true.

De ganse voorwaarde is dus te lezen als: als er een fout gebeurt bij de invoer – we voeren geen getal in terwijl dat wel zou moeten voor het type double, dan zetten we de vlag op true in het if blok.

Men zou het if statement kunnen versimpelen door het wat uiteen te trekken:

bool geenfout = (cin >> invoer);
if(!geenfout)

De variabele geenfout bevat true als alles goed ging met de input, anders is hij false. Als er dus wel iets fout ging (!(geenfout)), zetten we de vlag op “true” in het if blok. Anders voeren we het else blok uit.

De voorwaarde van het do-while blok, op lijn 30 zorgt ervoor dat we het ganse do-while blok blijven herhalen zolang de variabele vlag de waarde “false” heeft, dus zolang er geen letter(s) ingevoerd werden.

Lijn 42 bevat ook een nieuwe instructie, de instructie system. Dit is de manier van C++ om systeemcommando’s op te roepen. Het commando “pause” is een windowscommando (net zoals bijvoorbeeld “dir”). Het stopt de uitvoer totdat u op een toets gedrukt hebt. Dit werkt niet in linux, omdat linux het commando “pause” niet kent. Het is ook niet nodig in linux, hoewel het de uitvoer van het programma niet zal hinderen als u het laat staan (u krijgt wel een foutboodschap).

U kunt de code hier downloaden.

Vragen kunnen gesteld worden op het forum – op het C++ board.

Opdracht

  • Maak een nieuw project aan, met daarin een file “main”. Noem het “project_1.6”.
  • Typ het programma over en compileer.
  • Probeer uit te vissen wat u aan het programma zou moeten wijzigen als de instructies in het if en het else blok omgewisseld zouden zijn. U zet de vlag dus in het else blok, en doet de berekeningen in het if blok.
Advertisements

About justtheengineer

Ingenious engineer, slightly dotty...
This entry was posted in Cursus and tagged , , , , , , . Bookmark the permalink.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s