• No results found

Algoritmisch Denken en Gestructureerd Programmeren (in Greenfoot)

N/A
N/A
Protected

Academic year: 2021

Share "Algoritmisch Denken en Gestructureerd Programmeren (in Greenfoot)"

Copied!
19
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 1

Instructies 1

Theorie 2

3.1 Submethodes ontwerpen . . . 2

3.2 Een probleem opdelen in kleinere delen . . . 3

3.3 Lay-out van code . . . 3

3.4 Logische operatoren . . . 4

3.5 Je initi¨ele wereld instellen . . . 4

3.6 Een wereld opslaan . . . 5

3.7 Tekst gebruiken . . . 5

Uitdagingen 7 3.1 Submethodes gebruiken . . . 7

3.2 Oefenen met logische operatoren . . . 8

3.3 Leg een ei in ieder nest . . . 9

3.4 Geen dubbele eieren . . . 10

3.5 Door een tunnel lopen . . . 10

3.6 Naar het nest lopen en hekken ontwijken . . . 11

3.7 Om een omheining lopen . . . 11

3.8 Spoor van eieren volgen tot het nest . . . 12

3.9 Eenvoudige doolhof . . . 13

3.10 Lastigere doolhof . . . 14

3.11 Dodo maakt wilde sprongen . . . 14

Reflectie 17

Opslaan en inleveren 18

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

(2)

Inleiding

In de vorige opgaven maakte je kennis met Greenfoot en algoritmisch denken. Je bent in staat om code te lezen, deze aan te passen en om zelf code te schrijven. Ook kun je generieke oplossingen bedenken en implementeren. In deze opdracht zul je leren om je oplossing te ontwerpen door deze op te splitsen in verschillende losse onderdelen. Zo wordt het makkelijker om te programmeren, te testen en je geschreven code opnieuw te gebruiken. Door problemen op te delen in kleinere stukken wordt het makkelijker om complexere problemen op te lossen.

Doelen

Het doel van deze opdracht is:

• Problemen opdelen in kleinere behapbare delen.

Leerdoelen

Na het voltooien van deze opdracht kun je:

• een (complex) probleem opdelen in deelproblemen.

• decompositie toepassen in stroomdiagrammen en code door submethodes te herkennen.

• submethodes afzonderlijk ontwerpen, schrijven en testen.

• de rol van het resultaattype en de parameter(s) van een methode omschrijven.

• bestaande submethodes en oplossingen opnieuw gebruiken.

• conditionele expressies samenstellen door logische operatoren te combineren.

• nesting toepassen als strategie voor het oplossen van complexere problemen.

• generieke oplossingen ontwikkelen.

• jouw oplossing beoordelen.

Instructies

In deze opdracht ga je verder met je eigen code uit de vorige opdracht. Maak een kopie van jouw scenario zodat je altijd nog terug kan naar een vorige versie. Een kopie maken doe je zo:

• Open jouw scenario van de vorige opdracht.

• In de Greenfoot menu, bovenaan het scherm, selecteer je ’Scenario’ en dan ’Save As ...’.

• Ga naar de folder waarin je jouw werk voor opdracht 3 wilt opslaan.

• Kies een bestandsnaam met jouw eigen naam en opdrachtnummer, bijvoorbeeld:Opdr3_John. Tijdens de opdracht zul je wat vragen moeten beantwoorden. Je moet het volgende inleveren:

• Alle stroomdiagrammen: 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;

(3)

• Het reflectieblad: vul in en lever het in.

Je moet al jouw antwoorden met je partner te bespreken. Noteer kort jullie antwoorden.

Er zijn drie soorten taken:

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 taken, ontwikkeld voor leerlingen die de 2-ster opdrachten vol- tooid hebben en klaar zijn voor een grotere uitdaging.

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

Opmerking:

• In deze opdracht mag je alleen aanpassingen maken inMyDodo;

• Je mag methodes gebruiken uit deMyDodoofDodoklasse, maar niet uit deActorklasse;

• ‘Teleporteren’ is niet toegestaan: als Mimi ergens moet zijn, dan moet ze daar zelf stap voor stap heenlopen (ze mag er niet in ´e´en keer naar toe springen).

Theorie

Theorie 3.1: Submethodes ontwerpen

