BVP 2006-2007
Oefenzitting 3 1. Werken met Java1 1.1. Achtergrond
In deze oefenzitting zien we wat er nodig is om vertrekkend van een programma tot een werkend stuk code te komen dat door de computer kan uitgevoerd worden. We beschrijven dit eerst zoals voor de meeste klassieke programmeertalen gangbaar is (Pascal, Delphi, C, … ), om dan over te gaan naar de ietwat bijzondere situatie bij Java en sommige andere programmeertalen. Het probleem is als volgt: hoe breng ik de computer zover bepaalde taken voor mij uit te voeren? Eerst en vooral moet ik als mens die taken op één of andere manier beschrijven. Dit beschrijven komt neer op het schrijven van een programma in een taal die voor de mens begrijpbaar is. De computer verstaat echter slechts één taaltje: zijn eigen laag-niveau machinetaal die bestaat uit een opeenvolging van 1-tjes en 0-letjes. Hoe gebeurt nu de overgang van een programma geschreven in een hogere programmeertaal naar een door de computer uitvoerbaar stukje code? Hiervoor gebruikt men een vertaler (of zogeheten compiler). Een compiler zal elke opdracht beschreven in de gebruikte programmeertaal vertalen naar een correcte sequentie van primitieve operaties die wel door de computer begrijpbaar zijn.
Compiler
Programmeertaal
Machinetaal
Welke werkmiddelen heb je zoal nodig? 1. een tekst-editor. programma-code is niets anders dan tekst. Om je programma te schrijven heb je dus een tekst-editor nodig: een programma waarmee je pure tekst-bestanden kan aanmaken. Hiertoe volstaat reeds een eenvoudige editor zoals notepad. Complexe tekstverwerkers zijn niet geschikt voor deze taak. 2. een vertaler (of compiler): zoals hierboven verteld begrijpt een computer slechts zijn eigen machinetaal. Je hebt dus een vertaler nodig om je programma om te zetten naar de machinetaal van je computer. Het resultaat van het vertalen (of compileren) van je code zal machinecode zijn.
Nu zijn er echter verschillende computerarchitecturen. Programma’s gecompileerd voor PC’s zullen niet bruikbaar zijn op Macintoshmachines en omgekeerd. Code gecompileerd voor het ene type machine is dus nutteloos voor het andere. Als je echt wenst dat je programma op meerdere platformen werkt moet je ook meerdere vertalers hebben.
Machinetaal 1
Compiler
Programmeertaal
Machinetaal 2
Machinetaal 3
1
Met dank aan de MI groep voor het lenen van deze tekst ☺
1
Voor sommige programmeertalen, waaronder Java, heeft men het anders aangepakt. In plaats van het programma te vertalen naar de respectievelijke machinetalen, heeft men besloten om het programma naar één gemeenschappelijke hoog-niveau machinetaal (zogeheten bytecode) om te zetten. Om de instructies in deze hoog-niveau machinetaal uit te kunnen voeren gaat men gebruik maken van een virtuele machine. Deze virtuele machine is niet meer dan zelf een programma dat voor elke opdracht de gepaste sequentie van machine-specifieke instructies uitvoert. Er komt dus geen tweede vertaler bij kijken.
M1 st JV Te a v ja
Compiler javac Test.java
Programmeertaal Test.java
Machinetaal 1
JVM2 java Test
Bytecode Test.class
ja JV va M3 Te st
Machinetaal 2
Machinetaal 3
Het voordeel van deze aanpak is dat als je er van uitgaat dat de gebruikers van je programma de nodige virtuele machine voorhanden hebben, het voldoende is het programma slechts één enkele keer te vertalen. Dit is wat men noemt overdraagbaarheid (portability) van je programma. De werkmiddelen die je in dit schema nodig hebt om beginnend van je initieel programma te komen tot werkende code zijn nu als volgt: 1. een tekst-editor: je moet nog steeds je code met iets neerschrijven. 2. een vertaler: deze keer gaat de vertalen niet naar machinetaal omzetten, wel naar een intermediaire hoog-niveau machinetaal (bytecode). 3. een virtuele machine: om het programma te kunnen uitvoeren heb je een speciale omgeving nodig, namelijk een omgeving die de hoog-niveau instructies begrijpt en er de nodige laagniveau instructies mee kan associëren. Uitvoeren vanop de commandline vergeleken met gebruik van een IDE Zoals je in de les reeds kon zien is de manier van programmeren met een eenvoudige tekst editor en compileren vanuit command line al gauw omslachtig: je moet constant van omgeving wisselen (van je notepad, naar het DOS-venster, en terug), je moet ingewikkelde commando’s intypen, de editor zou toch wel wat beter kunnen zijn, etc… Het hele ontwikkelproces kan dus zeker verbeterd worden. Een mogelijke oplossing is het gebruik van IDE’s (IDE = Integrated Development Environment). Een IDE heeft als eigenschap dat ze rechtstreeks interageren met de compiler. Terijl je in de IDE bijvoorbeeld op “compile” of “execute” klikt, zullen de commando’s javac en java in de achtergrond worden opgeroepen.
2
2. JCreator2 1. IDE Wat is nu een IDE? Een IDE is een programma-ontwikkelingsomgeving waar alle werktuigen die men nodig heeft voor het programmeren geïntegreerd zijn tot één geheel en dus gemakkelijker uitvoerbaar zijn. Een IDE bevat dus altijd een tekst-editor, een knop of menu-item voor het compileren van een programma, een knop of menu-item voor het uitvoeren van het programma, eenvoudige gebruikersinterfaces voor het instellen van specifieke opties, … Ook bieden IDE’s vaak editors aan die beter zijn voor het programmeerwerk dan bijvoorbeeld Notepad: sleutelwoorden krijgen vaak een ander kleur, commentaartekst wordt ook anders afgebeeld, indentatie gebeurt automatisch, … Het voordeel hiervan is dat je een beter overzicht kan behouden op je code, en hopelijk minder typfouten zal maken. De voordelen van het gebruik van een IDE zijn zodanig evident dat we jullie binnen de cursus BVP willen aanmoedigen tot het gebruik ervan. Er bestaan tal van verschillende IDE’s voor Java gaande van kleine verbeterde editors tot zware ontwikkelings-omgevingen. In deze cursus gebruiken we de omgeving JCreator. Deze omgeving is gratis, bevat het merendeel van wat men van een IDE verwacht, en is niet al te complex in gebruik. Wel verwachten we dat je tijdens de oefenzittingen die in de PC-klassen doorgaan, alsook voor de verdediging van je practica, zonder problemen met JCreator overweg kan.
2. JCreator JCreator biedt de mogelijkheid om op een georganiseerde wijze java-toepassingen te schrijven. Deze organisatie steunt op twee concepten: workspaces en projecten. Een workspace bestaat uit één of meerdere projecten, en elk project komt neer op een afzonderlijke toepassing. De projecten die deel uitmaken van een zelfde workspace zijn vaak ergens onderling verwant. Zo zou je voor een bepaalde oefeningzitting één workspace kunnen voorzien, waarbij dan elk van de oefeningen voorgesteld wordt door een afzonderlijk project binnen die workspace. Je zou ook een workspace kunnen zien als een bundel van projecten die voor hetzelfde vak moeten worden gemaakt (een workspace voor BVP, ...). Hoe je het best gebruik maakt van het concept workspace is voor deze cursus weinig relevant: het komt erop neer dat je moet weten dat JCreator met deze concepten werkt en dat je je programma’s moet zien als projecten die deel moeten uitmaken van een workspace. Wanneer je dus met JCreator een toepassing wenst te schrijven moet je er een nieuw project voor maken. Vermits elk project met een workspace moet geassocieerd worden zal je een workspace moeten kiezen (of nieuw aanmaken). JCreator werkt met workspaces en projecten. Elk project behoort tot een worspace en elke workspace kan één of meerdere projecten bevatten.
2
Wederom dank aan de MI groep voor de basistekst ☺
3
Het is een goede gewoonte de logische projectstructuur te vertalen naar een fysische structuur op schijf …
3. Een eenvoudige toepassing Aan de hand van het eenvoudige Hello World! programma zullen we de algemene werking van JCreator uitleggen ... Stap 1
Stap 2
Opstarten van JCreator Kies Start Menu → Programs → External → Jcreator LE. Je zou dan een scherm moeten krijgen wat er als volgt uitziet …
Indien dit niet zo is, dan zal er waarschijnlijk reeds een workspace open staan. Je kan deze workspace afsluiten via het menu File → Close Workspace. Nieuw project, nieuwe workspace aanmaken Vermits een workspace enkel een zinvol concept is als er ook een project aan gekoppeld is, is er in JCreator voorzien dat als je een nieuw project aanmaakt, je meteen voor de keuze gezet wordt of je het nu in een nieuwe workspace wenst te plaatsen of in de huidig openstaande workspace. Vermits we op dit moment nog geen workspace ter beschikking hebben, zullen we de eerste optie moeten kiezen.
4
• • • • • • •
Stap 3
Kies het menu File → New… Kies de tab “Projects” Klik in het linkervenster het icoon “Empty Project” aan Zet als Location d:\user_<je studentennr> Zet als project naam EersteToepassing (geen spaties) Zoals verwacht, vermits we nog geen workspace hebben open staan, kan men enkel de optie “Create New Workspace” kiezen. Klik op “Finish” (met de opties Classpath en Tools kan je kiezen welke compiler je gebruikt, maar dit zou moeten goedstaan na de installatie van Jcreator).
Het effect van deze operatie zal zijn dat er een nieuwe workspace wordt aangemaakt waarin zich één project bevindt, namelijk EersteToepassing. Merk op dat de workspace dezelfde naam draagt. Initieel is het project leeg. Nieuw bestand toevoegen aan project Maak een bestand met de naam HelloWorld.java en voeg het toe aan het EersteToepassing project. • • • • • •
Kies het menu: File > New… of klik op het icoon Kies de tab “Files” Kies “Java File” Geef het bestand een naam. Let op de regel dat een java-bestand de naam moet dragen van de hoofdklasse die erin gedefinieerd wordt. We kiezen hier HelloWorld.java. Als Location zal er automatisch de plaats staan waar je het project hebt staan Klik op “OK”
5
Stap 4
Code schrijven Door in het project-overzicht te klikken op de vers toegevoegde bestandsnaam wordt rechts de inhoud van dat bestand getoond. Op dit moment is het bestand leeg. In datzelfde venster kan je het bestand nu editeren. Schrijf nogmaals de HelloWorld-klasse over. Merk op dat reeds bij het typen de kleuren van bepaalde woorden veranderen (public, class, void, ook de haakjes worden anders gekleurd, commentaar verschijnt in het groen, etc… ).
Stap 5
Compileren Terwijl deze operatie er voorheen in bestond een DOS-venster te openen en eigenhandig een bevel in te typen, zo volstaat het nu om gewoon op te klikken. Je kan het compileren ook opstarten via het menu Build → Compile Project, of door de toets F7 in te drukken. Dit compileren duurt dan eventjes. Van zodra het compilatieprocess afgelopen is zou er in het onderste scherm de mededeling “Process completed” moeten verschijnen.
6
Stap 6
Indien er foutmeldingen verschijnen, heb je waarschijnlijk ergens een fout gemaakt bij het schrijven van de code. Tracht de foutmeldingen te gebruiken om je fouten terug te vinden (door te klikken op een foutmelding, verschijnt er in het bestand een rood pijltje bij de plaats waar de compiler beweert dat er een probleem is). Als een project uit meer dan 1 bestand bestaat, en je wil niet alle bestanden compileren, dan kan je via het menu Build → Compile File dit verwezenlijken Uitvoeren Het uitvoeren van de toepassing gebeurt even gemakkelijk als het compileren. Het volstaat om op
te klikken. Je kan dit ook via de menu’s doen, of gebruik makend van de F5 toets.
7
Om echt efficiënt met een IDE te kunnen werken moet je er wat ervaring mee opdoen. Toch zouden er reeds enkele voordelen tot uiting moeten zijn gekomen: • •
•
Het feit dat de editor sleutelwoorden, haakjes, commentaar e.d. in kleur zet maakt het schrijven en nalezen van de code makkelijker. Ook worden sommige haakjes automatisch voor je aangevuld. Misschien is het instellen van de juiste opties wel wat moeizaam, maar eens die moeite geleverd werd is het enkel kwestie van op de juiste knopjes te drukken om je project te compileren en te runnen (vergelijk dit met de ellenlange bevelen die je in het DOS-venster moest schrijven). De foutmeldingen van de compiler worden in hetzelfde hoofdscherm afgebeeld als de bestanden die gecompileerd worden. Door op de foutmeldingen te klikken wordt er in de editor aangegeven van waar de fout eventueel zou kunnen komen. Dit maakt het vinden van de fouten makkelijker, en dus de ontwikkelingscyclus van de software korter.
Bekijk ook eens de bestanden die bij deze oefening werden aangemaakt (gebruik hiervoor Windows Explorer). Zoals je ziet is nu de zaak heel wat complexer dan in de eerste oefening. Er werden bijkomende folders aangemaakt, en er zijn enkele extra bestanden bijgekomen. Zo vind je naast de verwachtte .java en .class bestanden, ook nog .jcw en .jcp bestanden. Dit zijn bestanden waarin bijkomende informatie bewaard wordt over respectievelijk je workspace (welke projecten er bijvoorbeeld deel van uitmaken), en je project (zo zullen de extra compilatie-opties die je hebt ingegeven hierin bewaard zijn).
4. Een toepassing met in- en uitvoer We maken tijdens de oefenzittingen gebruik van de klasse Scanner om invoer te vragen aan de gebruiker. Deze sectie toont in 2 stappen hoe je in je project in JCreator kunt er voor zorgen dat deze klasse kan gebruiken. We veronderstellen wel dat je al een project hebt geopend of een nieuw heb aangemaakt in een directory hier aangeduid door ProjectMap. Stap 1
Stap 2
Een import statement schrijven Om de functionaliteit van klassen te kunnen gebruiken die niet in de standaard Java.Lang package zitten, moet je die eerst importeren. Hiervoor schrijf je boven de declaratie van de klasse het statement “import java.util.Scanner;” Testen Nu de compiler “weet” waar hij moet gaan zoeken naar de voor hem vreemde klasse Scanner, kunnen we ermee aan de slag. Probeer bij voorbeeld het volgende: Scanner newscan = new Scanner(System.in); int getal1; getal1 = newscan.nextInt(); Welke foutmelding krijg je wanneer je het import statement weglaat ? Kan je dit verklaren ? Welk import statement werkt analoog aan het bovenstaande ? (hint: je dient het * symbool te gebruiken)
3. Opwarmer - Kwadraten Maak een programma dat de som berekent van alle kwadraten van alle natuurlijke getallen in het interval [1..x]. Lees het getal x in met behulp van de klasse Scanner en schrijf daarna het resultaat uit.
8
4. Cirkel 1. Opgave Schrijf een Java programma dat de oppervlakte van het gearceerde gebied in onderstaande figuur berekent.
ri
ro
De invoer bestaat uit twee positief natuurlijke getallen: ro (outer straal) en ri (inner straal). Deze twee getallen worden door middel van Scanner in gelezen. Deze opdracht los je op met behulp van JCreator.
2. JCreator •
Maak een nieuw project aan binnen de workspace EersteToepassing. Maak nog een nieuw bestand aan waarin je de nodige code neerschrijft (enkel een main methode). Compileer en voer uit.
5. Extra Indien je nog tijd over hebt kan je proberen om de opgaven, die deze week tijdens de schriftelijke oefenzitting aan bod kwamen, in de pcklas te implementeren.
9