Programmeren voor Kinderen

Leren programmeren op de basisschool

Les 7

Heb je de moeilijke opdracht uit Les 6 gemaakt?

Het eerste gedeelte was niet zo heel moeilijk, denk ik. Je moest de computer laten vragen tot hoever hij de tafel moest uitrekenen. Ik had het zo opgeschreven:

totenmet = input('Tot hoever? Tot en met ')

Hier mag degene die het programma gebruikt dus typen tot hoever de tafel moet gaan, en dat wordt dan in de variabele totenmet gestopt.

Daarna moest je ervoor zorgen dat de computer de tafel ook inderdaad tot daar ging uitrekenen. Misschien had je je zoiets gedaan:

for i in range(1, totenmet):

Maar als je het programma dan uitvoert gaat het net niet helemaal goed:

Welke tafel wil je zien? De tafel van 5
Tot hoever? Tot en met 3
De tafel van 5
1 x 5 = 5
2 x 5 = 10

Ik vroeg toch tot en met drie?

Weet je nog dat range(1, 11) tot en met tien telt? range() maakt altijd een lijstje tot, maar niet tot en met het laatste getal. Als je dat getal erbij wil hebben moet je aan range() dus 1 meer meegeven.

Je kan het op een paar verschillende manieren oplossen. Hier laat ik er een paar zien.

Oplossing 1.

getal = input('Welke tafel wil je zien? De tafel van ')
totenmet = input('Tot hoever? Tot en met ')
print 'De tafel van', getal
for i in range(1, totenmet + 1):
    print i, 'x', getal, '=', i * getal

In deze oplossing heb ik een trucje gedaan mat range. Ik zeg tegen range niet: ‘maak een lijstje tot totenmet‘, maar ik vraag: ‘Kun je een lijstje maken tot eentje hoger dan totenmet.’ En dat is precies goed: Als de gebruiker bijvoorbeeld 10 heeft getypt, gaat range() to 11, en dat betekent dat hij stop bij… 10!

Oplossing 2.

getal = input('Welke tafel wil je zien? De tafel van ')
totenmet = input('Tot hoever? Tot en met ')
tot = totenmet + 1 
print 'De tafel van', getal
for i in range(1, tot):
    print i, 'x', getal, '=', i * getal

In deze oplossing hebben we twee variabelen voor de range: totenmet is wat we aan de gebruiker vragen, en dan maken we tot, en die geven we de waarde totenmet + 1. Dus als totenmet 10 is, wordt tot vanzelluf elluf. En daarna gebruiken we tot in de haakjes bij range().

Oplossing 3.

getal = input('Welke tafel wil je zien? De tafel van ')
tot = input('Tot hoever? Tot en met ') + 1
print 'De tafel van', getal
for i in range(1, tot):
    print i, 'x', getal, '=', i * getal

Bij deze oplossing moet je heeeeel goed kijken wat ik heb gedaan. Zie je het?

Er staat

tot = input('Tot hoever? Tot en met ') + 1

Dus de computer denkt: ‘Even vragen wat de gebruiker wil. Aaah, daar is het: 10. Nu doen we dat + 1, dus 11. En dan stoppen we het in het doosje tot. En in range() gebruiken we tot, niet totenmet.

Oplossing 4.

getal = input('Welke tafel wil je zien? De tafel van ')
totenmet = input('Tot hoever? Tot en met ')
print 'De tafel van', getal
for i in range(1, totenmet):
    print i, 'x', getal, '=', i * getal
print totenmet, 'x', getal, '=', totenmet * getal

Deze oplossing is een beetje dom. We laten de for-lus gewoon te vroeg eindigen, en dan schrijven we er nog een regel achteraan om de laatste som te maken.

Zie je overigens dat die extra regel niet meer naar binnen staat? Zo ziet de computer dat die niet meer bij de for-lus hoort. Want anders wordt-ie ook 10 keer gedaan. Of 23 keer. Of 1000 keer.

Oplossing 5.