Wanneer een reeks taken herhaald wordt, kan het handig zijn om deze in een aparte submethode te zetten. Als je dan die reeks nodig hebt, hoef je alleen die submethode aan te roepen. Dat scheelt veel foutgevoelig typewerk en maakt daarnaast het testen en hergebruik makkelijker.

Voorbeeld

Om een stap achteruit te zetten moet Mimi:

• 180 graden draaien (bijvoorbeeld door twee keerturnRight( )aan te roepen),

• een stap zetten en dan,

• weer 180 graden draaien (weer door twee keerturnRight( )aan te roepen).

Als Mimi nu een paar stappen achteruit moet zetten en je zou, om dit te realiseren, de code voor het zetten van ´e´en stap achteruit steeds dupliceren dan krijg je op die manier wel erg veel instructies. In zo’n geval is het veel beter om een submethodepublic void stepOneCellBackwards( )te schrijven.

/**

* Move one cell backwards

*

* <p>Initial situation is same as final situation.

*

*/

public void stepOneCellBackwards( ) { turnRight( );

turnRight( );

(4)

move();

turnRight( );

turnRight( );

}

Die methode kun je steeds aanroepen metstepOneCellBackwards( );. Zie de code hieronder.

public void methodeOneCellBackwardsGebruiken( ) { // deel van een methode

stepOneCellBackwards( );

// rest van de methode }

Theorie 3.2: Een probleem opdelen in kleinere delen

Een complex probleem (en zijn oplossing), wordt eenvoudiger als je het opdeelt in kleinere behap- bare onderdelen. In programmacode vormen deze delen apartesubmethodes. Elke submethode kan afzonderlijk ontworpen, ontwikkeld en getest worden (zie Theorie 3.1). Submethodes worden daarna gecombineerd tot een totaaloplossing voor het probleem als geheel. Deze aanpak waarin een groot probleem wordt opgedeeld in meerdere kleinere deelproblemen heetdecompositie.

Figuur 1: Een probleem in kleine problemen opdelen en deze afzonderlijk aanpakken Decompositie wordt toegepast bij:

• complexe problemen: als een probleem of reeks van taken zo ingewikkeld is dat het beter (over- zichtelijker en minder foutgevoelig) is om deze afzonderlijk te ontwerpen, te ontwikkelen en te testen.

• herhaling: als dezelfde reeks van stappen meerdere keren wordt herhaald.

• veel afzonderlijke stappen: als een algoritme moeilijk te lezen of te begrijpen is doordat het bestaat uit heel veel gedetailleerde stappen (bijvoorbeeld, meer dan zeven).

• samenhangende stappen: als een reeks van stappen samen een redelijk op zichzelf staande taak of module vormen (die mogelijk ergens anders of in een later stadium opnieuw gebruikt kan worden).

Door decompositie wordt code makkelijker te begrijpen (lezen), te testen, opnieuw te gebruiken, aan te passen en uit te breiden.

(5)

Theorie 3.3: Lay-out van code

Code wordt beter leesbaar door steeds dezelfde stijl te gebruiken. Net als naamgeving, zijn er ook stijlafspraken. Door steeds op dezelfde wijze in te springen kun je bepaalde fouten voorkomen. Zo zie je bijvoorbeeld sneller of je een haakje of accolade te veel of te weinig hebt. De volgende twee voorbeelden laten duidelijk het voordeel zien van het uitlijnen van code.

public void move() { if ( canMove() ) { step(); } else { showError( "I’m

stuck!" ); // prints to the console. } }

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

step( );

} else {

showError( "I’m stuck!" ); // prints to the console.

} }

Zie http://google-styleguide.googlecode.com/svn/trunk/javaguide.html voor een compleet overzicht van stijl- en naamgevingsafspraken. Greenfoot kan je trouwens helpen om jouw code uit te lijnen. Gebruik hiervoor Ctrl-Shift-I.

Theorie 3.4: Logische operatoren

De ’EN’ (in programmacode: &&), de ’OF’ (in code: ||) en de ’NIET’ (in code: !) hetenlogische opera- toren. Logische operatoren kunnen handig zijn bij het vormen van beslissingen, omdat ze je in staat stellen boolean methodes te combineren. Op die manier kun je conditionele expressies samenstellen die bepaalde keuzes heel specifiek omschrijven.

Operator Betekenis Voorbeeld

&& EN facingNorth( )&& fenceAhead( )

|| OF fenceAhead( )|| borderAhead( )

! NIET !fenceAhead( )

Logische operatoren combineren

Met logische operatoren kun je complexere conditionele expressies maken. Hierdoor wordt jouw code mogelijk eenvoudiger. Echter, het combineren van logische operatoren, in het bijzonder met een ne- gatie (de NIET) kan ook tot lastig te begrijpen uitdrukkingen leiden. Daarnaast is het raadzaam om haakjes te gebruiken om duidelijk te maken wat bij elkaar hoort.

Expressie Is gelijk aan Betekenis

!( A && B ) !A || !B Is waar zodra ´e´en van beide A of B niet waar is

!( A || B ) !A && !B Is alleen waar als geen van beide A or B waar is

Voorbeelden

• NIET (slaan OF trappen) wordt !(slaan || trappen)wat hetzelfde betekent als !slaan && ! trappen. Oftewel je mag geen van beide doen.

• NIET (sokken EN sandalen) wordt !(sokken && sandalen)wat hetzelfde betekent als !sokken

|| !sandalen. Oftewel, je mag of het een of de ander, maar niet allebei (wat er ook en beetje gek uitziet, vind je niet?).

(6)

Theorie 3.5: Je initi¨ ele wereld instellen

Wil je dat steeds een bepaalde wereld geopend wordt en dat je dus niet telkens weer opnieuw alle objecten in de wereld hoeft te plaatsen (bijvoorbeeld nadat je je code hebt aangepast), volg dan deze instructies waarmee we de wereld, als voorbeeld, de wereld ’worldEmptyNestsTopRow’ laden:

1. Klik in het klassendiagram met de rechtermuisknop op ‘Mauritius’.

2. Kies ’Open Editor’

3. Bovenin staat de volgende declaratie:

Figuur 2: Opent een lege wereld (beginsituatie)

4. Vervang de bestandsnaam van de wereld (hetgeen v´o´or de ’.txt’) met de wereld die je wil openen (bijvoorbeeld ’worldEmptyNestsTopRow’). Het ziet er dan zo uit:

Figuur 3: Opent ’worldEmptyNestsTopRow’ bestand

Theorie 3.6: Een wereld opslaan

Volg deze stappen om een wereld op te slaan:

1. Klik in de wereld met de rechtermuisknop op een lege cel.

2. Kies ’saveToFile( )’.

3. De wereld is nu opgeslagen met de naam ’saved.txt’ in de map ’worlds’. Je kunt in deze map het bestand zelf een andere, zinvollere naam geven. Bedenk ook dat wanneer je twee of meerdere kerensaveToFile( )gebruikt, de oude ’saved.txt’ zal worden overschreven.

Theorie 3.5 omschrijft hoe je elke keer een bepaalde wereld kan laden.

Theorie 3.7: Tekst gebruiken

In Java (en ook in veel andere programmeertalen) wordt een tekst eenStringgenoemd.Stringis een type, net zoalsintenboolean. Methodes kunnen eenString(oftewel tekst) als parameter meekrijgen.

Je hebt er al een gebruikt om tekst naar de console af te drukken (zie Theorie 1.14). Om een tekst in een programma te kunnen gebruiken, moet je deze altijd tussen dubbele aanhalingstekens zetten.

• Zo definieer je eenString:String text1 = "Hello";

(7)

• Zo geef je eenStringals parameter mee:

String textGreeting = "Hello";

System.out.println ( textGreeting );

Het resultaat ziet er zo uit:

• TweeStrings ’plak’ je aan elkaar (concatenatie) met ’ +’.

String textGreetingMimi = "Hello " + "Mimi";

System.out.println ( textGreetingMimi );

Het resultaat ziet er zo uit:

• EenStringen eenintvariableint nrOfEggsFoundvoeg je ook samen met ’ +’.

int nrOfEggs = 5;

String textIFound = "I have found ";

System.out.println ( textIFound + nrOfEggs + " eggs today" );

Het resultaat ziet er zo uit:

Dit is soms een beetje verwarrend omdat de ’ +’ ook gebruikt kan worden voor het optellen van tweeints. Zoek zelf maar eens uit wat het verschil is tussen 1 + 1 + "= 2"en "2 = "+ 1 + 1. De methodeshowCompliment(String compliment) krijgt een String met de naamcompliment als parameter mee. De methode levert een smiley op samen met het compliment zelf. De volgende twee voorbeelden van programmacode leveren precies hetzelfde resultaat op. Het resultaat zie je in figuur 4.

showCompliment( "Congradulations!" );

en

String textCongradulations = "Congradulations!";

showCompliment( textCongradulations );

Figuur 4: Resultaat van beide stukjes code

(8)

Uitdagingen

Lees eerst Theorie 3.1: Submethodes ontwerpen.

Lees eerst Theorie 3.2: Een probleem opdelen in kleinere delen.

Opgave 3.1: Submethodes gebruiken

Bij taak 2.5 heb je de methodeboolean grainAhead( )geschreven die controleerde of er een graan in de cel voor Mimi lag (zie stroomdiagram 5).

Figuur 5: Stroomdiagram voorgrainAhead

De volgende taak is om submethodes te gebruiken om de code vanboolean grainAhead( )op te schonen.

a) Schrijf een methodestepBack ( )waarmee Mimi ´e´en stapje achteruit zet. Na afloop moet ze nog altijd in de oorspronkelijke richting kijken. Voeg ook JavaDoc commentaar toe.

b) Vervang de omcirkelde code door een aanroep van stepBack, zoals in het volgende stroomdia- gram:

