5.1Inleiding: game¶
In deze module leer je te werken met toestandsdiagrammen. Als introductie daarop kun je met de gehele klas de volgende opdracht doen.
Automaat bewaker
Wellicht heb je de volgende toestanden gevonden, ook al noem je ze waarschijnlijk anders
Waakzaam, rondkijkend
Alert, klar voor actie, rondkijkend
Gealarmeerd, achter vijand aan lopend
Verdwaasd, rondlopend
Dood
Op basis van deze toestanden kun je een toestandsdiagram maken, waarin duidelijk wordt hoe de bewaker van de ene toestand in de andere komt. De getallen geven de toestanden aan zoals hierboven staat beschreven.

Je kunt in het toestandsdiagram bijvoorbeeld zien dat als de bewaker in toestand 1 is en hij ziet een vijand, dan wordt de toestand van de bewaker 2.
In de bovenstaande uitwerking zie je totaal 5 toestanden en 6 toestandsovergangen. Misschien zijn er wel meer hoor, alleen in dit korte fragment kun je ze niet allemaal zien.
Het losse pijltje naar toestand 1 betekent dat dit de begintoestand is, oftewel de initiële toestand.
5.2Toestanden en toestandsovergangen¶
Hieronder zie je een voorbeeld van een onderdeel van een frisdrankautomaat. Dit onderdeel houdt bij hoeveel geld de gebruiker van de automaat heeft ingeworpen. Voor het gemak gaan we uit van slechts twee munten: 50 cent en 1 euro. En alle frisdranken in de automaat kosten 2 euro.

De bollen zijn toestanden. Dit toestandsdiagram kent dus vijf toestanden. De frisdrankautomaat begint in de starttoestand, dat is in dit geval de toestand ‘Start: 0 euro’. Bij elke toestand zie je enkele overgangen. Bijvoorbeeld de overgang van de starttoestand ‘0 euro’ naar ‘0,5 euro’. Die toestandsovergang vindt plaats als de gebruiker begint met het inwerpen van een muntstuk van 50 eurocent.
Je ziet dat een toestandsovergang ook naar dezelfde toestand kan gaan. Kijk maar bij de toestand ‘2 euro’. Na de toestandsovergang ‘Inworp 50 cent’ is de toestand nog steeds ‘2 euro’.

Solution to Exercise 3
Dat kan op de volgende vier manieren:
50ct + 50ct + 50ct + 50ct
50ct + 1 euro + 50ct
50ct + 50ct + 1 euro
1 euro + 50ct + 50ct
De meeste automaten geven teveel ingeworpen muntjes direct bij het inwerpen terug. Daarom tellen we die mogelijkheden niet mee in dit antwoord.
Een toestandsovergang wordt meestal uitgevoerd op basis van informatie uit één van de sensoren. Als iemand één euro in de frisdrankautomaat doet, wordt dat door één of meerdere sensoren gedetecteerd. Hoe dat precies werkt is hierbij niet belangrijk. Uit de toestandsdiagram kun je opmaken naar welke toestand de automaat moet gaan als iemand die euromunt inwerpt.
Solution to Exercise 4
12niet
5.3Acties in een toestandsdiagram¶
Het vorige toestandsdiagram is nog niet volledig, de gebruiker moet immers wel een frisdrank kunnen selecteren. In het volgende toestandsdiagram voegen we een overgang ‘selectie’ toe aan alle toestanden. ‘Selectie’ betekent dat de gebruiker een frisdrank kiest.

Aan een toestandsovergang kan een actie worden gekoppeld. Bij de frisdrankautomaat wordt de actie: ‘geef frisdrank’ uitgevoerd als de gebruiker een frisdrank selecteert en de toestand is: ‘2 euro’. Acties zijn altijd gekoppeld aan toestandsovergangen en niet aan toestanden. Een toestandsovergang mag één of meer acties hebben, maar dat hoeft niet. Voor het uitvoeren van acties worden vaak actuatoren gebruikt, zoals een lampje, display of motor.
In deze module gebruiken we steeds een dubbele punt om het onderscheid te maken tussen toestandsovergang en actie.
<toestandsovergang> : <actie>Solution to Exercise 5
Uitleg
De automaat houdt bij hoeveel geld (50 cent en 1 euro-muntstukken) er is ingeworpen. Pas als het totaal gelijk is of meer dan 2 euro kan de gebruiker een frisdrank selecteren. De automaat geeft geen geld terug (niet een erg klantvriendelijke automaat dus).
5.4Tabel met toestandsovergangen¶
Voor het overzicht laten we de toestandsovergangen die naar dezelfde toestand verwijzen ook wel eens weg, zoals hieronder.

