• No results found

De Sc` ene

N/A
N/A
Protected

Academic year: 2021

Share "De Sc` ene"

Copied!
30
0
0

Bezig met laden.... (Bekijk nu de volledige tekst)

Hele tekst

(1)

Algoritmisch Denken en Gestructureerd Programmeren (in Greenfoot)

2017 Renske Smetsers-Weeda & Sjaak Smetsersc 1

Inhoudsopgave

Inleiding 1

Leerdoelen 2

Instructies 3

Theorie 3

1.1 Mimi’s wereld . . . 3

1.2 Objecten aanmaken . . . 4

1.3 Algoritmes . . . 5

1.4 Methodes en hun resultaten . . . 5

1.5 Klassen en overerving . . . 6

1.6 Toestand van een object . . . 7

1.7 Parameters en resultaten . . . 8

1.8 Signatuur . . . 8

1.9 Lezen van een stroomdiagram en programmacode . . . 9

1.10 Java Documentatie . . . 11

1.11 Aanpassingen doorvoeren . . . 12

1.12 Naamgevingsafspraken . . . 13

1.13 Fouten . . . 14

1.14 Afdrukken naar een console . . . 14

Uitdagingen 16 1.1 Kennis maken met Greenfoot . . . 16

1.2 De wereld vullen . . . 17

1.3 Accessormethode ontdekken . . . 18

1.4 Mutatormethode ontdekken . . . 18

1.5 Overerving . . . 19

1.6 Toestanden . . . 20

1.7 Accessormethodes aanroepen . . . 20

1.8 Parameters gebruiken . . . 20

1Licensed under the Creative Commons Attribution 4.0 license:https://creativecommons.org/licenses/by/4.0/

(2)

1.9 Stroomdiagram en bijbehorende programmacode ontdekken . . . 21

1.10 Nieuwe methode turn180() toevoegen . . . 22

1.11 Foutmeldingen herkennen . . . 23

1.12 Tekst naar de console afdrukken . . . 24

1.13 Variabelen naar de console afdrukken . . . 24

1.14 Co¨ordinaten naar de console afdrukken . . . 25

Reflectie 27

Opslaan en inleveren 28

(3)

Inleiding

In deze opgavenreeks Algoritmisch denken en gestructureerd programmeren (in Greenfoot) leer je op een leuke manier de basisvaardigheden voor Objectgeori¨enteerd programmeren. Na afloop kun je dan, met behulp van de Greenfoot- en Java-bibliotheken, programmeren in de programmeertaal Java.

Met deze basisvaardigheden ben je ook in staat om je makkelijk andere objectgeori¨enteerde talen ei- gen te maken. Je leert hoe je voorgegeven stukken programmacode kunt gebruiken als eerste aanzet voor een nieuw programma. Hergebruik van bestaande programmacode is een van de grote voorde- len van de taal Java: Omdat er heel veel mensen zijn die programmeren in Java is er ook heel veel voorbeeldcode beschikbaar op internet. Door hier slim gebruik van te maken wordt het makkelijker om zelf grote programma’s te schrijven. Natuurlijk leer je ook je eigen code schrijven.

