Ga naar hoofdinhoud

Opgaven

Wat je geleerd hebt

In dit hoofdstuk is het volgende besproken:

  • Het nut van functies
  • Functies creëren
  • Parameters en argumenten
  • Waardes uit functies retourneren middels return
  • Functie benamingen
  • Commentaar in functies
  • Variabele scope en levensduur
  • Lokale en globale variabelen
  • Het gebruik van functies om grip te krijgen op complexiteit
  • Modules
  • Gebruik van een main() functie
  • Anonieme functies

In deze opgaves schrijf je functies. Je moet natuurlijk niet alleen de functies schrijven, maar ook code om de functies te testen. Om te oefenen, moet je ook je functies becommentariëren als hierboven uitgelegd.

Opgave 1

Schrijf een functie tafel_van_vermenigvuldiging waaraan een getal nn (int) moet doorgegeven worden. De functie moet de tafel van vermenigvuldiging van nn uitschrijven vanaf 1 tot en met 10.

Voorbeeld

>>> tafel_van_vermenigvuldiging(12)
1 * 12 = 12
2 * 12 = 24
3 * 12 = 36
4 * 12 = 48
5 * 12 = 60
6 * 12 = 72
7 * 12 = 84
8 * 12 = 96
9 * 12 = 108
10 * 12 = 120

Opgave 2

Schrijf een functie gemeenschappelijke_karakters waaraan twee strings (str) moeten doorgegeven worden. De functie moet het aantal gemeenschappelijke karakters (int) van de twee strings teruggeven. Hierbij wordt hetzelfde karakter slechts één keer geteld. Zo hebben de strings een en twee bijvoorbeeld slechts één gemeenschappelijk karakter (de letter e). Hoofdletters en kleine letters worden beschouwd als verschillende karakters.

Voorbeeld

>>> gemeenschappelijke_karakters('een', 'twee')
1

Opgave 3

De Grerory-Leibnitz reeks benadert π\pi op basis van de reeksontwikkeling

4×(1113+1517+19)4 \times \left(\frac{1}{1} - \frac{1}{3} + \frac{1}{5} - \frac{1}{7} + \frac{1}{9} - \cdots\right)

Schrijf een functie gregory_leibnitz waaraan een getal nn (int) moet doorgegeven worden. De functie moet de benadering (float) van π\pi teruggeven die men bekomt op basis van de eerste nn termen van de Grerory-Leibnitz reeks.

Voorbeeld

>>> gregory_leibnitz(1)
4.0
>>> gregory_leibnitz(10)
3.0418396189294032
>>> gregory_leibnitz(100)
3.1315929035585537
>>> gregory_leibnitz(1000)
3.140592653839794

Opgave 4

Een kwadratische vergelijking is een vergelijking van de vorm

ax2+bx+c=0,ax^2 + bx + c = 0\,,

waarin a,b,cRa, b, c \in \mathbb{R} en a0a \neq 0.

De grootheid

Δ=b24ac\Delta = b^2 - 4ac

wordt de discriminant van de kwadratische vergelijking genoemd. Het teken van Δ\Delta bepaalt het aantal reële oplossingen:

  • als Δ>0\Delta > 0 dan zijn er twee verschillende reële oplossingen x1x2x_1 \neq x_2

  • als Δ=0\Delta = 0 dan zijn er twee gelijke reële oplossingen x1=x2x_1 = x_2

  • als Δ<0\Delta < 0 dan zijn er geen reële oplossingen voor de vergelijking

De reële oplossingen kunnen bepaald worden met de zogenaamde wortelformule:

x1=bΔ2a   en   x2=b+Δ2ax_{1} = \frac{-b - \sqrt{\Delta}}{2a}\ \ \ \text{en}\ \ \ x_{2} = \frac{-b + \sqrt{\Delta}}{2a}

  • Schrijf een functie discriminant waaraan de drie parameters aa, bb en cc (int of float) van een kwadratische vergelijking moeten doorgegeven worden. De functie moet de discriminant Δ\Delta (float) van de kwadratische vergelijking teruggeven.

  • Schrijf een functie oplossingen waaraan de drie parameters aa, bb en cc (int of float) van een kwadratische vergelijking moeten doorgegeven worden. De functie moet drie waarden teruggeven: i) het aantal verschillende reële oplossingen (int) van de vierkantsvergelijking, ii) de oplossing x1x_1 (float) van de vierkantsvergelijking en iii) de oplossing x2x_2 (float) van de vierkantsvergelijking. Als de kwadratische vergelijking geen reële oplossingen heeft, dan moet de waarde 00 teruggegeven worden voor x1x_1 en x2x_2.

Voorbeeld

>>> discriminant(1, 0, -1)
4.0
>>> discriminant(1, 4, -5)
36.0