(9)

Figuur 6: Stroomdiagram voorgrainAheaddoor gebruik te maken van de submethodestepBack c) Test jouw programma.

d) Kun je nog meer code opruimen in degrainAheadmethode?

e) Test jouw programma opnieuw ook al heb je slechts kleine wijzigingen aangebracht.

Lees eerst Theorie 3.3: Lay-out van code.

Lees eerst Theorie 3.4: Logische operatoren.

Opgave 3.2: Oefenen met logische operatoren

De logische operatoren ’EN’, ’OF’ ’NIET’ worden vaak verkeerd begrepen, zeker als ze in combinaties voorkomen. Daarom oefenen we er nu even mee.

a) In een bus hangt een bord: ”Zittend 15 staand 3 OF 13 zittend + 1 rolstoel”. Vul de volgende twee uitspraken aan:

• Specifieker: ”(zittend IS GELIJK AAN 15 EN staand IS GELIJK AAN 3)OF ...”

• En dit vertalen naar programmacode wordt: ” (zittend == 15 && staand == 3)...”

b) Wat wil je vanavond eten? Plaats haakjes op de juiste plek en vertaal het vervolgens naar pro- grammacode:

”Frietjes en frikandel of kroket en een blikje”.

c) Honden en katten gaan niet samen, dat wordt ruzie. Haal de haakjes weg en pas de uitspraak aan zodat deze nog altijd hetzelfde betekent: ”NIET (honden EN katten)”