Het is echter wel verstandig om goed na te denken over wat er in alle gevallen gebeurt. Bijvoorbeeld, wat gebeurt er in toestand ‘1 euro’ als de gebruiker een frisdrank selecteert? Door over alle mogelijkheden na te denken voorkom je fouten die je later veel tijd kosten om te herstellen. Je kunt dat ook in een tabel weergeven door alle toestanden te combineren met alle mogelijke toestandsovergangen. Daarbij geef je voor alle mogelijkheden aan wat de nieuwe toestand wordt.
| Toestand ↓ / Toestandsovergang → | Inworp 50 cent | Inworp 1 euro | Selectie |
|---|---|---|---|
| Start: | 0 euro | 0,5 euro | 1 euro |
| 0,5 euro | 1 euro | ||
| 1 euro | |||
| 1,5 euro | |||
| 2 euro |
In de bovenstaande tabel zie je alle toestanden in de linker kolom. Je ziet ook alle mogelijke gebeurtenissen in de bovenste rij. Voor iedere combinatie moet de tabel beschrijven wat de nieuwe toestand wordt. Dit kan dus ook dezelfde toestand blijven. De tabel hierboven is nog niet volledig ingevuld.
Solution to Exercise 6
Uitleg
| Toestand ↓ / Toestandsovergang → | Inworp 50 cent | Inworp 1 euro | Selectie |
|---|---|---|---|
| Start: | 0 euro | 0,5 euro | 1 euro |
| 0,5 euro | 1 euro | 1,5 euro | 0,5 euro |
| 1 euro | 2 euro | 2 euro | 1 euro |
| 1,5 euro | 2 euro | 2 euro | 1,5 euro |
| 2 euro | 2 euro | 2 euro | 0 euro: geef frisdrank |
5.5Verbreding: Toestandsovergang bij gebeurtenis of status¶
In het voorbeeld van de frisdankautomaat is er een toestandsovergang als er wat gebeurt. De gebeurtenis is het inwerpen van een muntje. De gebeurtenis duurt kort, het is een moment waarop je het muntje inwerpt. Je kunt je voorstellen dat het inwerpen het moment is waarop het muntje tegen een drukknopje komt. Het moment dat het muntje tegen de drukknop komt, verandert de drukknop van niet-ingedrukt naar wel-ingedrukt. Een gebeurtenis is dus een verandering van een waarde. De waarde is in dit geval niet-ingedrukt of wel-ingedrukt.
Je kunt een toestandsdiagram ook anders maken. Een toestandsovergang vindt dan niet plaats bij een verandering van een waarde, maar als een sensor (bijvoorbeeld een drukknop) een bepaalde waarde heeft. Je hebt dan twee keer zoveel toestanden nodig. Elke keer als er de schakelaar wordt ingedrukt door een muntje ga je naar een volgende toestand waarin gewacht wordt tot het muntje verder valt. Voor een mens duurt dat wachten zo kort dat je het niet eens merkt, maar voor de computer in de frisdrankautomaat duurt dat wachten best lang. Als het muntje verder is gevallen, dan staat de schakelaar weer in de niet-ingedrukt stand. Je gaat dan naar de toestand met het nieuwe bedrag.
Je kunt dus kiezen voor twee soorten toestandsovergangen:
als er een verandering van een waarde is (een gebeurtenis)
als er een bepaalde waarde wordt gezien (status)
Bij het voorbeeld van de frisdrankautomaat in dit hoofdstuk hebben we gewerkt met manier 1 (gebeurtenissen), omdat we dan minder toestanden hoefden te gebruiken. In het volgende hoofdstuk Toestandsdiagrammen (opdrachten) zul je beide manieren tegen komen.
In het hoofdstuk Van toestandsdiagram naar code gebruiken we vooral manier 2 (status), omdat toestandsdiagrammen die gemaakt zijn op manier 2 gemakkelijker om te zetten zijn in code.
5.6Regels voor een toestandsdiagram¶
Een toestandsdiagram is gebonden aan strenge regels:
Een toestandsdiagram bestaat uit toestanden (bollen) en toestandsovergangen (pijlen)
Alle toestanden worden weergegeven als bollen. In de bol staat een korte beschrijving van de toestand.
Er is altijd precies één starttoestand, die herken je aan de pijl die niet verbonden is aan een andere toestand.
Alle toestandsovergangen worden weergegeven als een pijl, die één kant op wijst. Bij de pijl staat een korte beschrijving van de toestandsovergang.
Een toestand kan nooit twee of meer keer dezelfde toestandsovergang hebben.
Een toestandsovergang mag dezelfde toestand als begin en eind hebben.
Bij een toestandsovergang mogen één of meerdere acties staan. In deze module gebruiken we steeds een dubbele punt om het onderscheid te maken tussen toestandsovergang en actie.