De Sc` ene

Figuur 1: Mimi de Dodo

Dit is Mimi, onze Dodo. Een Dodo (een vogel die jammer genoeg inmiddels is uitgestorven) is, naar men zegt, nooit erg intelligent geweest. Eerst zul je deze Dodo een paar eenvoudige opdrachten leren uitvoeren, zoals lopen en draaien. Gedurende de cursus zul je haar leren om ingewikkeldere taken uit te voeren, zoals het lopen door een doolhof. Ook ga je een wedstrijd met jouw klasgenoten aan: wie maakt de slimste Dodo

Programmeren

Je programmeert in de taal Java. In de opdrachten werken we met de Greenfoot programmeeromge- ving. Dit is een omgeving die je helpt Java programma’s te schrijven zonder eerst uitgebreid de theorie van programmeren te leren. Zo kun je gaandeweg Java leren terwijl je er mee bezig bent.

Computational Thinking

De focus van deze cursus ligt op het algoritmisch denken: het bedenken en formuleren van een oplos- sing zodanig dat deze uitgevoerd kan worden door een computer. Om tot die oplossingen te komen moet je soms (creatief ) puzzelen. Vaak zijn er meerdere oplossingen voor ´e´en probleem, soms is de ene beter dan de andere. Om vaardig te worden in het herkennen, bedenken en toepassen van betere oplossingen zullen we ook oefenen met de andere aspecten van Computational Thinking:

• Algoritmiek: een algoritme beschrijven door middel van beslissingen, opeenvolgingen en her- halingen van taken.

• Decompositie: aanpak waarmee je een groot probleem (of oplossing) opdeelt in kleinere stukken die dan afzonderlijk opgelost kunnen worden.

• Abstractie: details weglaten waardoor het probleem eenvoudiger wordt zodat een oplossing makkelijker gevonden kan worden. Hierdoor kun je ook beter patronen herkennen waardoor (delen van) problemen met al bestaande oplossingen aangepakt kunnen worden.

• Generalisatie: je probleem veralgemeniseren waarmee je oplossing ook voor andere vergelijk- bare situaties hergebruikt kan worden (bijvoorbeeld door gebruik van parameters).

• Evaluatie: terugkijken op jouw oplossing en aanpak. Is het een juiste oplossing voor het pro- bleem? Had het beter, slimmer of effici¨enter gekund?

(4)

Computational Thinking gaat over het oplossen van problemen, systemen ontwikkelen en mense- lijk gedrag begrijpen. Het doel is niet om mensen te laten denken zoals computers; het is een manier waarop mensen problemen oplossen. Denken zoals een informaticus betekent meer dan alleen het kunnen programmeren van een computer. Het vereist ook het oplossen van problemen.

Als je wilt leren schaken, dan moet je de spelregels kennen. Die spelregels vertellen je wat wel en wat niet mag. Wil je goed kunnen schaken en het leuk vinden, dan is het niet genoeg om de regels te kennen. Je moet ook leren wat een goede zet is.

Wat programmeren betreft, zijn er natuurlijk talloze Java tutorials en handboeken te vinden op het internet. Die leren je de regels, maar leren je weinig over hoe je het schrijven van een programma aanpakt. In deze cursus leer je hoe je een programmeertaak systematisch uitvoert. Je leert een pro- bleem analyseren en op een gestructureerde en overzichtelijke manier te zoeken naar een oplossing.

Het doel is dat je goed leert programmeren en er ondertussen plezier bij hebt.

Doelen

De cursus bestaat uit een aantal opdrachten.

De doelen van deze eerste opdracht zijn:

• Leren aanpassen van bestaande code op een gestructureerde manier;

• Kennismaken met de Greenfoot programmeeromgeving.

Leerdoelen

Na afloop van deze opdracht kun je:

• je weg vinden in de programmeeromgeving Greenfoot;

• methodes aanroepen en hun effect analyseren;

• het verschil tussen een mutatormethode en een accessormethode in jouw eigen woorden om- schrijven;

• aan de hand van een klassendiagram, de subklassen van een klasse benoemen;

• (ge¨erfde) methodes van een klasse vinden en benoemen;

• eigenschappen van de toestand van een object benoemen;

• omschrijven wat de typesint,String,voidenbooleanzijn;

• aan de hand van een signatuur, het resultaattype en de parameter(type)s van een methode benoemen;

• de relatie tussen een algoritme, een stroomdiagram en programmacode kunnen omschrijven;

• JavaDoc commentaar aan code toevoegen;

• stapsgewijs codeaanpassingen doorvoeren en testen;

• syntax foutmeldingen herkennen en interpreteren;

• afdrukken naar een console.

(5)

Instructies

Voor deze opdracht heb je nodig:

• Greenfoot: Instructies voor het installeren en openen van de Greenfoot omgeving worden ver- derop gegeven;

• scenario ’DodoScenario1’: Dit moet je downloaden van de cursuswebsite2.

Tijdens de opdracht zul je enkele vragen moeten beantwoorden. Bespreek je antwoorden met je partner en noteer ze beknopt. Na afloop dien je het volgende in te leveren:

• Alle flowcharts: gebruik potlood en papier of maak gebruik van de software op https://www.

draw.io/;

• Jouw code: het bestandMyDodo.javabevat al jouw code en moet ingeleverd worden;

• Het reflectieblad: vul in en lever het in.

Er zijn drie soorten opgaven:

Aanbevolen. Leerlingen met weinig programmeerervaring of leerlingen die wat meer oefening nodig hebben moeten deze taken allemaal afmaken.

Verplicht. Iedereen moet deze taken afmaken.

Uitdagend. Complexere opgaven, ontwikkeld voor leerlingen die 2-ster opdrachten vol- tooid hebben en klaar zijn voor een grotere en onderzoekende uitdaging.

Leerlingen die 1-ster opgaven overslaan moeten alle 3-ster opgaven maken.

Theorie

Theorie 1.1: Mimi’s wereld

Dit is onze Dodo. Ze heet Mimi en behoort tot de Dodo familie. Hier staat ze, kijkend naar het oosten.

Mimi leeft in een wereld die bestaat uit 12 bij 12 vakjes. Deze wereld is begrensd, ze kan er niet uit.

Haar levensdoel is het leggen en uitbroeden van eieren. In het plaatje hieronder zie je haar wereld (met de co¨ordinaten).

2http://course.cs.ru.nl/greenfoot/

(6)

Figuur 2: Mimi’s world

Mimi is een heel brave Dodo. Ze doet namelijk altijd precies wat haar wordt gezegd en geeft altijd eerlijk antwoord op vragen. Door methodes aan te roepen kun je haar opdrachten geven (commando’s) of vragen stellen.

Je kunt Mimi opdrachten laten uitvoeren, zoals:

move zet een stap naar de volgende cel (hokje) hatchEgg broed een ei uit

jump spring een aantal cellen vooruit

Je kunt ook een vraag stellen waar Mimi dan een antwoord op geeft, zoals:

canMove Kun je een stapje vooruit zetten?

getNrOfEggsHatched Hoeveel eieren heb je uitgebroed?

Theorie 1.2: Objecten aanmaken

Alle bewoners en voorwerpen die in de wereld voorkomen zijn objecten. Objecten worden ook wel instanties genoemd.

Figuur 3: Scenario met ´e´enMyDodoobject en drieEgg-objecten

In onze opdrachten hebben we ´e´en hoofdrolspeelster, eenMyDodo-object. Ze is een instantie van de klasseMyDodoen we noemen haar Mimi.

Metnew MyDodo( )maak je een nieuw object vanMyDodoaan. Dit kan op twee manieren:

1. Door met je rechtermuisknop opMyDodo in de klassendiagram te klikken, ”new MyDodo( )” te kiezen (zie figuur 4) en dan de Dodo naar de wereld te slepen.

2. Rechtstreeks in de code. Dit laatste zullen we in de vervolgopdrachten tegenkomen.

(7)

Figuur 4: Met de rechtermuisknop een nieuwMyDodo-object aanmaken.

Theorie 1.3: Algoritmes

Een algoritme is een serie van precies omschreven opdrachten om een taak uit te voeren; een stap- penplan. Algoritmes vormen de basis waarmee we computers problemen kunnen laten oplossen. Pro- grammacode is een algoritme geschreven voor een computer. Deze vertelt dus precies, stap voor stap, wat de computer moet doen.

Als een stappenplan voldoende nauwkeurig is opgeschreven, zou iemand anders het na kunnen doen, precies zoals jij het bedoelde. Met hetzelfde probleem (beginsituatie) zou die andere persoon dan tot dezelfde oplossing komen (eindsituatie).

Het lijkt een beetje op een recept. Het verschil met een recept is dat een stappenplan nog preciezer is. In een recept voor een pudding zou kunnen staan: ”roer tot een glad geheel”. Maar de ene keer zou je toetje misschien wat minder glad kunnen zijn dan de andere keer. Dat mag niet in een algoritme.

Het resultaat moet elke keer precies hetzelfde zijn. Voor elke stap moet daarom duidelijk zijn wat deze precies inhoudt.

Theorie 1.4: Methodes en hun resultaten

Er zijn twee soorten methodes, mutatormethodes en accessormethodes.

Mutatormethode

Een mutatormethode is een opdracht aan een object om dit iets uit te laten voeren. Hierdoor verandert de toestand van het object. Een mutatormethode kun je herkennen aan het (type van het) resultaat:

void. Bijvoorbeeld:

(8)

• void move( )verandert de toestand van Dodo door deze ´e´en cel vooruit te plaatsen.

• void setDirection( int new_direction )verandert de kijkrichting van een actor.

Accessormethode

Een accessormethode is een vraag die informatie over een object oplevert. Bijvoorbeeld:

• int getNrOfEggsHatched( ) met als resultaat een int (een geheel getal) dat aangeeft hoeveel eieren Mimi heeft uitgebroed.

• boolean canMove( )met als resultaattrue(’waar’) offalse(’niet waar’) dat aangeeft of Mimi al dan niet een stapje vooruit kan zetten.

Deze accessormethodes geven enkel informatie over het object terug, ze doen niks met het object. De toestand van het object blijft ongewijzigd. Bijvoorbeeld, Dodo geeft informatie maar verplaatst zich niet.

Theorie 1.5: Klassen en overerving

Elk object hoort bij (of eigenlijk, is een instantie van) een klasse. Zo is Mimi een instantie van de klasse MyDodo. DatMyDodotot het Dodoras behoort kun je zien in het klassendiagram. In Greenfoot staat het klassendiagram rechts op het scherm; zie figuur 5. De pijl in het diagram geeft een ’is-een’ relatie aan:

MyDodo’is-een’Dodo. Dus, elkeMyDodo-instantie behoort ook tot de klasseDodo.

Figuur 5: Klassediagram

Methodes van MyDodo

Mimi heeft methodes die je kunt aanroepen. Mimi is eenMyDodoen kan dus alles wat eenmyDodokan.

Door in de wereld met de rechtermuisknop te klikken op Mimi kun je zien wat eenMyDodoallemaal kan, bijvoorbeeldmove( ).

Methodes van Dodo

Maar Mimi, onzeMyDodo, kan veel meer. Er zijn dingen die alle Dodo’s in het algemeen kunnen. Mimi kan dat dan natuurlijk ook, ze is tenslotte ook een Dodo!

We leggen nu uit hoe je kan zien welke methodes Dodoallemaal heeft. Klik in de wereld met de rechtermuisknop op Mimi. Bovenaan het lijstje zie je ’inherited from Dodo’ staan. Als je daarop klikt, dan zie je ineens meer methodes, bijvoorbeeldlayEgg( ). Dit zijn de methodes vanDodo, de dingen die alle Dodo’s kunnen. OmdatMyDodoeenDodois (dat zie je in het klassendiagram in figuur 5), erft (oftewel inherits in het Engels) ze deze Dodo-methodes. We zeggen ook wel datMyDodoeen subklasse is vanDodo. Dit houdt in dat elkeMyDodoook alleDodomethodes uit uit kan voeren.

(9)

Inheritance

Met overerving kun je een nieuwe klasse maken als uitbreiding van een bestaande klasse. De be- staande klasse wordt dan de superklasse genoemd. De uitgebreide klasse heet subklasse.

Een instantie van een subklasse kan alle methodes aanroepen van zijn superklasse. OmdatMyDodo een subklasse vanDodois kan eenMyDododus methodes uitvoeren uit zowel deMyDodo-klasse als van deDodo-klasse.

Voorbeeld van een klassendiagram

Figuur 6: Klassendiagram van huisdier

In het klassendiagram in figuur 6 zie je datKattenenHondensubklasses zijn vanHuisdier.

• ElkHuisdierkanslapen( )eneten( ), dus dan kunnenKattenenHondendat ook.

• EenKatkanspinnen( ). Deze methode is specifiek voorKatten: Niet elkHuisdierkanspinnen(

).

Theorie 1.6: Toestand van een object

Je kunt verschillende objecten in de wereld zetten, bijvoorbeeld een Dodo en een ei. Je kunt ook meerdere objecten van dezelfde klasse in de wereld zetten. Hier zie je drie objecten van de klasse Eggen ´e´en van de klasseMyDodo.

Figuur 7: Wereld met meerdere objecten

Alle objecten van dezelfde klasse hebben dezelfde methodes en dus hetzelfde gedrag. De drieEgg- objecten zien er hetzelfde uit en kunnen precies hetzelfde doen: ze hebben dezelfde methodes. Toch zijn het verschillende objecten, of instanties.

Elk object heeft zijn eigen toestand. Een toestand bestaat uit eigenschappen die kunnen veranderen, zoals co¨ordinaten of uiterlijk. De toestand van een object kun je bekijken door in de wereld met de rechtermuisknop op het object te klikken en dan ’Inspect’ te kiezen. In het volgende voorbeeld zie je de toestanden van tweeEgg-objecten. Het ene met co¨ordinaten (1,1) en het andere met co¨ordinaten (2,2).

(10)

Figuur 8: Toestanden van twee Egg-objecten

Theorie 1.7: Parameters en resultaten Resultaten

In 1.4 hebben we gezien dat een accessormethode informatie over de toestand van een object oplevert.

Zo’n antwoord heet een resultaat. Bijvoorbeeld de methodeint getNrOfEggsHatched( )die eenint (geheel getal) als resultaat heeft. Een methode kan maar ´e´en resultaat opleveren.

Parameters

Methodes kunnen ook bepaalde waarden meekrijgen die ze meer informatie geeft om een bepaalde taak uit te voeren. Die meegegeven waarden heten parameters. Een methode kan 0 of meer parame- ters hebben.

Voorbeelden:

• void jump (int distance)heeft ´e´en parameter,distancewaarmee de methode ‘weet’ hoe ver er gesprongen moet worden. Daarnaast weten we datdistanceeenint(geheel getal) is. Door de aanroep vanjump(3);zal Mimi 3 vakjes verplaatsen en door de aanroep vanjump(5);5 vakjes.

De methodejumpis zo geschreven dat deze all´e´en kan worden aangeroepen met de aanvullende informatie. Anders weet deze methode niet hoe ver Mimi verplaatst moet worden.

• void move( )heeft geen parameters. De verplaatsing is altijd ´e´en.

• void setDirection( int new_direction )heeft ´e´en parameter, een int new_directiondie de methode vertelt in welke richting het object moet draaien.

Types

Parameters en resultaten hebben een type. Hettypegeeft aan welke soorten waarden een parameter of resultaat moet hebben.

Voorbeelden van verschillende types zijn:

Type Betekenis Voorbeeld

int geheel getal 2

boolean ’waar’ of ’niet waar’ true

String tekst ”Mijn fiets is gestolen!”

List lijst [1,2,3]

Een type kan ook een klasse zijn, zoalsEggof zelfs een lijst (List) van dingen.

Een aanroep vanvoid jump( int distance )zonder een parameter mee te geven mag dus niet, deze methode moet eenintmeekrijgen.

(11)

Theorie 1.8: Signatuur

De specificatie van een methode heet de signatuur. Aan de hand van de signatuur kun je zien wat de naam van een methode is, welke parameters hij verwacht en wat voor soort resultaat hij oplevert (resultaattype).

• Methodenaam: v´o´or het eerste haakje staat de naam van de methode. In dit voorbeeld:jump.

• Parameter: tussen de haakjes ’(’ en ’)’ staat aangegeven welke parameters de methode als input krijgt. In dit voorbeeld:distance.

• Parametertype: het type (zoalsint,boolean,String) van de parameter staat voor de naam van de parameter. In dit voorbeeld:int.

• Resultaattype: het type (zoalsint, boolean, void) van het resultaat staat voor de naam van de methode. In dit voorbeeld is het resultaattypevoid.

• Methode signatuur: het geheel van alle bovengenoemde onderdelen. In dit voorbeeld: public void jump (int distance). (Watpublicbetekent komt later aan bod)

Figuur 9: Signatuur van een methode Voor het voorbeeld hierboven:

Methodenaam jump

Parameter distance

Parametertype int

Resulttype void

Methode signatuur public void jump ( int distance )

Theorie 1.9: Lezen van een stroomdiagram en programmacode

Een stroomdiagram gebruik je om een algoritme visueel weer te geven. Door een stroomdiagram te tekenen houd je overzicht over het geheel. Hierdoor wordt het schrijven, lezen en analyseren van programmacode makkelijker.

We bekijken het algoritme vanmove( )uitMyDodo. Dit heb je al een keer gezien bij taak 1.4.

(12)

Figuur 10: Stroomdiagram en bijbehorende code voormove( )

Figuur 11: Stroomdiagram en bijbehorende code voormove( )

Toelichting stroomdiagram

• Methodenaam:move. De naam staat in de linkerbovenhoek.

• Begin- en eindsituaties staan beschreven in notitieblokjes in de rechterbovenhoek en rechterbe- nedenhoek.

• Er wordt bovenaan bij ’Start’ begonnen.

• Body: dit is het gedeelte tussen ’Start’ en ’Einde’. Het omschrijft wat de methode doet. In dit voorbeeld:

– Volg de pijl naar de ruit.

– Een ruit betekent dat er een keuze gemaakt moet worden, afhankelijk van het resultaat van

’canMove?’ wordt er een ander pad vervolgd:

∗ Als ’canMove?’ waar is, dan wordt de pijltruenaar rechts gevolgd.

∗ Als ’canMove?’ niet waar is, dan wordt de pijlfalsenaar links gevolgd.

Dit is hetzelfde als eenif..then..elsein programmacode.

– Bij een rechthoek wordt een methode aangeroepen en uitgevoerd. Dus, afhankelijk van welke pijl er gevolgd is, zal ´of ’move’ ´of ’turnRight’ uitgevoerd worden.

• Als het ’Einde’ bereikt is, dan is de move methode afgelopen.

Toelichting code

• Commentaar: de tekst tussen /** en */ bovenaan (in de Greenfoot editor in blauw weergegeven) is commentaar. De compiler doet daar niets mee. Programmeurs schrijven commentaar om ande- ren te helpen hun programma’s te begrijpen. De begin- en eindsituaties worden hier beschreven.

Wat de parameters en resultaten van de methode zijn ook. Als commentaar maar ´e´en regel be- slaat kun je ook // gebruiken.

(13)

• Signatuur: deze ispublic void move( ).

• Access-modifier: deze ispublic. Wat dit betekent en welke andere mogelijkheden er zijn, komt later aan bod.

• Methodenaam:move.

• Resultaattype: dat isvoid. Zoals we in Theorie 1.4 zagen betekentvoiddat de methode iets uit- voert en dus geen waarde oplevert. Deze mutatormethode doet dus iets met een object. Dit in tegenstelling tot een accessormethode die informatie over de toestand van een object oplevert.

(zie Theorie 1.4).

• Body: deze staat tussen de eerste accolade { en bijbehorende }. In dit voorbeeld bestaat de body uit een conditional statement: dit is deif..then..else. Dit moet als volgt gelezen worden:

– Tussen de haakjes ’(’ en ’)’ staat een conditie. Er wordt eerst gecontroleerd of de conditie canMovewaar is of niet.

– Als deze true is, dan wordt het gedeelte direct volgende op de conditie uitgevoerd. Dus, step( )wordt aangeroepen en Dodo zet een stapje vooruit.

– Als dezefalseis, dan wordt het gedeelte achter deelseuitgevoerd. Dan wordt dus de fout- melding met de tekst ”I’m stuck” getoond.

Theorie 1.10: Java Documentatie

Bij elke methode hoort commentaar. Commentaar geeft toelichting over wat de programmacode doet.

In Java heet dit JavaDoc (’Java Documentatie’). Commentaar toevoegen helpt anderen (en jezelf ) code te begrijpen en opnieuw te gebruiken.

Schrijven van Java Documentatie

In Java zijn er een standaard afspraken over hoe je code van commentaar voorziet (bekijk bijvoorbeeld de code hieronder):

• Elk methode heeft (globaal) commentaar waarin staat uitgelegd wat de methode doet.

• Begin- en eindsituatie zijn beschreven.

• Commentaar begint met /**en eindigt met */.

• Voor commentaar korter dan ´e´en regel gebruik je //gevolgd door het commentaar.

@paramgeeft aan welke parameters de methode verwacht.

@returngeeft aan wat de methode als resultaat oplevert.

/**

* Move given number of cells forward in the current direction.

*

* <p> Initial: Dodo is somewhere in the world.

* <p> Final: If possible, Dodo has jumped the distance forwards

*

* @param int distance: the number of steps made

* @return nothing

*/

public void jump( int distance ) {

(14)

int steps = 0; // steps counter set to 0

while ( steps < distance ) { // check if more steps must be taken

move(); // take a step

steps++; // increment the counter }

}

Bekijken van Java Documentatie

Het bekijken van JavaDoc in Greenfoot voor jouw code gaat als volgt:

1. Open de code in de editor.

2. Rechtsbovenin het scherm kies je ’Documentation’ in plaats van ’Source Code’ (broncode). (Zie figure 12)

Figuur 12: Bekijken van JavaDoc in plaats van broncode (Source Code)

Theorie 1.11: Aanpassingen doorvoeren

Om Mimi nieuwe dingen te laten doen moet je zelf nieuwe methodes schrijven. Net als bij een natuur- lijke taal moet je eerst code leren lezen voordat je zelf code kan schrijven. En als je bestaande code wil aanpassen moet je eerst nauwkeurig kunnen beschrijven wat voor wijzigingen je wilt doorvoeren.

Aanpassingen

Voer aanpassingen altijd stapsgewijs door. Een tikfoutje is snel gemaakt. Maar het ontdekken en vinden van een fout kan een stuk lastiger zijn. Daarom doe je er goed aan om bij elke kleine wijziging in de code opnieuw te testen. Na elke wijziging:

1. Uitvoeren: Roep de methode aan door in de wereld met de rechtermuisknop op Mimi te klikken.

Kies daarna de juiste methode.

(15)

Figuur 13: Uitvoeren van een methode door met de rechtermuisknop op Mimi te klikken 2. Test: Controleer of de methode doet wat je verwacht. Vergelijk de begin- en eindsituaties.

Werk gestructureerd

Leer jezelf aan om deze stappen telkens meteen na elke aanpassing te doen. Als je namelijk een foutje hebt gemaakt vind je nu nog makkelijk de oorzaak. Als je veel meer wijzigingen in ´e´en keer doorvoert zonder tussendoor steeds te testen, dan kan het opsporen van fouten in je code (debuggen) een hels karwei worden!

Theorie 1.12: Naamgevingsafspraken

Methodes en parameters hebben namen. Er zijn algemene afspraken over de manier waarop je in Java een naam kiest. Door je daaraan te houden is je code makkelijker leesbaar voor anderen.

Naam van een methode:

• is betekenisvol: deze komt overeen met wat de methode doet

• is in de vorm van een commando: bestaat uit ´e´en of meer werkwoorden

• bestaat uit letters en cijfers: bevat geen spaties, komma’s of andere ’rare’ tekens (’ ’ uitgezonderd)

• is geschreven in lowerCaseCamel: begint met een kleine letter, elk volgend ’woord’ begint met een hoofdletter

• bijvoorbeeld:canMove Naam van een parameter:

• is betekenisvol: het komt overeen met waarvoor de parameter bedoeld is

• bevat uit ´e´en of meer zelfstandige naamwoorden

• bestaat uit letters en cijfers: bevat geen spaties, komma’s of andere ’rare’ tekens (’ ’ uitgezonderd)

• is geschreven in lowerCaseCamel: begint met een kleine letter, elk volgend ’woord’ begint met een hoofdletter

(16)

• bijvoorbeeld:nrOfEggs

Bekijk http://google-styleguide.googlecode.com/svn/trunk/javaguide.html voor een com- pleet overzicht van stijl- en naamgevingsafspraken.

Theorie 1.13: Fouten Syntaxfouten

Als je iets verkeerd intikt wat de compiler niet begrijpt, dan heet dat een syntax error. Wanneer de compiler een fout ontdekt zal het bijbehorende regelnummer rood gemarkeerd worden. Als je op de fout klikt geeft de compiler een toelichting (zie figuur 14). Het is dan aan jou om de fout op te sporen en te herstellen. Een aantal veel voorkomende fouten met bijbehorende foutmeldingen zijn:

Figuur 14: Compiler foutmelding

Gemaakte fout Foutmelding van de compiler

ontbrekende ’;’ aan einde regel ’;’ expected

ontbrekende ’( )’ in header ’(’ expected, of ’illegal start of expression’

ontbrekende ’{’ bij begin body ’;’ expected

ontbrekende ’}’ bij einde body illegal start of expression ontbrekende ’( )’ bij methode aanroep ’(’ expected of ’not a statement’

tikfout (let ook op hoofd/kleine letters) cannot find symbol

verkeerde type parameter meegegeven method cannot be applied to given types geen parameter meegegeven method cannot be applied to given types verkeerde returntype incompatible types: unexpected return value

Logische fouten

Daarnaast zijn er andere soorten programmeerfouten. De compiler keurt je programma goed, maar als je het uitvoert doet het niet wat je verwacht. Zoiets heet een logische fout. Waar de fout dan precies zit is soms erg lastig te vinden. Het zoeken naar fouten heet debuggen. Onder het motto van ’voorkomen is beter dan genezen’ zullen we in het volgende hoofdstuk aandacht besteden aan het gestructureerd aanpakken van programmeerproblemen. Dat kan de kans op logische fouten aanzienlijk verkleinen.

Theorie 1.14: Afdrukken naar een console

Tijdens het zoeken naar fouten in een programma kan het handig zijn om waarden of tekst af te druk- ken. Hierdoor kun je beter bepalen waar de fout zit. Om een console venster te openen met daarin een tekst, kun je de volgende Java methode gebruiken: System.out.println ( String );. Het volgende voorbeeld laat voorbeeldcode hiervoor zien:

public void printingToConsole( ){

String message = "Hello";

int nrOfEggs = 5;

System.out.println ( message );

(17)

System.out.println ( message + " Mimi!" );

System.out.println ( nrOfEggs );

System.out.println ( "There are " + nrOfEggs + " eggs." );

}

En dit is het bijbehorende resultaat:

Figuur 15: De console

Afhankelijk van wat er afgedrukt moet worden, roep je deprintlnmethode aan met verschillende argumenten:

• Tekst zet je tussen aanhalingstekens ’ ’ en ’ ’.

• Voor de waarde van een variabele (zoals een getal) gebruik je all´e´en de naam van de variabele (zonder aanhalingstekens).

• Teksten en variabelen combineer je met ’ + ’.

Toevoeging:

Voor meer informatie over deprintlnmethode, zie: https://docs.oracle.com/javase/7/docs/

api/java/io/PrintStream.html#println(java.lang.String).

(18)

Uitdagingen

Opgave 1.1: Kennis maken met Greenfoot

We gaan nu in Greenfoot oefenen met Mimi. Hiervoor moeten we eerst (als dat nog niet gedaan is) Greenfoot versie 3.1.0 downloaden en installeren. Daarna openen we het gegeven scenario in Green- foot.

Kies een map om jouw werk in op te slaan:

• Bedenk een vaste plek waar je alle scenario-informatie gaat opslaan. Je kunt hiervoor even- tueel een USB-stick gebruiken.

Indien nodig: Download en installeer Greenfoot versie 3.1.0:

• Download Greenfoot: Ga naar http://www.greenfoot.org/download en volg de aangege- ven instructies.

Download het scenario:

• Download het gegeven scenario-bestand dat bij deze opdracht hoort: ’DodoScenario1.zip’.

• Kopieer het zip-bestand naar de door jou uitgekozen opslagplaats.

• Pak het zip-bestand hier uit. Met je rechtermuisknop klik je op het bestand en selecteer dan Extract All....

Open de Greenfootomgeving:

• Ga naar Start - All Programs - Greenfoot en selecteer hier Greenfoot. De omgeving hoort nu op te starten.

Open het scenario:

• Selecteer ’Scenario’ in het hoofdmenu en daarna ’Open’.

• Ga naar het scenario ’DodoScenario1’ en kies ’Open’.

Hernoem het scenario:

• Kies in Greenfoot ’Scenario’ in het bovenste menu, en dan ’Save As ...’.

• Controleer dat je in de map staat waar je jouw werk wilt opslaan.

• Vul de bestandsnaam aan met jouw eigen naam en het opdrachtnummer, bijvoorbeeld:

Opdr1_Michel.

Als het goed is krijg je het volgende te zien:

(19)

Figuur 16: Wat je te zien krijgt na het openen van ’DodoScenario1’

Lees eerst Theorie 1.1: Mimi’s wereld.

Lees eerst Theorie 1.2: Objecten aanmaken.

Opgave 1.2: De wereld vullen

We gaan het scenario maken zoals in figuur 3:

a) Klik met de rechtermuisknop op MyDodo, helemaal rechts in het scherm.

b) Kiesnew MyDodo()om een nieuwMyDodo-object te maken.

c) Sleep hetMyDodo-object, onze Mimi, naar een willekeurig vakje in de wereld.

d) Leg op dezelfde manier de drie BlueEggs (blauwe eieren) in de wereld neer. Tip: houd Shift ingedrukt om snel meerdere blauwe eieren neer te leggen.

Lees eerst Theorie 1.3: Algoritmes.

(20)

Lees eerst Theorie 1.4: Methodes en hun resultaten.

Opgave 1.3: Accessormethode ontdekken

Door in de wereld met je rechtermuisknop op Mimi te klikken krijg je een lijst te zien van wat ze allemaal kan. Je ziet dan welke methodes je kunt aanroepen. Met sommige van die methodes kan Mimi vragen beantwoorden waarmee ze informatie over haarzelf geeft. Dat zijn accessormethodes.

a) Sleep Mimi naar het midden van de wereld. Klik op Mimi met de rechtermuisknop en roep de boolean canMove( ) methode aan. Er verschijnt een venstertje zoals in het plaatje hieronder.

Zoals je ziet, levert de methodetrue(’waar’) op.

Figuur 17: Dialoogvenster voorcanMove( )

b) Kun je Mimi verplaatsen zodatboolean canMove( )iets anders oplevert dantrue? c) Wat denk je datbooleanbetekent?

d) We bekijken nu wat een accessormethode doet, behalve het opleveren van een resultaat:

i. Omschrijf de beginsituatie: Waar is Mimi en welke kant kijkt ze op? Hoeveel eieren zijn er?

ii. Roep de methodeint getNrOfEggsHatched( )aan.

iii. Verandert er iets aan de toestand van de wereld door het aanroepen van deze methode?

e) Wat resultaat levertint getNrOfEggsHatched( )op? Wat betekentint?

f ) Kun je een beginsituatie maken zodat de methodeint getNrOfEggsHatched( )de waarde 3 op- levert? Tip: zet Mimi op een ei en roep danhatchEgg( )aan.

Je hebt nu gezien dat een accessormethode informatie oplevert over het object zonder de toestand van dat object aan te passen.

Opgave 1.4: Mutatormethode ontdekken

Met mutatormethodes kun je onzeMyDodoopdrachten laten uitvoeren. Mimi is zo geprogrammeerd dat ze een aantal dingen kan doen.

a) Klik in de wereld met de rechtermuisknop op Mimi. Zo zie je welke methodes je kunt aanroepen, bijvoorbeeldhatchEgg( ). Je ziet dus wat Mimi allemaal kan. Noem ´e´en andere methode die er voor zorgt dat Mimi iets doet.

b) We onderzoeken nu wat methodevoid move( )doet.

(21)

i. Sleep Mimi naar het midden van de wereld. Roep de methode void move( )aan. Kun je beschrijven wat de methode doet?

ii. Sleep Mimi nu naar de rand van de wereld, kijkend naar buiten. Roep haar methodevoid move( )weer aan. Wat gebeurt er nu?

iii. Koppel nu de onderdelen A, B en C in het stroomdiagram in figuur 18 aan de bijbehorende code hieronder.

Figuur 18: Stroomdiagram voor MyDodo’smove( )methode

/**

* Move one cell forward in the current direction.

*

* <P> Initial: Dodo is somewhere in the world

* <P> Final: If possible, Dodo has moved forward one cell

*

*/

public void move() { if ( canMove( ) ) {

step();

} else {

showError( "I’m stuck!" );

} }

Lees eerst Theorie 1.5: Klassen en overerving.

Opgave 1.5: Overerving

We bekijken nu welke methodesMyDodovan haarDodofamilie erft.

a) Bekijk het klassendiagram aan de rechterkant van de scherm. Mimi is eenMyDodo. AlleMyDodo’s zijnDodo’s. Welke andere ’is-een’ relaties zie je? Noem er tenminste twee.

b) Mimi, die eenMyDodois, kan alles wat eenDodokan. Klik in de wereld met de rechtermuisknop op Mimi. Kies ’inherited from Dodo’. Meer methodes verschijnen, zoalslayEgg( ). Controleer dat Mimi inderdaad de methodelayEgg()kan uitvoeren.

(22)

c) Noem twee andere methodes dieMyDodovan deDodoklasse erft.

d) Naast de methodes die ze van Dodo erft, kan Mimi ook nog specifieke dingen doen die all´e´en MyDodokan doen. Vind een methode dieMyDodo’s wel hebben maarDodo’s niet.

We hebben nu gezien dat Mimi, en alle andereMyDodos, alle methodes vanDodoerven en deze dus kunnen uitvoeren.

Lees eerst Theorie 1.6: Toestand van een object.

Opgave 1.6: Toestanden

Elk object heeft een toestand. We laten nu zien hoe je de toestand van een object kunt bekijken.

a) Sleep Mimi naar de linkerbovenhoek van de wereld.

b) Klik met de rechtermuisknop op Mimi en kies ’Inspect’. Wat zijn haar (int xenint y) co¨ordinaten?

c) Onderzoek wat de co¨ordinaten van alle andere hoeken zijn. Geef deze aan in figuur 19. De linkerbovenhoek is al voor je gedaan.

Figuur 19: Co¨ordinaten in de wereld

Lees eerst Theorie 1.7: Parameters en resultaten.

Lees eerst Theorie 1.8: Signatuur.

Opgave 1.7: Accessormethodes aanroepen

In taak 1.6 hebben we gezien dat je met ’Inspect’ informatie over de toestand van Mimi kan bekijken.

Accessormethodes zijn gemaakt om die informatie als resultaat op te leveren. Daardoor kun je ook wat met de informatie doen in je programma. We bekijken nu hoe het opleveren van een resultaat werkt.

a) Klik met de rechtermuisknop op Mimi.

b) Welke methode in deDodoklasse geeft de co¨ordinaten van een object?

(23)

Opgave 1.8: Parameters gebruiken

We bekijken nu een paar voorbeelden van methodes met parameters.

a) Zet Mimi ergens midden in de wereld neer. Klik met de rechtermuisknop op Mimi. Roep de methodejump( int distance )aan. Deze methode verwacht eenint(geheel getal)distancedie aangeeft hoe ver Mimi moet springen. Vul een kleine waarde in en kijk wat er gebeurt.

b) Roep de methodejump( int distance )weer aan, deze keer met een groot getal, zoals 20, als parameter. Wat gebeurt er? Kun je dat beredeneren?

c) Wat gebeurt er als je een waarde invoert die geenint(geheel getal) is, bijvoorbeeld het komma- getal 2.5? Welke foutmelding krijg je? Wat betekent dit? Tip: kijk eventueel terug naar Theorie 1.13.

d) Tik een woord als een parameter in, bijvoorbeeld: ”drie”, met aanhalingstekens. Dan krijg je een foutmelding zoals in figuur 20. Waarom zegt de foutmelding iets over eenString?

Figuur 20: Foutmelding bij gebruik van tekst als parameter

Lees eerst Theorie 1.9: Lezen van een stroomdiagram en programmacode.

Opgave 1.9: Stroomdiagram en bijbehorende programmacode ontdekken

We bekijken nu de methodecanLayEgg( ). Mimi mag all´e´en een ei leggen als er niet al eentje ligt.

a) Bekijk de code voor deboolean canLayEgg( )methode hieronder. Het stroomdiagram in figuur 21 geeft het algoritme weer. Vul de lege plaatsen in bij A, B, C, D (in het stroomdiagram) en E (in de code).

(24)

Figuur 21: Stroomdiagram voor decanLayEgg( )methode

/**

* Test if Dodo can lay an egg.

* (there is not already an egg in the cell)

*

* <p> Initial: Dodo is somewhere in the world

* <p> Final: Same as initial situation

*

* @return boolean true if Dodo can lay an egg (no egg there)

* false if Dodo can’t lay an egg

* (already an egg in the cell)

*/

public boolean canLayEgg( ) { if ( onEgg( ) ){

// E } else {

return true;

} }

b) Open de code voorMyDodoin de editor: klik met de rechtermuisknop opMyDodoin the class dia- gram and select ’Open editor’.

c) Zoek de methodecanLayEgg( ). Tip: gebruik Ctrl+F.

d) Haal de commentaartekens voor de code weg.

e) Vervang ’E’ met de juiste code.

f ) Test jouw methode. Klik in de wereld met de rechtermuisknop op Mimi. Kies dan de methode canLayEgg( ). Test een paar verschillende situaties.

Lees eerst Theorie 1.10: Java Documentatie.

Lees eerst Theorie 1.11: Aanpassingen doorvoeren.

Lees eerst Theorie 1.12: Naamgevingsafspraken.

(25)

Opgave 1.10: Nieuwe methode turn180() toevoegen

We gaan nu zelf een nieuwe methode toevoegen aanMyDodo. Taak: Dodo maakt een halve draai (draait dus 180 graden).

Figuur 22: Stroomdiagram voorturn180

a) Bekijk het stroomdiagram en de bijbehorende code hieronder. Vul A en B in.

public void A ( ) { turnRight( );

B }

b) Open de code van de klasseMyDodoin de editor.

c) Schrijf de code voor de methodeturn180.

d) Compileer de code door op de ’Compile’ knopje te drukken, linksbovenin het scherm (zie figuur 23).

Figuur 23: Knop voor het compileren Herstel eventuele fouten.

e) Roep jouw nieuwe methodevoid turn180( )aan door deze met de rechtermuisknop te selecte- ren. Test of die werkt zoals verwacht. Test ook of andere methodes nog steeds goed werken. Met andere woorden, controleer ook of het programma als geheel nog werkt zoals verwacht.

f ) Voeg commentaar bovenaan de methode toe waarin je aangeeft wat de begin- en eindsituatie zijn. Gebruik hiervoor de JavaDoc standaarden. Tip: bekijk Theorie 1.10.

g) Natuurlijk test je ook na deze wijziging jouw programma opnieuw.

Lees eerst Theorie 1.13: Fouten.

(26)

Opgave 1.11: Foutmeldingen herkennen

De compiler is erg kieskeurig. Soms maak je een foutje in de code of vergeet je iets. Dan zal de compiler daarover klagen. Het is handig als je enkele veelvoorkomende klachten herkent, zodat je het probleem gemakkelijk kunt vinden en oplossen. Laten we er een paar bekijken.

a) Open de klasseMyDodoin de editor. Ga naar de code van deturn180( )methode.

b) Pas telkens de code op de aangegeven wijze aan. Koppel de juiste foutmelding bij de fout in de code. Daarna herstel je de fout.

i. Verwijder de ’;’ achterturnRight( );

ii. Verander de spelling vanturn180( ) iii. Veranderturn180( )inturn180(5)

iv. Verwijder de ’{ ’ naturn180( ) v. Verwijder de ’)’ inturn180( ) vi. Verwijder de ’( )’ inturn180( )

Probleem Foutmelding

’;’ expected

’(’ expected

method cannot be applied to given types invalid method declaration

’)’ expected

cannot find symbol

3. Herstel alle fouten en test of het programma nog doet wat je verwacht.

Lees eerst Theorie 1.14: Afdrukken naar een console.

Opgave 1.12: Tekst naar de console afdrukken

Het afdrukken naar de console (een apart venster voor tekstuitvoer) kan handig zijn tijdens het testen en zoeken naar fouten in jouw programma. We gaan nu oefenen met het afdrukken van tekst naar een console.

a) Zoek de code voor jouwturn180( )methode.

b) Voeg de volgende print-naar-console instructie toe aan het einde van de methode:

System.out.println(’’Ik ben net 180 graden gedraaid’’);

c) Voer jouw methode uit door in de wereld met de rechtermuisknop op Mimi te klikken en de methodeturn180aan te roepen. Let op: het venster van de console kan verscholen liggen achter andere vensters.

Je hebt nu code geschreven om tekst af te drukken naar een console.

(27)

Opgave 1.13: Variabelen naar de console afdrukken

Het afdrukken naar de console (een apart venster voor tekstuitvoer) kan handig zijn tijdens het testen en zoeken naar fouten in jouw programma. We gaan nu oefenen met het afdrukken van zowel tekst als waarden van een variabele.

a) Zoek de code voorMyDodo’sjump.

b) De code komt niet overeen met het stroomdiagram in figuur 24. Zoek het verschil.

Figuur 24: Voorbeeld stroomdiagram voor het afdrukken van tekst naar de console

c) GebruikSystem.out.println("moved "+ nrStepsTaken);om een ’print-naar-console’ instructie op de juiste plek in de code toe te voegen.

d) Voer jouw methode uit door in de wereld met de rechtermuisknop op Mimi te klikken en de methodejump te selecteren. Let op: het venster van de console kan verscholen liggen achter andere vensters.

e) Test jouw methode met verschillende waarden.

Je hebt nu code geschreven om zowel tekst als waardes van een variabele af te drukken naar een console.

Opgave 1.14: Co¨ ordinaten naar de console afdrukken

Taak: Mimi loopt naar de wereldgrens en drukt bij elke stap haar co¨ordinaten af naar de console.

(28)

/**

* Walks to edge of the world printing the coordinates at each step

*

* <p> Initial: Dodo is on West side of world facing East.

* <p> Final: Dodo is on East side of world facing East.

* Coordinates of each cell printed in the console.

*/

public void walkToWorldEdgePrintingCoordinates( ) { while ( ! borderAhead( ) ) {

//print coordinates move();

} }

a) Zoek inMyDodode code voor de methodewalkToWorldEdgePrintingCoordinates(). b) Voeg de code toe voor het afdrukken van de co¨ordinaten.

c) Test jouw methode. Wordt ook de allerlaatste co¨ordinaat geprint?

d) Pas het stroomdiagram en de code aan zodat het programma voor alle co¨ordinaten werkt. Voeg ook (JavaDoc) commentaar toe aan jouw code.

Je hebt nu zelf code geschreven en met een ’print-naar-console’ instructie getest of jouw methode correct werkt.

(29)

Reflectie

In deze opdracht heb je kennis gemaakt met Greenfoot. Je hebt ook zelf code aangepast en geoefend met het compileren en testen van de code na elke wijziging. Als je ergens echt goed in wilt worden, dan is een van de meest belangrijke stappen om even terug te blikken op wat je deed en hoe dat ging. Neem een van de taken in gedachten die je gemaakt hebt en waar je trots op bent om op terug te blikken.

Resultaat

Ik weet dat mijn oplossing werkt omdat . . . Ik ben trots op mijn oplossing omdat . . . Ik kan mijn oplossing verbeteren door . . .

Aanpak

Mijn aanpak was goed omdat . . .

Wat ik volgende keer beter anders kan doen is . . .

Geef met een smiley aan hoe het ging.

Ik kan het

Het is me een beetje gelukt maar ik begreep het niet helemaal

Ik snapte er helemaal niks van

Ik kan mijn weg vinden in de Greenfoot omgeving.

Ik kan onderzoeken welke methodes een object heeft en deze aanroe- pen.

Ik kan de relatie tussen een algoritme, zijn stroomdiagram en de bijbe- horende code uit leggen.

Ik kan de code van een methode vinden in de Greenfoot editor

Ik kan stapsgewijs aanpassingen doorvoeren in code.

Ik kan een methode toevoegen, compileren en testen.

(30)

Opslaan en inleveren

Sla je werk op. Je hebt het nodig voor de volgende opdrachten.

Opslaan

Selecteer ’Scenario’ in het Greenfoot menu, en dan ’Save’. Alle bestanden die bij het scenario horen zitten nu in ´e´en map.

Inleveren

Lever het volgende in:

• Naam: van jou (en je partner);

• Jouw code: HetMyDodo.javjava bestand;

• Stroomdiagrammen:

– Als je ze op papier hebt gemaakt: plak (foto’s van) jouw stroomdiagrammen in een (Word) bestand.

– Als je software gebruikt hebt: sla het bestand op als .pdf of .jpg.

Referenties

GERELATEERDE DOCUMENTEN

Er bleek geen significant verschil te zijn voor de prestaties van de persoon met afasie tussen de laag- en hoogvoorstelbare items ( X²(1) = .042, p = .635)..

Werknemers die genieten van glij- dende werkuren en/of een sterke invloed hebben op hun uurrooster zijn dus relatief gezien innova- tiever, maar dit is vooral te danken aan

[r]

Bij optellen en aftrekken van grootheden moet je de absolute fouten volgens de KOWmethode samenstellen om de absolute fout in het resultaat te krijgen.. Iemand wil de massa van

Bereken de gevoeligheid van deze test.. Bereken de specificiteit van

OmO Omgekeerd kunnen we de specificiteit verhogen door de grenswaarde te verhogen tot er geen FP meer zijn, maar dan komen er veel FN uitslagen.. Gevoeligheid (of sensitiviteit)

Roep jouw nieuwe methode void turn180( ) aan door deze met de rechtermuisknop te selecteren en test of die werkt zoals verwacht.. Ga terug naar

Compileer en test jouw methode door met de rechtermuisknop op Mimi te klikken en deze te selecteren.. Werkt de