Informatica Actief Knip en plakwerk van Casper Bezemer moodle.informatica-actief.nl ii Inhoudsopgave 1 B3 - JavaLogo 1.1 Java, applets en JavaLogo . . . . . . . . . . . . . 1.1.1 Java, applets . . . . . . . . . . . . . . . . . 1.1.2 Wat is JavaLogo? . . . . . . . . . . . . . . 1.2 Werken met JCreator . . . . . . . . . . . . . . . . 1.2.1 Inleiding JDK en JCreator . . . . . . . . . . 1.2.2 Installatie JDK en documentatie . . . . . . 1.2.3 Installatie JCreator . . . . . . . . . . . . . 1.2.4 Installatie JavaLogo in JCreator . . . . . . 1.2.5 Een eerste programma in JCreator . . . . 1.3 Tekenen in Java . . . . . . . . . . . . . . . . . . . 1.3.1 Tekenopdrachten in een Java programma 1.3.2 Meer kleuren gebruiken . . . . . . . . . . . 1.3.3 Fouten zoeken in een programma . . . . . 1.3.4 Een JavaLogo-applet op een website . . . 1.4 Variabelen en typen in Java . . . . . . . . . . . . . 1.4.1 Variabelen gebruiken in Java . . . . . . . . 1.4.2 Typen . . . . . . . . . . . . . . . . . . . . . 1.4.3 Schrijfopdracht en Font-objecten . . . . . 1.5 Methoden maken voor deeltaken . . . . . . . . . 1.5.1 Nieuwe methoden voor deeltaken . . . . . 1.5.2 Parameters van een methode . . . . . . . 1.6 Herhalingsopdrachten en commentaar . . . . . . 1.6.1 Herhalingsopdrachten maken in Java . . . 1.6.2 Commentaar in een programma . . . . . . 1.7 Invoervariabelen . . . . . . . . . . . . . . . . . . . 1.7.1 Gebeurtenisgestuurde interactie . . . . . . 1.7.2 Invoervariabelen gebruiken . . . . . . . . . 1.7.3 Meer invoervariabelen en keuze . . . . . . iii . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 1 1 3 5 5 7 8 8 9 10 10 11 13 16 17 17 19 21 23 23 24 27 27 29 30 30 31 34 iv INHOUDSOPGAVE Hoofdstuk 1 B3 - JavaLogo 1.1 Java, applets en JavaLogo 1.1.1 Java, applets Java De taal Java die wij in deze cursus gaan gebruiken is een vrij nieuwe taal, ontstaan in ongeveer 1995. Java is een zogenaamde objectgeoriënteerde programmeertaal. Objectgeoriënteerde talen zijn de resultaten van nieuwe ontwikkelingen op het gebied van programmeertalen. Heel kort geformuleerd kun je zeggen dat met objectgeoriënteerde programmeren het beter mogelijk is om structuur aan te brengen in programma’s. Iets wat bij veel complexe programma’s van tegenwoordig waaraan door veel programmeurs tegelijk wordt gewerkt steeds belangrijker wordt. Andere objectgeoriënteerde talen zijn bijvoorbeeld C++ en Delphi. De compiler van Java werkt iets anders dan die van andere talen. De programmacode wordt niet meteen omgezet in machinecode, maar in een zogenaamde bytecode. Een code die bij uitvoering met nog een extra (kleine) vertaalstap moet worden omgezet in machinecode. Een voordeel is dat de bytecode voor alle soorten processoren hetzelfde is. Dit is vooral handig voor programma’s die via internet verspreid worden, zoals applets, programmaatjes die in een webpagina worden uitgevoerd. Zo’n webpagina kan dan op verschillende soorten computers bekeken worden. Applets In deze cursus zullen we applets gaan maken. Dat zijn (vaak kleine) programma’s in Java die we binnen een webpagina kunnen uitvoeren. De browser waarmee we een dergelijke webpagina bekijken download zo´n programma en voert het uit. Hiervoor is wel een zogenaamde Java Runtime Environment nodig op de computer van de gebruiker (”Java moet geïnstalleerd zijn”). Flash-animaties 1 2 HOOFDSTUK 1. B3 - JAVALOGO werken volgens een soortgelijk systeem (in dat geval moet er een Flashplayer geïnstalleerd zijn. De HTML-code in figuur 1.1.1 is van een webpagina met een applet. <HTML> <HEAD> <TITLE>A Clock</TITLE> </HEAD> <BODY> <h1>A Clock</h1> <hr> <applet code="Clock.class" width=170 height=150> </applet> </BODY> </HTML> Figuur 1.1: Deze HTML-pagina laadt een applet genaamd Clock.class in de webbrowser. Bekijken we deze pagina in een webbrowser, dan zien we onderstaand scherm met een lopende klok die bovendien de juiste tijd aangeeft. Figuur 1.2: Zo ziet de Clock applet eruit op de webpagina. 1.1. JAVA, APPLETS EN JAVALOGO 3 In de code zie je een zogenaamde applet-tag met een verwijzing naar een applet. De tag lijkt op de tags die je gebruikt om afbeeldingen op een webpagina weer te geven. <applet code="Clock.class" width=170 height=150> </applet> Figuur 1.3: De code hierboven laadt de applet in onze HTML pagina Er zijn drie elementen. Twee daarvan (width en height) geven de afmetingen van het applet. Het element ”code”bevat de verwijzing naar een class-bestand met de bytecode van het applet. Dit class-bestand moet dus beschikbaar zijn naast de html-file, in dit geval in dezelfde map. In het vervolg van deze cursus gaat het om het zelf maken van zo’n classbestand. Deze bytecode is het eindprodukt van ons programmeerwerk. 1.1.2 Wat is JavaLogo? De applets die we maken in deze cursus zijn gebaseerd op de tekenalgoritmen die we in cursus B3H07 hebben bestudeerd en ontworpen, maar we gaan verder dan het maken van tekeningen alleen. We zullen ook allerlei animaties en interacties mogelijk maken. In een verdiepend onderwerp gaan we bovendien 3D-figuren maken. Voorbeelden van dergelijk applets kun je bekijken op de JavaLogo-site. Figuur 1.4: Enkele voorbeelden van wat je in JavaLogo kan doen. Wat is nu het verschil tussen JavaLogo en Java, en waarom heet deze cursus ’programmeren in JavaLogo’ en niet ’programmeren in Java’ ? We zouden gebruik kunnen maken van de tekenopdrachten die standaard in Java aanwezig zijn, maar deze opdrachten zijn voor beginners niet zo eenvoudig te begrijpen. 4 HOOFDSTUK 1. B3 - JAVALOGO Bovendien is er voor de wat ingewikkeldere tekeningen veel lastig rekenwerk nodig. Daarom gaan we werken met een extra set tekenopdrachten die we aan Java hebben toegevoegd. Deze tekenopdrachten zijn afgekeken van de programmeertaal Logo. Logo Logo is een educatieve programmeertaal, eind jaren zestig bedacht door Seymour Papert. De bedoeling was een simpele programmeertaal te maken die speciaal geschikt was voor kinderen. Logo bestond uit een grafisch scherm waarover je de ”turtle”(een cursor in de vorm van een schildpad) heen en weer kon laten lopen. Er zijn verschillende vertalingen en varianten van Logo ontstaan in de hele wereld. Vandaag is in België en Nederland en zelfs Engeland een variant nog heel populair: Superlogo. Die is lang niet meer hetzelfde als de oorspronkelijke taal, en er zijn veel meer functies dan de oorspronkelijke taal. Kinderen en volwassenen kunnen er echt uitgebreide programma’s mee maken. Er bestaan tot op de dag van vandaag ook nog andere varianten maar die zijn minder populair. Maar ondanks alles hebben alle varianten zeker één ding gemeen met het oorspronkelijke Logo: de turtle.Hieronder zie je een afbeelding gemaakt in Logo. Klik op hier voor extra informatie en de Logo-code. Omdat we bij JavaLogo de Logo-tekenopdrachten aan Java hebben toegevoegd programmeren we echt in de taal Java, alleen beschikken we nu over opdrachten waarmee we makkelijker kunnen tekenen. Als je de cursus B3H07 hebt doorgewerkt, dan heb je al ervaring met deze opdrachten. Bij een objectgeorienteerde taal als Java is het overigens heel gebruikelijk om de taal uit te breiden met extra opdrachten. De opdrachten worden dan als extra klassen aan de taal toegevoegd. Later komen we daar nog op terug. 1.2. WERKEN MET JCREATOR 5 1.2 Werken met JCreator 1.2.1 Inleiding JDK en JCreator Java Development Kit (JDK) De gratis verkrijgbare Java Development Kit van Sun, de makers van Java, is het meest basale gereedschap om Javaprogramma´s te maken. De JDK bevat een compiler, een appletviewer en nog enkele hulpprogramma’s die bestuurd kunnen worden vanaf de DOS-prompt. Daarnaast is er wel nog een tekst-editor nodig om de code te kunnen typen en opslaan. Het programma Kladblok van de Bureau accessoires van Windows, is hiervoor geschikt. 6 HOOFDSTUK 1. B3 - JAVALOGO Ontwikkelomgeving: JCreator Makkelijker dan het kale JDK, is een zogenaamde IDE (Integrated Development Environment), in het Nederlands: een geïntegreerde ontwikkelomgeving. Zo’n programma biedt alles wat we nodig hebben in één gebruiksvriendelijke omgeving. We kunnen de programma’s schrijven, compileren en testen. Bovendien heeft het faciliteiten om onze projecten met alle bijbehorende files te ordenen en te organiseren. In deze Cursus werken we met JCreator van het bedrijf Xinox. De versie die we zullen gebruiken is gratis verkrijgbaar.We zullen dus in het begin wat aandacht moeten besteden aan de werking en de installatie van JCreator, zodat we daarna de aandacht vooral kunnen richten op het eigenlijke programmeren. 1.2. WERKEN MET JCREATOR 7 1.2.2 Installatie JDK en documentatie De Java Development Kit (JDK) van Sun bevat alle basale tools die nodig zijn voor het maken van Javaprogramma’s. De JDK is gratis te downloaden vanaf de site van Sun (Sun downloadsite voor de JDK). In deze handleiding gaan we uit van de versie JDK 6 update 3. Je kunt deze versie ook rechtstreeks binnenhalen via de link: JDK 6 (Java Development Kit). •Download het bestand en start de installatieprocedure. Accepteer de license agreement en ga door tot je komt bij onderstaand scherm. Eventueel kun je een andere map kiezen waarin de JDK geïnstalleerd wordt. Standaard gebeurt dit in de map C:\Program Files\Java\jdk1.6.0_03. Ook kun je ervoor kiezen om niet alle onderdelen te installeren. In elk geval heb je de Development Tools nodig. •Kies Next. 8 HOOFDSTUK 1. B3 - JAVALOGO •Kies Finish De JDK is nu geïnstalleerd . Vervolgens installeren we de Java documentatie. Deze kan weer gedownload worden via de site van Sun, of rechtstreeks via de link: JDK 6 Documentatie. Het betreft een zipbestand dat moet worden uitgepakt in de map van de JDK. 1.2.3 Installatie JCreator Zie de website van Informatica Actief. Deze pagina krijg ik niet mooi in dit boek, omdat ’ie meer plaatjes is dan tekst. 1.2.4 Installatie JavaLogo in JCreator Zie de website van Informatica Actief. 1.2. WERKEN MET JCREATOR 1.2.5 Een eerste programma in JCreator Zie de website van Informatica Actief. 9 10 HOOFDSTUK 1. B3 - JAVALOGO 1.3 Tekenen in Java 1.3.1 Tekenopdrachten in een Java programma In de cursus B3H07 hebben we een verzameling tekenopdrachten gedefinieerd. In het applet: “Tekenalgoritmen bouwen” konden we deze opdrachten uitvoeren en de bijbehorende tekening bekijken. In deze cursus gaan we dezelfde tekenopdrachten omzetten in een Javaprogramma. We zullen zien dat we daarmee veel extra mogelijkheden krijgen die niet kunnen in het applet waarmee we de tekenalgoritmen in B3H07 testten. Je kunt de tekenopdrachten van B3H07 nogmaals bestuderen via de link B3H07: De tekenopdrachten en het tekenblad. We bekijken nogmaals het volgende algoritme: vooruit(100) rechts(90) vooruit(100) links(90) vooruit(100) links(60) vooruit(100) Het Javaprogramma dat dit tekenalgoritme uitvoert ziet er zo uit: Programma 1 import logotekenap.*; public class Applet1 extends TekenApplet { public void tekenprogramma() { vooruit(100); rechts(90); vooruit(100); links(90); vooruit(100); links(60); vooruit(100); } } We lopen de details van dit programma door. public class Applet1 Een programma in Java bestaat altijd uit een of meer zogenaamde klassen (engels: class). Wij zullen ons in de programma’s die we gaan maken doorgaans beperken tot één klasse. De opdrachten 1.3. TEKENEN IN JAVA 11 moeten dus binnen een klasse staan en de naam van de klasse: Applet1 is de naam van ons programma. Bovendien moet de naam van het bestand waar de code in staat ook dezelfde naam hebben, in ons geval is die naam Applet1.java . Het woord: public geeft aan dat de klasse van buitenaf kan worden gebruikt. extends TekenApplet Dit wil zeggen dat je bij het maken van Applet1 in feite doorbouwt op de applet: TekenApplet. In TekenApplet zijn alle tekenopdrachten gedefinieerd die je in je tekenprogramma kunt gebruiken. Ook de eerste regel van de code hangt hiermee samen. import logotekenap.* Om die klasse TekenApplet te kunnen gebruiken, moet deze voor ons programma toegankelijk worden gemaakt. Dat gebeurt door de opdracht: import logotekenap.* . logotekenap is een zogenaamd package (een soort map) waarin TekenApplet te vinden is. De regel: public class Applet1 extends TekenApplet noemen we de header van de klasse. Alles wat tussen de accolades staat die hierop volgen (de rest van het programma dus) noemen we die body van de klasse. public void tekenprogramma() In een objectgeoriënteerde taal als Java moeten alle opdrachten bovendien gebundeld worden in groepjes. Zo’n groepje heet een methode. De naam van de methode waarin onze opdrachten staan is: tekenprogramma(). Aan die twee haakjes kun je zien dat je met een methode te maken hebt. Het woord: void (dat betekent ‘leeg’) wil zeggen dat de methode iets doet, maar geen uitvoer heeft. Sommige methoden hebben wel uitvoer, dan staat er in plaats van void iets anders. Hier komen we later op terug. Het woord: public geeft (net als bij class) aan dat de methode van buitenaf kan worden aangeroepen. Net als bij een klasse heeft een methode ook een header en een body. De regel: public void tekenprogramma() is de header, de rij opdrachten tussen de accolades die daarop volgt is de body. Wat we verder in de code kunnen zien is dat alle opdrachten afgesloten worden met een puntkomma. Vergeet dit niet, want anders zal de compiler de code niet accepteren. Een ander belangrijk punt is het feit dat Java onderscheid maakt tussen hoofdletters en kleine letters. Dus de naam applet1 is een andere naam dan Applet1. Het is de gewoonte om de naam van een public variabele/methode/klasse met een hoofdletter te laten beginnen en de naam van private elementen met een kleine letter. 1.3.2 Meer kleuren gebruiken Voor het tekenen van van gekleurde lijnen en inkleuren van figuren gebruik je respectievelijk de opdrachten penAan(kleur) en vulAan(kleur). Je kunt kiezen 12 HOOFDSTUK 1. B3 - JAVALOGO uit een beperkte lijst met kleuren: rood, groen, blauw, geel, oranje, cyaan, roze, magenta, grijs, lichtgrijs, wit en zwart. Er is echter een andere mogelijkheid beschikbaar met meer keuzes. penAan(kleur) Hiermee zet je een denkbeeldige pen aan. Tussen de haakjes kun je aangeven met welke kleur er getekend moet worden. penAan(r,g,b) Dezelfde opdracht als hierboven, maar nu je kleur maken door een rgb-waarde op te geven. vulAan(kleur) Deze opdracht kun je gebruiken om vlakken in te kleuren. De kleur kies je door een naam op te geven. vulAan(r,g,b) Deze opdracht kun je gebruiken om vlakken in te kleuren met een te kiezen rgb-kleur. De rgb-kleuren die je in in een van de vorige cursussen al tegenkwam kun je hier dus gebruiken in de tekenopdrachten. Zowel r, g als b is een getal tussen 0 en 255. Daarmee zijn dus 2563 ≈ 16 miljoen kleuren te maken. Achtergrondkleur De achtergrondkleur van het tekenblad was tot nu toe steeds wit, maar ook die kleur is te veranderen met een opdracht: achtergrondkleur(kleur) Stelt een gegeven achtergondkleur in door een kleur naam op te geven achtergrondkleur(r,g,b) idem, maar nu door rgb-waarden op te geven. Er is echter een verschil met de andere tekenopdrachten. Deze opdracht moet niet worden opgenomen in de methode tekenprogramma(), maar in een aparte methode initialiseer(). Dit is zo omdat het instellen van de achtergrondkleur eigenlijk hoort bij het instellen, oftewel het initialiseren van het tekenblad, terwijl het tekenprogramma zich bezighoudt met het tekenen op het tekenblad. Hieronder zie een voorbeeldprogramma waarin een zachtgele ster wordt getekend op een roze achtergrondkleur. 1.3. TEKENEN IN JAVA 13 Programma 2 import logotekenap.*; public class Applet2 extends TekenApplet { public void initialiseer() { achtergrondkleur("roze"); } public void tekenprogramma() { vulAan(255,255,200) vooruit(100); rechts(144); vooruit(100); rechts(144); vooruit(100); rechts(144); vooruit(100); rechts(144); vooruit(100); vulUit(); } } 1.3.3 Fouten zoeken in een programma Er bestaat geen programmeur die altijd meteen bij de eerste compilatie een perfect werkend programma heeft. Dus het opsporen en corrigeren van fouten is een altijd aanwezig onderdeel van het programmeren. Er zijn verschillende soorten fouten. Fouten in de syntax Allereerst zijn er de zogenaamde syntactische fouten. Fouten die je zou kunnen vergelijken met taalfouten bij het schrijven. Een voorbeeld van een syntaxfout is wanneer je een programma-opdracht niet afsluit met een puntkomma, of wanneer je de naam van een methode met een hoofdletter schrijft, terwijl je dat eerder met een kleine letter hebt gedaan. Het kan ook zijn dat je een accolade vergeten bent. Dit soort fouten wordt meestal bij het compileren ontdekt. Bovendien geeft de compiler aan wat er fout is en in welke regel. 14 HOOFDSTUK 1. B3 - JAVALOGO Fouten in de semantiek Semantische fouten zondigen tegen de betekenis van codewoorden. Ook het gebruik van bouwstenen of procedures waarvan we betekenis, bedoeling of gebruik niet precies kennen, leidt tot semantische fouten. Wanneer je bijvoorbeeld een tekenopdracht gebruikt buiten de methode tekenprogramma(), dan maak je een semantische fout. Semantische fouten worden soms wel en soms niet door de compiler herkend. Logische fouten Een ander soort fout is een logische fout. In dat geval heb je soms een werkend programma, alleen doet het niet wat je wilt. Als je een programma wilt schrijven dat twee vierkanten moet tekenen, maar het tekent er maar één, dan heb je een logische fout. Debuggen Semantische en logische fouten worden ook wel bugs genoemd. Het opsporen en verbeteren van dit soort fouten noemen we ’debuggen’ en een ontwikkelomgeving (zoals JDK en JCreator) heeft meestal speciale voorzieningen voor het debuggen van programma’s. JavaLogo trace-functie We zullen nog niet gaan werken met de debugger van JDK en JCreator, maar met een JavaLogo-optie om fouten in je tekenprogramma op te sporen. Dit is de zogenaamde ”tracefunctie”. Met deze functie kunnen we de stappen die het programma uitvoert één voor één bekijken. Om dit te kunnen gebruiken is een kleine toevoeging aan ons programma nodig. In de methode initialiseer() geven we de opdracht: maakTraceMogelijk(). Zie het programma hieronder: 1.3. TEKENEN IN JAVA 15 Programma 2a import logotekenap.*; public class Applet1 extends TekenApplet { public void initialiseer() { maakTraceMogelijk(); achtergrondkleur("roze"); } public void tekenprogramma() { vooruit(100); rechts(90); vooruit(100); links(90); vooruit(100); links(60); vooruit(50); } } Onderaan de applet verschijnt nu een knop met trace inschakelen. Wanneer je hierop drukt, dan kun je het programma stap voor stap doorlopen (zie afbeelding hieronder) met de knoppen: stap, terug en loop. De opdracht die op dat moment uitgevoerd wordt kun je lezen in het venstertje. 16 HOOFDSTUK 1. B3 - JAVALOGO Wanneer je kiest voor trace uitschakelen, dan wordt de tekening weer op de normale manier gemaakt. Met deze tracefunctie heb je een instrument in handen om fouten in je programmacode te ontdekken, omdat je precies kunt zien bij welke opdracht de tekening anders verloopt dan je gedacht had. Hiermee heb je een eenvoudige debugger. Wanneer het programma goed werkt, dan kun je de opdracht maakTraceMogelijk() weer verwijderen. Tip: Als je de tracefunctie wilt gebruiken, dan moet je in je applet voldoende ruimte geven voor de knoppen. Zorg dat je in de html-file een breedte van minstens 450 pixels opgeeft. <HTML> <BODY> <APPLET CODE="Applet1.class" WIDTH="450" HEIGHT="300" > </APPLET> </BODY> </HTML> 1.3.4 Een JavaLogo-applet op een website Dit is niet onderdeel van het boek omdat Java-applets tegenwoordig zelden meer uitgevoerd mogen worden in de webbrowser, en daarom dit hoofdstuk geen toegevoegde waarde meer heeft. Ben je echt benieuwd dan kun je het lezen op Informatica-Actief. 1.4. VARIABELEN EN TYPEN IN JAVA 17 1.4 Variabelen en typen in Java 1.4.1 Variabelen gebruiken in Java In cursus B3H07 waarin we tekenalgoritmen maakten, zagen we al het voordeel van variabelen. Je kunt dit nog eens nalezen via de link ’B3H07: Variabelen gebruiken in tekenopdrachten’. Nu gaat het erom hoe we variabelen kunnen gebruiken in Java. We bekijken daarvoor het tekenalgoritme van de rechthoek. Hierin gebruiken we twee variabelen, één voor de breedte en één voor de hoogte van de rechthoek. Het voordeel is dat we het algoritme maar op één plaats hoeven te veranderen als we andere maten willen geven aan de rechthoek. hoogte = 200 breedte = 400 vulAan("rood") vooruit(hoogte) rechts(90) vooruit(breedte) rechts(90) vooruit(hoogte) rechts(90) vooruit(breedte) rechts(90) vulUit() Hieronder zie je een Javaprogramma dat dezelfde rechthoek tekent en dezelfde variabelen gebruikt. Programma3 import logotekenap.*; public class Rechthoek extends TekenApplet { double hoogte; double breedte; public void initialiseer() { achtergrondkleur("lichtgrijs"); } public void tekenprogramma() { breedte = 400; hoogte = 200; 18 HOOFDSTUK 1. B3 - JAVALOGO stap(-breedte/2,-hoogte/2); vulAan("rood"); vooruit(hoogte);rechts(90); vooruit(breedte);rechts(90); vooruit(hoogte);rechts(90); vooruit(breedte);rechts(90); vulUit(); } } In dit programma komt een aantal nieuwe elementen voor die we zullen toelichten. Variabele: declaratie Ten eerste moeten we in ons programma aankondigen dat we met een variabele willen gaan werken. Dit noemen we: een variabele declareren. Dit gebeurt in ons programma in de eerste twee regels van de body van de class: double hoogte en double breedte . Bij een declaratie van een variabele moeten we ook aangeven om wat voor soort variabele het gaat, ofwel het type variabele . In ons geval willen we dat de variabele een getal is. We hebben dan keuze uit een geheel getal: een int (komt van het engelse woord voor geheel getal: integer), of een kommagetal: een double (double komt van het engels voor dubbele precisie.) Omdat we de afspraak hebben dat we tekenopdrachten kommagetallen meegeven, moeten we voor double kiezen. Lokale en globale variabelen Declaraties van variabelen kunnen eigenlijk overal in het programma worden gedaan. Door de variabelen te declareren binnen de body van de klasse, maar buiten de body van een methode, kunnen we deze variabelen overal in de klasse gebruiken. We hadden hoogte en breedte ook kunnen declareren binnen de methode tekenprogramma() zoals hieronder. public void tekenprogramma() { double breedte; double hoogte; breedte = 400; hoogte = 200; ... } 1.4. VARIABELEN EN TYPEN IN JAVA 19 Deze variabelen zijn dan alleen te gebruiken binnen deze methode en dat zou in dit geval eigenlijk ook voldoende zijn geweest. Zulke variabelen die alleen binnen de methode zelf te gebruiken zijn noemen we lokale variabelen. Zijn de variabelen beschikbaar voor de hele klasse, dan spreken we van globale variabelen. Variabele: toekenning Ten tweede moeten we de variabele een waarde geven. Dit noemen we een toekenning. In ons programma gebeurt dat in de eerste twee regels van de methode tekenprogramma(): breedte = 400; en hoogte = 200;. De waardetoekenning aan een variabele moet natuurlijk gebeuren voordat de variabele gebruikt wordt in een tekenopdracht. Declaratie en toekenning in één Het is mogelijk om een variabele tegelijk te declareren en een waarde toe te kennen. De code wordt korter en soms is dat daarom handig. public void tekenprogramma() { double breedte = 400; double hoogte = 200; ... } Rekenen in Java Een nieuw element in deze code is dat er gerekend wordt met de variabelen. Dat zie je in de regel: stap(-breedte/2,-hoogte/2); Deze stapopdracht is bedoeld om de rechthoek in het midden van het tekenblad te krijgen. Anders zou de linkerbenedenhoek van de rechthoek in het midden van het scherm staan. We moeten de pen eerst een halve rechthoeksbreedte naar links en een halve rechthoekshoogte naar beneden verplaatsen. De uitkomst van de berekeningen breedte/2 en -hoogte/2 geven precies de waarden die we nodig hebben. In Java kunnen we de bekende operatoren als + (plus), - (min), * (maal), / (gedeeld door) en ∧ (tot de macht) gebruiken. Bovendien is er klasse Math met allerlei wiskundige functies beschikbaar. Als je in je programma bijvoorbeeld de wortel uit 2 wilt gebruiken, dan schrijf je: Math.sqrt(2). 1.4.2 Typen In het theorieblok 1.4.1, ’Variabelen gebruiken in Java’, kwamen we twee typen variabelen tegen: double en int. (kommagetallen en gehele getallen). Voor de tekenopdrachten als vooruit(...) en rechts(...) moet je het type double 20 HOOFDSTUK 1. B3 - JAVALOGO gebruiken. Dit is niet waar. JavaLogo gebruikt int bij het tekenen, dus de getallen worden sowieso afgerond. Het is wel belangrijk dat je je bewust bent van dit soort afrondfouten. double breedte = 400; double hoek = 90; vooruit(zijde); rechts(hoek); ... Voor kleuropdrachten met rgb-kleuren, zoals vulAan(..., ..., ...) gebruik je het type int. int roodWaarde int groenWaarde int blauwWaarde = 255; = 255; = 200; vulAan(roodWaarde, groenWaarde, blauwWaarde); .... Type: String We hebben ook tekenopdrachten waarbij de naam van een kleur gebruikt wordt, bijvoorbeeld: penAan(”rood”), of vulAan(”lichtgrijs”). We hebben hier niet te maken met een getal, maar een dergelijke kleurnaam kan ook een variabele zijn. Namen, woorden, of algemener: een rij van letters noemen we in Java een String. Zo kunnen we een variabele voor een kleurnaam declareren, toekennen en gebruiken: String kleur; .... kleur = "rood"; .... vulAan(kleur); .... (declaratie van de variabele) (toekenning van de variabele) (gebruik van de variabele) Wat opvalt is dat we een String-waarde tussen aanhalingstekens zetten. Dat is nodig, want dan ziet de compiler het verschil tussen een String en een naam van een variabele. Andere typen In Java zijn veel verschillende typen variabelen mogelijk. Het is zelfs mogelijk om je eigen type te maken. Wel is er onderscheid tussen zogenaamde primitieve typen, zoals double en int, en zogenaamde objecttypen die we in Java klassen noemen. Variablen waarvan het type in een klasse beschreven is, noemen we objecten. 1.4. VARIABELEN EN TYPEN IN JAVA 21 1.4.3 Schrijfopdracht en Font-objecten In JavaLogo kunnen we in een applet tekeningen maken. Soms is het handig om ook tekst te kunnen weergeven. Het TekenApplet voorziet daarin met twee JavaLogo-opdrachten. schrijf(tekst) Hiermee zet je een tekst op het scherm op de plaats van de tekenpen op dat moment. De tekst heeft een standaard lettertype. schrijf(tekst, font) Dezelfde opdracht als hierboven, maar nu kun je een lettertype (font) opgeven. De tekst die aan deze opdrachten wordt meegegeven is van het type String. Font-objecten Het font (Engels voor lettertype) dat aan de schrijfopdracht wordt meegegeven is een zogenaamd object. Het is van een Java-type waarvan de eigenschappen zijn vastgelegd in de klasse Font. Ook hier komen we in aanraking met objectgeoriënteerd programmeren, maar we gaan niet in op de details. Wel laten we een stukje programmacode zien waarin het gebruikt wordt. programma4 import logotekenap.*; import java.awt.Font; public class TekstApplet extends TekenApplet { Font f; public void initialiseer() { f = new Font("Helvetica", Font.PLAIN,18); } public void tekenprogramma() { schrijf("Hello world",f); } } Font is een standaard Javaklasse en om die te kunnen gebruiken moeten we deze importeren in ons programma. Hiervoor is de opdracht: 22 HOOFDSTUK 1. B3 - JAVALOGO import java.awt.Font Er moet een variabele van het type Font worden gedeclareerd aan het begin van de klasse: Font f Vervolgens moet er een Font-object gemaakt worden en toegekend aan de variabele. Dit gebeurt in de methode initialiseer() met de opdracht: f = new Font("Helvetica", Font.PLAIN,18) Bij de maken van een Font worden er drie argumenten meegegeven. De eerste: ”Helveticaïs de fontnaam, de naam van het lettertype. De volgende fontnamen zijn in Java beschikbaar: Helvetica, TimesRoman, Courier, Dialog, DialogInput, ZapfDingbats Als tweede argument hebben we de volgende mogelijkheden: Font.PLAIN Font.ITALIC Font.BOLD Font.BOLD + Font.ITALIC Het derde argument geeft de lettergrootte aan uitgedrukt in punten (pt), net als in tekstverwerkers. 1.5. METHODEN MAKEN VOOR DEELTAKEN 23 1.5 Methoden maken voor deeltaken 1.5.1 Nieuwe methoden voor deeltaken De cursus B3H07 maakten we al algoritmen met deeltaken. Hoe dat in z’n werk ging kun je nog eens nalezen via de link: B3H07: Deeltaken in algoritmen. We maakten het volgende figuur middels een algoritme met twee deeltaken: Wanneer we dit algoritme omzetten naar een Javaprogramma, dan krijgen we de volgende code: import logotekenap.*; public class DrieSter extends TekenApplet { public void tekenprogramma() { links(15); vierkant(); rechts(30); ruit(); rechts(90); vierkant(); rechts(30); ruit(); rechts(90); vierkant(); rechts(30); ruit(); } void vierkant() { vulAan("groen"); vooruit(120);links(90); vooruit(120);links(90); vooruit(120);links(90); vooruit(120);links(90); vulUit(); } 24 HOOFDSTUK 1. B3 - JAVALOGO void ruit() { vulAan("rood"); vooruit(120);links(30); vooruit(120);links(150); vooruit(120);links(30); vooruit(120);links(150); vulUit(); } } Methode definitie We zien dat de code voor het tekenen van een vierkant is ondergebracht in een nieuwe methode met de header: void vierkant(). Voor de ruit is hetzelfde gedaan in de methode: void ruit(). De toevoeging public is hier niet nodig, omdat de methode niet buiten de klasse gebruikt hoeft te worden. De header en de body van de methode vierkant() noemen we de definitie van de methode vierkant(). Methode-aanroep In de methode tekenprogramma() kun je zien dat de code verschillende keren vierkant() bevat. Hier wordt de methode vierkant() aangeroepen. Wat dan gebeurt is dat de code die in de methode-definitie van vierkant() staat wordt uitgevoerd. Daarna gaat de methode tekenprogramma weer verder waar het gebleven was, bij rechts(30) dus. Vervolgens volgt een methode-aanroep ruit() en wordt de code bij void ruit() uitgevoerd, enzovoort. Eigenlijk is het dus zo dat het programma begint in tekenprogramma() en bij een methode-aanroep naar de code van de bijbehorende methode-definitie springt en na uitvoering weer terug. Het voordeel van het werken met nieuwe methoden voor deeltaken is ten eerste dat een deeltaak maar één keer geschreven hoeft te worden, terwijl deze meerdere keren kan worden uitgevoerd. We hoeven dus minder code te schrijven. Een tweede voordeel is dat het tekenprogramma veel overzichtelijker wordt omdat er door het opsplitsen in deeltaken meer structuur is aangebracht. 1.5.2 Parameters van een methode We hebben gezien dat we een methode kunnen definiëren om een bepaalde taak uit te voeren, zoals het tekenen van een vierkant met een zijde van 120. Wanneer je vierkanten van verschillende maten wilt tekenen, hoeft er maar één getal, de lengte van de zijde, te veranderen. Met een kleine verandering kun je dezelfde methode gebruiken voor het tekenen van vierkanten met verschillende maten. De methode aanroep ziet er dan zo uit: vierkant(100), of vierkant(50). 1.5. METHODEN MAKEN VOOR DEELTAKEN 25 De eerste aanroep tekent een vierkant met een zijde van 100, de tweede met een zijde van 50. Het getal dat wordt meegegeven noemen we een parameter. Dit getal is de invoer voor de methode. De aangepaste code voor de methode zie je hieronder. void vierkant(double z) { vulAan("groen"); vooruit(z);rechts(90); vooruit(z);rechts(90); vooruit(z);rechts(90); vooruit(z);rechts(90); vulUit(); } In de header van de methode-definitie wordt tussen de haakjes een variabele z gedeclareerd: double z, op de plaats waar de parameter staat in de methodeaanroep. Deze (lokale) variabele wordt vervolgens in de body van de methode gebruikt als zijde van het vierkant. Bij een methode-aanroep wordt aan deze variabele z de waarde van de meegegeven parameter toegekend en op deze manier wordt er een vierkant getekend met de juiste zijde. Eigenlijk is dit niet nieuw, want in feite zijn de opdrachten vooruit(200) en rechts(30) ook methode-aanroepen met een parameter. Alleen zijn de methodedefinities in dit geval niet door ons gemaakt. (Die bevinden zich in de klasse TekenApplet waarop onze programma’s voortbouwen) Hieronder staat een voorbeeld van een programma dat bovenstaande tekening van 10 vierkanten tekent in 10 verschillende maten. 26 HOOFDSTUK 1. B3 - JAVALOGO import logotekenap.*; public class Waaier extends TekenApplet { public void tekenprogramma() { vierkant(200);rechts(20); vierkant(180);rechts(20); vierkant(160);rechts(20); vierkant(140);rechts(20); vierkant(120);rechts(20); vierkant(100);rechts(20); vierkant(80);rechts(20); vierkant(60);rechts(20); vierkant(40);rechts(20); vierkant(20);rechts(20); } void vierkant(double z) { vulAan("groen"); vooruit(z);rechts(90); vooruit(z);rechts(90); vooruit(z);rechts(90); vooruit(z);rechts(90); vulUit(); } } We kunnen nu met de nieuwe methode een vierkant tekenen met een willekeurige zijde, maar ze zijn wel allemaal groen. We kunnen ervoor zorgen dat ook de kleur als parameter wordt meegeven, bijvoorbeeld vierkant(120, "rood"), door binnen de methodedefinitie voor nog een variabele te zorgen: void vierkant(double z, String kleur) { vulAan(kleur); vooruit(z);rechts(90); vooruit(z);rechts(90); vooruit(z);rechts(90); vooruit(z);rechts(90); vulUit(); } Een kleur wordt voorgesteld door een String, en niet door een getal. Het type variabele is dus geen double, maar een String (zie 1.4.2 Variabelen: typen). 1.6. HERHALINGSOPDRACHTEN EN COMMENTAAR 27 1.6 Herhalingsopdrachten en commentaar 1.6.1 Herhalingsopdrachten maken in Java In de cursus H07 leerden we de herhalingsopdracht te gebruiken in onze algoritmen. Je kunt dan nogmaal teruglezen via de link ‘B3H07: Herhalingen gebruiken’. In Java ziet een herhaling er als volgt uit: for(int i=0 ; i<4 ; i++) { vooruit(100); rechts(90); }9 Toelichting op de code: Er wordt een geheel getal (engels: integer) met naam i gemaakt en dat krijgt als waarde 0: int i = 0. Dit is de teller. Zolang i kleiner is dan 4, i<4, worden de opdrachten tussen de accolades uitgevoerd. Dit is de voorwaarde. De opdracht i++ betekent i=i+1, oftewel: i wordt één groter gemaakt. Dit is de eindstap. Zodra de voorwaarde niet meer wordt voldaan, oftewel i is niet meer kleiner dan 4, stopt de herhaling. Het is aardig om eens te kijken hoe het programma “Waaier” dat we eerder maakten eruit kan zien wanneer je gebruik maakt van herhalingen. De code zie je hieronder: import logotekenap.*; public class Waaier extends TekenApplet { double zijde; 28 HOOFDSTUK 1. B3 - JAVALOGO public void tekenprogramma() { zijde = 200; for(int i=0 ; i<10 ; i++) { vierkant(zijde); rechts(20); zijde = zijde-20; } } void vierkant(double z) { vulAan("groen"); for(int i=0 ; i<4 ; i++) { vooruit(z); rechts(90); } vulUit(); } } In de herhalingslus in de methode tekenprogramma() is de regel zijde = zijde-20 opgenomen. Hierdoor wordt de variabele zijde na elke herhalingsstap 20 kleiner, waardoor de getekende vierkanten steeds kleiner worden. Een andere oude bekende is het algoritme voor de krans van vierkanten. Hieronder het algoritme, compleet met deeltaken uitgevoerd in Java-code. import logotekenap.*; public class Krans extends TekenApplet { double zijde, afstand; public void tekenprogramma() { zijde = 50; afstand = 100; penUit();stap(-50,-150);penAan(); rechts(90); for(int i=0 ; i<9 ; i++) { rozet(zijde); vooruit(afstand); links(40); } } 1.6. HERHALINGSOPDRACHTEN EN COMMENTAAR 29 void rozet(double z) { for(int i=0 ; i<45 ; i++) { vierkant(z); rechts(8); } } void vierkant(double z) { for(int i=0 ; i<4 ; i++) { vooruit(z); rechts(90); } } } 1.6.2 Commentaar in een programma Tot nu toe zijn de programma’s die we gemaakt hebben nog vrij klein, overzichtelijk en goed te begrijpen. Bij complexere programma’s is het vaak gewenst om tussen de code wat uitleg en commentaar te geven. De compiler moet echter wel weten dat deze extra tekst niet bij de echte code hoort. We kunnen een commentaarregel invoegen door die te laten beginnen met: //. Het is ook mogelijk om een heel blok commentaar in te voegen. Dit blok 30 HOOFDSTUK 1. B3 - JAVALOGO moet dan beginnen met /* en afgesloten worden met */. Een voorbeeld zie je hieronder. /*deze methode tekent 9 rozetten die op de punten van een negenhoek geplaatst zijn*/ public void tekenprogramma() { zijde = 50; afstand = 100; penUit();stap(-50,-150);penAan(); rechts(90); for(int i=0 ; i<9 ; i++) { rozet(zijde); vooruit(afstand); links(40); } } // deze methode tekent een rozet van 45 vierkanten void rozet(double z) { for(int i=0 ; i<45 ; i++) { vierkant(z); rechts(8); } } 1.7 Invoervariabelen 1.7.1 Gebeurtenisgestuurde interactie De programma’s die we tot nu toe gemaakt hebben missen een belangrijke eigenschap die de meeste computerprogramma’s wel hebben: ze zijn niet interactief. De gebruiker kan zo’n programma uitvoeren en wachten op het resultaat (de tekening), maar kan niet communiceren met het programma. De gebruiker kan geen nieuwe invoer leveren, waarop het programma vervolgens reageert met weer een nieuwe uitvoer. We gaan nu een aantal nieuwe elementen in onze programma’s inbouwen, waardoor interactie wel mogelijk wordt. 1.7. INVOERVARIABELEN 31 Gebeurtenisgestuurde programma’s Wanneer je een willekeurig computerprogramma, bijvoorbeeld een tekstverwerker, start, dan gebeurt er meestal het volgende: het programma laat een scherm zien en wacht vervolgens op een gebeurtenis; het wacht tot de gebruiker iets doet. Zo’n gebeurtenis kan bijvoorbeeld zijn: het invullen van een tekstvak, het klikken op een knop, het openen van een menu of het verslepen van een icoon. Na zo’n gebeurtenis komt de computer met een reactie, zoals bijvoorbeeld het openen van een dialoogvenster, het opslaan van een document, of het afsluiten van het programma. In het vorige onderwerpen hebben we JavaLogoprogramma’s leren kennen als een serie opdrachten die achtereenvolgens worden uitgevoerd. Een nieuw aspect van een programma is dat het reageert op gebeurtenissen. 1.7.2 Invoervariabelen gebruiken In eerdere programma’s heb je variabelen gebruikt. In het logotekenap-package is de mogelijkheid ingebouwd om de waarden van variabelen te veranderen, zonder dat het programma opnieuw hoeft te worden gecompileerd en opgestart. Dit noemen we invoervariabelen. Wat is zo’n invoervariabele nu voor ding? Wanneer je het programma uitvoert, dan wordt de invoervariabele zichtbaar als een vakje met een getal erin, waarvan je de waarde kunt veranderen door op pijltjes te klikken of door zelf een getal in te vullen. Bovendien staat er een label bij met een beschrijving. In het applet waarvan de afbeelding hieronder staat, zie je aan de rechterkant zo’n invoervariabele staan. De code van dit applet zie je hieronder. import logotekenap.*; public class Vierkant extends TekenApplet 32 HOOFDSTUK 1. B3 - JAVALOGO { 1 InvoerVariabele zijdeInv; double zijde; public void initialiseer() { zijdeInv = new InvoerVariabele("zijde",0,400,100); maakZichtbaar(zijdeInv); zijde = 100; } 2 3 public void tekenprogramma() { stap(-zijde/2,-zijde/2); vierkant(zijde); } void vierkant(double z) { vulAan("rood"); for(int i=0 ; i<4 ; i++) { vooruit(z); rechts(90); } vulUit(); } 4 public void invoerVarActie(InvoerVariabele iv) { zijde = zijdeInv.geefWaarde(); tekenOpnieuw(); } 5 6 } In de code van het programma zien we nogal wat nieuwe zaken: 1. InvoerVariabele zijdeInv; Dit is een declaratie van een variabele, maar niet van het type double, maar van het type InvoerVariabele. De naam van deze Invoervariabele is zijdeInv (in principe zou je hier iedere naam kunnen gebruiken die je maar wilt). Variabelen kunnen dus eenvoudige getallen zijn (zoals double of int), maar ook een String (een rij letters zoals bijvoorbeeld ”rood”) en andere complexe ’dingen’ met allerlei eigenschappen zijn. Zo’n soort variabele noemen we een object. Een InvoerVariabele is een voorbeeld van een object. 1.7. INVOERVARIABELEN 33 We maken zo weer kennis met een stukje objectgeoriënteerd programmeren. 2. zijdeInv = new InvoerVariabele("zijde",0,400,100); Voordat een object gebruikt kan worden in een programma moet het ’gemaakt’, oftewel ’gecreëerd’ worden. Dat gebeurt in deze regel binnen de methode initialiseer(). Met new InvoerVariabele(...) wordt er een nieuw object van het type InvoerVariabele gemaakt. Dit object wordt vervolgens toegekend aan de naam zijdeInv. Met behulp van de String en de getallen die tussen de haakjes staan, wordt bovendien een aantal eigenschappen van het object vastgelegd: • De String “zijde” bepaalt de tekst die op het label komt te staan. • Het eerste getal is de kleinste waarde die de InvoerVariabele kan aannemen. Het minimum. • Het tweede getal is de grootste waarde die de InvoerVariabele kan aannemen. Het maximum. • Het derde getal is de standaardwaarde van de InvoerVariabele. De default. 3. maakZichtbaar(zijdeInv); Na de creatie van het object, wordt met behulp van deze opdracht de InvoerVariabele zichtbaar gemaakt op de applet. Bovendien komt er een wit paneel aan de rechterkant van het applet waar ook andere InvoerVariabelen worden neergezet. 4. public void invoerVarActie(InvoerVariabele iv) Wanneer de gebruiker van het programma de InvoerVariabele een andere waarde geeft, dan moet het programma daarop reageren met een actie. Wat het programma in dat geval moet doen staat beschreven in de methode: public void invoerVarActie(InvoerVariabele iv) { zijde = zijdeInv.geefWaarde(); tekenOpnieuw(); } Zo’n methode noemen we een event handler omdat deze bepaalt wat er moet gebeuren bij een gebeurtenis (Engels: event). Wanneer de gebruiker iets verandert aan een InvoerVariabele, dan wordt deze methode aangeroepen en uitgevoerd. 5. zijde = zijdeInv.geefWaarde(); Hier wordt de huidige waarde van de InvoerVariabele zijdeInv opgevraagd en toegekend aan de variabele zijde. De methode geefWaarde() is onderdeel van objecten van het type InvoerVariabele en moet dus altijd gebruikt worden in combinatie met zo’n object. Vandaar de uitdrukking zijdeInv.geefWaarde(). Er valt over dit soort zaken nog veel te vertellen, maar we zullen hier op dit moment 34 HOOFDSTUK 1. B3 - JAVALOGO niet verder op in gaan. Voor nu is het voldoende om te weten hoe je de waarde van een InvoerVariabele kunt opvragen. 6. tekenOpnieuw(); Deze opdracht spreekt eigenlijk voor zich: de opdrachten in de methode tekenprogramma() worden opnieuw uitgevoerd. Het resultaat is dat de tekening van het vierkant opnieuw gemaakt wordt, maar nu met de nieuwe waarde van de variabele zijde. 1.7.3 Meer invoervariabelen en keuze We laten nog een ander programma zien waarin twee InvoerVariabelen worden gebruikt. In dit applet kan zowel de breedte als de hoogte van een rechthoek onafhankelijk van elkaar worden aangepast. import logotekenap.*; public class Rechthoek extends TekenApplet { InvoerVariabele breedteInv; InvoerVariabele hoogteInv; double breedte; double hoogte; public void initialiseer() { breedteInv = new InvoerVariabele("breedte",0,400,200); maakZichtbaar(breedteInv); hoogteInv = new InvoerVariabele("hoogte",0,400,100); maakZichtbaar(hoogteInv); breedte = 200; hoogte = 100; } public void tekenprogramma() { stap(-breedte/2,-hoogte/2); vulAan("rood"); vooruit(hoogte); rechts(90); vooruit(breedte); rechts(90); vooruit(hoogte); rechts(90); vooruit(breedte); rechts(90); vulUit(); } public void invoerVarActie(InvoerVariabele iv) { if(iv==breedteInv) { breedte = breedteInv.geefWaarde(); tekenOpnieuw(); } if(iv==hoogteInv) 1.7. INVOERVARIABELEN { 35 hoogte = hoogteInv.geefWaarde(); tekenOpnieuw(); } } } Dit programma lijkt erg veel op het vorige programma. Alleen in de body van de eventhandler public void invoerVarActie(...) staat een keuzeopdracht die we al eerder zagen in ‘B3H07: Taken met keuzeopdrachten’. Hier zien we hoe deze opdracht in Java wordt gebruikt: Er zijn twee soorten keuzeopdrachten. De eerste is: if(voorwaarde) { opdracht1 ; opdracht2 ; .... } Alleen als de voorwaarde klopt, dan worden de opdrachten binnen de body na if(...) uitgevoerd. De tweede is een uitbreiding van de eerste: if(voorwaarde) { opdracht1 ; opdracht2 ; .... } else { opdracht1a ; opdracht2a ; .... } Er komt bij dat als er niet aan de voorwaarde voldaan is, dat dan de opdrachten bij else worden uitgevoerd. Bekijk de volgende regels: if(iv==breedteInv) { breedte = breedteInv.geefWaarde(); tekenOpnieuw(); } Er staat het volgende: als de InvoerVariabele iv waarbij de gebeurtenis plaatsvond gelijk is aan de InvoerVariabele breedteInv, dan moet de breedte worden aangepast en de tekening opnieuw gemaakt. Op dezelfde manier kun je de andere keuzeopdracht vertalen: 36 HOOFDSTUK 1. B3 - JAVALOGO if(iv==hoogteInv) { hoogte = hoogteInv.geefWaarde(); tekenOpnieuw(); } Als de InvoerVariabele iv waarbij de gebeurtenis plaatsvond gelijk is aan de InvoerVariabele hoogteInv, dan moet de hoogte worden aangepast en de tekening opnieuw gemaakt. Let ook even op het teken voor “is gelijk aan”. In Java gebruiken we hiervoor blijkbaar ==. Het gewone gelijkteken, = , wordt gebruikt bij toekenningen en betekent “wordt gelijk aan”. Bijvoorbeeld zijde = 100 betekent eigenlijk: “zijde krijgt waarde 100”.