Oefeningen bij de cursus java



Vergelijkbare documenten

VI. Klassen en objecten

Zo vind u hierin de volgende documentatie over de klasse Applet: +----java.awt.panel java.applet.applet

X. Grafische elementen

IMP Uitwerking week 13

voegtoe: eerst methode bevat gebruiken, alleen toevoegen als bevat() false is

Zelftest Programmeren in Java

Overerving & Polymorfisme

Imperatief Programmeren, derde deeltentamen (INFOIMP) 4 november 2005

Vakgroep CW KAHO Sint-Lieven

Datatypes Een datatype is de sort van van een waarde van een variabele, veel gebruikte datatypes zijn: String, int, Bool, char en double.

Game of Life in Java

Omschrijf bij ieder onderdeel van de methode de betekenis ervan. Java kent twee groepen van klassen die een GUI kunnen maken: awt en swing.

Programmeren in Java les 3

Modelleren en Programmeren

Kleine cursus PHP5. Auteur: Raymond Moesker

Een stoomcursus door Edgar de Graaf, november 2006

Tentamen Imperatief en Object-georiënteerd programmeren in Java voor CKI

public Paneel() { knop = new JButton( Klik ); knop.addactionlistener( new KnopHandler() ); tekstvak = new JTextField(10); add(knop); add(tekstvak);

Uitwerking Aanvullend tentamen Imperatief programmeren Woensdag 24 december 2014, uur

Ingebouwde klassen & methodes

eerste voorbeelden in Java

NAAM: Programmeren 1 Examen 29/08/2012

APPLICATIEBOUW 3E COLLEGE: OBJECT GEORIËNTEERD PROGRAMMEREN, METHODEN, PARAMETERS, SCOPE VAN VARIABELEN. Onderdeel van SmartProducts

Tentamen Objectgeorienteerd Programmeren IN1205 Voorbeeld

Voorbeeldtentamen Inleiding programmeren (IN1608WI), Oktober 2003, , Technische Universiteit Delft, Faculteit EWI, Afdeling 2.

Uitwerkingen Tweede deeltentamen Imperatief programmeren Vrijdag 15 oktober 2010, uur

Abstracte klassen & Interfaces

Tentamen Object Georiënteerd Programmeren TI oktober 2014, Afdeling SCT, Faculteit EWI, TU Delft

Programmeren (1) Examen NAAM:

Labo 2 Programmeren II

Beginselen van programmeren Practicum 1 (Doolhof) : Oplossing

Voor het bepalen van de getalswaarde van een string is een standaardmethode beschikbaar: n = Integer.parseInt(s);

Java spiekbrief. Commentaar. Definitie van een methode. Types. Variabelendeclaratie. Definitie van een klasse. Namen. Definitie van een veld

NAAM: Programmeren 1 Examen 21/01/2011

Modelleren en Programmeren

Hoofdstuk 1: Inleiding. Hoofdstuk 2: Klassen en objecten Datahiding: afschermen van implementatiedetails. Naar de buitenwereld toe enkel interfaces.

Modelleren en Programmeren

Tentamen Imperatief Programmeren

sheets Programmeren 2 Java Recursie, de muis en graphics Walter Kosters

Scala. Korte introductie. Sylvia Stuurman

Informatica. Objectgeörienteerd leren programmeren. Van de theorie met BlueJ tot een spelletje met Greenfoot... Bert Van den Abbeele

Een topprogrammeur in het OO programmeren is Graig Larman. Hij bedacht de volgende zin:

Wat is een grafische gebruikersinterface (GUI)?

Uitwerking Tweede deeltentamen Imperatief programmeren - versie 1 Vrijdag 21 oktober 2016, uur

HOGESCHOOL VAN AMSTERDAM Informatica Opleiding. CPP 1 van 10

Modelleren en Programmeren

Java spiekbrief. Commentaar. Definitie van een methode. Types. Variabelendeclaratie. Definitie van een klasse. Namen. Definitie van een veld

Universiteit van Amsterdam FNWI. Voorbeeld van tussentoets Inleiding programmeren

Lessen Java: Reeks 3. David Blinder Jan G. Cornelis

Programmeren in C# Interfaces. Hoofdstuk 23

Modelleren en Programmeren

Opdracht 7a. Applicatiebouw 2014/2015

Objectgeorïenteerd werken is gebaseerd op de objecten die door het systeem gemanipuleerd worden.

INFORMATICA 1STE BACHELOR IN DE INGENIEURSWETENSCAPPEN

Tentamen Object Georiënteerd Programmeren TI januari 2013, Afdeling SCT, Faculteit EWI, TU Delft

Deel 1 : Gesloten Boek

6.2 VBA Syntax. Inleiding Visual Basic

Info-books. Toegepaste Informatica. Deel 37: Programmeren in Java HO37. K. Behiels - J. Gils

Lessen Java: Reeks pag. 1

Objectgeoriënteerd programmeren in Java 1

Modelleren en Programmeren

Tentamen Inleiding Programmeren (IN1608WI), 2 februari 2012, , Technische Universiteit Delft, Faculteit EWI, Afdeling 2.

Tentamen in2705 Software Engineering

Programmeren in Java 3

Java. Basissyllabus. Egon Pas

6.3 VBA Syntax Instructie. Wij gaan de Visual Basic Editor opnieuw openen, om de instructie die wij zojuist getypt hebben, nader te bekijken.

Derde deeltentamen Imperatief programmeren - versie 1 Vrijdag 10 november 2017, uur

Programmeren 1 23 januari 2013 Prof. T. Schrijvers

SPOJ oplossingen Gilles Callebaut 7 augustus 2015

Stel dat u 15 tellers nodig heeft. Dat kunt u een array van tellers als volgt declareren:

Klassen & objecten, overerving, abstracte klassen, debuggen, interfaces, formulieren, polymorfie, statische methoden, event-handlers

HOOFDSTUK 3. Imperatief programmeren. 3.1 Stapsgewijs programmeren. 3.2 If Then Else. Module 4 Programmeren

Tentamen Objectgeorienteerd Programmeren TI februari Afdeling ST Faculteit EWI TU Delft

1. Exclusief aanvinken

1 Objectgeoriënteerd programmeren met Java

Variabelen en statements in ActionScript

Datastructuren: stapels, rijen en binaire bomen

Derde deeltentamen Imperatief programmeren - versie 1 Vrijdag 6 november 2015, uur

Uitwerking Derde deeltentamen Imperatief programmeren - versie 1 Vrijdag 10 november 2017, uur

Recursie. public static int faculteit( int n ){ // Deze functie berekent n! // pre: n = N en n >= 0 // post: faculteit = N!

Versie 2: B C D D A C D A C C. Versie 3: C D A A B D A B D D. Versie 4: A D C C B D C B D D. Versie 5: B A D D C A D C A A

Syntax van opdracht. opdracht. expressie. variabele. = expressie ; klasse naam. methode naam. property naam += object

Java Les 3 Theorie Herhaal structuren

Introductie in C++ Jan van Rijn. September 2013

Programmeren I. 26 augustus Algemene Richtlijnen. Richtlijnen Programmeren 1

Noties Informatica. In java fungeren objecten als een model voor de elementen waarin een probleem kan worden opgesplitst

Tweede deeltentamen Mobiel programmeren - versie 1 Vrijdag 2 februari 2018, uur

6,1. Samenvatting door een scholier 1809 woorden 28 oktober keer beoordeeld. Informatica

Programmeren in Java 3

Transcriptie:

Inhoud: Oefeningen bij de cursus java I. Reeksontwikkeling...1 II. Een tekst omzetten in hoofdletters...2 III. Klasse Punt: een oefening over klassen...2 IV. Constructoren...4 V. Oefening: klassen en afgeleide klassen...6 VI. De klasse Vector...9 VII. Een abstracte klasse ontwerpen...11 VIII. Een interface...12 IX. Muntcalculator....13 X. Boots het bekende spelletje Schuifpuzzel na in een applet...17 XI. Een applet converteren naar een toepassing...20 XII. Absolute positionering...22 XIII. Memory het bekende geheugenspelletje nagebootst...23 I. Reeksontwikkeling Bereken e x tot een bepaalde nauwkeurigheid. Gebruik een reeksontwikkeling in een while-lus. De reeksontwikkeling is: e x? 1? 2 x x?? 2! 3 x 3!?...? n x? n! En hier is de code: /********************************************* Oefening op het gebruik van de while-opdracht Bereken e macht x tot bepaalde nauwkeurigheid. **********************************************/ public class Emacht public static void main(string args[]) double x=1.0; double nauwkeurigheid=1e-15; //stel de gewenste nauwkeurigheid in double term, som, vorigesom; int i; //teller term=1;... //reken tot het verschil < gewenste nauwkeurigheid som=1;vorigesom=0; i=1; while (Math.abs(som-vorigeSom)nauwkeurigheid) vorigesom=som; term *= x/i; som += term; i++; // en druk af System.out.println("e macht "+x+" is "+som); System.out.println("De lus werd "+i+" maal doorlopen."); Oefeningen bij de cursus java door ir. C. Daniels 1

II. Een tekst omzetten in hoofdletters Een tekst, ingegeven via het toetsenbord, omzetten naar hoofdletters in een methode /************************************* Een tekst omvormen naar hoofdletters in een methode **************************************/ public class Hoofdl static String Hoofdl(String s) return s.touppercase(); public static void main(string args[]) byte b[]=new byte[50]; //voor read() String tekst; try System.in.read(b); catch (java.io.ioexception e) tekst=new String(b); System.out.println(Hoofdl(tekst)); III. Klasse Punt: een oefening over klassen Ontwerp zelf een klasse Punt, met twee klassevariabelen de integer waarden x en y. Vul de klasse aan met constructoren, accessor-methoden en een methode tostring() die een tekstversie teruggeeft van een object, en een methode AfstandTotOorsprong() die de afstand van dat punt tot de oorsprong berekend. /************************************* Punt.java - De klasse punt *************************************/ public class Punt /**************************************************** de klassevariabelen x en y, omwille van de afscherming zijn ze private gedeclareerd *****************************************************/ private int x; private int y; /*********************************** De default constructor Eigenschappen van een constructor 1) is public 2) geen return-type 3) zelfde naam als klasse ************************************/ public Punt() x=0; //initialiseer hier de beide waarden op nul y=0; System.out.println("Default constructor Punt aangeroepen."); /*************************************************** Constructor 2 aanvaard 1 parameter xx, zowel x als y worden = xx Oefeningen bij de cursus java door ir. C. Daniels 2

****************************************************/ public Punt(int xx) x=xx; y=xx; System.out.println("Constructor #2 aangeroepen"); /***************************************** Constructor 3 aanvaard 2 parameters voor x, en y resp. *****************************************/ public Punt(int xx,int yy) x=xx; y=yy; System.out.println("Constructor #3 aangeroepen"); /************************************* De "copy-constructor" aanvaard 1 parameters van het hetzelfde type als de klasse *************************************/ public Punt(Punt p) x=p.x; y=p.y; System.out.println("Copy-constructor aangeroepen"); /***************************************************** Accessor-methoden Laten toe de klassevariabelen te lezen of te wijzigen *****************************************************/ //wijzig x public void SetX(int xx) x=xx; //lees x public int ReturnX() return x; //wijzig y public void SetY(int yy) y=yy; //lees y public int ReturnY() return y; /******************************************** Andere methoden van de klasse *********************************************/ //Geef de waarde van de klassevariabelen //terug in een tekst public String tostring() return "x="+x+" y="+y; //Bereken de afstand tot oorpsrong van een object public double AfstandTotOorsprong() return Math.sqrt(x*x+y*y); Oefeningen bij de cursus java door ir. C. Daniels 3

Hier de code van het hoofdprogramma: /********************************************** OefeningPunt.java - gebruikt de klasse Punt **********************************************/ public class OefeningPunt public static void main(string args[]) Punt P1= new Punt(); //roept defaultconstructor aan System.out.println("P1: "+P1.toString()); Punt P2 = new Punt(50); //roept constructor 2 aan System.out.println("P2:"+P2.toString()); Punt P3 = new Punt(10,200); //roept constructor 3 aan P3.SetX(100); //wijzig de waarde van x in 100 System.out.println("P3.x = "+P3.ReturnX()); Punt P4= new Punt(P3); //roept de copyconstructor aan System.out.println("P4:"+P4.toString()); //bereken afstand tot oorsprong van P4 System.out.println("Afstand tot oorsprog van P4:" + P4.AfstandTotOorsprong()); De uitvoer van het prgramma ziet er als volgt uit: Default constructor Punt aangeroepen. P1: x=0 y=0 Constructor #2 aangeroepen P2:x=50 y=50 Constructor #3 aangeroepen P3.x = 100 Copy-constructor aangeroepen P4:x=100 y=200 Afstand tot oorsprog van P4:223.60679774997897 Process Exit.. IV. Constructoren Demonstreer het gebruik van constructoren in een klasse en de afgeleide klasse. Gebruik een klasse-methode om het aantal objecten te tellen. /********************************************* de superdklasse (Eng. parent-class) *********************************************/ class SuperKlasse //een klassevariabele //protected: dus alleen de afgeleide klasse //krijgt toegang tot deze variabele protected String Naam; //object teller protected static int ObjectTeller=0; //default constructor public SuperKlasse() System.out.println("Default-constructor superklasse"); Naam=new String("Java is geweldig..."); ObjectTeller ++; // andere constructor public SuperKlasse(String n) Oefeningen bij de cursus java door ir. C. Daniels 4

Naam=n; System.out.println("Constructor #2 superklasse"); ObjectTeller ++; //een andere methode public void Toon() System.out.println("Vanuit Toon() uit de superklasse:"); System.out.println(Naam); //Een klasse-methode = gemeenschappelijk aan alle objecten //Toon het aantal geïnstantieerde objecten public static void AantalObjecten() System.out.println("\nAantal geïnstantieerde objecten: "+ObjectTeller); /******************************************** de afgeleide klasse: erft dus variabelen en methodes uit de hoofdklasse *******************************************/ class AfgKlasse extends SuperKlasse protected int Getal; public AfgKlasse() //roept automatisch default constructor uit de superklasse aan Getal=100; System.out.println("Default constructor uit de afgeleide klasse"); public AfgKlasse(int n) //roept automatisch default constructor van de superklasse aan Getal=n; System.out.println("Constructor #3 van de afgeleide klasse"); public AfgKlasse(String s, int n) super(s); //roept constructor 2 van de superklasse aan Getal=n; System.out.println("Constructor #3 van de afgeleide klasse"); // "overrides" de methode Toon() uit de superklasse public void Toon() System.out.println("Vanuit Toon() uit de afgeleide klasse:"); System.out.println(Naam+" "+Getal); public class TestAfgKlasse public static void main(string args[]) //roept de default constructor van de superklasse aan Oefeningen bij de cursus java door ir. C. Daniels 5

System.out.println("\n*** object S van de superklasse ***"); SuperKlasse S=new SuperKlasse(); S.Toon(); //roept de default constructoren van de afgeleide klasse //en van de superklasse aan System.out.println("\n*** object A1 van de afgeleide klasse ***"); AfgKlasse A1= new AfgKlasse(); //object van de afgeleide klasse A1.Toon(); //roept constructor #2 aan van afgeleide klasse, //en de default constructor van de superklasse aan System.out.println("\n*** object A2 van de afgeleide klasse ***"); AfgKlasse A2=new AfgKlasse(111); A2.Toon(); //roept constructor #3 aan van afgeleide klasse, //en constructor #2 van de superklasse aan System.out.println("\n*** object A3 van de afgeleide klasse ***"); AfgKlasse A3=new AfgKlasse("Java is object georiënteerd",-555); A3.Toon(); //aanroep van een klase methode uit SuperKlasse SuperKlasse.AantalObjecten(); De uitvoer van deze oefening is als volgt: *** object S van de superklasse *** Default-constructor superklasse Vanuit Toon() uit de superklasse: Java is geweldig... *** object A1 van de afgeleide klasse *** Default-constructor superklasse Default constructor uit de afgeleide klasse Vanuit Toon() uit de afgeleide klasse: Java is geweldig... 100 *** object A2 van de afgeleide klasse *** Default-constructor superklasse Constructor #3 van de afgeleide klasse Vanuit Toon() uit de afgeleide klasse: Java is geweldig... 111 *** object A3 van de afgeleide klasse *** Constructor #2 superklasse Constructor #3 van de afgeleide klasse Vanuit Toon() uit de afgeleide klasse: Java is object georiënteerd -555 Aantal geïnstantieerde objecten: 4 V. Oefening: klassen en afgeleide klassen Ontwerp een superklasse Punt met als klassevariabelen de coördinaten x, en y. Een afgeleide klasse AfgeleidPunt met klassevariabelen Grootte en Kleur. Deklareer de nodige constructoren, accessors, en een methode tostring() die de eigenschappen van een punt als tekst weergeeft. Gebruik alles in een applet dat verschillende gekleurde cirkels tekent in een applet. Superklasse Punt Afgeleide klasse AfgeleidPunt ***************** ***************************** * int x * --- > * int Grootte * * int y * * Color Kleur * ***************** ***************************** En hieronder de code van de bestanden Punt.java, AfgeleidPunt.java, en het applet Oefpunt.java, en het html-bestand Oefpunt.html met het applet. Oefeningen bij de cursus java door ir. C. Daniels 6

/********************************* Punt.java - De superklasse Punt *********************************/ public class Punt //klassevariabelen //protected: alleen toegankelijk in afgeleide klassen protected int x; protected int y; //default constructor public Punt() System.out.println("Default constructor uit Punt"); x=0; y=0; //andere constructor public Punt(int xx, int yy) System.out.println("Constructor #2 uit Punt"); x=xx; y=yy; //copy constructor public Punt(Punt p) System.out.println("Copy-constructor uit Punt"); x=p.x; y=p.y; //accessors public int GeefX() return x; public int GeefY() return y; public void SetX(int xx) x=xx; public void SetY(int yy) y=yy; public String tostring() return "x= "+x+" y= "+y; /******************************************************** AfgeleidPunt.java - de afgeleide klasse van klasse Punt ********************************************************/ import java.awt.*; public class AfgeleidPunt extends Punt /* nieuwe klassevariabelen x en y reeds bekend uit superklasse Punt */ protected int Grootte; protected Color Kleur; //default constructor public AfgeleidPunt() Grootte=1; Kleur= Color.black; System.out.println("Default constructor uit AfgeleidPunt"); //andere constructor public AfgeleidPunt(int xx, int yy, int gr, Color kl) Oefeningen bij de cursus java door ir. C. Daniels 7

super(xx,yy); Grootte = gr; Kleur = kl; System.out.println("Constructor #2 uit AfgeleidPunt"); //copy-constructor public AfgeleidPunt(AfgeleidPunt ap) super(ap.x,ap.y); Grootte = ap.grootte; Kleur = ap.kleur; System.out.println("Copy-Constructor uit AfgeleidPunt"); //accessors public int GeefGrootte() return Grootte; public Color GeefKleur() return Kleur; public void SetGrootte(int gr) Grootte = gr; public void SetKleur(Color kl) Kleur = kl; //tostring, "overrides" tostring uit superklasse public String tostring() return super.tostring() //roep die even aan voor x- en y-waarde +"\ngrootte : "+Grootte+" Kleur : "+Kleur; /********************************************** OefPunt.java - oefening op afgeleide klasse ***********************************************/ import java.applet.*; import java.awt.*; public class OefPunt extends Applet AfgeleidPunt P[]; //een array van punten AfgeleidPunt ExtraPunt; //nog ééntje extra voor de blauwe rand final int MAXPUNTEN=10; //final: MAXPUNTEN is een constante waarde //initialiseer applet public void init() P = new AfgeleidPunt[10]; //eerste punt P[0]= new AfgeleidPunt(5,5,290,new Color(0,255,0)); //de andere punten for (int i=1;i<maxpunten;i++) P[i]= new AfgeleidPunt(50+5*i,50+5*i,20*i,new Color(25*i,255-25*i,0)); ExtraPunt=new AfgeleidPunt(P[0]); ExtraPunt.SetX(0); ExtraPunt.SetY(0); ExtraPunt.SetGrootte(300); ExtraPunt.SetKleur(Color.blue); //en teken de objecten public void paint(graphics g) //ExtraPunt g.setcolor(extrapunt.geefkleur()); g.filloval(extrapunt.geefx(),extrapunt.geefy(), Oefeningen bij de cursus java door ir. C. Daniels 8

ExtraPunt.GeefGrootte(),ExtraPunt.GeefGrootte()); //De andere punten for (int i=0;i<maxpunten;i++) g.setcolor(p[i].geefkleur()); g.filloval(p[i].geefx(),p[i].geefy(), P[i].GeefGrootte(),P[i].GeefGrootte()); System.out.println(P[i].toString()); <!-- ********************* Oefpunt.html ************************ -- > <HTML <HEAD <!-- Generated by Kawa IDE -- > <TITLEApplet title</title </HEAD <BODY <H2Oefening op klassen en afgeleide klassen</h2 <HR> <APPLET CODE=OefPunt WIDTH=300 HEIGHT=300</APPLET <HR </BODY </HTML Het afgewerkte applet gezien in Netscape Navigator: VI. De klasse Vector De klasse Vector laat toe een onbepaald aantal objecten op te slaan in een dynamisch array. Met de methode addelement() kunnen nieuwe objecten worden toegevoegd. Met de methode elementat(int) kan een element terug worden opgevraagd. We gebruiken dit om een aantal objecten van een zelf ontworpen klasse Cirkel op te slaan, en weer te geven in een applet. Oefeningen bij de cursus java door ir. C. Daniels 9

/**************************************************** Cirkels.java Teken een set gekleurde cirkels in een applet. Gebruik een vctor-object om de cirkelobjecten op te slaan. ******************************************************/ import java.awt.*; import java.util.*; import java.applet.*; //een cirkel-klasse class Cirkel private int x,y; //coordinaten van de top linksboven private int diameter; //diameter van de cirkel private int randdikte; //dikte van het randje rond de cirkel private Color kleur; //kleur van de cirkel //constructor public Cirkel(int xx,int yy, int d, Color c, int rd) x=xx; y=yy; diameter=d; randdikte=rd; kleur=c; //accessormethodes public int getx() return x; public int gety() return y; public int getdiameter() return diameter; Oefeningen bij de cursus java door ir. C. Daniels 10

public int getranddikte() return randdikte; public Color getkleur() return kleur; //ons applet public class Cirkels extends Applet //een Vector om een aantal cirkel-objecten op te slaan Vector Cirkels=new Vector(); public void init() Cirkel c; for (int i=0;i<10;i++) Cirkels.addElement( new Cirkel(5*i,5*i, 25*i,new Color(25*i,255-25*i,200),i/2)); System.out.println("Aantal cirkels:"+cirkels.size()); setbackground(color.yellow); public void paint(graphics g) Cirkel c; //hulp object om de code wat te verlichten for (int i=0;i<cirkels.size();i++) //Vector geeft Object terug, dus typecasting naar Cirkel c= (Cirkel)Cirkels.elementAt(i); g.setcolor(color.black); //een zwarte rand g.filloval(c.getx()-c.getranddikte(), c.gety()-c.getranddikte(), c.getdiameter()+2*c.getranddikte(), c.getdiameter()+2*c.getranddikte()); g.setcolor(c.getkleur()); //de cirkelkleur g.filloval(c.getx(), c.gety(), c.getdiameter(), c.getdiameter()); VII. Een abstracte klasse ontwerpen Een abstracte klasse bevat minstens één abstracte methode. Dit is een methode zonder body. Van zo'n klasse kan men geen object instantiëren. In een afgeleide klasse van een abstracte klasse is men verplicht deze methode alsnog te definiëren, dit is een body toe te voegen. Hieronder een eenvoudig voorbeeld om dit te illustreren. /***************************************** Oefeningen bij de cursus java door ir. C. Daniels 11

Een abstracte klasse bevat minstens één abstracte methode ******************************************/ abstract class Abstract //een abstracte methode bevat geen body ( het gedeelte tussen ) public abstract void MethodeA(); /***************************************************** Klasse subabstract afgeleid van Abstract is VERPLICHT (!) de abstracte methode te definiëren ******************************************************/ class subabstract extends Abstract public void MethodeA() System.out.println("OK! Dit mag wel..."); //Klasse AbstracteKlasse public class AbstracteKlasse public static void main(string args[]) //Abstract A = new Abstract(); //Niet ok! geen object van een abstracte klasse mogelijk... subabstract B = new subabstract(); //OK! B.MethodeA(); Plaats de bovenstaande code in een bestand AbstracteKlasse.java en compileer VIII. Een interface Een interface is een abstracte klasse. Zij worden in java gebruikt om meervoudige overerving mogelijk te maken in java. Een interface bevat uitsluitend constante waarden bevatten, of abstracte methoden. /********************************* een eenvoudige klasse *********************************/ class Artikelen protected String Artikel; //protected, dus gekend in de afgeleide klasse public Artikelen(String s) //een constructor Artikel=s; /************************************************ De interface - kan alleen constante waarden en abstracte methodes bevatten ************************************************/ interface Firma /*een variabele in een interface moet final zijn, dus constant, en geïnitialiseerd worden */ final int Maat=40; //een interface bevat ook geen constructor(s) //een abstracte methode public String FirmaNaam(); Oefeningen bij de cursus java door ir. C. Daniels 12

/************************************************************ De klasse Stock is afgeleid van de klasse Artikel, en implementeert de interface Firma. U mag zoveel interfaces implementeren als u wil. Vermeld dan de namen van de interfaces achter het woordje "implements", gescheiden door een komma ************************************************************/ class Stock extends Artikelen implements Firma public Stock(String s) super(s); //roep constructor van de bovenklasse aan met super() //de methode FirmaNaam() methode MOET hier gedefiniëerd worden! public String FirmaNaam() return "Krekels nv."; public String Toon() return Artikel; public class OefInterface public static void main(string args[]) Stock MijnArtikel=new Stock("Jeans"); //instantieer een object van de klasse Stock System.out.println(MijnArtikel.Toon() + " (maat:" + MijnArtikel.Maat + ") van de firma " + MijnArtikel.FirmaNaam()); Plaats de hele code in een bestand OefInterface.java, en compileer. De uitvoer is: Jeans (maat:40) van de firma Krekels nv. IX. Muntcalculator. Onderstaande oefening laat toe munten om te rekenen. De gegevens kunnen door de gebruiker worden aangepast, door de code in het html-bestand aan te passen. We maken gebruik van een klasse MuntEenheid, die de naam, en de waarde van de munt in Euro bevat. Oefeningen bij de cursus java door ir. C. Daniels 13

Hieronder de code van de klasse MuntEenheid: /*********************************** MuntEenheid.java ***********************************/ public class MuntEenheid protected String Naam; //naam van de munteenheid protected double WaardeInEuro;//de waarde in Euro //constructor public MuntEenheid(String n,double w) Naam=n; WaardeInEuro=w; //accessors public String getnaam() return Naam; public double getwaarde() return WaardeInEuro; //geef een tekstweergave van het object public String tostring() return "1 "+Naam+" = "+WaardeInEuro+"Euro"; En dit is de code van het applet: /********************************* Muntcalculator.java Omrekenen van munten Gebruikt de klasse MuntEenheid **********************************/ import java.applet.*; import java.awt.*; import java.awt.event.*; Oefeningen bij de cursus java door ir. C. Daniels 14

public class MuntCalculator extends Applet implements ActionListener private final int AANTAL=5; //plaats voor 5 munten private Choice Munt1,Munt2; private TextField Bedrag; private int AantalMunten; private Panel MyPanel[]; private Label Resultaat; private Button Berekenen; MuntEenheid ME[]; //array van Munten en waarde in Euro int s1,s2; //de geslecteerde munten public void init() setbackground(new Color(200,255,200)); Munt1= new Choice(); Munt2= new Choice(); Bedrag= new TextField(6); Bedrag.addActionListener(this); Berekenen=new Button("Berekenen"); Berekenen.addActionListener(this); Resultaat = new Label("Resultaat ----",Label.RIGHT); Color c=new Color(200,255,200); FlowLayout fr = new FlowLayout(FlowLayout.RIGHT); //intialiseer de 5 panelen MyPanel=new Panel[5]; for (int i=0;i<5;i++) MyPanel[i]=new Panel(fR); MyPanel[i].setBackground(c); MyPanel[4].setBackground(new Color(255,180,180)); MyPanel[0].add(new Label("Bedrag: ")); MyPanel[0].add(Bedrag); MyPanel[1].add(new Label("Van : ")); MyPanel[1].add(Munt1); MyPanel[2].add(new Label("Naar: ")); MyPanel[2].add(Munt2); MyPanel[3].add(Berekenen); MyPanel[4].add(Resultaat); setfont(new Font("TimesRoman",3,12)); setlayout(new FlowLayout(FlowLayout.RIGHT)); //panelen bij het applet voegen for (int i=0;i<5;i++) add(mypanel[i]); ME=new MuntEenheid[AANTAL]; /* lees de munten in met getparameter() uit het html-bestand */ String p; AantalMunten=0; p=getparameter("munt1"); if (p!=null) ME[0]=new MuntEenheid(p, new Double(getParameter("Waarde1")).doubleValue()); AantalMunten++; p=getparameter("munt2"); if (p!=null) ME[1]=new MuntEenheid(p, new Double(getParameter("Waarde2")).doubleValue()); AantalMunten++; Oefeningen bij de cursus java door ir. C. Daniels 15

p=getparameter("munt3"); if (p!=null) ME[2]=new MuntEenheid(p, new Double(getParameter("Waarde3")).doubleValue()); AantalMunten++; p=getparameter("munt4"); if (p!=null) ME[3]=new MuntEenheid(p, new Double(getParameter("Waarde4")).doubleValue()); AantalMunten++; p=getparameter("munt5"); if (p!=null) ME[4]=new MuntEenheid(p, new Double(getParameter("Waarde5")).doubleValue()); AantalMunten++; //Voeg de namen bij de keuzelijsten for (int i=0;i<aantalmunten;i++) Munt1.addItem(ME[i].getNaam()); Munt2.addItem(ME[i].getNaam()); //bereken de waarde van bedrag in de nieuwe munt public Double BerekenWaarde(Double w) s1=munt1.getselectedindex(); s2=munt2.getselectedindex(); return new Double(w.doubleValue()*ME[s1].getWaarde()/ME[s2].getWaarde()); //reageer op knopdruk en op return in het veld bedrag public void actionperformed(actionevent e) try Double s=new Double(Bedrag.getText()); //Berekenen en afronden op 2 cijfers na de komma s=new Double( Math.round(100.0*BerekenWaarde(s).doubleValue())/100.0 ); //plaats de uitkomst in het Resultaat-label Resultaat.setText(s.toString()+" "+ME[s2].getNaam()); catch(exception ee) Resultaat.setText("Ongeldig!"); En dit is de code van het het bijhorende html-bestand: <HTML <HEAD <!-- Generated by Kawa IDE -- <TITLEMuntcalculator title</title </HEAD <BODY Oefeningen bij de cursus java door ir. C. Daniels 16

<H1Muntcalculator</H1 <HR <APPLET CODE=MuntCalculator WIDTH=175 HEIGHT=230 <!------------------------------------------ Plaats de waarden van de munten en hun waarde in Euro in de parameter-tabel -------------------------------------------- > <param name=munt1 value="bfr" <param name=waarde1 value="0.024789352" <param name=munt2 value="euro" <param name=waarde2 value="1" <param name=munt3 value="usd" <param name=waarde3 value="1.1160" <param name=munt4 value="ngl" <param name=waarde4 value="0.453780216" <param name=munt5 value="dm" <param name=waarde5 value="0.511291881" </APPLET <HR </BODY </HTML Als de waarde van de munteenheden veranderen, is het voldoende dit aan te passen in de html-code. X. Boots het bekende spelletje Schuifpuzzel na in een applet Ontwerp een applet dat het bekende spelletje schuifpuzzel nabootst: En hier is de bijbehorende code: /********************************************************** Schuifpuzzel.java door C. Daniels Dit is het bekende spelletje met de schuivende blokjes. Wij verschuiven echter niet de blokjes, maar wel het opschrift (Label). Één blokje is steeds onzichtbaar. De uitvoer naar System.out is ter controle **********************************************************/ import java.awt.*; import java.awt.event.*; import java.applet.*; import java.lang.string; public class Schuifpuzzel extends Applet implements ActionListener Oefeningen bij de cursus java door ir. C. Daniels 17

private Button Knop[]; //16 knopjes private int OnzichtbaarBlokje; //plaats van het onzichtbare blokje private int Teller=0; //telt aan het aantal keren dat u een blokje verschuift private String s;//tekst voor het einddialoog //initialiseer het applet public void init() Knop = new Button[16]; //maak het array aan int rij=0,kolom=0; setbackground(new Color(0,0,0)); //initialiseer alle knopjes for (int i=0;i<16;i++) Knop[i]=new Button(); kolom++; if (kolom==4) kolom=0;rij++; setlayout( new GridLayout(4,4)); for (int i=0;i<16;i++) Knop[i].addActionListener(this); //actionlistener bijvoegen Knop[i].setActionCommand(String.valueOf(i)); //actioncommand instellen Knop[i].setLabel(String.valueOf(i+1)); //label instellen add(knop[i]); //voeg het bij het applet Knop[15].setVisible(false); //laatste blokje wordt onzichtbaar OnzichtbaarBlokje=15; Shuffle(); //schudt de blokjes... //op blokje geklikt? public void actionperformed(actionevent e) //op welk blokje? int plaats =(new Integer(e.getActionCommand())).intValue(); System.out.println("Action:"+plaats+" "+OnzichtbaarBlokje); //grenst het aan het lege blokje? if (GrenstAan(plaats,OnzichtbaarBlokje)) String temp; System.out.println("OK! verwisseld..."+ ++Teller); Knop[plaats].setVisible(false); Knop[OnzichtbaarBlokje].setVisible(true); temp=knop[plaats].getlabel(); Knop[plaats].setLabel(Knop[OnzichtbaarBlokje].getLabel()); Knop[OnzichtbaarBlokje].setLabel(temp); OnzichtbaarBlokje=plaats; else System.out.println("nope...dat gaat niet..."); if (Opgelost()) //spel opgelost? System.out.println("Klaar!!!"); //doe hier later iets nuttiger... s=new String("Spel is afgelopen, na "+Teller+" keren klikken!"); EindDialoog.MaakFrame(s); //Toon einddialoog Teller=0; //reset de teller Shuffle(); // en opnieuw shuffelen... Oefeningen bij de cursus java door ir. C. Daniels 18

// Schud de blokjes... Verwissel 10000 maal twee blokjes, public void Shuffle() String temp; int r1,r2; for (int i=1;i<10000;i++) r1=(int)math.round(math.random()*15); r2=(int)math.round(math.random()*15); // Moeten aan elkaar grenzen // en één van beide moet het onzichtbaar blokje zijn if (GrenstAan(r1,r2)&&(r1==OnzichtbaarBlokje r2==onzichtbaarblokje)) System.out.println(r1+" "+r2); temp=knop[r1].getlabel(); Knop[r1].setLabel(Knop[r2].getLabel()); Knop[r2].setLabel(temp); if (r1==onzichtbaarblokje) OnzichtbaarBlokje=r2; else OnzichtbaarBlokje=r1; //en maak het blokje met label 16 onzichtbaar for (int i=0;i<16;i++) Knop[i].setVisible(true); if (new Integer(Knop[i].getLabel()).intValue()==16) OnzichtbaarBlokje=i; Knop[i].setVisible(false); //test of twee blokjes aan elkaar grenzen public boolean GrenstAan(int p,int q) int i; if (p>q) i=p;p=q;q=i; //zet kleinste eerst if ( (Math.abs(p-q)==1 &&( (p!=3 && q!=4)) //niet achter het randje... &&( (p!=7 && q!=8)) &&( (p!=11 && q!=12)) ) (Math.abs(p-q)==4) ) return true; return false; //puzzel opgelost? public boolean Opgelost() boolean temp=true; for (int i=0;i<16;i++) if (i!=new Integer(Knop[i].getLabel()).intValue()-1) temp=false; return temp; En dit is de herbruikbare klasse EindDialoog. Geeft aan dat u alle blokjes op de juiste plaats heeft gekregen, en na hoeveel zetten. U kunt dit voorbeeld ook in een andere toepassing herbruiken! Oefeningen bij de cursus java door ir. C. Daniels 19

Plaats het in een apart bestand EindDialoog.java en voeg het bij aan het project. /*********************************************** EindDialoog.java aanroepen met EindDialoog.MaakFrame(tekst) ***********************************************/ import java.awt.*; import java.awt.event.*; public class EindDialoog extends Dialog implements ActionListener protected Button OkKnop; //een dialoog moet een frame hebben... protected static Frame HetFrame; public EindDialoog(Frame parent,string s) super(parent,true); setlayout( new FlowLayout(FlowLayout.CENTER)); Font f=new Font("TimesRoman",3,15); //mooie grote letters setfont(f); setbackground(new Color(255,200,200)); //WindowListener erbij... addwindowlistener (new WindowAdapter() public void windowclosing(windowevent e) hide(); if (HetFrame!=null) HetFrame.hide(); ); setsize(300,150); add(new Label(s)); OkKnop=new Button("OK"); OkKnop.addActionListener(this); add(okknop); public static void MaakFrame(String tekst) //als er geen Frame-object is, maak het dan nu één //maar we tonen het niet... if (HetFrame==null) HetFrame=new Frame("Dialoog"); //instantieer het dialoogvenster EindDialoog einddialoog = new EindDialoog(HetFrame,tekst); //en toon de einddialoog einddialoog.show(); public void actionperformed(actionevent e) System.out.println("stoppen!"+e.getSource()); hide(); if (HetFrame!=null) HetFrame.hide(); XI. Een applet converteren naar een toepassing Een applet converteren zodat het werkt als een toepassing. Oefeningen bij de cursus java door ir. C. Daniels 20

import java.awt.*; import java.applet.applet; import java.awt.color; /*ons applet - Niet public. Als u dat wel doet, moet u ze in een apart bestand declareren met de naam AppletConversie.java */ class AppletConversie extends Applet static int i=1; //tellertje ter info Font f; public void init() f=new Font("Arial",3,25); System.out.println("Geïnitialiseerd met init() "+i++); public void start() System.out.println("Gestart met start() "+i++); public void stop() System.out.println("Gestopt met stop() "+i++); public void destroy() System.out.println("Vernietigd met destroy() "+i++); public void paint(graphics g) g.setfont(f); g.setcolor(color.red); g.drawstring("java is fantastisch!",20,40); System.out.println("Paint()-methode "+i++); public class AppletToExe extends AppletConversie //voeg de main()-methode toe public static void main(string args[]) //instantieer uw appletklasse AppletConversie Ac = new AppletConversie(); //instantieer een nieuw frame Frame f=new Frame("Van applet naar toepassing"); //voeg het applet toe aan het frame f.add(ac); //grootte aanpassen f.setsize(300,100); //toon het frame, klaar... f.show(); /*roep zelf de init() en de start()-methode van het applet aan*/ Ac.init(); Ac.start(); Sla het met de naam van de public-klasse AppletToExe.java, en compileer. Oefeningen bij de cursus java door ir. C. Daniels 21

XII. Absolute positionering In java wordt sterk aangeraden om een layout-manager te gebruiken, voor de opmaak van uw toepassing. Men weet immers niet op voorhand wat de schermresolutie is, of de afmetingen van het scherm waarop uw toepassing, of applet, zal draaien. Nochtans is absolute positionering in java mogelijk met de methode setlocation(). Hieronder een speelse toepassing van deze methode, in het applet JumpingButton. Als u de knop wil aanklikken, verspringt hij van plaats. /*************************************************************** JumpingButton.java Maakt gebruik van de methode setlocation() om een knop naar een willekeurige plaats te verplaatsen. Deze methode wordt afgeraden ten voordele van de layoutmanagers ***************************************************************/ import java.awt.*; import java.applet.*; import java.awt.event.*; public class JumpingButton extends Applet implements MouseMotionListener static Button jb; //initialiseer het applet public void init() setbackground(new Color(200,220,255)); jb=new Button("Klik hier!"); jb.addmousemotionlistener(this); add(jb); //plaatst de knop op een randomplaats in het applet private void setbutton() int x=(int)(math.random()*this.getsize().width)-20; int y=(int)(math.random()*this.getsize().height)-20; jb.setlocation(x,y); //Als de muis boven de knop komt, verplaats hem... public void mousemoved(mouseevent e) setbutton(); repaint(); public void mousedragged(mouseevent e) Oefeningen bij de cursus java door ir. C. Daniels 22

XIII. Memory het bekende geheugenspelletje nagebootst Idereen kent wel het spelletje, waarin er van u verwacht wordt een aantal gekleurde knoppen in een bepalde willekeurige volgorde in te drukken. Na elke ronde wordt er één knop aan de sequentie bijgevoegd, tot u in de fout gaat. In de appletviewer ziet het afgewerkte spelletje er als volgt uit: En hier is de code van het applet. Ze bevat twee klassen. Zoals reeds gezegd is het betere methode om de twee klassen elk in hun eigen bronbestand te plaatsen. Hier werd alles samengezet. /****************************************** Memory.java Het bekende geheugenspelletje nagebootst *******************************************/ import java.applet.*; import java.awt.*; import java.awt.event.*; import java.util.*; /*************************************************** MyThread is een afgeleide van de Thread-klasse Laat de knoppen één voor én oplichten ***************************************************/ class MyThread extends Thread //houdt een array van de in te drukken knoppen bij private Vector ButtonReeks; Oefeningen bij de cursus java door ir. C. Daniels 23

//pointer naar hoofdklasse private Memory M; //speciale constructor met link naar de hoofdklasse public MyThread(Memory m) M=m; //hier wordt het werk gedaan... public void run() //haal de knoppensequentie op uit de hoofdklasse this.buttonreeks=m.getbuttonreeks(); //en toon ze één voor één for (int i=0;i<buttonreeks.size();i++) int p; p=((integer)buttonreeks.elementat(i)).intvalue(); //eventjes wachten tussenin try this.sleep(1000); catch(exception e) //Maak die knoop rood M.setButtonColor(p,M.ROOD); try this.sleep(200); catch(exception e) //en terug de originele kleur M.setButtonColor(p,M.ORIGINEEL); //de tekst in het label aanpassen public void settekst(string t) try sleep(2000); M.setLabelTekst(t); catch(exception e)system.out.println("ging niet..."); /************************************************************ Hoofdklasse *************************************************************/ public class Memory extends Applet implements ActionListener Oefeningen bij de cursus java door ir. C. Daniels 24

//indicatie voor de kleur van de knop public final int ORIGINEEL=0; public final int ROOD=1; //de knoppen private Button b[]; //kleurtjes voor de knoppen private Color kleuren[]= new Color[6]; //centrum van de knoppencirkel private final int centrumx=125; private final int centrumy=125; //grootte van de knoppen private final int LENGTE=75; //instantieer de threadklasse private MyThread Th; //de startknop private Button Start; //een Vector-array van knoppen Vector ButtonReeks=new Vector(); //het label onderaan private Label titel,tekst; //variabelen voor het spelbeheer private boolean SpelAanGang=false; private boolean SpelerAanBeurt=false; private int teller=0; //initialisatie van het applet public void init() Th=new MyThread(this); setlayout(null); //zet die layout even uit... //instantier de knoppekes b = new Button[6]; //straal van de cirkel waarop de knoppen staan double r=100.0; //instantieer de knoppen b[0]=new Button("EEN"); b[0].setbounds((int)math.round(r*math.sin(math.pi*180/180))+centrumx,(int)math.round(r*math.cos(math.pi*180/180))+centrumy,lengte,lengte); b[1]=new Button("TWEE"); b[1].setbounds((int)math.round(r*math.sin(math.pi*120/180))+centrumx,(int)math.round(r*math.cos(math.pi*120/180))+centrumy,lengte,lengte); b[2]=new Button("DRIE"); Oefeningen bij de cursus java door ir. C. Daniels 25

b[2].setbounds((int)math.round(r*math.sin(math.pi*60/180))+centrumx, (int)math.round(r*math.cos(math.pi*60/180))+centrumy,lengte,lengte); b[3]=new Button("VIER"); b[3].setbounds((int)math.round(r*math.sin(math.pi*0/180))+centrumx,( int)math.round(r*math.cos(math.pi*0/180))+centrumy,lengte,lengte); b[4]=new Button("VIJF"); b[4].setbounds((int)math.round(r*math.sin(math.pi*300/180))+centrumx,(int)math.round(r*math.cos(math.pi*300/180))+centrumy,lengte,lengte); b[5]=new Button("ZES"); b[5].setbounds((int)math.round(r*math.sin(math.pi*240/180))+centrumx,(int)math.round(r*math.cos(math.pi*240/180))+centrumy,lengte,lengte); //initialiseer de knopeigenschappen for (int i=0;i<6;i++) kleuren[i]=new Color(i*80%256,255-i*10,(i*120+120)%256); b[i].addactionlistener(this); b[i].setbackground(kleuren[i]); add(b[i]); //bij het applet voegen //mooi achtergrondkleurtje setbackground(new Color(255,230,210)); //de titel titel=new Label("Memory"); titel.setfont(new Font("TimesRoman",2,20)); titel.setbounds(10,25,90,20); add(titel); //de tekst onderaan tekst=new Label("Klik op start!"); tekst.setfont(new Font("TimesRoman",2,20)); tekst.setbounds(60,330,200,30); tekst.setbackground(new Color(250,150,180)); tekst.setalignment(label.center); add(tekst); //de startknop Start=new Button("Start"); Start.setBounds(130,365,50,25); Start.addActionListener(this); Start.setBackground(new Color(250,150,180)); add(start); setlabeltekst("klik de knop 'Start'"); //een wilekeurige knop aan de reeks toevoegen public void KnopBijvoegen() Integer NieuweKnop= new Integer ((int)( Math.round ((Math.random()*5)))); ButtonReeks.addElement(NieuweKnop); Oefeningen bij de cursus java door ir. C. Daniels 26

//de tekst van het label aanpassen //kan aangeroepen worden vanuit de MyThread public void setlabeltekst(string s) tekst.settext(s); //gebruiken we nu niet public void mouseclicked(mouseevent e) public void mouseentered(mouseevent e) public void mouseexited(mouseevent e) //welke knop gedrukt? public void actionperformed(actionevent e) String lbl=""; int IngedrukteKnop=0; lbl=((button)e.getsource() ).getlabel(); if (SpelerAanBeurt && SpelAanGang) if (lbl=="een") IngedrukteKnop=0; else if (lbl=="twee") IngedrukteKnop=1; else if (lbl=="drie") IngedrukteKnop=2; else if (lbl=="vier") IngedrukteKnop=3; else if (lbl=="vijf") IngedrukteKnop=4; else if (lbl=="zes") IngedrukteKnop=5; //is er een fout gemaakt? if (IngedrukteKnop!=((Integer)ButtonReeks.elementAt(teller)).intValue()) setlabeltekst("mis! Score: "+(ButtonReeks.size()-1)); SpelAanGang=false; SpelerAanBeurt=false; teller=0; ButtonReeks.clear(); Start.setVisible(true); else setlabeltekst("ok..."); teller++; //telt de aangeklikte knopkes if (teller==buttonreeks.size()) //tot zover ok, dus nieuwe knop bijvoegen... SpelerAanBeurt=false; KnopBijvoegen(); setlabeltekst("volgende, let goed op!"); Oefeningen bij de cursus java door ir. C. Daniels 27

Th.run(); //toon de knoppensequentie setlabeltekst("nu is het uw beurt!"); SpelerAanBeurt=true; teller=0; if (lbl=="start") //de startknop ingedrukt Start.setVisible(false); SpelAanGang=true; setlabeltekst("ok we starten!"); setlabeltekst("let goed op!"); KnopBijvoegen(); Th.run(); //toon de knoppensequentie setlabeltekst("nu is het uw beurt!"); SpelerAanBeurt=true; //accessor, geeft de knoppenreeks door aan MyThread public Vector getbuttonreeks() return ButtonReeks; //kleur van de knoppekes, aangeroepen vanuit MyThread public void setbuttoncolor(int n,int k) if (k==origineel) b[n].setbackground(kleuren[n]); else if (k==rood) b[n].setbackground(color.red); Oefeningen bij de cursus java door ir. C. Daniels 28