Opdracht 3: Dodo verdeelt haar werk - Radboud Universiteitcourse.cs.ru.nl/greenfoot/docs/Opdrachten...

19
Opdracht 3: Dodo verdeelt haar werk Algoritmisch Denken en Gestructureerd Programmeren (in Greenfoot) c 2017 Renske Smetsers-Weeda & Sjaak Smetsers 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 Reectie 17 Opslaan en inleveren 18 1 Licensed under the Creative Commons Attribution 4.0 license: https://creativecommons.org/licenses/by/4.0/

Transcript of Opdracht 3: Dodo verdeelt haar werk - Radboud Universiteitcourse.cs.ru.nl/greenfoot/docs/Opdrachten...

Page 1: Opdracht 3: Dodo verdeelt haar werk - Radboud Universiteitcourse.cs.ru.nl/greenfoot/docs/Opdrachten v3.1.1...Opdracht 3: Dodo verdeelt haar werk AlgoritmischDenkenenGestructureerdProgrammeren(inGreenfoot)

Opdracht 3: Dodo verdeelt haar werk

Algoritmisch Denken en Gestructureerd Programmeren (in Greenfoot)c© 2017 Renske Smetsers-Weeda & Sjaak Smetsers1

Inhoudsopgave

Inleiding 1

Leerdoelen 1

Instructies 1

Theorie 23.1 Submethodes ontwerpen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23.2 Een probleem opdelen in kleinere delen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33.3 Lay-out van code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33.4 Logische operatoren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43.5 Je initiele wereld instellen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43.6 Een wereld opslaan . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53.7 Tekst gebruiken . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5Uitdagingen 73.1 Submethodes gebruiken . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73.2 Oefenen met logische operatoren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83.3 Leg een ei in ieder nest . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93.4 Geen dubbele eieren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103.5 Door een tunnel lopen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103.6 Naar het nest lopen en hekken ontwijken . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113.7 Om een omheining lopen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113.8 Spoor van eieren volgen tot het nest . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123.9 Eenvoudige doolhof . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133.10 Lastigere doolhof . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143.11 Dodo maakt wilde sprongen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14Reflectie 17

Opslaan en inleveren 18

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

Page 2: Opdracht 3: Dodo verdeelt haar werk - Radboud Universiteitcourse.cs.ru.nl/greenfoot/docs/Opdrachten v3.1.1...Opdracht 3: Dodo verdeelt haar werk AlgoritmischDenkenenGestructureerdProgrammeren(inGreenfoot)

Dodo verdeelt haar werk Opdracht 3

Inleiding

In de vorige opgaven maakte je kennis met Greenfoot en algoritmisch denken. Je bent in staat om codete lezen, deze aan te passen en om zelf code te schrijven. Ook kun je generieke oplossingen bedenkenen implementeren. In deze opdracht zul je leren om je oplossing te ontwerpen door deze op te splitsenin verschillende losse onderdelen. Zo wordt het makkelijker om te programmeren, te testen en jegeschreven code opnieuw te gebruiken. Door problemen op te delen in kleinere stukken wordt hetmakkelijker 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 jouwscenario 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 bestand MyDodo.java bevat al jouw code en moet ingeleverd worden;

Algoritmisch denken en gestructureerd programmeren (in Greenfoot) 1

Page 3: Opdracht 3: Dodo verdeelt haar werk - Radboud Universiteitcourse.cs.ru.nl/greenfoot/docs/Opdrachten v3.1.1...Opdracht 3: Dodo verdeelt haar werk AlgoritmischDenkenenGestructureerdProgrammeren(inGreenfoot)