d) We kunnen niet naar buiten als het regent of onweert. Haal de haakjes weg en pas de uitspraak aan zodat deze nog altijd hetzelfde betekent: ”NIET (regen OF onweer)”

(10)

Lees eerst Theorie 3.5: Je initi¨ ele wereld instellen.

Lees eerst Theorie 3.6: Een wereld opslaan.

Opgave 3.3: Leg een ei in ieder nest

Jouw taak is:

Mimi loopt naar de grens van de wereld. Als ze onderweg een nest tegenkomt, legt ze er een ei in.

Zorg ervoor dat jouw algoritme generiek is. Het moet dus werken in elke wereld, ook als een nest iets naar links of rechts wordt verplaatst, of als er een extra nest wordt toegevoegd.

a) Open de ’worldEmptyNestsTopRow’ wereld.

b) Vul de lege plekken in de stroomdiagram in figuur 7 aan.

Figuur 7: Stroomdiagram voor het vullen van nestjes tot aan de grens van de wereld

c) Schrijf de bijbehorende programmacode (en commentaar). Zorg er ook voor dat jouw code uitge- lijnd is (zie Theorie 3.3).

d) Test jouw methode door met je rechtermuisknop op Mimi te klikken en de methode aan te roepen.

Tip: Theorie 3.5 omschrijft hoe je elke keer een bepaalde wereld kan laden.

