Klein en Groot

Inleiding

In de les ‘Klein en Groot’ wordt een programma ontwikkeld om het kleinste en het grootste getal in een reeks te zoeken. Tevens zal dit programma worden gebruikt om zelf nieuwe blokken (categorie Mijn blokken) te bouwen.

Klein en Groot: Algoritme

Probleemstelling

DagHoogste temperatuurDagHoogste temperatuurDagHoogste temperatuur
1 juli18.211 juli21.121 juli25.1
2 juli22.812 juli22.322 juli24.5
3 juli23.513 juli20.523 juli 24.6
4 juli20.014 juli16.824 juli24.8
5 juli20.415 juli16.225 juli23.9
6 juli19.616 juli18.926 juli21.3
7 juli22.317 juli25.227 juli21.4
8 juli22.218 juli26.528 juli20.7
9 juli21.319 juli24.529 juli20.9
10 juli21.920 juli24.430 juli21.8
31 juli19.9
Temperatuur juli 2021 (https://www.meteobelgie.be)

Bovenstaande tabel bevat de temperatuurgegevens opgetekend in Ukkel voor de maand juli 2021. Hoe zoek je nu bijvoorbeeld de grootste waarde in deze reeks?

Het grootste getal vinden

Probeer even te volgen hoe we dit als mens waarschijnlijk oplossen. Je kijkt naar de temperatuur op 1 juli en je onthoudt de meting van 18.2. Dit is voorlopig de hoogste waarde. Dan bekijk je de meting van 2 juli (22.8) en je vergelijkt deze waarde met de voorlopig hoogste waarde (18.2). 22.8 is hoger dan 18.2 en dus onthou je nu 22.8. De waarde 18.2 mag je vergeten. De meting van 3 juli (23.5) is weer hoger dan de voorlopig hoogste waarde (22.8) en je onthoudt nu de waarde 23.5. De waarde 20.0 van 4 juli is kleiner dan de voorlopig hoogste waarde (23.5). Deze waarde interesseert je niet. Op deze manier bekijk je alle gegevens en je vergelijkt voortdurend de nieuw ingelezen waarde met de waarde die je voorlopig als grootste getal hebt bijgehouden.

Op een gelijkaardige manier kunnen we natuurlijk ook het kleinste getal in de reeks vinden.

Variabelen

Het aantal benodigde variabelen is beperkt. Het getal dat we aan het bekijken zijn moet zich natuurlijk in een variabele bevinden. We kunnen deze geheugenplaats aanduiden met de naam Temperatuur. De laagste gevonden temperatuur bewaren we dan in de variabele LaagsteTemperatuur en de hoogste temperatuur in de variabele HoogsteTemperatuur. Het eerste element in de reeks is duidelijk een uitzondering. Dit element kan namelijk nog niet worden vergeleken met de hoogste en kleinste gevonden waarde. Het is dus aan te bevelen om het aantal bekeken elementen bij te houden. Deze variabele kunnen we bijvoorbeeld aanduiden met de naam AantalGelezen.

Algoritme

Volgende pseudocode is een voorstelling van het algoritme:

AantalGelezen = 0
Input Temperatuur
Repeat Until Temperatuur = ""
   Verhoog AantalGelezen met 1
   If AantalGelezen = 1 Then
      LaagsteTemperatuur = Temperatuur
   Else
      If Temperatuur < LaagsteTemperatuur Then
         LaagsteTemperatuur = Temperatuur
      End If
   End If
   If AantalGelezen = 1 Then
      HoogsteTemperatuur = Temperatuur
   Else
      If Temperatuur > HoogsteTemperatuur Then
         HoogsteTemperatuur = Temperatuur
      End If
   End If
   Input Temperatuur
End Repeat
If AantalGelezen > 0 Then
   Output LaagsteTemperatuur
   Output HoogsteTemperatuur 
End If

Klein en Groot: Scratch-programma

Het omzetten van de pseudocode naar een Scratch-programma levert weinig moeilijkheden:

Klein en Groot
Klein en Groot

Enkel de voorwaarde in het herhaal tot-blok vraag wellicht wat meer uitleg. De voorwaarde antwoord = "" controleert of de standaardvariabele antwoord (te vinden in de categorie Waarnemen) leeg is. De herhaal tot-structuur eindigt dus als er geen gegevens worden ingevuld bij de uitvoering van het vraag-blok.

Zelf blokken maken

Bovenstaand programma werkt prima. De structuur wordt echter wat onoverzichtelijk. Vooral de verschillende als…dan…anders-blokken vervat in de herhaal tot-structuur bemoeilijken het lezen en begrijpen van het programma.

Als we het programma even van dichtbij analyseren dan kunnen we een drietal onderdelen onderscheiden:

  1. Het kleinste getal zoeken;
  2. Het grootste getal zoeken;
  3. De resultaten afdrukken.

Scratch biedt de mogelijkheid om goed afgelijnde onderdelen in een afzonderlijke procedure onder de categorie Mijn blokken op te nemen. Een procedure is een bundeling van instructies die samenhoren en die kan worden uitgevoerd door de naam van de procedure te aanroepen. 

Een procedure definiëren

Maak een blok
Maak een blok

Een procedure kan worden gedefinieerd via de categorie Mijn blokken. De knop Maak een blok (zie rode pijl) laat toe om de procedure te definiëren in volgend venster:

Definitie blok

Een procedure (blok) krijgt steeds een naam. De naam van een blok is willekeurig. In ons voorbeeld hebben we gekozen voor zoek_Kleinste, zoek_Grootste en druk_Resultaten. Het is natuurlijk aan te bevelen om een naam te gebruiken die duidelijk maakt wat de procedure doet. Na het indrukken van de knop OK wordt de procedure gedefinieerd via een nieuw definieer-blok definieer blok in deel C. De knoppen (Voeg een invoer toe) onderaan het definitievenster worden in een latere les besproken.

In de categorie Mijn blokken worden de gedefinieerde blokken toegevoegd. Deze blokken zijn volledig vergelijkbaar met de gewone blokken die we onder de andere categorieën aantreffen. Enkel de werking van elk blok moet nog worden opgebouwd.

Een procedure opbouwen

De instructies die in een bepaald blok moeten worden uitgevoerd worden toegevoegd aan het definieer-blok beschikbaar in deel C. Alle gedefinieerde variabelen zijn beschikbaar en kunnen ook in deze blokken worden gebruikt. De blokken zoek_Kleinste en zoek_Grootste worden dan als volgt opgemaakt:

Kleinste getal
zoek_Kleinste
Grootste getal
zoek_Grootste

De procedure druk_Resultaten wordt als volgt vervolledigd:

druk_Resultaten

Een procedure oproepen

Een procedure kan worden uitgevoerd door de naam van de procedure te gebruiken in een script. In Scratch wordt, zoals steeds, een van onze blokken uit deel B (categorie Mijn blokken) gesleept naar de juiste plaats in het programma.

Het programma ziet er dan als volgt uit:

Programma met procedures

Evaluatie

In het tweede deel van deze les werd het programma ‘Klein en Groot’ opgebouwd door middel van procedures. Door het programma op te splitsen in kleinere delen wordt het oorspronkelijk programma beter leesbaar en begrijpbaar. Tevens kunnen procedures, indien goed opgebouwd, in latere programma’s opnieuw worden gebruikt.