Dodo verdeelt haar werk Opdracht 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 meeroefening 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 in MyDodo;• Je mag methodes gebruiken uit de MyDodo of Dodo klasse, maar niet uit de Actor klasse;• ‘Teleporteren’ is niet toegestaan: als Mimi ergens moet zijn, dan moet ze daar zelf stap voor stapheenlopen (ze mag er niet in een 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 tezetten. Als je dan die reeks nodig hebt, hoef je alleen die submethode aan te roepen. Dat scheelt veelfoutgevoelig typewerk en maakt daarnaast het testen en hergebruik makkelijker.Voorbeeld

Om een stap achteruit te zetten moet Mimi:• 180 graden draaien (bijvoorbeeld door twee keer turnRight( ) aan te roepen),• een stap zetten en dan,• weer 180 graden draaien (weer door twee keer turnRight( ) aan te roepen).

Als Mimi nu een paar stappen achteruit moet zetten en je zou, om dit te realiseren, de code voor hetzetten van een stap achteruit steeds dupliceren dan krijg je op die manier wel erg veel instructies. Inzo’n geval is het veel beter om een submethode public void stepOneCellBackwards( ) te schrijven./*** Move one cell backwards** <p>Initial situation is same as final situation.**/public void stepOneCellBackwards( ) {turnRight( );turnRight( );

Algoritmisch denken en gestructureerd programmeren (in Greenfoot) 2

Page 4: Opdracht 3: Dodo verdeelt haar werk - Radboud Universiteitcourse.cs.ru.nl/greenfoot/docs/Opdrachten v3.1.1...Opdracht 3: Dodo verdeelt haar werk AlgoritmischDenkenenGestructureerdProgrammeren(inGreenfoot)

Dodo verdeelt haar werk Opdracht 3

move();turnRight( );turnRight( );}Die methode kun je steeds aanroepen met stepOneCellBackwards( );. Zie de code hieronder.

public void methodeOneCellBackwardsGebruiken( ) {// deel van een methodestepOneCellBackwards( );// 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 aparte submethodes. Elke submethode kanafzonderlijk ontworpen, ontwikkeld en getest worden (zie Theorie 3.1). Submethodes worden daarnagecombineerd tot een totaaloplossing voor het probleem als geheel. Deze aanpak waarin een grootprobleem wordt opgedeeld in meerdere kleinere deelproblemen heet decompositie.

Figuur 1: Een probleem in kleine problemen opdelen en deze afzonderlijk aanpakkenDecompositie 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 tetesten.• herhaling: als dezelfde reeks van stappen meerdere keren wordt herhaald.• veel afzonderlijke stappen: als een algoritmemoeilijk te lezen of te begrijpen is doordat het bestaatuit heel veel gedetailleerde stappen (bijvoorbeeld, meer dan zeven).• samenhangende stappen: als een reeks van stappen samen een redelijk op zichzelf staande taakof module vormen (die mogelijk ergens anders of in een later stadium opnieuw gebruikt kanworden).Door decompositie wordt code makkelijker te begrijpen (lezen), te testen, opnieuw te gebruiken,aan te passen en uit te breiden.

Algoritmisch denken en gestructureerd programmeren (in Greenfoot) 3

Page 5: Opdracht 3: Dodo verdeelt haar werk - Radboud Universiteitcourse.cs.ru.nl/greenfoot/docs/Opdrachten v3.1.1...Opdracht 3: Dodo verdeelt haar werk AlgoritmischDenkenenGestructureerdProgrammeren(inGreenfoot)

Dodo verdeelt haar werk Opdracht 3

Theorie 3.3: Lay-out van code

Code wordt beter leesbaar door steeds dezelfde stijl te gebruiken. Net als naamgeving, zijn er ookstijlafspraken. Door steeds op dezelfde wijze in te springen kun je bepaalde fouten voorkomen. Zozie je bijvoorbeeld sneller of je een haakje of accolade te veel of te weinig hebt. De volgende tweevoorbeelden laten duidelijk het voordeel zien van het uitlijnen van code.public void move() { if ( canMove() ) { step(); } else { showError( "I’mstuck!" ); // 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 compleetoverzicht van stijl- en naamgevingsafspraken. Greenfoot kan je trouwens helpen om jouw code uit telijnen. Gebruik hiervoor Ctrl-Shift-I.Theorie 3.4: Logische operatoren

De ’EN’ (in programmacode: &&), de ’OF’ (in code: ||) en de ’NIET’ (in code: !) heten logische opera-toren. Logische operatoren kunnen handig zijn bij het vormen van beslissingen, omdat ze je in staatstellen boolean methodes te combineren. Op die manier kun je conditionele expressies samenstellendie 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 codemogelijk 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 omhaakjes te gebruiken om duidelijk te maken wat bij elkaar hoort.Expressie Is gelijk aan Betekenis

!( A && B ) !A || !B Is waar zodra een van beide A of B niet waar is!( A || B ) !A && !B Is alleen waar als geen van beide A or B waar isVoorbeelden

• 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 gekuitziet, vind je niet?).

Algoritmisch denken en gestructureerd programmeren (in Greenfoot) 4

Page 6: Opdracht 3: Dodo verdeelt haar werk - Radboud Universiteitcourse.cs.ru.nl/greenfoot/docs/Opdrachten v3.1.1...Opdracht 3: Dodo verdeelt haar werk AlgoritmischDenkenenGestructureerdProgrammeren(inGreenfoot)

Dodo verdeelt haar werk Opdracht 3

Theorie 3.5: Je initiele wereld instellen

Wil je dat steeds een bepaalde wereld geopend wordt en dat je dus niet telkens weer opnieuw alleobjecten in de wereld hoeft te plaatsen (bijvoorbeeld nadat je je code hebt aangepast), volg dan dezeinstructies 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 voor 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 hetbestand zelf een andere, zinvollere naam geven. Bedenk ook dat wanneer je twee of meerderekeren saveToFile( ) 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 een String genoemd. String is eentype, net zoals int en boolean. Methodes kunnen een String (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 ineen programma te kunnen gebruiken, moet je deze altijd tussen dubbele aanhalingstekens zetten.

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

Algoritmisch denken en gestructureerd programmeren (in Greenfoot) 5

Page 7: Opdracht 3: Dodo verdeelt haar werk - Radboud Universiteitcourse.cs.ru.nl/greenfoot/docs/Opdrachten v3.1.1...Opdracht 3: Dodo verdeelt haar werk AlgoritmischDenkenenGestructureerdProgrammeren(inGreenfoot)

Dodo verdeelt haar werk Opdracht 3

• Zo geef je een String als parameter mee:String textGreeting = "Hello";System.out.println ( textGreeting );

Het resultaat ziet er zo uit:

• Twee Strings ’plak’ je aan elkaar (concatenatie) met ’ +’.String textGreetingMimi = "Hello " + "Mimi";System.out.println ( textGreetingMimi );

Het resultaat ziet er zo uit:

• Een String en een int variable int nrOfEggsFound voeg 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 vantwee ints. Zoek zelf maar eens uit wat het verschil is tussen 1 + 1 + "= 2" en "2 = "+ 1 + 1.De methode showCompliment(String compliment) krijgt een String met de naam compliment alsparameter mee. De methode levert een smiley op samen met het compliment zelf. De volgende tweevoorbeelden van programmacode leveren precies hetzelfde resultaat op. Het resultaat zie je in figuur4.

showCompliment( "Congradulations!" );enString textCongradulations = "Congradulations!";showCompliment( textCongradulations );

Figuur 4: Resultaat van beide stukjes code

Algoritmisch denken en gestructureerd programmeren (in Greenfoot) 6

Page 8: Opdracht 3: Dodo verdeelt haar werk - Radboud Universiteitcourse.cs.ru.nl/greenfoot/docs/Opdrachten v3.1.1...Opdracht 3: Dodo verdeelt haar werk AlgoritmischDenkenenGestructureerdProgrammeren(inGreenfoot)

Dodo verdeelt haar werk Opdracht 3

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 methode boolean grainAhead( ) geschreven die controleerde of er een graan inde cel voor Mimi lag (zie stroomdiagram 5).

Figuur 5: Stroomdiagram voor grainAheadDe volgende taak is om submethodes te gebruiken om de code van boolean grainAhead( ) op teschonen.a) Schrijf een methode stepBack ( )waarmeeMimi een stapje achteruit zet. Na afloopmoet ze nogaltijd 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:

Algoritmisch denken en gestructureerd programmeren (in Greenfoot) 7

Page 9: Opdracht 3: Dodo verdeelt haar werk - Radboud Universiteitcourse.cs.ru.nl/greenfoot/docs/Opdrachten v3.1.1...Opdracht 3: Dodo verdeelt haar werk AlgoritmischDenkenenGestructureerdProgrammeren(inGreenfoot)

Dodo verdeelt haar werk Opdracht 3

Figuur 6: Stroomdiagram voor grainAhead door gebruik te maken van de submethode stepBackc) Test jouw programma.d) Kun je nog meer code opruimen in de grainAheadmethode?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 combinatiesvoorkomen. 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 tweeuitspraken 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 aanzodat 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 uitspraakaan zodat deze nog altijd hetzelfde betekent: ”NIET (regen OF onweer)”

Algoritmisch denken en gestructureerd programmeren (in Greenfoot) 8

Page 10: Opdracht 3: Dodo verdeelt haar werk - Radboud Universiteitcourse.cs.ru.nl/greenfoot/docs/Opdrachten v3.1.1...Opdracht 3: Dodo verdeelt haar werk AlgoritmischDenkenenGestructureerdProgrammeren(inGreenfoot)

Dodo verdeelt haar werk Opdracht 3

Lees eerst Theorie 3.5: Je initiele 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 eenei in.

Zorg ervoor dat jouw algoritme generiek is. Het moet dus werken in elke wereld, ook als een nestiets 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 wereldc) Schrijf de bijbehorende programmacode (en commentaar). Zorg er ook voor dat jouw code uitge-lijnd is (zie Theorie 3.3).d) Test jouwmethode doormet je rechtermuisknop opMimi te klikken en demethode 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.