e) Werkt het programma zoals je verwacht? Er zit een fout in het stroomdiagram. Kun jij die vin- den?

f ) Hoe zou je het stroomdiagram aan kunnen passen? Pas de code aan met jouw verbetervoorstel.

(11)

g) Test opnieuw.

Je hebt nu eenif..then..else..genest in eenwhile-loop.

Opgave 3.4: Geen dubbele eieren

Jouw volgende taak is: Mimi loopt naar de grens van de wereld. Als ze onderweg een nest tegenkomt waar nog geen ei in ligt, legt ze er een ei in.

a) Open de ’worldEmptyNestsTopRow’ wereld en plaats een ei in een aantal nestjes. Tip: Theorie 3.5 omschrijft hoe je elke keer een bepaalde wereld kan laden.

b) Omschrijf de begin- en eindsituaties.

c) Teken een stroomdiagram.

d) Schrijf en test de bijbehorende code (met commentaar). Zorg er ook voor dat jouw code netjes uitgelijnd is (zie Theorie 3.3).

Afhankelijk van de door jouw gekozen oplossing heb je nu nesting (vanif..else..) of combinaties van logische operatoren gebruikt om een complexere voorwaarde te omschrijven.

Opgave 3.5: Door een tunnel lopen

Jouw taak is om Mimi te leren om door een tunnel (van hekjes) te lopen (zie figuur 8), en te stoppen als ze uit de tunnel komt (zie figuur 9).

Figuur 8: Beginsituatie Figuur 9: Eindsituatie

We delen dit probleem eerst op in deelproblemen die ieder afzonderlijk aangepakt kunnen worden:

(12)

Figuur 10: Het probleem opdelen in deelproblemen die ieder afzonderlijk aangepakt worden a) Schrijf en test een submethode die controleert of er links van Mimi een hek staat.

b) Schrijf en test een vergelijkbare submethode die controleert of er rechts van Mimi een hek staat.

Je mag natuurlijk gebruik maken van jouw methodesboolean fenceOnLeft( )enboolean fenceOnRight ( ).

c) Maak gebruik van deze submethodes om een methodevoid walkThroughTunnel( )te schrijven.

Je kunt de ’worldTunnel’ wereld gebruiken om te testen (Theorie 3.5 beschrijft hoe je deze kan openen).

d) Test jouwvoid walkThroughTunnel( )methode.

Je hebt nu zelf gebruik gemaakt van abstractie om een groter probleem op te splitsen in kleinere delen. Met het verdeel-en-heers principe heb je de kleinere delen ontworpen, ge¨ımplementeerd en getest (methodesfenceOnRight ( )enfenceOnLeft ( )). Daarna heb je deze gebruikt in

walkThroughTunnel( )en het geheel getest.

Wie weet, misschien wil je straks in een volgende opgave gebruik maken van ´e´en van jouw me- thodes (bijvoorbeeldfenceOnRight ( )). Omdat je er nu een aparte methode van gemaakt hebt is hergebruik een stuk makkelijker. Dit noemen we ook welmodularisatie.

Lees eerst Theorie 3.7: Tekst gebruiken.

Opgave 3.6: Naar het nest lopen en hekken ontwijken

Mimi zoekt haar nest. Als ze onderweg een hek tegenkomt, moet ze daar overheen klimmen. Als ze haar nest heeft gevonden moet ze er een ei in leggen en stoppen. Heeft ze het einde van de wereld be- reikt voordat ze haar nest gevonden heeft, dan moet ze stoppen en in een pop-up venster een geschikte foutmelding geven.

Tips:

• Schets eerst een stroomdiagram op hoog niveau.

• Het kan handig zijn om terug te kijken naar taak 2.9 waar je de code hebt geschreven voor walkToWorldEdgeClimbingOverFences( ).

• Laad de ’worldFencesAndNest’ wereld.

• Om een pop-up foutmelding te tonen maak je gebruik van:showError( String message)

Opgave 3.7: Om een omheining lopen

In deze opdracht laat je Mimi om een omheining heen lopen.

(13)

a) Open de ’worldFencedArea’ wereld.

