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:
| Opdracht | Wat die doet |
|---|---|
add | Vraagt wat je wilt toevoegen en slaat het op |
list | Toont de opgeslagen items als een genummerde lijst |
count | Meldt hoeveel items zijn opgeslagen |
quit | Neemt 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:
| Situatie | Bericht |
|---|---|
| Na het toevoegen | Added: read a book |
| Items tonen | 1. read a book, daarna 2. water the plants, enzovoort |
| Tonen als er niets is opgeslagen | The list is empty. |
| Tellen | Items stored: 2 |
| Stoppen | Goodbye. |
| Een onbekende opdracht | I do not know that command. |
| Na de lus | Final 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:
listbij een leeg programma moet melden dat de lijst leeg is;twee keer
add, telkens met een echt item;countmoet2melden;een onzinopdracht mag het programma niet beëindigen;
listmoet beide items nummeren vanaf1;ADDin hoofdletters moet ook werken;een item met spaties aan de randen moet zonder die spaties worden opgeslagen;
quitmoet 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:
Geef
menu_titleeen niet-lege string naar keuze en druk die één keer af, vóór de lus.Begin
itemsals een lege lijst.Blijf herhalen totdat de gebruiker
quittypt.Vraag om een opdracht met
Command (add, list, count, quit):en schoon die op met.strip().lower().addvraagtWhat should I add?, voegt het met.strip()opgeschoonde antwoord toe en druktAdded:af, gevolgd door het item.listdruktThe list is empty.af als er niets is opgeslagen en toont anders elk item als genummerde regel vanaf1.countdruktItems stored:af, gevolgd door het opgeslagen aantal.quitdruktGoodbye.af en verlaat de lus.Elke andere opdracht drukt
I do not know that command.af en de lus gaat verder.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.