getal = input('Welke tafel wil je zien? De tafel van ')
tot = input('Tot hoever? Wil je alsjeblieft 1 meer typen dan hoever je eigenlijk wil, dus als je tot en met tien wil type je elf. Tot ')
print 'De tafel van', getal
for i in range(1, tot):
    print i, 'x', getal, '=', i * getal

De laatste oplossing is eigenlijk niet echt een oplossing: we vragen gewoon aan de gebruiker om het op te lossen. Het werkt wel, natuurlijk, maar het is leuker om de computer het werk te laten doen, in plaats van de gebruiker.

Ik vind oplossing 1 eigenlijk het beste. Wat vind jij? En welke oplossing had jij bedacht?

Zoveel zielen, zoveel gedachten

Zoveel zielen, zoveel gedachten. Dat betekent: verschillende mensen denken verschillende dingen. En zo is het ook vaak met programmeurs: verschillende programmeurs bedenken verschillende oplossingen voor hetzelfde probleem. Dat maakt het best wel een beetje ingewikkeld, want als je het programma van een andere programmeur leest moet je dus begrijpen wat hij of zij bedacht had. Dat zag je wel bij alle programmaatjes hierboven: ik moest een heleboel uitleggen om je te laten begrijpen hoe ik het had gedaan.

Het belangrijkste is om te onthouden: een goede programmeur is een luie programmeur. Ze zeggen ook wel: Alles Lekker Lui Eenmaal Schrijven. Dat is het omgekeerde van Nodeloos Iets Eigenlijk Tweemaal Schrijven. In de vierde oplossing hadden we de print-regel eigenlijk twee keer geschreven; da’s niet zo goed. En voor we de for-lus kenden schreven we die regel zelfs tien keer. Maar vanaf nu gaan we Alles Lekker Lui Eenmaal Schrijven.

De afkorting van Alles Lekker Lui Eenmaal Schrijven is A.L.L.E.S. De afkorting van Nodeloos Iets Eigenlijk Tweemaal Schrijven is N.I.E.T.S. Als je programmeert is A.L.L.E.S. beter dan N.I.E.T.S.

Opdrachten

Hieronder volgen een paar programmaatjes die een beetje N.I.E.T.S. zijn. Niet zo goed dus. Kun je ze verbeteren zodat ze A.L.L.E.S. zijn?

Start cmd maar, en type notepad alles.py. Je kunt alle programmaatjes achter elkaar typen; de computer doet ze dan allemaal achter elkaar. Voor deze oefeningen is dat prima!

print 'aapje'
print 'aapje'
print 'aapje'
print 'aapje'
print 'oooooolifantje'

print 'Altijd is kortjakje ziek'
print 'midden in de week maar zondag niet'
print 'Zondag gaat zij naar de kerk'
print 'met een boek vol zilverwerk'
print 'Altijd is kortjakje ziek'
print 'midden in de week maar zondag niet'

getal = 4
print 'Tel er veertig bij op'
print getal + 40
print 'Trek er twintig af'
print getal + 40 - 20
print 'Doe er weer zeven bij'
print getal + 40 - 20 + 7

Voer je ze ook even uit, met python alles.py? Dan kun je zien of het ook echt werkt, wat je hebt bedacht!

Wat heb je geleerd?

Dit was wel weer een moeilijke les. Maar je hebt een paar heel belangrijke dingen geleerd.

  • Je programma kan nu vragen welke tafel je wilt laten zien, maar ook tot hoever.
  • De computer kan rekenen met variabelen op allerlei plekken, bijvoorbeeld in range(1, totenmet + 1).
  • Je kan nieuwe variabelen maken met behulp van oude variabelen, bijvoorbeeld tot = totenmet + 1.
  • Het is leuker om de computer slim te laten zijn dan de gebruiker.
  • De regels die naar binnen staan horen bij de for-lus. De regels die weer gewoon staan horen er niet meer bij.
  • Soms zijn er een heleboel oplossingen voor hetzelfde probleem.
  • A.L.L.E.S. is beter dan N.I.E.T.S.