b) Bepaal de begin- en eindsituaties. Bedenk een geschikt algoritme. Tip: Om te voorkomen dat Mimi oneindig veel rondjes om het hek heen wandelt gaan we ervan uit dat in het laatste vakje van de route om de omheining een ei ligt. Als ze gaat lopen en dat ei tegenkomt, dan weet ze dat ze klaar is.

c) Schrijf de bijbehorende methodevoid walkAroundFencedArea( )waarmee Mimi om de omhei- ning heen loopt. Schrijf daar ook (JavaDoc) commentaar bij.

d) Compileer en test het programma. Controleer ook of jouw programma werkt bij een grotere omheining.

e) Voor welke beginsituaties werkt jouw programma? Indien nodig, pas de beschrijving van jouw beginsituatie aan.

f ) Test ook of jouw methode werkt met een andere wereld, zoals:

’worldOtherFencedArea’. Pas het algoritme (en dus ook het stroomdiagram en code) dusdanig aan dat het ook hiervoor werkt.

Figuur 11: Een andere omheining

Je hebt nu een generieke methode geschreven waarmee Mimi om een willekeurige omheining kan lopen. Je hebt daarbij mogelijk gebruik gemaakt van modularisatie door (bestaande en geteste) me- thodes te opnieuw te gebruiken.

Opgave 3.8: Spoor van eieren volgen tot het nest

Er ligt een spoor van eieren naar het nest van Mimi. Kan jij Mimi helpen om haar nest te vinden? (zie wereld: ’worldEggTrailToNest’).

Figuur 12: Taak: volg het spoor van eieren tot aan het nest

(14)

We delen het probleem op in deelproblemen die stapsgewijs los van elkaar opgelost kunnen wor- den.

a) Teken een stroomdiagram op hoog niveau dat aangeeft welke submethodes je moet ontwerpen en schrijven.

b) Voor elke submethode:

• Kies een geschikte naam (en returntype);

• Bepaal de begin- en eindsituaties.

• Schrijf en test de submethode.

c) Gebruik makend van deze submethodes, schrijf en test jouw oplossing als geheel.

d) Controleer of jouw programma ook werkt voor een ander pad van eieren. Test deze ook met

’world followEggTrailBehindUntilNest’. Wellicht kom je tot de ontdekking dat je nog wat moet verbeteren.

e) Reflecteer over jouw aanpak. Wat ging goed? Wat kun je volgende keer beter anders doen?

Opgave 3.9: Eenvoudige doolhof

Help jij Dodo weer haar nest te vinden? Hiervoor moet je haar helpen om haar weg door de doolhof te vinden. Jouw oplossing moet natuurlijk weer generiek zijn: Dodo moet haar weg door een willekeurige doolhof vinden, niet alleen voor de doolhof uit het plaatje.

Je mag van het volgende uitgaan:

• De wereld is omgeven door hekken.

• Er is precies ´e´en nest.

• Er bestaat een route naar het nest.

• Het nest ligt direct naast een hek.

• Aan het begin is er maar ´e´en richting waarin Dodo kan lopen.

• Het doolhof bevat geen doodlopende paden. Verder zijn er geen ’eilanden’ van hekjes: ieder hekje is verbonden met de omheining.

Schrijf een methode waarmee Dodo het nest vindt.

a) Bedenk een geschikt algoritme en teken een stroomdiagram op hoog niveau.

(15)

b) Ontwikkel, implementeer en test de submethodes voor jouw algoritme ´e´en voor ´e´en.

c) Test jouw programma voor de volgende doolhoven:

• ’world doolhofLevel1a’.

• ’world doolhofLevel1b’.

• ’world doolhofLevel1c’.

d) Beoordeel jouw programma. Welke verbeteringen kun je bedenken? Je hoeft ze niet per se door te voeren, je hoeft ze alleen op te sommen.

Opgave 3.10: Lastigere doolhof

Help jij Dodo haar nest te vinden door een wat ingewikkeldere doolhof? Geef Mimi ook een compli- mentje (maak gebruik van een pop-up venster) als ze haar nest gevonden heeft. Jouw oplossing moet natuurlijk weer generiek zijn.

Je mag van het volgende uitgaan:

• Er is ´e´en nest.

• Er bestaat een route naar het nest.

• De wereld is omgeven door een hekken.

• Het nest ligt direct naast een hek.

• Er zijn geen ’eilanden’ van hekjes: ieder hekje is verbonden met de omheining.