Algoritmisch denken en gestructureerd programmeren (in Greenfoot) 9

Page 11: Opdracht 3: Dodo verdeelt haar werk - Radboud Universiteitcourse.cs.ru.nl/greenfoot/docs/Opdrachten v3.1.1...Opdracht 3: Dodo verdeelt haar werk AlgoritmischDenkenenGestructureerdProgrammeren(inGreenfoot)

Dodo verdeelt haar werk Opdracht 3

g) Test opnieuw.Je hebt nu een if..then..else.. genest in een while-loop.Opgave 3.4: Geen dubbele eieren

Jouw volgende taak is: Mimi loopt naar de grens van de wereld. Als ze onderweg een nest tegenkomtwaar 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: Theorie3.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 netjesuitgelijnd is (zie Theorie 3.3).

Afhankelijk van de door jouw gekozen oplossing heb je nu nesting (van if..else..) of combinatiesvan logische operatoren gebruikt om een complexere voorwaarde te omschrijven.Opgave 3.5: Door een tunnel lopen

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

Figuur 8: Beginsituatie Figuur 9: EindsituatieWe delen dit probleem eerst op in deelproblemen die ieder afzonderlijk aangepakt kunnenworden:

Algoritmisch denken en gestructureerd programmeren (in Greenfoot) 10