Tot de volgende keer maar weer!

Dion

7 Reacties aan “Les 7”

  1. Floor schreef:

    Beste Dion.
    Bij de eerste opdracht heb ik om oooooolifantje te krijgen dit geschreven; print ‘o’*6,’lifantje’, ik krijg dan alleen oooooo lifantje, dus een spatie tussen de o en de l. Ik kan nergens meer een spatie vinden. Heb jij een idee hoe ik dit kan verhelpen?

    • Dion Nicolaas schreef:

      Wat goed dat je ook de o’s van olifantje niet gewoon typt! Dat had ik nog niet eens bedacht.
      De truc om een string te vermenigvuldigen zorgt ervoor dat je 6 o’s krijgt. Maar wist je dat je strings ook kan optellen? Daarmee kan je het oplossen.

      Succes,
      Dion

  2. milan schreef:

    beste Dion
    bij opdracht 2 heb ik eerst Kortjakje in een tekstbestand geschreven
    en daarna dit ingevuld in alles.py:
    Kortjakje = open(“kortjakje.txt”, “r”)
    for i in Kortjakje:
    print(i)

    maar dan krijg ik:

    altijd is kortjakje ziek

    midden in de week maar zondags niet

    zondags gaat zij naar de kerk

    met een boek vol zilverwerk

    altijd is kortjakje ziek

    midden in de week maar zondags niet

    • Dion Nicolaas schreef:

      🙂 Dat is een leuke oplossing, en je maakt ook nog gebruik van een lus!
      print gaat altijd naar de volgende regel, maar in je tekstbestand staat ook een regelovergang, vandaar dat-ie twee keer naar de volgende regel gaat.
      als je de print-regels zo maakt:
      print i,
      … dan zal print geen regelovergang doen. En dan gaat het dus precies goed…

  3. Lex schreef:

    Beste dion

    Als ik mijn bestand voor de tafels uit opdracht 6 doe:

    getal = input(‘Welke tafel wil je zien? De tafel van: ‘)
    for i in range(1, 11):
    print(i ,’x’, getal, ‘=’,i * getal)

    krijg ik als output
    1×1 = 1
    2×1 = 11
    3×1 = 111
    4×1 = 1111
    5×1 = 11111
    etc….

    Dus bij deze les met als codering:

    getal = input(‘Welke tafel wil je zien? De tafel van ‘)
    totenmet = input(‘Tot hoever? Tot en met ‘)
    tot = totenmet + 1
    print(‘De tafel van’, getal)
    for i in range(1, tot):
    print(i, ‘x’, getal, ‘=’, i * getal)

    ik na Tot hoever? tot en met ….
    Traceback \:
    File “C:\Users\Lex\print.py”, lane 3 in
    tot = totenmen + 1
    TypeError: Can’t convert ‘int’ object to str implicity

    Dit komt denk ik omdat hij de input als een string leest en ze daarom bij elkaar optelt of zegt niet +1 te kunnen doen maar hoe los ik dit op?

    Daarnaast liep ik bij les 1 ook al tegen het probleem aan dat ik bij elke print haakjes moet zetten en dan typen anders krijg ik “SyntaxError: Missing parentheses in call to ‘print’ ”

    Ik weet dus niet hoe ik dit moet oplossen zou jij mij mischien verder kunnen helpen?

    Vriendelijke groet,

    lex

    • Dion Nicolaas schreef:

      Ik denk dat je Python 3 hebt geïnstalleerd in plaats van Python 2.7. Er zijn wat verschillen tussen Python 2 en 3, met name hoe het print-commando werkt en… hoe input() werkt!
      De makkelijkste oplossing voor nu is om overal waar in de voorbeelden input("blabla") staat, dit te vervangen door eval(input("blabla")). Let op de haakjes!
      Je kunt natuurlijk ook Python 2.7 installeren…

      Succes,
      Dion

    • Yuri schreef:

      Klopt. String converteren naar int: tot = int(totenmet) + 1

      Dan werkt het wel.

Geef een reactie