Schrijf een methode waarmee Dodo het nest vindt.

a) Bedenk een geschikt algoritme en teken een stroomdiagram op hoog niveau.

b) Ontwikkel, implementeer en test de submethodes voor jouw algoritme ´e´en voor ´e´en.

c) Test jouw programma als geheel voor de volgende doolhoven:

• ’worldMazeLevel2a’.

• ’worldMazeLevel2b’.

• ’worldMazeLevel2c’.

d) Maak zelf ook een nieuwe doolhof. Wissel jouw doolhof uit met een medeleerling. Test jouw programma daarmee. Vergelijk elkaars oplossingen.

(16)

Opgave 3.11: Dodo maakt wilde sprongen

Nu is het tijd voor een meer uitdagende algoritmisch denken puzzel. Stel we hebben een methode jumpToEnd( ). Hiermee kan Mimi herhaaldelijk stappen zetten totdat ze niet meer verder kan (er staat een hek in de weg of ze heeft de grens van de wereld bereikt):

public void jumpToEnd( ) {

while ( ! borderAhead( ) && ! fenceAhead( ) ){

step( );

} }

DejumpToEnd( )methode wordt aangeroepen ingoWild( ).

Figuur 13: Stroomdiagram voor de methodegoWild( )

Het scenario wordt uitgevoerd doorgoWildaan te roepen. Hieronder staan drie verschillende be- ginsituaties:

Figuur 14: A Figuur 15: B Figuur 16: C

a) Stopt Mimi als je uitgaat van beginsituatie A? Zo ja, hoe vaak wordt dejumpToEnd( )methode aangeroepen?

(17)

b) Stopt Mimi als je uitgaat van beginsituatie B? Zo ja, hoe vaak wordt de jumpToEnd( )methode aangeroepen?

c) Controleer jouw antwoorden door een printopdracht toe te voegen aan de code. (Theorie 1.14 en Theorie 3.7 beschrijven hoe je tekst naar de console kunt afdrukken).

d) We gaan uit van beginsituatie C. Door in de wereld hekken op bepaalde plekken neer te zetten kun je ervoor zorgen dat Mimi het ei vindt. Kun je hekken in figuur C neerzetten zodat Mimi haar ei vindt als je degoWild( )methode aanroept? Er zijn twee eisen:

• Je mag hooguit vijf hekken gebruiken.

• Je mag geen hek naast een wereldgrens plaatsen.

(18)

Reflectie

In deze opdracht heb je geoefend met het ontwerpen van code als losse componenten. Daardoor wordt het makkelijk om oplossingen te bedenken, schrijven, testen en opnieuw te gebruiken.

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:

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 een algoritme beschrijven in een hoog-niveau stroomdiagram.

Ik kan submethodes in een algoritme herkennen.

Ik kan submethodes afzonderlijk ontwerpen, schrijven en testen.

Ik kan conditionele expressies samenstellen door logische operatoren te combineren.

Ik kan generieke oplossingen ontwikkelen.

(19)

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

(nieuw vel papier) Toon m.b.v. Je mag hier geen rekenregels voor limieten gebruiken.).. (nieuw vel papier)

Dit stroomdiagram kan overzichtelijker gemaakt worden door voor deze stappen een aparte submethode (en subdiagram) te maken?. In de oorspronkelijke methode roepen we de nieuwe

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

(Net als bij het aanroepen van een methode waar je ook niet de signatuur hoeft te herhalen bij een aanroep. Sterker nog, Java staat niet eens toe dat je bij gebruik ook het

Stel een MyDodo heeft een instantievariabele private int eggsToHatch waarmee Mimi bij- houdt hoeveel eieren ze moet uitbroeden3. All´e´en zij weet hoeveel het

Help Mimi om een lijst met alle eieren te maken en daarna deze ´e´en voor ´e´en te doorlopen en de co ¨ordinaten van de eieren af te drukken.. Open de wereld

Het enige verschil is dat het voorwerp waarmee de bal in botsing komt niet stilstaat, maar zelf ook beweegt en door deze botsing zelf ook een andere snelheid zal krijgen?.

Ouders verwoorden verschillende essentiële aspecten in de grondhouding die zij verwachten van professionele hulpverleners: de vragen en wensen van ouders ernstig