Page 12: Opdracht 3: Dodo verdeelt haar werk - Radboud Universiteitcourse.cs.ru.nl/greenfoot/docs/Opdrachten v3.1.1...Opdracht 3: Dodo verdeelt haar werk AlgoritmischDenkenenGestructureerdProgrammeren(inGreenfoot)

Dodo verdeelt haar werk Opdracht 3

Figuur 10: Het probleem opdelen in deelproblemen die ieder afzonderlijk aangepakt wordena) 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.Jemag natuurlijk gebruikmaken van jouwmethodes boolean fenceOnLeft( ) en boolean fenceOnRight( ).

c) Maak gebruik van deze submethodes om een methode void walkThroughTunnel( ) te schrijven.Je kunt de ’worldTunnel’ wereld gebruiken om te testen (Theorie 3.5 beschrijft hoe je deze kanopenen).d) Test jouw void walkThroughTunnel( )methode.Je hebt nu zelf gebruik gemaakt van abstractie om een groter probleem op te splitsen in kleineredelen. Met het verdeel-en-heers principe heb je de kleinere delen ontworpen, geımplementeerd engetest (methodes fenceOnRight ( ) en fenceOnLeft ( )). Daarna heb je deze gebruikt inwalkThroughTunnel( ) en het geheel getest.Wie weet, misschien wil je straks in een volgende opgave gebruik maken van een van jouw me-thodes (bijvoorbeeld fenceOnRight ( )). Omdat je er nu een aparte methode van gemaakt hebt ishergebruik 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 zehaar 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, danmoet ze stoppen en in een pop-up venster een geschiktefoutmelding 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 voorwalkToWorldEdgeClimbingOverFences( ).• 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.