>>> oplossingen(1, 0, -1)
(2, -1.0, 1.0)
>>> oplossingen(1, 4, -5)
(2, -5.0, 1.0)

Opgave 5

In hoofdstuk 7 legde ik de loop-en-een-half uit. De uiteindelijke code voor het voorbeeld dat ik gebruikte had nog steeds iets lelijks, namelijk dat als x kleiner dan 0 of groter dan 1000 was, dat de code nog steeds vroeg om y terwijl het al bekend was dat het een andere waarde voor x zou moeten krijgen. Ik gaf ook aan dat he dat het gemakkelijkste kon oplossen via functies. Creëer een functie die je aan onderstaande code toevoegt en in onderstaande code aanroept, zodat het probleem wordt opgelost. Verwijder ook de exit() door introductie van een main() functie. Hint: Maak een variant van getInteger() die garandeert dat de integer tussen 0 en 1000 ligt.

from pcinput import getInteger
from sys import exit

while True:
x = getInteger( "Geef nummer 1: " )
if x == 0:
break
y = getInteger( "Geef nummer 2: " )
if y == 0:
break
if (x < 0 or x > 1000) or (y < 0 or y > 1000):
print( "De nummers moeten tussen 0 en 1000 liggen" )
continue
if x%y == 0 or y%x == 0:
print( "Fout: de nummers mogen geen delers zijn" )
exit()
print( "Vermenigvuldiging van", x, "met", y, "geeft", x * y )

print( "Tot ziens!" )

Opgave 6

Hoeveel kleurencombinaties zijn er mogelijk bij een keuze van drie kleuren uit de zeven kleuren van de regenboog? De volgorde van de kleuren is niet van belang. Dat zijn er

(73)=7!3!4!=35\binom{7}{3} = \frac{7!}{3!4!} = 35

Hoe komt men tot de waarde van deze coëfficiënt? Voor de eerste kleurkeuze zijn er 7 mogelijkheden, voor de tweede nog 6, en voor de derde nog 5. In totaal dus 7×6×5=7!4!=2107 \times 6 \times 5 = \frac{7!}{4!} = 210 mogelijkheden.

Maar daarbij is rekening gehouden met de volgorde van de kleuren: eerst kan rood en dan geel gekozen zijn, maar ook eerst geel en dan rood. Om van deze volgorde af te zien, moet nog gedeeld worden door het aantal volgordes van de drie kleuren. Dat is

1×2×3=3!=61 \times 2 \times 3 = 3! = 6

Opgave

De faculteit van een natuurlijk getal nn, genoteerd als n!n!, is het product van de getallen 1 tot en met nn:

n!=k=1nk=1×2×3××nn! = \prod_{k=1}^{n}k = 1 \times 2 \times 3 \times \cdots \times n

Bijvoorbeeld als n=5n = 5:

5!=1×2×3×4×5=1205! = 1 \times 2 \times 3 \times 4 \times 5 = 120

In overeenstemming met de definitie van het lege product is afgesproken dat

0!=10! = 1

Een binomiaalcoëfficient, geschreven als

(nk)\binom{n}{k}

en uitgesproken als "nn boven kk", is een grootheid uit de combinatoriek die aangeeft op hoeveel manieren men uit nn (verschillende) objecten er zonder terugleggen kk kan kiezen. Zo'n keuze heet een combinatie. Een binomiaalcoëfficient is gedefinieerd als het natuurlijk getal

(nk)=n!k!(nk)!   voor 0kn\binom{n}{k} = \frac{n!}{k!(n-k)!}\ \ \ \text{voor }0 \leq k \leq n

en

(nk)=0   voor k<0 of k>n\binom{n}{k} = 0\ \ \ \text{voor }k < 0\text{ of }k > n

Gevraagd wordt:

  • Schrijf een functie faculteit waaraan een getal nNn \in \mathbb{N} (int) moet doorgegeven worden. De functie moet n!n! (int) teruggeven.

  • Schrijf een functie binomiaal waaraan twee getallen n,kNn, k \in \mathbb{N} (int) moeten doorgegeven worden. De functie moet (nk)\binom{n}{k} teruggeven.

Voorbeeld

>>> faculteit(5)
120

>>> binomiaal(7, 3)
35

Opgave 7

Wat is er fout aan de volgende code? Los het probleem op!

# Wat is er fout?
def oppervlakte_van_driehoek( basis, hoogte ):
opp = 0.5 * basis * hoogte
print( "Een driehoek met basis", basis, "en hoogte", hoogte, "heeft oppervlakte", opp )

print( oppervlakte_van_driehoek( 4.5, 1.0 ) )

Dit soort code wordt vaak geschreven door studenten die de details van functies nog niet goed begrijpen.