Inhoud leereenheid 8
Programmeren in JavaLogo (1) Introductie 73 Leerkern 75 1
Inleiding 75 Wat is programmeren? 75 1.2 Logo, Java en JavaLogo 76 Eerste programma’s 77 2.1 Pen en Tekenblad 77 2.2 Een volledig JavaLogo-programma 80 2.3 Pen en tekenblad nader bekeken 82 Extra methoden 87 3.1 Zelf methoden toevoegen 88 3.2 Zelfgedefinieerde methoden uitvoeren 90 1.1
2
3
Samenvatting 94 Zelftoets 95 Terugkoppeling 97 1 2
Uitwerking van de opgaven 97 Uitwerking van de zelftoets 101
Bijlage: JCreator en JavaLogo installeren en gebruiken 103
72
Leereenheid 8
Programmeren in JavaLogo (1)
INTRODUCTIE
In de leereenheden 6 en 7 hebben we enkele activiteiten in het objectgeoriënteerd ontwikkelen van informatiesystemen nader onderzocht: analyse in leereenheid 6 en ontwerp in leereenheid 7. In deze en de volgende leereenheid besteden we aandacht aan implementatie: deze twee leereenheden bevatten een korte inleiding in programmeren. Bij analyse en ontwerp zijn we uitgegaan van objectgeoriënteerde methoden. Daarbij past een objectgeoriënteerde programmeertaal zoals Java, de taal die ook in andere programmeercursussen van de Open Universiteit wordt gebruikt. In Java is het mogelijk om zelf klassen te maken met attributen en methoden en om nieuwe objecten te creëren waar vervolgens berichten heen gestuurd kunnen worden. Het werken met Java is vrij ingewikkeld; in twee leereenheden zouden we daar niet ver mee komen. We hebben daarom gekozen voor een andere, op Java gebaseerde taal, die JavaLogo heet. In deze taal kunnen berichten gestuurd worden naar een paar vaste objecten, met als belangrijkste een object pen dat een instantie is van een klasse Pen. Met behulp van die berichten kunnen we dit penobject een tekening laten maken op een tekenblad (ook een vast object). We zullen beginnen met eenvoudige tekeningen, maar in de loop van de twee leereenheden zult u voldoende leren om ook meer complexe tekeningen te kunnen maken, evenals eenvoudige animaties (een mogelijkheid die ingebouwd is in JavaLogo). Als voorproefje tonen we een paar opnamen van een animatie die u aan het eind van de volgende leereenheid leert maken (zie figuur 8.1).
FIGUUR 8.1
OU
Uitwaaierende vierkanten; drie stadia uit een animatie (in kleuren rood, blauw en geel)
73
Inleiding informatica
We beginnen deze leereenheid met een korte uitleg over wat programmeren is (paragraaf 1) en waar de gebruikte taal JavaLogo vandaan komt (paragraaf 2). In de rest van de leereenheid gaan we in JavaLogo programma’s schrijven, die u ook daadwerkelijk gaat uitvoeren. LEERDOELEN
Na het bestuderen van deze leereenheid wordt verwacht dat u – kunt aangeven hoe een JavaLogo-programma is opgebouwd en welke functies de methoden initialiseer() en tekenprogramma() hierin hebben – weet welke parameters de methoden vooruit, links, rechts, aan, uit, vulAan en vulUit van klasse Pen hebben en wat het effect is van een bijbehorend bericht naar het standaardobject pen – weet welke parameter de methode achtergrondkleur van de klasse Tekenblad heeft en wat het effect is van een bijbehorend bericht naar het standaardobject tekenblad – een reeks opdrachten naar het object pen kunt interpreteren als een eenvoudige tekening en omgekeerd een dergelijke tekening ook kunt beschrijven met behulp van een reeks berichten naar pen – weet hoe u extra methoden kunt definiëren en deze methoden kunt laten uitvoeren met behulp van een bericht – het verschil weet tussen de typen double en String – commentaar kunt opnemen in een JavaLogo-programma en ook weet wat de functie daarvan is – JavaLogo-programma’s kunt laten uitvoeren met behulp van JCreator – de betekenis kunt geven van de volgende kernbegrippen: programmeren, machinetaal, hogere programmeertaal, opdracht, tracen, type, parameter. Studeeraanwijzingen Het is de bedoeling dat u de programma’s die u in de opgaven schrijft, ook echt door uw computer laat uitvoeren. In de bijlage bij deze leereenheid wordt uitgelegd hoe u de benodigde software daarvoor op uw computer kunt installeren en hoe u daarmee om moet gaan. De installatie wordt beschreven in paragraaf 1 van de bijlage. U kunt deze naar keuze nu uitvoeren of voordat u opgave 8.2 maakt. Programmeeropdrachten hebben bijna altijd meer dan één goede uitwerking. Zo kan een vierkant bijvoorbeeld linksom of rechtsom getekend worden en kan er op elk van de vier hoekpunten begonnen worden met tekenen. In de terugkoppeling tonen we steeds één mogelijkheid. Hebt u een andere oplossing die ook werkt, vergelijk die dan even met de uitwerking in de terugkoppeling; in veel gevallen zal uw oplossing net zo goed zijn. De studielast van deze leereenheid bedraagt ongeveer 6 uur.
74
OU
Leereenheid 8
Programmeren in JavaLogo (1)
LEERKERN
Komt aan de orde in leereenheid 14.
Hogere programmeertaal
Fortran
Inleiding
1.1
WAT IS PROGRAMMEREN?
Een computer doet niets uit zichzelf. Voor iedere taak die door een computer wordt uitgevoerd, is een programma nodig: een voorschrift dat door de computer kan worden verwerkt, waarin precies en ondubbelzinnig is vastgelegd wat de computer moet doen.
Programma
Machinetaal
1
Hoe verloopt die verwerking? Het hart van een computer is de processor, ook wel de centrale verwerkingseenheid genoemd. Deze processor kan eenvoudige instructies verwerken, met betekenissen als ‘tel deze twee getallen bij elkaar op’, ‘zet deze rij enen en nullen in geheugenplaats A’ of ‘ga verder met de instructie op geheugenplaats X als de inhoud van geheugenplaats A ongelijk is aan nul’. Die instructies zijn gesteld in machinetaal. Ieder type processor heeft zijn eigen machinetaal. Een programma is niets anders dan een rij van die instructies. Toen computers pas bestonden, werden programma’s direct in machinetaal geschreven. Inmiddels hoeven we als programmeur niet eens meer te weten hoe de machinetaal er uitziet van de computer die we gebruiken. We formuleren ons programma in een geschikte algemene programmeertaal en laten het aan de computer over daar machinetaal van te maken. Zo’n hogere programmeertaal is dus, in tegenstelling tot de machinetaal, onafhankelijk van welke processor dan ook. In het begin leken hogere programmeertalen nog vrij veel op machinetalen. Figuur 8.2 laat een stukje zien uit een programma geschreven in de allereerste hogere programmeertaal Fortran, waarvan de oudste versie stamt uit 1954. X = G N = 0 1 IF (X) 2, 2, 3 2 STOP 3 X = X - D N = N + 1 GOTO 1 FIGUUR 8.2
Een stukje programma in Fortran
Een Fortran-programma bestond net als een machinetaalprogramma uit een rij eenvoudige instructies. Veel structuur had een Fortranprogramma verder niet. Naarmate de hardware krachtiger werd en de programma’s groter werden, werd de noodzaak van een goede structurering van programma’s ook steeds groter. Programmeertalen kwamen daardoor steeds verder van de machinetaal af te staan. Dat maakt het vertaalproces naar machinetaal moeilijker, maar het schrijven van programma’s een stuk makkelijker.
OU
75
Inleiding informatica
Klassedefinitie Methodedefinitie
In objectgeoriënteerde programmeertalen schrijven de programmeurs zelf klassen, met attributen en methoden. Het is gebruikelijk deze activiteit het definiëren van klassen te noemen; het resultaat heet een klassedefinitie. In een gedefinieerde klasse komen onder andere methodedefinities voor. Daarnaast kunnen programmeurs ook allerlei klassen gebruiken die al door anderen gedefinieerd zijn. Figuur 8.3 toont een deel van de Java-implementatie van de klasse Rekening uit leereenheid 6. U herkent vermoedelijk wel de attributen rekeningnummer, naam en saldo en de methode schrijfBij die het saldo verhoogt met het meegegeven bedrag. class Rekening { int rekeningnummer; String naam; double saldo; public void schrijfBij(double bedrag) { saldo = saldo + bedrag; } ... } FIGUUR 8.3
Een stukje programma in Java
Het zal duidelijk zijn dat het vertalen van een Java-programma naar machinetaal complexer is dan de vertaling van een Fortran-programma. Wat daar allemaal bij komt kijken, is voor ons niet van belang. Het is wel interessant om te kijken wat er ongeveer gebeurt bij de uitvoering van een Java-programma. Als het programma start, zijn er nog geen objecten; als eerste moeten die dus worden aangemaakt (minstens één). Dan kan daar vervolgens een bericht heen worden gestuurd. Bij het uitvoeren van de bijbehorende methode kunnen er berichten naar andere objecten worden verstuurd, zoals we gezien hebben in leereenheid 7. Er kunnen daarbij ook nieuwe objecten worden aangemaakt, die ook weer berichten kunnen ontvangen en versturen. Op die manier werken de objecten samen om de beoogde taak uit te voeren. 1.2
LOGO, JAVA EN JAVALOGO
Midden jaren zestig bedacht de wiskundige Seymour Papert de taal Logo. Papert heeft gewerkt bij Piaget, een bekende psycholoog die veel ontdekt heeft over het verloop van leerprocessen, vooral bij kinderen. Bij het ontwerp van Logo ging het niet om het programmeren op zich, maar om aan kinderen een gereedschap te geven waarmee ze zelf al ontdekkend van alles zouden kunnen leren. Logo kende verschillende vormen waarmee verschillende kennisgebieden verkend konden worden, zoals taal, muziek, wiskunde en robotica. Het populairst werd de omgeving die gebruikmaakte van een turtle: een bestuurbare afbeelding van een schildpad die bij het lopen over het scherm een spoor naliet. De bestuurbare pen waarmee u in deze cursus gaat werken, is een nazaat van deze schildpad.
76
OU
Leereenheid 8
Programmeren in JavaLogo (1)
Logo is een leuke en aansprekende taal om de basisprincipes van programmeren te verkennen, maar wordt inmiddels vrijwel niet meer gebruikt. Een taal die op dit moment wel zeer veel gebruikt wordt, is de programmeertaal Java. Java is ontstaan in 1995. De taal dankt zijn populariteit onder meer aan het feit dat het de eerste taal was die het mogelijk maakte om een programma in te bouwen in een webpagina. Tot de komst van Java waren webpagina’s niet veel meer dan folders. Inmiddels kan dat ook op allerlei andere manieren en wordt Java ook voor andere toepassingen gebruikt. Java is een krachtige taal, ook dankzij de inmiddels zeer grote bibliotheek van kant-en-klare klassen die een programmeur kan gebruiken. Sinds 1997 gebruikt de Open Universiteit Java in programmeercursussen. Om daarbij aan te sluiten, willen we ook in deze cursus gebruikmaken van Java. Het werken met Java is echter vrij ingewikkeld en voert te ver voor deze inleidende cursus. We maken daarom gebruik van de taal JavaLogo, die op Java is gebaseerd. Javalogo is bedacht door Peter Boon en ontwikkeld door Peter Boon en Paul Bergervoet. Zij hebben klassen geschreven die het mogelijk maken om Logo-opdrachten te gebruiken als berichten aan objecten als pen en tekenblad. JavaLogo is dus in feite een uitbreiding van Java, maar verbergt veel van de onderliggende functionaliteit voor de programmeur. JavaLogo is daarom geschikt om de beginselen van objectgeoriënteerd programmeren uit te leggen, zonder al te veel detailkennis van Java te introduceren. 2
Eerste programma’s
2.1
PEN EN TEKENBLAD
De twee belangrijkste objecten die JavaLogo ons ter beschikking stelt, zijn het object pen en het object tekenblad. Het object pen is een instantie van de klasse Pen; het tekenblad is een instantie van de klasse Tekenblad. De pen tekent op het tekenblad. In JavaLogo tekenen we met de pen op een tekenblad van 500 bij 500 pixels. Een pixel is de maateenheid van afbeeldingen op een computerscherm. Een heel scherm heeft bijvoorbeeld een afmeting van 1024 × 768 pixels (maar meer of minder komt ook voor; dat hangt van het scherm en de instellingen af). Bij het besturen van de pen moeten we vier dingen in de gaten houden: – de positie van de pen op het tekenblad – de richting waarin de pen aan het bewegen is (In Logo werden lijnen getekend door een schildpad die altijd vooruit liep; de richting bepaalde welke kant de schildpad op een bepaald moment opkeek.) – of de pen aan is (op het tekenblad staat) of uit (van het tekenblad af, wat het mogelijk maakt om de pen te bewegen zonder dat er iets wordt getekend) – de kleur waarmee de pen tekent.
OU
77
Inleiding informatica
Als we beginnen te tekenen, staat de pen altijd in het midden van het blad, en wijst naar boven (zie figuur 8.4). De pen is dan aan.
FIGUUR 8.4
Tekenblad en pen (het bolletje geeft de plaats aan van de pen; het pijltje de huidige richting)
Figuur 8.5 toont de attributen en de methoden van de klasse Pen (we tonen de volledige klasse in paragraaf 2.3).
FIGUUR 8.5
Klasse Pen
Het attribuut positie bepaalt waar de pen zich op het tekenblad bevindt. Het attribuut richting bepaalt de richting waarin de pen beweegt. Het attribuut aanOfUit geeft aan of de pen aan is (op het tekenblad staat) of uit.
Parameter
78
We kunnen de pen besturen met behulp van de volgende opdrachten. – pen.aan(kleur) zet de pen op het tekenblad en bepaalt de tekenkleur. Voor de kleur, die tussen haakjes staat, moet in deze opdracht een concrete kleur worden ingevuld tussen dubbele aanhalingstekens, bijvoorbeeld pen.aan("rood") of pen.aan("blauw"). We noemen kleur een parameter van de opdracht. Het is in feite een nadere precisering (‘zet de pen aan, en wel met tekenkleur rood’). – pen.uit() haalt de pen van het tekenblad. – pen.vooruit(aantalPixels) beweegt de pen het opgegeven aantal pixels vooruit, in de huidige richting. Als de pen aan is, wordt een lijn getekend. Ook deze opdracht heeft een parameter: het aantal pixels. We schrijven dus bijvoorbeeld pen.vooruit(30) of pen.vooruit(122). – pen.links(hoek) draait de pen naar links (tegen de wijzers van de klok in), over de aangegeven hoek (in graden). – pen.rechts(hoek) draait de pen naar rechts (met de klok mee), over de aangegeven hoek. Bij de opdrachten links en rechts moet de hoek dus als parameter worden opgegeven.
OU
Leereenheid 8
Voorbeeld: twee bergen
Programmeren in JavaLogo (1)
Als eerste voorbeeld gaan we de pen het berglandschap laten tekenen dat in figuur 8.6 wordt getoond.
FIGUUR 8.6
Twee bergen
De reeks opdrachten die samen deze tekening maken, ziet er als volgt uit (de regelnummers horen niet bij de opdrachten): 1 2 3 4 5 6 7 8 9 10 11 12 13
Opdracht
pen.aan("zwart"); pen.rechts(45); pen.vooruit(100); pen.rechts(90); pen.vooruit(100); pen.rechts(135); pen.uit(); pen.vooruit(30); pen.aan("zwart"); pen.rechts(135); pen.vooruit(80); pen.rechts(90); pen.vooruit(80);
We noemen een bericht aan het object pen een opdracht. We zullen later ook opdrachten behandelen die iets anders doen dan een bericht versturen. Merk op, dat na elke opdracht een puntkomma moet staan en dat de kleur zwart tussen dubbele aanhalingstekens staat. Uw programma werkt niet als u intypt: pen.aan(zwart)! Merk ook op, dat alle opdrachten een parameter hebben, behalve pen.uit(); dat behoeft geen nadere precisering. De haakjes moeten er echter wel staan: typt u daar pen.uit, dan gaat het fout. Figuur 8.7 laat precies zien waar de pen na elke opdracht staat en in welke richting deze wijst. Opdracht 7 haalt de pen van het tekenblad en beweegt deze dus niet; na de verplaatsing in opdracht 8 wordt de pen in opdracht 9 weer op het tekenblad geplaatst. Ga zelf na dat de hoeken waarover gedraaid wordt, kloppen. De eerste draai gaat over 45° (de helft van een rechte hoek). Voor de bergtoppen wordt 90° gedraaid. In de opdrachten 6 en 10 wordt 135° gedraaid (de som van 90° plus 45°).
FIGUUR 8.7
OU
Richting en positie van de pen na elke opdracht
79
Inleiding informatica
OPGAVE 8.1
Geef een reeks opdrachten voor het tekenen van een vierkant met een zijde van 100 pixels. 2.2
EEN VOLLEDIG JAVALOGO-PROGRAMMA
Een volledig JavaLogo-programma moet meer bevatten dan alleen de opdrachten aan de pen. Ieder JavaLogo-programma is in feite zelf een nieuwe klasse, waarvan we de naam zelf kunnen bepalen (bijvoorbeeld OnzeKlasse). Voor we een voorbeeld van zo’n klasse laten zien, leggen we globaal uit hoe JavaLogo werkt. Bij het opstarten wordt allereerst een instantie van OnzeKlasse gemaakt en vervolgens worden daar twee berichten naar toe gestuurd, namelijk initialiseer() en tekenprogramma(). Wij zullen er dus voor moeten zorgen dat OnzeKlasse die berichten kan afhandelen: de klasse moet methoden initialiseer() en tekenprogramma() hebben. Dit wordt geïllustreerd in figuren 8.8 en 8.9. Omdat in figuur 8.9 de instantie van OnzeKlasse pas bestaat nadat die wordt gecreëerd, tekenen we die wat lager.
FIGUUR 8.8
Een JavaLogo-programma is een klasse met (minimaal) twee methoden
FIGUUR 8.9
Schematische voorstelling van het uitvoeren van een JavaLogo-programma
Figuur 8.10 toont een volledig JavaLogo-programma voor het berglandschap uit figuur 8.6. 1
import logotekenap.*; public class Bergen extends TekenApplet {
80
OU
Leereenheid 8
public void initialiseer() { }
5
public void tekenprogramma() { pen.aan("zwart"); pen.rechts(45); pen.vooruit(100); pen.rechts(90); pen.vooruit(100); pen.rechts(135); pen.uit(); pen.vooruit(30); pen.aan("zwart"); pen.rechts(135); pen.vooruit(80); pen.rechts(90); pen.vooruit(80); }
10
15
20
25
Programmeren in JavaLogo (1)
}
FIGUUR 8.10
Een volledig JavaLogo-programma
We lichten deze code globaal toe. Merk op, dat de regelnummers geen onderdeel van het programma vormen. Ze zijn slechts in figuur 8.10 toegevoegd om in onderstaande uitleg eenvoudig te kunnen aangeven welke regel we bedoelen.
Klasse Bergen
Regel 1 is nodig om de klassen Pen en Tekenblad te kunnen gebruiken. In de regels 3 tot en met 25 definiëren we de klasse Bergen. Bergen is de naam van het programma, en zoals vermeld is het programma zelf ook een klasse. Op regel 3 staat de kop van de klasse. In die kop wordt onder meer de naam vermeld (Bergen) en het feit dat deze klasse een uitbreiding is van de klasse TekenApplet. Dit heeft te maken met JavaLogo; op de details gaan we niet in. Meteen na de kop van de klasse Bergen volgt op regel 4 een accolade; het programma eindigt met de bijbehorende sluitaccolade in regel 25. Tussen die accolades staan de methoden initialiseer en tekenprogramma. (Later komt daar nog het een en ander bij). Bij het uitvoeren van het JavaLogoprogramma worden de opdrachten in deze twee methoden uitgevoerd: eerst die uit initialiseer en dan die uit tekenprogramma.
Methode initialiseer
De methode initialiseer bevat opdrachten die uitgevoerd moeten worden vóór met tekenen wordt begonnen. De methode bestaat uit een kopregel (regel 5), een openingsaccolade (regel 6) en een sluitaccolade (regel 7). Er staan tussen die accolades geen opdrachten: deze methode hoeft dus niets te doen! De kopregel vermeldt dat de methode ook voor andere objecten zichtbaar is (public), dat deze geen terugkeerwaarde heeft (void, wat Engels is voor leeg).
Methode tekenprogramma
De methode tekenprogramma bevat de penbewegingen. De methode begint op regel 9 met een kopregel. De kopregel vermeldt dat deze methode voor andere objecten zichtbaar is (public) en geen terugkeerwaarde heeft (void). De kopregel bevat verder de naam van de methode en een paar
OU
81
Inleiding informatica
haakjes (als de methode parameters had, dan zouden die daar tussen staan). Na de kopregel volgt een openingsaccolade (regel 10), een serie opdrachten die u al kent uit de vorige paragraaf (regels 11-23), en een sluitaccolade waarmee de methode wordt afgesloten (regel 24). Tot slot merken we nog op, dat sommige woorden vet staan gedrukt; deze hebben een speciale betekenis in Java. OPGAVE 8.2
Installeer, als u dat nog niet gedaan hebt, nu eerst de software (zie paragraaf 1 van de bijlage). a Maak gebruik van de aanwijzingen in de bijlage om het programma uit figuur 8.10 daadwerkelijk op uw computer in te typen en uit te voeren. Neem de opdrachten precies zo over (denk aan de puntkomma’s en gebruik in dit geval nergens hoofdletters)! b Voeg aan de methode initialiseer één opdracht toe, als volgt. Neem ook nu de opdracht precies zo over; denk aan de puntkomma en let op de hoofdletters T en M. public void initialiseer() { maakTraceMogelijk(); }
Voer het programma opnieuw uit. Wat is het effect? Wat kunt u met de verschillende knoppen die u er nu bij krijgt? Tracen
Tracen betekent de uitvoering van een programma stap voor stap volgen. De tracemogelijkheid in JavaLogo is onmisbaar bij het aan de praat krijgen van programma’s. Bij het besturen van de pen is een fout namelijk snel gemaakt, waardoor uw tekening er geheel anders uit komt te zien dan de bedoeling was. Draait u bijvoorbeeld in regel 16 van het programma 45° naar links in plaats van 135° naar rechts, dan ziet uw tekening er opeens uit als getoond in figuur 8.11. Met behulp van de tracemogelijkheid kunt u dan achterhalen welke opdracht fout is.
FIGUUR 8.11 2.3
Klasse Pen
82
Eén foute draai en de berg staat op zijn kop.
PEN EN TEKENBLAD NADER BEKEKEN
Figuur 8.12 toont alle methoden van de klasse Pen. We zullen nu een volledige specificatie geven van deze methoden (in paragraaf 2.1 hebben we een aantal bijzonderheden nog niet vermeld).
OU