Algoritmisch denken en gestructureerd programmeren (in Greenfoot) 11

Page 13: Opdracht 3: Dodo verdeelt haar werk - Radboud Universiteitcourse.cs.ru.nl/greenfoot/docs/Opdrachten v3.1.1...Opdracht 3: Dodo verdeelt haar werk AlgoritmischDenkenenGestructureerdProgrammeren(inGreenfoot)

Dodo verdeelt haar werk Opdracht 3

a) Open de ’worldFencedArea’ wereld.b) Bepaal de begin- en eindsituaties. Bedenk een geschikt algoritme. Tip: Om te voorkomen datMimi oneindig veel rondjes om het hek heen wandelt gaan we ervan uit dat in het laatste vakjevan de route om de omheining een ei ligt. Als ze gaat lopen en dat ei tegenkomt, dan weet ze datze klaar is.c) Schrijf de bijbehorende methode void 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 grotereomheining.e) Voor welke beginsituaties werkt jouw programma? Indien nodig, pas de beschrijving van jouwbeginsituatie aan.f) Test ook of jouw methode werkt met een andere wereld, zoals:’worldOtherFencedArea’. Pas het algoritme (en dus ook het stroomdiagram en code) dusdanigaan dat het ook hiervoor werkt.

Figuur 11: Een andere omheiningJe hebt nu een generieke methode geschreven waarmee Mimi om een willekeurige omheining kanlopen. 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? (ziewereld: ’worldEggTrailToNest’).

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

Algoritmisch denken en gestructureerd programmeren (in Greenfoot) 12

Page 14: Opdracht 3: Dodo verdeelt haar werk - Radboud Universiteitcourse.cs.ru.nl/greenfoot/docs/Opdrachten v3.1.1...Opdracht 3: Dodo verdeelt haar werk AlgoritmischDenkenenGestructureerdProgrammeren(inGreenfoot)

Dodo verdeelt haar werk Opdracht 3

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 ontwerpenen 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 moetverbeteren.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 tevinden. Jouw oplossingmoet natuurlijk weer generiek zijn: Dodomoet haarweg door eenwillekeurigedoolhof vinden, niet alleen voor de doolhof uit het plaatje.

Je mag van het volgende uitgaan:• De wereld is omgeven door hekken.• Er is precies een nest.• Er bestaat een route naar het nest.• Het nest ligt direct naast een hek.• Aan het begin is er maar een richting waarin Dodo kan lopen.• Het doolhof bevat geen doodlopende paden. Verder zijn er geen ’eilanden’ van hekjes: ieder hekjeis verbonden met de omheining.

Schrijf een methode waarmee Dodo het nest vindt.a) Bedenk een geschikt algoritme en teken een stroomdiagram op hoog niveau.

Algoritmisch denken en gestructureerd programmeren (in Greenfoot) 13

Page 15: Opdracht 3: Dodo verdeelt haar werk - Radboud Universiteitcourse.cs.ru.nl/greenfoot/docs/Opdrachten v3.1.1...Opdracht 3: Dodo verdeelt haar werk AlgoritmischDenkenenGestructureerdProgrammeren(inGreenfoot)

Dodo verdeelt haar werk Opdracht 3

b) Ontwikkel, implementeer en test de submethodes voor jouw algoritme een voor een.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 doorte 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 moetnatuurlijk weer generiek zijn.

