0%

Werk herhalen met lussen · eindproject

Eindproject: Project: Bouw een interactief menu

De vorige les bleef vragen totdat er één bruikbaar antwoord kwam en stopte daarna. Dit project blijft na elke geslaagde actie werken, totdat de gebruiker aangeeft klaar te zijn.

Dat is een echte verandering. Een menulus vormt de basis van veel software, van een opdrachtregelprogramma tot de app op je telefoon: wacht op een instructie, voer die uit en wacht opnieuw.

Je kent alles wat nodig is al. Een lijst om gegevens te bewaren, een lus om het programma actief te houden, if en elif om een actie te kiezen, break om op verzoek te stoppen en een for-lus om de verzameling te tonen.

Wat het programma doet

Je programma houdt een lijst met items bij. Je kiest zelf het onderwerp: boeken om te lezen, planten om te kopen, plaatsen om te bezoeken, liedjes om te leren of iets anders dat je leuk vindt.

Het begrijpt vier opdrachten:

OpdrachtWat die doet
addVraagt wat je wilt toevoegen en slaat het op
listToont de opgeslagen items als een genummerde lijst
countMeldt hoeveel items zijn opgeslagen
quitNeemt afscheid en beëindigt de lus

Bij iets anders volgt een beleefde melding en een nieuwe ronde.

De precieze formuleringen

De opdrachten, vragen en berichten staan vast, zodat je programma automatisch getest kan worden. Alles daarbuiten, waaronder de titel en de items zelf, kies je zelf.

Vraag om een opdracht met precies deze tekst:

Command (add, list, count, quit): 

Vraag om een nieuw item met precies deze tekst:

What should I add? 

Druk deze berichten precies af, met de echte waarden in plaats van de voorbeelden:

SituatieBericht
Na het toevoegenAdded: read a book
Items tonen1. read a book, daarna 2. water the plants, enzovoort
Tonen als er niets is opgeslagenThe list is empty.
TellenItems stored: 2
StoppenGoodbye.
Een onbekende opdrachtI do not know that command.
Na de lusFinal count: 2

Schoon elk antwoord op met .strip(). Gebruik voor de opdracht ook .strip().lower(), zodat zowel ADD als add werkt. Bewaar de itemtekst zoals die is getypt, afgezien van de spaties aan de randen. Iemand die The Left Hand of Darkness toevoegt, moet niet the left hand of darkness in de lijst terugvinden.

Bouw het in vijf stappen

Voer het programma na elke stap uit. Een menulus is veel makkelijker in delen te bouwen dan in één keer.

1. De lus die stopt

Druk je titel af en schrijf daarna een while True-lus die om een opdracht vraagt en verder alleen bij quit met break stopt. Voeg na de lus de regel Final count: toe.

Voer het uit. Typ quit. Als het programma eindigt, staat de basis goed.

2. De onbekende opdracht

Voeg de else-tak toe die I do not know that command. afdrukt. Voer het uit, typ iets geks en controleer of je een nieuwe ronde krijgt in plaats van een fout.

3. Toevoegen

Voeg de add-tak toe. Die stelt de tweede vraag, voegt het opgeschoonde antwoord toe aan items en drukt de bevestiging af. Druk tijdelijk len(items) af om te controleren of de lijst echt groeit en verwijder die controle voordat je de weergave bouwt.

4. Tellen en tonen

Voeg de count-tak toe en daarna de list-tak. Handel binnen list eerst de lege lijst af. Loop anders over de items en houd een teller bij met het accumulatorpatroon uit les 6: begin vóór de lus bij 1, druk de teller af en tel aan het einde van elke ronde 1 erbij op.

5. Maak het persoonlijk

Kies je titel en onderwerp. Voeg drie of vier echte items toe en lees de uitvoer zoals een gebruiker dat zou doen. Klinkt er iets abrupt of onduidelijk?

Test voordat je instuurt

Doorloop deze reeks met de hand en controleer elke reactie:

  1. list bij een leeg programma moet melden dat de lijst leeg is;

  2. twee keer add, telkens met een echt item;

  3. count moet 2 melden;

  4. een onzinopdracht mag het programma niet beëindigen;

  5. list moet beide items nummeren vanaf 1;

  6. ADD in hoofdletters moet ook werken;

  7. een item met spaties aan de randen moet zonder die spaties worden opgeslagen;

  8. quit moet het afscheid en het uiteindelijke aantal afdrukken.

Submit voert je programma uit met eigen voorbereide antwoorden en doorloopt zo hetzelfde pad zonder dat je iets hoeft te typen.

Als je abonnement Guided bevat, is dit een goed moment om Monty te vragen:

Lees mijn menulus en vertel of elke tak doet wat de bijbehorende opdracht belooft. Wijs één ding aan dat ik duidelijker kan maken, zonder het voor me te herschrijven.

Als het slaagt

Probeer zelf een vijfde opdracht toe te voegen, bijvoorbeeld first om alleen het eerste item te tonen. Je zult merken dat de opbouw daar makkelijk ruimte voor biedt. Dat is een teken dat de structuur goed is.

Bekijk daarna het hele programma en zie hoe lang het lusblok is geworden. Elke tak is kort, maar ze staan onder elkaar. Om er één te begrijpen, moet je langs de andere lezen. In het volgende hoofdstuk krijg je daar een hulpmiddel voor: eigen functies met een naam. Zo kunnen add, list en count elk één regel in de lus worden, met een klein stuk code dat je afzonderlijk kunt lezen.

Je hebt een programma gebouwd dat openblijft, onthoudt wat het heeft gekregen, op instructies reageert en stopt als je daarom vraagt. Dat is een heel ander soort programma dan wat je in hoofdstuk 1 schreef.

Opdracht

Bouw het interactieve menu uit de les.

Vereisten:

  1. Geef menu_title een niet-lege string naar keuze en druk die één keer af, vóór de lus.

  2. Begin items als een lege lijst.

  3. Blijf herhalen totdat de gebruiker quit typt.

  4. Vraag om een opdracht met Command (add, list, count, quit): en schoon die op met .strip().lower().

  5. add vraagt What should I add? , voegt het met .strip() opgeschoonde antwoord toe en drukt Added: af, gevolgd door het item.

  6. list drukt The list is empty. af als er niets is opgeslagen en toont anders elk item als genummerde regel vanaf 1.

  7. count drukt Items stored: af, gevolgd door het opgeslagen aantal.

  8. quit drukt Goodbye. af en verlaat de lus.

  9. Elke andere opdracht drukt I do not know that command. af en de lus gaat verder.

  10. Druk na de lus Final count: af, gevolgd door het opgeslagen aantal.

Kies je eigen titel en items. Alles in de tabel met precieze berichten moet overeenkomen.