HOOFDSTUK
Module 4 – Programmeren
3
Imperatief programmeren 3.1 Stapsgewijs programmeren De programmeertalen die tot nu toe genoemd zijn, zijn imperatieve of procedurele programmeertalen. Imperatief programmeren is het stapsgewijs in code omschrijven wat een programma moet doen, net als een algoritme of een PSD.
3.2 If Then Else Bij imperatief programmeren omschrijf je in een code stapsgewijs wat een programma moet doen, net als een algoritme en PSD. Wanneer een PSD selecties (keuzes) bevat, deelt de lijn van het programma zich op met de verschillende antwoorden op het vraagstuk. Denk nog maar even terug aan dit schema: is het vuur uit? ja vuur aansteken
nee
Als je imperatief gaat programmeren, krijg je veel met zulke keuzes of voorwaardes te maken. Hiertoe zijn er de ‘if then’-statements en de ‘else’-statements. vraag leeftijd leeftijd <12 Voorbeeld: toegangsprijs ja nee We kijken weer even naar het voorbeeld dat de procedure beschrijft voor het bepalen van leeftijd >=60 detoegang toegangsprijs voor een is 5 euro ja pretpark. nee toegang is 5 euro toegang is 10 euro vertel toegang Voorbeeld ALS leeftijd < 12 DAN toegang := 5 euro druk af “Dit bestand bestaat al.” ANDERS ALS leeftijd >= 60 druk af “Toch onder deze naam opslaan? (J/N)” DAN De code wordt sequentieel, van boven naar wacht op toegang := 5 eurotoetsindruk beneden afgewerkt. Je ziet dat er allerlei keuzes ANDERS totdat een J of N is ingedrukt toegang := 10 euro is ingedrukte toets J? gemaakt moeten worden. Uiteindelijk is het EINDE-ALS resultaat datnee mensen jonger dan 12 en ouder EINDE-ALSja dan, of net zo oud als 60, voor de toegang 5 euro
sla het bestand op
betalen; de overige leeftijden betalen 10 euro.
Niet elke If heeft een Else, maar wel elke Else een If Het if-statement is niet onlosmakelijk verbonden aan het else-statement; het is niet noodzakelijk dat elke if-statement ook een else heeft. Aan de andere kant hoort elke elsestatement wel bij een if.
223
Module 4 – Programmeren Imperatief programmeren Hoofdstuk 3
Informatie Wijze van weergeven Merk op dat alle operaties binnen een statement iets naar rechts zijn geplaatst. Dit principe noemen we inspringen. In de meeste programmeertalen zal het programma ook werken als je dit niet doet, maar het is belangrijk om het wel te doen, omdat de code er overzichtelijker van wordt.
3.3 Lus Wanneer een programma een iteratie (herhaling) bevat, zeggen we ook wel dat er sprake is van een lus (of ‘loop’ in het Engels). De operaties die in een lus zitten worden namelijk uitgevoerd zolang aan een bepaalde voorwaarde voldaan wordt. De meest bekende is de while-lus, hieronder aangegeven als ‘ZOLANG’. Hier zie je een voorbeeld van een lus:
Voorbeeld getal := 0 ZOLANG getal < 3 getal := getal + 1 EINDE-ZOLANG
In dit voorbeeld wordt een getal net zolang opgehoogd totdat deze niet meer kleiner is dan 3. Met andere woorden: de lus stopt zodra het getal 3 is geworden.
Oneindige lus Wanneer de voorwaarde van een while-lus nooit onwaar wordt, zal de lus niet vanzelf stoppen (het programma ‘blijft hangen’). Dit noem je een ‘oneindige lus’. Meestal is dit niet de bedoeling en heeft de programmeur een fout in de voorwaarde gemaakt, of ergens anders, of allebei.
3.4 Booleaanse expressies In de eerder gegeven voorbeelden heb je (misschien onbewust) al kennis gemaakt met Booleaanse expressies.
Informatie Een Booleaanse expressie is een expressie die de waarden true of false aan kan nemen. De naam Booleaans komt van de wiskundige en filosoof George Boole, die het redeneren in waarden als true en false heeft geïntroduceerd in de 19e eeuw.
224
Module 4 – Programmeren Imperatief programmeren Hoofdstuk 3
De voorwaarde van een if-statement is een Booleaanse expressie. Als die de de waarde true heeft, wordt de direct onderliggende code uitgevoerd en niet de code onder de else - als de else aanwezig is. Als de Booleaanse expressie de waarde false heeft, is het andersom.
Symbolen Booleaanse logica De symbolen in onderstaande tabel worden vaak gebruikt in de Booleaanse expressies van programmeertalen. Symbool
Naam
Gebruik
>
groter-dan
x > y is true als x groter is dan y
>=
groter-danof-gelijk-aan
x >= y is true als x groter is dan y of net zo groot
<
kleiner-dan
y < y is true als x kleiner is dan y
<=
kleiner-danof-gelijk-aan
x <= y is true als x kleiner is dan y of net zo groot
not
not
not x is true als x false is en andersom; de Booleaanse waarde van x wordt geïnverteerd
and
and
x and y is true als x en y beide true zijn
or
or
x or y is true als x of y true is (of als ze allebei true zijn)
xor
exclusive or
x xor y is true als x of y true is (en niet als ze allebei true zijn)
Misschien had je het al opgemerkt: de code van de toegangsprijs van het pretpark kunnen we met deze logica korter omschrijven:
Voorbeeld ALS leeftijd < 12 OF leeftijd >= 60 DAN toegang := 5 euro ANDERS toegang := 10 euro EINDE-ALS
Wijze van weergeven Bij het opstellen van een Booleaanse expressie moet je zorgvuldig te werk gaan. Een verschil in de volgorde van de expressie kan bijvoorbeeld hele andere resultaten opleveren. Het is daarom veilig om delen van je expressie te voorzien van haakjes: ‘(‘ en ‘)’. Door delen tussen haakjes te zetten, geef je aan dat deze als geheel geïnterpreteerd moeten worden.
225
Module 4 – Programmeren Imperatief programmeren Hoofdstuk 3
Waarheidstabel De volgende expressie: \(x EN y) OF z
is niet hetzelfde als: x EN (y OF z)
Je kunt dit gemakkelijk zien door voor deze expressies een waarheidstabel te maken. Dit is een tabel waarin je aangeeft wanneer de expressie true of false is bij welke waarden. Hieronder zijn van beide expressies de verschillende waarheidstabellen weergegeven.
(x EN y) OF z x
y
x EN (y OF z) z
Waarde van expressie
x
y
z
Waarde van expressie
true
true
true
true
true
true
true
true
true
true
false
true
true
true
false
true
true
false true
true
true
false true
true
true
false false
false
true
false false
false
false true
true
true
false true
true
false
false true
false
false
false true
false
false
false false true
true
false false true
false
false false false
false
false false false
false
Informatie Meestal worden in waarheidstabellen de termen true en false vervangen door respectievelijk 1 en 0. Dit kan zo’n tabel een stuk beknopter maken.
3.5 Variabelen Een variabele is een element dat een bepaalde waarde aan kan nemen. Een voorbeeld van een variabele is de toegangsprijs van een pretpark. De waarde die een variabele kan hebben, is afhankelijk van het type van de variabele. Er zijn verschillende typen die voorkomen in verschillende programmeertalen, maar doorgaans zijn de volgende typen in ieder geval aanwezig: Geheel getal Dit wordt een integer genoemd, vaak afgekort tot int. ‘42’ is bijvoorbeeld een heel getal.
226
Module 4 – Programmeren Imperatief programmeren Hoofdstuk 3
Kommagetal Dit wordt vaak een double of float genoemd. Bijvoorbeeld: ‘109,75’. In veel programmeertalen moet je deze getallen op z’n Engels noteren, met een decimale punt. Karakter Dit noemt men een character of kortweg char (spreek uit: kar). Een karakter kan elk ANSI-, EBCDIC- of Unicode-teken zijn, bijvoorbeeld ‘$’. Boolean Dit wordt ook wel bool genoemd (Nederlands: booelaanse). Een boolean kan alleen maar true of false zijn. Sommige programmeertalen (waaronder C en C++) laten hier ook gehele getallen in toe, waarbij 0 staat voor false en alle andere getallen voor true. Een apart soort variabele is de string. Dit is een reeks karakters, bijvoorbeeld ‘tijger’ of ‘$2,50’.
3.6 Arrays De meeste programmeertalen bieden de mogelijkheid om arrays (Nederlands: rij) te maken. Een array is een geordende rij van variabelen van hetzelfde type. Zo kun je bijvoorbeeld een array van gehele getallen maken. De variabelen van een array zijn genummerd; het volgnummer noemen we de index. In veel programmeertalen begint de indexering van een array altijd met 0 (en niet met 1).
Voorbeeld De code: rij_van_getallen := [32, 59, 825, 9042]
De indexering: rij_van_getallen index:
0
1
2
3
waarde:
32
59
825
9042
3.7 Functies Je kunt een functie (een verwant begrip is procedure) gebruiken als je een bepaald stuk code vaker moet gebruiken of als je een programma overzichtelijker wilt maken. Met een functie maak je een ‘subprogrammaatje’. Als in het programma de naam van een functie staat, wordt daar het subprogrammaatje dat erbij hoort, uitgevoerd. We noemen dat het aanroepen van de functie.
227
Module 4 – Programmeren Imperatief programmeren Hoofdstuk 3
Van een functie moeten de volgende zaken worden gedefinieerd: De naam Elke functie moet een unieke naam hebben. Sommige programmeertalen laten toe dat namen van functies vaker voorkomen, zolang de parameters verschillen. Dit principe noem je overloading. De parameters Dit zijn speciale variabelen die een waarde krijgen bij het aanroepen van de functie. Zo kan de functie werken met de meegegeven waarden. Een functie kan nul of meer parameters hebben. Het returntype Dit is het waarde-type dat de functie na uitvoeren oplevert. Een functie kan maar één returntype hebben. Deze waarde wordt op de plek van de aanroep verder gebruikt. De body Dit is de code die uitgevoerd wordt als de functie aangeroepen wordt.
Voorbeeld In dit voorbeeld wordt voor elke variabele, het type van de variabele gespecificeerd (net als bij de meeste programmeertalen).
Voorbeeld som(int getal1, int getal2) : int int optelling := getal1 + getal2 return optelling
De functie ‘som’ telt twee getallen van het type ‘int’ bij elkaar op en geeft het resultaat (wat hier de naam ‘optelling’ heeft gekregen) als int terug. De termen ‘getal1’ en ‘getal2’ zijn de parameters en worden gescheiden door een komma. We kunnen nu naar deze functie refereren, of anders gezegd: we kunnen deze functie aanroepen en het resultaat in een andere variabele stoppen. Bijvoorbeeld:
Voorbeeld int getalA := som(10, 20) int getalB := som(getalA, 70) int getalC := som(som(50, 50), getalB)
Als bovenstaande code uitgevoerd zou worden, zou na afloop getalA de waarde 30 hebben, getalB 100 en getalC 200. Je ziet: na een aanroep van een functie kan het resultaat precies zo worden behandeld als het returntype van de functie. In dit geval is het returntype van de functie een integer en kun je dus dit resultaat direct weer gebruiken, zoals op de derde regel hier ook gebeurt.
228
Module 4 – Programmeren Imperatief programmeren Hoofdstuk 3
3.8 Parameters en argumenten We hebben eerder aangegeven dat getal1 en getal2 de parameters zijn van de functie ‘som’. Bij het aanroepen worden deze parameters ingevuld door, wat we noemen, de argumenten. Een argument is een waarde die meegegeven wordt bij een functie-aanroep. We herhalen het voorbeeld uit de vorige paragraaf:
Voorbeeld int getalA := som(10, 20) int getalB := som(getalA, 70) int getalC := som(som(50, 50), getalB)
Als bij het aanroepen van een functie een variabele meegegeven wordt - zoals in ons voorbeeld op de tweede regel het geval is - dan wordt niet de variabele zelf meegestuurd, maar de waarde van de variabele. Omdat de waarde wordt meegegeven, verandert de variabele zelf dus niet na het aanroepen van een methode, ongeacht wat de methode met de parameters doet. We proberen dit in het volgende voorbeeld te verduidelijken.
Voorbeeld We definiëren eerst een functie (die eigenlijk niets zinnigs doet):
Voorbeeld zomaarEenFunctie(int eenGetal) : int eenGetal := 999 return 0
Vervolgens roepen we deze aan:
Voorbeeld mijnEersteGetal := 5 mijnTweedeGetal := zomaarEenFunctie(mijnEersteGetal)
Na het zogenaamd uitvoeren van deze code zal mijnEersteGetal nog altijd de waarde 5 hebben en mijnTweedeGetal de waarde 0.
229
Module 4 – Programmeren Imperatief programmeren Hoofdstuk 3
3.9 Void Alle voorbeeldfuncties tot nu toe hadden een returnwaarde, namelijk een int. Maar een functie hoeft niet per se een returnwaarde te hebben. Dat geef je aan met het returntype void. Void is eigenlijk geen variabele-type, maar is eerder de afwezigheid van een waarde. Letterlijk vanuit het Engels vertaald betekent void dan ook ‘leegte’. Hieronder is een voorbeeldfunctie zonder returnwaarde gedefinieerd:
Voorbeeld zegHallo() : void print(“hallo”)
Deze functie heeft geen parameters en geen returnwaarde. Bovendien wordt er een andere functie aangeroepen met de naam ‘print’, waarbij een string als argument wordt meegegeven.
3.10 Syntax De syntaxis (Engels: syntax) is de grammatica van een programmeertaal. Hij beschrijft hoe de code er in een bepaalde programmeertaal uit moet komen te zien, wat de grammaticale regels zijn. Elke programmeertaal heeft een eigen syntax, maar sommige programmeertalen hebben onderling veel syntactische overeenkomsten, zoals C, C++, Java, C#. De reden dat veel programmeertalen een overeenkomstige syntax hebben, is om het programmeurs makkelijker te maken een andere taal te leren.
Voorbeeld int som(int getal1, int getal2) { return getal1 + getal2; }
Voorbeeld van een functie die zou werken in C, C++, Java en C#.
230
Module 4 – Programmeren Imperatief programmeren Hoofdstuk 3
3.11 Vragen en opdrachten 3.11.1 Open vragen 1. Wanneer zal van een else-statement de inhoud worden uitgevoerd? Geef de waarheidstabel van de volgende expressie: x OR (NOT y). a. Noem de Engelse namen van de verschillende typen variabelen die je kent. b. Wat valt je op als je de string met de lijst vergelijkt? 2. a. Welke eigenschappen moet je van een functie of procedure definiëren? b. Wat is het verschil tussen een parameter en een argument? 3. Leg in je eigen woorden uit wat syntax betekent.
3.11.2 Meerkeuzevragen 1. Welke van onderstaande beweringen over lijsten is niet waar? a. De eerste waarde van een lijst staat altijd op index 0. b. Een lijst heeft een volgorde waarin de waardes gerangschikt zijn. c. In één lijst kunnen verschillende waardes worden opgeslagen van verschillende typen. d. Een lijst wordt ook wel array genoemd. 2. Bekijk dit voorbeeld: int a = 2; int b = 4; int c = 6; vermenigvuldig(int x, int y) : int return x * y c := vermenigvuldig(a, b)
Stel dat deze code uitgevoerd zou worden, welke waardes zouden dan correct zijn ná het uitvoeren: a. x is 2, y is 4 en c is 6. b. a is 2, b is 4 en c is 8. c. b is 4, y is 4 en c is 4. d. a is 2, b is 4 en c is 6. 3. Welke van onderstaande beweringen over lussen is niet waar? a. Van een lus wordt de booleaanse expressie herhaaldelijk gecontroleerd. b. Een lus is vergelijkbaar met de iteratie van een PSD. c. Een ander woord voor lus is loop. d. Bij een oneindige lus wordt niet aan de booleaanse expressie voldaan.
231
Module 4 – Programmeren Imperatief programmeren Hoofdstuk 3
4. Van de volgende booleaanse expressie zijn de operatoren vervangen door cijfers. De waarden voor x en y zijn: x = true, y = false. Welke operatoren kunnen hier staan om de expressie de waarde true te laten zijn? x 1 y 2 3 (x 4 y)
a. b. c. d.
1 = XOR, 2 = AND, 3 = OR, 4 = XOR 1 = OR, 2 = AND, 3 = NOT 4 = AND 1 = AND, 2 = AND, 3 = NOT, 4 = AND 1 = OR, 2 = XOR, 3 = NOT, 4 = AND
3.11.3 Korte opdrachten 1. Zoek ten minste vijf syntactische regels voor de programmeertaal Java en beschrijf deze kort in je eigen woorden. 2. a. Schrijf zelf code voor het zetten van koffie. Maak hierbij gebruik van variabelen, ten minste één lus en ten minste één functie. b. Beschrijf vervolgens stapsgewijs de werking van jouw code. Geef hierbij onder andere aan welke variabelen op welk moment welke waarde hebben.
232
Module 4 – Programmeren Imperatief programmeren Hoofdstuk 3
3.12 Samenvatting Imperatief programmeren is het stapsgewijs schrijven van instructies die van boven naar beneden uitgevoerd worden. Kenmerken hierbij zijn: if-, then-, else-statemens: gebruikt om voorwaarden aan variabelen te stellen lussen: herhalingen, denk hierbij aan de while-lus functies of procedures: kleine deelprogramma’s om het programma overzichtelijker te maken en herhalende code slechts één keer te hoeven schrijven. Een parameter is een variabele die gedefiniëerd is bij een functie. Een argument is de waarde die je meegeeft bij het aanroepen van een functie. Er zijn verschillende typen variabelen: int: heel getal double of float: kommagetal char: een karakterteken bool of boolean: heeft de waarde true of false. Een string is een reeks van karakters. Een lijst (of array) is een reeks van waardes van één type variabele. De syntax van een programmeertaal beschrijft de grammaticaregels waaraan een programmeur zich voor die taal moet houden.
233
AANTEKENINGEN
234
Fundament Informatica deel 1