In deze verkenningsfase ga je een probleem analyseren. We starten met zeer eenvoudige problemen, kijken hoe we dit met pen en papier oplossen (analyse), zetten dit om naar een stappenplan (algoritme), we proberen de code uit in de shell, en tenslotte plaatsen we de code in de editor en testen het script uit.
In deze verkenning ga je:
een probleem analyseren en omzetten in een algoritme
getallen bewaren in een variabele (in het geheugen)
kennismaken met de rekenkundige basisbewerkingen
output geven met de print-opdracht
Opdracht 1.1:
Een boer heeft een akker in de vorm van een rechthoekig trapezium. De afmetingen van de akker zijn aangeduid op de bijgevoegde figuur. Hij wilt de akker omvormen tot een boomgaard. Hij leest op de website www.landleven.nl dat een appelboom een oppervlakte van 8 x 8 m nodig heeft. Hoeveel bomen moet de boer aankopen?
Neem een blad en papier en bereken op een gestructureerde manier het aantal bomen dat de boer moet aankopen.
Hou je oplossing goed bij, want later ga je hiermee verder werken.
Opdracht 1.2:
Veronderstel dat je broer of zus een machine is die je moet programmeren om een boterham met choco te smeren.
Maak eens (in je eigen woorden) een stappenplan waarmee je broer of zus deze taak tot een goed einde kan brengen.
Bekijk daarna het filmpje: Leer programmeren met boterham met choco.
Zou jou stappenplan wel tot een goed resultaat geleid hebben?
In de wiskunde en wetenschappen krijg je wel dikwijls te maken met een stappenplan dat leidt tot een oplossing, maar in het dagelijkse leven kunnen die dikwijls zeer complex zijn.
Meestal worden complexe problemen opgelost door deze op te delen in kleinere minder complexe problemen die wel oplosbaar zijn. Elk van deze kleine problemen wordt dan apart opgelost en uitgetest. Op het einde worden al deze oplossingen samengebracht om zo de oplossing van het complexe probleem te vormen. Dit is computationeel denken.
Computational thinking is reformulating a seemingly difficult problem into one we know how to solve, perhaps by reduction, embedding, transformation or simulation.
Janet Wing – 2006
Opdracht 1.3:
Schrijf eens in je eigen woorden op welke stappen je ondernomen hebt om het aantal boompjes te berekenen dat de boer moet aankopen. Jij bent geen machine, dus je mag acties zoals pen en papier nemen overslaan.
Als ik een tekst in het Nederlands zou schrijven met fouten erin, zou je nog steeds in staat zijn om de tekst te begrijpen. Maar als we AI even buiten beschouwing laten, kan een computer dat niet.
Daarom is de syntaxis van een computertaal van groot belang. Gelukkig is de syntaxis van Python over het algemeen vrij eenvoudig en levert het leesbare script’s op. Dit betekent dat je meer aandacht kunt besteden aan het denkproces achter het programmeren.
Laten we eens kijken naar de basis wiskundige bewerkingen bij het verkennen van de syntaxis van de code. Je hebt waarschijnlijk al ervaring met het uitvoeren van berekeningen in spreadsheetscript’s zoals Excel of Google Spreadsheets. Op basis van die ervaring, kun je vermoeden welke symbolen Python gebruikt voor de basisbewerkingen: optelling, aftrekking, vermenigvuldiging, deling en machtsverheffing.
Opdracht 1.4
Schrijf op een blad wat jij denkt dat het teken is om onderstaande bewerkingen uit te voeren.
Optelling
Aftrekking
Vermenigvuldiging
Deling
Machtsverheffing
Je kan de juiste antwoorden hieronder zien.
Antwoorden opdracht 1.4
Optellen: +
Aftrekken: -
Vermenigvuldigen; *
Deling: /
Machtsverheffing: **
Opdracht 1.5:
Controleer je algoritme van opdracht 1.3 door het stap voor stap uit te voeren in de shell.
Je geeft één voor één de bewerkingen in. Sluit de bewerkingen af door op ENTER te drukken.
Er zijn verschillende manieren om een algoritme voor te stellen. Enkele voorbeelden zijn: psuedo code, stroomdiagram, scriptstructuur diagram (Nassi–Shneiderman diagram).
Nassi-Schneidermann diagrammen (NSD) zijn een goed middel om algoritmen voor te stellen, doordat het automatisch leidt tot gestructureerd geheel.
Let op! Een algoritme wordt onafhankelijk gemaakt van de programmeertaal die je gaat gebruiken. We gebruiken daarom in het algoritme geen syntax specifiek voor een taal. Voor bewerkingen gebruiken we gewoon de wiskundige notatie. Voor de toekenning (assignment) van een waarde aan een variabele maken we gebruik van een pijl.
Het voorbeeld van het algoritme bestaat uit 6 stappen die achter elkaar moeten uitgevoerd worden. Dit wordt een sequentie genoemd.
Meer informatie over Nassi-Sheiderman diagramma’s of scriptstructuur diagram vind je op Wikipedia.
Het juiste antwoord is 309 (bomen).
Waarschijnlijk kom je als resultaat 309,375 bomen uit. Dit komt omdat je “/” gebruikt hebt als wiskundige operator. Verander nu het symbool “/” met “//” (twee maal het deelteken) en controleer wat je nu krijgt.
Het symbool “//” wordt gebruikt voor de gehele deling. De gehele deling geeft als uitkomst het gehele getal dat kleiner of gelijk is aan de deling.
Hiernaast zie je het verschil tussen beide bewerkingen:
In Python is een variabele een naam die aan een waarde is gekoppeld. Het is een container waarin je gegevens kunt opslaan en later kunt gebruiken in je script. Variabelen in Python zijn dynamisch getypeerd, wat betekent dat je ze kunt gebruiken om verschillende soorten gegevens op te slaan.
Enkele belangrijke gegevenstypen die vaak worden gebruikt in Python zijn:
Integer (int): Dit is een geheel getal, bijvoorbeeld 5, -3, 0. Het wordt gebruikt voor het opslaan van numerieke waarden zonder decimalen.
Float: Dit is een drijvendekommagetal, bijvoorbeeld 3.14, -0.5, 2.0. Het wordt gebruikt voor het opslaan van numerieke waarden met decimalen.
String (str): Dit is een reeks tekens, bijvoorbeeld "Hallo", "Python", "123". Het wordt gebruikt voor het opslaan van tekstuele gegevens.
Boolean (bool): Dit is een datatype dat slechts twee waarden kan bevatten, True of False. Het wordt gebruikt voor het opslaan van waarheidswaarden.
Deze zijn slechts enkele belangrijke gegevenstypen in Python.
Bij het oplossen van Fysica vraagstukken maak je ook gebruik van variabelen, meestal bestaande uit één letter of symbool. Passen we dezelfde methode toe in een script (script), dan is het later moeilijk te achterhalen waarvoor deze variabele gebruikt werd.
We geven daarom onze variabele een betekenisvolle naam..
Er zijn welke enkele regels die we moeten volgen.
Een variabel naam .....
mag enkel bestaan uit letters, cijfers en "underscores" ( _ ).
mag niet beginnen met een cijfer.
mag geen gereserveerd woord (keyword) van Python zijn.
De gereserveerde woorden zijn:
Programmeurs kiezen nooit een variabele naam die ook de naam is van een functie (of het nu een standaard Python functie betreft of een functie die ze zelf hebben geschreven). Als je dat doet, loop je de kans dat de functie niet langer door de code gebruikt kan worden, wat kan leiden tot uitermate vreemde fouten.
Kies een betekenisvolle naam (oppervlak_boom, grote_zijde, kleine_zijde, basis, aantal_bomen,...)
Uitzondering: Wegwerp variabelen
Dit zijn variabelen die slechts in een klein deel van de code gebruikt worden en daarna niet meer.
Om verwarring te vermijden, gebruiken je best alleen kleine letters in variabele namen.
Als een variabele naam uit meerdere woorden bestaat, plaats je underscores tussen die woorden.
Dit zorgt ervoor dat je variabele leesbaarder wordt
Het gebruik van namen die starten met een underscore is voorbehouden aan de auteurs van Python.
Met het toekenningsteken “=” kunnen we een waarde gaan toewijzen aan een functie. Dit is hetzelfde teken dat we uit de wiskunde kennen als gelijkheidsteken, maar heeft wel een andere betekenis.
Onderstaand voorbeeld lees je niet als “lange_zijde is gelijk aan 210” maar als “de variabele lange_zijde krijgt waarde 210”
Lange_zijde = 210
Onderstaand voorbeeld toont het verschil tussen het gelijkheidsteken en het toekenningsteken.
aantal = 5
aantal = aantal + 1
De variabele “aantal” kan (wiskundig) nooit gelijk zijn aan aantal +1.
In onze code krijgt de variabele aantal de waarde 5. In de tweede regel gaat het script de waarde van variabele aantal ophalen, en gaat hierbij 1 optellen. De variabele waarde krijgt het resultaat van deze bewerking.
Bij een toewijzing wordt dus eerst de bewerking rechts van het toewijzingsteken eerst uitgevoerd, en het resultaat van deze bewerking wordt dan toegekend aan de variabele links van het toewijzingsteken.
We hebben zonet ons algoritme gecontroleerd door rechtstreeks de berekeningen in te typen.
Je kan echter ook gebruik maken van variabelen, zoals aangegeven in het algoritme.
Als je dit in de shell intypt, dan krijg je onderstaand beeld:
Je merkt hier dat je geen uitvoer krijgt van je berekeningen.
Wanneer je gewoon een berekening in de shell typt, wordt deze berekening uitgevoerd, en wordt het resultaat getoond.
Wanneer je echter aantal_bomen = oppervlakte_veld/oppervlakte_boom typt, dan vraag je niet om de berekening uit te voeren en het resultaat toe te wijzen aan de variabele N.
Wil je het resultaat weten, of de waarde van een variabele, dan kan dit met de print()-instructie.
Wanneer je de print()-opdracht gebruikt, dan vraag je om uitvoer te geven naar het scherm.
Wil je dus het resultaat, het aantal bomen kennen, dan kan dit met
print(aantal_bomen)
Je moet niet steeds gebruik maken van een variabele, maar kan ook rechtstreeks de bewerking tussen de haaktjes plaatsen:
print((210+120)/2*120)
Of je kan verschillende gegevens combineren door ze te scheiden met een komma.
print("Oppervlakte veld:",(210+120)/2*120)
In Python is een "string" een reeks tekens. Het is één van de ingebouwde gegevens-typen. Strings worden gebruikt om tekst weer te geven in Python en worden omringd door enkele aanhalingstekens (') of dubbele aanhalingstekens ("). In de instructie
print("Oppervlakte veld: ",(210+120)/2*120)
is de string in het vet aangeduid.
mijn_string_single = 'Dit is een string.'
mijn_string_dubbel = "Dit is ook een string."
Zowel mijn_string_single als mijn_string_dubbel zijn variabelen die stringwaarden bevatten.
Je kunt enkele of dubbele aanhalingstekens gebruiken om een string te definiëren, maar de opening en sluiting van de aanhalingstekens moeten overeenkomen.
Hiernaast zie je enkele print-opdrachten met verschillende strings
Belangrijk is op te merken dat na een print()-opdracht er steeds een nieuwe lijn gestart wordt. Hoe je dit kan voorkomen leren we later.
Je kan tekst weergeven door de tekst te plaatsen tussen dubbele of enkele aanhalingstekens. Let op, het begin en einde van je string moeten wel beide ofwel enkelvoudige, of beide dubbele aanhalingstekens zijn.
We kunnen ook alle gegevens toewijzen aan variabelen. In de berekeningen worden dan de namen van deze variabelen gebruikt.
lange_zijde = 210
korte_zijde = 120
breedte = 120
oppervlakte_boom = 8*8
oppervlakte_veld = (lange_zijde + korte_zijde)/2*breedte
aantal_bomen = oppervlakte_veld/oppervlakte_boom
print("Aantal bomen:",aantal_bomen)
In de shell ziet dit er zo uit:
Gaan we eenmaal een script schrijven, dan wordt deze methode geprefereerd. Deze manier van werken zorgt ervoor dat bij het wijzigen van een waarde, je de wijziging slechts op één plaats in je script moet doorvoeren.
Opdracht 1.6
Onderzoek welk type variabele (integer of float) je krijgt bij het uitvoeren van een deling (/) en een gehele deling (//). Probeer alle combinaties uit van integers en floats.
Opdracht 1.7
Bekijk onderstaande instructies. Noteer wat je verwacht dat op de stippellijnen onder elke print-instructie op het scherm getoond gaat worden.
Controleer je antwoorden door de code in de shell in te typen.
We kennen nu alle code die we nodig hebben om een script te schrijven. Plaatsen we de code van het voorbeeld met de variabelen gewoon in de editor, dan is ons Python script klaar.
Nu moeten enkel nog het script uitvoeren.
Hieronder kan je zien hoe je in Thonny je script kan starten.
Documenteer je script.
Het is belangrijk dat je script leesbaar is en daarom van voldoende commentaar voorzien wordt. Op die manier kan iemand de gedachtegang van de programmeur volgen. Dit maakt het makkelijker om later aanpassingen aan het script aan te brengen.
Je kan opmerkingen toevoegen door deze vooraf te laten gaan door de hashtag (#).
Alles na # wordt genegeerd en is louter ter info.
Gebruiksvriendelijke interface
Je interactie met de gebruiker van je script moet ook gebruiksvriendelijk zijn.
Dit kan je bereiken door meer print-opdrachten toe te voegen .
Voorbeeld
Script met verzorgde output en extra uitleg voor/opmerkingen
# Aantal bomen berekenen
lange_zijde = 210
korte_zijde = 120
breedte = 120
oppervlakte_boom = 8*8
# Oppervlakte veld berekenen
oppervlakte_veld = (lange_zijde+korte_zijde)/2*breedte
# Aantal bomen berekenen
aantal_bomen = oppervlakte_veld/oppervlakte_boom
# Output
print("Gegevens:")
print("Lange zijde:",lange_zijde)
print("Korte zijde:",korte_zijde)
print("Breedte:",breedte)
print()
print("Resultaat:")
print("Aantal bomen aan te kopen:",aantal_bomen)
De output kan er dan zo uitzien:
Let wel op!
Het openen en sluiten moet met hetzelfde soort aanhalingstekens gebeuren. Anders krijg je een foutmelding.
Bestudeer de code en bekijk de output. Los daarna onderstaande vragen op:
Hoe kan je in Python….
een regel overslaan, zoals tussen “Breedte: 120” en “Resultaat”?
twee gegevens zoals “Breedte” en “120 “ (de waarde van breedte) op één lijn printen?
Output:
Code:
#Gegevens
korte_zijde=120
lange_zijde=210
breedte=120
oppervlakte_boom=8*8
#Oppervlakte berekenen
Oppervlakte_veld=(lange_zijde+korte_zijde)/2*breedte
#Aantal bomen berekenen
aantal_bomen=A/oppervlakte_boom
#Output
print(“Gegevens:”)
print(“Korte zijde:”,korte_zijde)
print(“Lange zijde:”,lange_zijde)
print(”Breedte:”,breedte)
print()
print(“Resultaat:”)
print(“Aantal bomen aan te kopen:”,aantal_bomen)