Je mag van het volgende uitgaan:• Er is een 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 een voor een.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 jouwprogramma daarmee. Vergelijk elkaars oplossingen.

Algoritmisch denken en gestructureerd programmeren (in Greenfoot) 14

Page 16: Opdracht 3: Dodo verdeelt haar werk - Radboud Universiteitcourse.cs.ru.nl/greenfoot/docs/Opdrachten v3.1.1...Opdracht 3: Dodo verdeelt haar werk AlgoritmischDenkenenGestructureerdProgrammeren(inGreenfoot)

Dodo verdeelt haar werk Opdracht 3

Opgave 3.11: Dodo maakt wilde sprongen

Nu is het tijd voor een meer uitdagende algoritmisch denken puzzel. Stel we hebben een methodejumpToEnd( ). Hiermee kanMimi herhaaldelijk stappen zetten totdat ze niet meer verder kan (er staateen hek in de weg of ze heeft de grens van de wereld bereikt):public void jumpToEnd( ) {while ( ! borderAhead( ) && ! fenceAhead( ) ){step( );}}De jumpToEnd( )methode wordt aangeroepen in goWild( ).

Figuur 13: Stroomdiagram voor de methode goWild( )Het scenario wordt uitgevoerd door goWild aan te roepen. Hieronder staan drie verschillende be-ginsituaties:

Figuur 14: A Figuur 15: B Figuur 16: Ca) Stopt Mimi als je uitgaat van beginsituatie A? Zo ja, hoe vaak wordt de jumpToEnd( ) methodeaangeroepen?

Algoritmisch denken en gestructureerd programmeren (in Greenfoot) 15

Page 17: Opdracht 3: Dodo verdeelt haar werk - Radboud Universiteitcourse.cs.ru.nl/greenfoot/docs/Opdrachten v3.1.1...Opdracht 3: Dodo verdeelt haar werk AlgoritmischDenkenenGestructureerdProgrammeren(inGreenfoot)

Dodo verdeelt haar werk Opdracht 3

b) Stopt Mimi als je uitgaat van beginsituatie B? Zo ja, hoe vaak wordt de jumpToEnd( ) methodeaangeroepen?c) Controleer jouw antwoorden door een printopdracht toe te voegen aan de code. (Theorie 1.14 enTheorie 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 zettenkun je ervoor zorgen dat Mimi het ei vindt. Kun je hekken in figuur C neerzetten zodat Mimi haarei vindt als je de goWild( )methode aanroept? Er zijn twee eisen:

• Je mag hooguit vijf hekken gebruiken.• Je mag geen hek naast een wereldgrens plaatsen.

Algoritmisch denken en gestructureerd programmeren (in Greenfoot) 16

Page 18: Opdracht 3: Dodo verdeelt haar werk - Radboud Universiteitcourse.cs.ru.nl/greenfoot/docs/Opdrachten v3.1.1...Opdracht 3: Dodo verdeelt haar werk AlgoritmischDenkenenGestructureerdProgrammeren(inGreenfoot)

Dodo verdeelt haar werk Opdracht 3

Reflectie

In deze opdracht heb je geoefendmet het ontwerpen van code als losse componenten. Daardoor wordthet 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 terugte 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 ikbegreep het niet helemaalIk 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 tecombineren.Ik kan generieke oplossingen ontwikkelen.

Algoritmisch denken en gestructureerd programmeren (in Greenfoot) 17

Page 19: Opdracht 3: Dodo verdeelt haar werk - Radboud Universiteitcourse.cs.ru.nl/greenfoot/docs/Opdrachten v3.1.1...Opdracht 3: Dodo verdeelt haar werk AlgoritmischDenkenenGestructureerdProgrammeren(inGreenfoot)

Dodo verdeelt haar werk Opdracht 3

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 horenzitten nu in een map.Inleveren

Lever het volgende in:• Naam: van jou (en je partner);• Jouw code: Het MyDodo.jav java 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.

Algoritmisch denken en gestructureerd programmeren (in Greenfoot) 18