TENTAMEN Programmeren 1 VOORBEELDUITWERKING

Vergelijkbare documenten
TENTAMEN Programmeren 1

TENTAMEN Programmeren 1 VOORBEELDUITWERKING

NAAM: Programmeren 1 Examen 21/01/2011

NAAM: Programmeren 1 Examen 29/08/2012

Programmeren (1) Examen NAAM:

Abstracte klassen & Interfaces

IMP Uitwerking week 13

Tentamen Objectgeorienteerd Programmeren TI februari Afdeling ST Faculteit EWI TU Delft

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

Tentamen Formele Methoden voor Software Engineering (213520)

Programmeren 1 20 januari 2012 Prof. T. Schrijvers

Tentamen Objectgeorienteerd Programmeren IN1205 Voorbeeld

Beginselen van programmeren Practicum 1 (Doolhof) : Oplossing

Vakgroep CW KAHO Sint-Lieven

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

Overerving & Polymorfisme

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

Tentamen Inleiding Programmeren (IN1608WI), duur van de toets 2 uur Technische Universiteit Delft, Faculteit EWI, Afdeling 2.

Tentamen in2705 Software Engineering

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

Uitwerking tentamen Algoritmiek 9 juni :00 17:00

Tentamen Formele Methoden voor Software Engineering (213520)

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

Kleine cursus PHP5. Auteur: Raymond Moesker

Modelleren en Programmeren

Veel succes! 1. Gegeven is de volgende klasse:

Inhoud. Eindtoets. Introductie 2. Opgaven 3. Bijlage bij opgaven 9. Terugkoppeling 12

public boolean equaldates() post: returns true iff there if the list contains at least two BirthDay objects with the same daynumber

Inleiding Software Engineering! Unit Testing, Contracten, Debugger! 13 Februari 2014!

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

Universiteit van Amsterdam FNWI. Voorbeeld van tussentoets Inleiding programmeren

Tentamen Inleiding Programmeren in Java

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

Aanvullende toets Gameprogrammeren (INFOB1GP) Woensdag 24 december 2014, uur

Tweede college algoritmiek. 12 februari Grafen en bomen

Derde deeltentamen Imperatief programmeren - versie 1 Vrijdag 9 november 2018, uur

Programmeren I. 26 augustus Algemene Richtlijnen. Richtlijnen Programmeren 1

Elfde college algoritmiek. 18 mei Algoritme van Dijkstra, Heap, Heapify & Heapsort

Objectgericht programmeren 1.

Uitwerkingen Tweede deeltentamen Imperatief programmeren Vrijdag 15 oktober 2010, uur

Uitwerkingen derde deeltentamen Gameprogrammeren Vrijdag 6 november 2015, uur

Programmeermethoden. Recursie. week 11: november kosterswa/pm/

Zelftest Programmeren in Java

Derde deeltentamen Imperatief programmeren - versie 1 Vrijdag 7 november 2014, uur

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

Tentamen Imperatief Programmeren

TECHNISCHE UNrVERSITElT DELFT Faculteit Elektrotechniek, Wiskunde en Informatica

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

Modelleren en Programmeren

VI. Klassen en objecten

Datastructuren: stapels, rijen en binaire bomen

Uitwerking Aanvullend tentamen Imperatief programmeren Woensdag 24 december 2014, uur

Programmeren 1 23 januari 2013 Prof. T. Schrijvers

Objectgeoriënteerd programmeren in Java 1

Voortgezet Prog. voor KI

Eindtoets. Opgaven. 1 Gegeven is het domeinmodel van figuur 1. Domeinmodel voor betalingen. Eindtoets I N T R O D U C T I E.

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

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

Programmeermethoden. Recursie. Walter Kosters. week 11: november kosterswa/pm/

Opdracht 6: Dodo wordt blijvend slimmer

{ specificatie (contract) en toelichting }

Datastructuren Werkcollege Intro

NAAM: Programmeren 1 Examen 31/08/2011

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

Scala. Korte introductie. Sylvia Stuurman

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

Inhoud. Eindtoets. Introductie 2. Opgaven 3. Terugkoppeling 12

Uitwerkingen Derde deeltentamen Imperatief programmeren Vrijdag 12 november 2010, uur

Practicumopgave 3: SAT-solver

blok 11 groep 4 Malmberg s-hertogenbosch

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

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

Als de spelsituatie zodanig is dat schaakmat of ( mat ) niet meer mogelijk is, dan eindigt de partij op een gelijkspel ( pat of remise ).

Aanvullende toets Gameprogrammeren Woensdag 5 januari 2011, uur


Algoritmiek. 15 februari Grafen en bomen

DIAGNOSTISCHE TOETS Softwaresystemen UITWERKING

Eerste deeltentamen Gameprogrammeren Vrijdag 25 september 2015, uur

Uitwerking Eerste deeltentamen Mobiel programmeren - versie 1 Vrijdag 23 december 2016, uur

Stacks and queues. Introductie 45. Leerkern 45. Terugkoppeling 49. Uitwerking van de opgaven 49

De Leidsche Flesch Studievereniging voor Natuurkunde, Sterrenkunde, Wiskunde en Informatica sinds DLF Pointerworkshop

In BlueJ. Doe onderstaande met muis/menu s:

Ontwerp van Informatiesystemen

Verder zijn er de nodige websites waarbij voorbeelden van objectgeoriënteerd PHP (of Objec Oriented PHP, OO PHP) te vinden zijn.

Abstraheren van modellen

Spelregels schaken. Doel van het spel

Derde deeltentamen Gameprogrammeren Vrijdag 7 november 2014, uur

Kwis (3) class X { public void a() { System.out.println("x"); public static void main(string[] args) { X x = new X();

Deeltentamen Grammatica s en ontleden 22 december 2005

{ specificatie (contract) en toelichting }

Datastructuren: stapels, rijen en binaire bomen

Programmeermethoden NA. Week 5: Functies (vervolg)

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

Project network. Gebaseerd op paragrafen , uit het boek. We simuleren een sociaal netwerk

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

Programmeermethoden. Pointers. Walter Kosters. week 10: november kosterswa/pm/

Ontwerp van Algoritmen: opgaven weken 3 en 4

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

X. Grafische elementen

Tentamen Formele Methoden voor Software Engineering (213520)

Transcriptie:

TENTAMEN Programmeren 1 vakcode: 213500 datum: 28 november 2002 tijd: 13:30 17:00 uur VOORBEELDUITWERKING Algemeen Bij dit tentamen mag gebruik worden gemaakt van het boek van Niño/Hosch, en van de handleiding van Programmeren 1. Dit tentamen bestaat uit 4 opgaven, waarvoor in het totaal 90 punten behaald kunnen worden. Het minimaal aantal punten per opgave bedraagt 0 punten. Opgave 1 (15 punten) De volgende opgaven zijn in de stijl van Niño/Hosch, Opgave 9.2. Geef voor elk van de volgende verzamelingen objecten een zinvolle abstractie die voor elk van de objecten geldt, en geef aan in wat voor soort applicatie (programma) dit van pas zou kunnen komen. Geef bovendien zowel voor de concrete objecten als het abstracte niveau een eigenschap of actie die daar bij hoort. Voorbeeld: Vraag: Tekens, regels, alinea s. Antwoord: Abstract niveau: tekstelement. Toepassing: tekstverwerker. Eigenschappen van de verschillende objecten: Tekens: Font; Regels: Afstand linker en rechter kantlijn; Alinea s: Uitlijning (links, reschts, gecentreerd); Tekstelementen: Positie op beeldscherm. Beoordeling: 3 per fout geïdentificeerde abstractie of applicatie, 1 voor ontbrekende of foute eigenschap/actie. a. Paspoort, rijbewijs, studentenkaart; b. Rol toiletpapier, krat bier, pak koffie; c. Digitale foto, internet-pagina, MP3-tje; d. Windkracht, elektrische spanning (voltage), beurskoers;

2 Tentamen Programmeren 1 28 november 2002 (UITWERKING) Antwoord op Opgave 1 De applicaties en eigenschappen/acties zijn voorbeelden; andere oplossingen zijn mogelijk. a. Abstract niveau: identiteitsbewijs. Toepassing: hotelregistratieprogramma. Eigenschappen van de verschillende objecten: Paspoort: Land van herkomst; Rijbewijs: Type voertuig; Studentenkaart: Studentnummer; Identiteitsbewijs: Naam, geboortedatum. b. Abstract niveau: artikel. Toepassing: winkel-database/kassa. Eigenschappen van de verschillende objecten: Rol toiletpapier: Font; Krat bier: Afstand linker en rechter kantlijn; Pak koffie: Uitlijning (links, reschts, gecentreerd); Artikel: Positie op beeldscherm. c. Abstract niveau: Bestand (file). Toepassing: filesysteem (Windows). Eigenschappen van de verschillende objecten: Digitale foto: resolutie; Internet-pagina: formaat (HTML, XML, PHP); MP3-tje: duur (in seconden); Bestand: Omvang (in bytes), naam bestand. d. Abstract niveau: Functie (getalsmatige grootheid) Opm: alleen getal of gegeven is niet genoeg: 1). Toepassing: graaf-tekenprogramma. Eigenschappen van de verschillende objecten: Windkracht: Plaats van meting; Spanning:ACofDC; Beurskoers: Fonds; Functie: Moment van meting, grootte.

Tentamen Programmeren 1 28 november 2002 (UITWERKING) 3 Opgave 2 (20 punten) Gegeven zijn de volgende klassendefinities, waarin alle methodendefinities vooralsnog ontbreken. public class Bord { * Construeert een nieuw, leeg Bord met gegeven dimensie. * @require 0 <= dim * @ensure getdim() == dim public Bord(int dim) * Levert de dimansie van dit Bord op. * @ensure dim >= 0 public int getdim() * Levert het vakje met gegeven coordinaten op. * @ensure als 0 <= i < getdim() en 0 <= j < getdim() * dan result!= null, result.getbord() == this, * result.getx() == i, result.gety() == j public Vakje getvakje(int i, int j) public class Vakje { * Maakt een nieuw Vakje in een gegeven Bord en met gegeven coordinaten. * @require bord!= null, 0 <= x < bord.getdim(), 0 <= y < bord.getdim() * @ensure getbord() == bord, getx() == x, gety() == y public Vakje(Bord bord, int x, int y) * Levert het Bord op waarin dit Vakje zit. * @ensure result!= null public Bord getbord() * Levert de x-coordinaat van dit Vakje op. * @ensure 0 <= x < getbord().getdim() public int getx() * Levert de y-coordinaat van dit Vakje op. * @ensure 0 <= y < getbord().getdim() public int gety() * Levert het Stuk op dat op dit Vakje staat. * @return het Stuk dat op dit Vakje staat; null als er geen Stuk op staat. public Stuk getstuk() * Zet een nieuw Stuk op dit Vakje, mits er geen Stuk op staat. * @return true als er nog gen Stuk op dit Vakje stond. * @require stuk!= null * @ensure result == (old.getstuk() == null) * als (result) dan this.getstuk() == stuk * anders this.getstuk() == old.getstuk()

4 Tentamen Programmeren 1 28 november 2002 (UITWERKING) public boolean setstuk(stuk stuk) * Haalt het Stuk van dit vakje af (als er een op staat). * @return het Stuk dat op dit Vakje stond * @ensure result == old.getstuk() * this.getstuk() == null public Stuk haalaf() public class Stuk { * Levert het Vakje op waar dit Stuk op staat. * @return het Vakje waar dit Stuk op staat; * null als dit Stuk niet op een Bord staat. public Vakje getpos() * Zet dit Stuk op een gegeven (ander) vakje, mits dat leeg is. * Haalt het Stuk eerst van het huidige vakje af. * @return true als vakje (voor deze zet) leeg was. * @require vakje!= null public boolean zet(vakje vakje) * Haalt dit Stuk van het bord. * @return true als dit Stuk op een bord stond. public boolean sla() a. (5 punten.) Implementeer de klasse Bord volgens de gegeven specificatie. Maak hierbij gebruik van een (naar keuze) 1- of 2-dimensionaal array van Vakje-instanties. Maak gebruik van klasseninvarianten om de postcondities te garanderen. b. (0 4 punten, 1 per fout antwoord.) Beantwoord de volgende vragen, uitgaand van variabelen Vakje v, w and Stuk s. Licht, waar nodig, uw antwoord toe. (i) Wat is het effect van v.setstuk(s) als v de waarde null heeft? (ii) Wat is het effect van v.setstuk(s) als s de waarde null heeft (maar v niet)? (iii) Wat is het effect van v.setstuk(s) als v en s beide niet-null zijn, en v.getstuk() vóór de aanroep de waarde null heeft? (iv) Als s, v en w allen niet-null zijn, en v.getstuk() == null en s.getpos() == w, wat is dan de waarde van v.getstuk() en s.getpos() na aanroep van v.setstuk(s)? (v) Als s, v en w allen niet-null zijn, en v.getstuk() == null en s.getpos() == w, wat is dan de waarde van v.getstuk() en s.getpos() na aanroep van s.zet(v)? (vi) Stuk bevat geen constructor. Kan er nu wel een instantie van de klasse worden geconstrueerd? c. (5 punten.) Geef postcondities voor de methoden van Stuk, die het resultaat van de methode zo volledig mogelijk uitdrukken. d. (6 punten.) Implementeer de klasse Stuk. Geef invarianten by de instantievariabelen.

Tentamen Programmeren 1 28 november 2002 (UITWERKING) 5 Antwoord op Opgave 2 a. (5 punten, waarvan 2 voor de klasseninvarianten. Trek max. 3 af voor fouten in de constructor, en max. 2 voor fouten in getvakje.) public class Bord { @invariant 0 <= dim private final int dim; * @invariant vakjes!= null, vakjes.length[] == dim * for all 0 <= i < dim: vakjes[i].length == dim * for all 0 <= i,j < dim: * vakjes[i][j]!= null, vakjes[i][j].getbord() == this * vakjes[i][j].getx() == i, vakjes[i][j].gety() == j private final Vakje[][] vakjes; public Bord(int dim) { this.dim = dim; this.vakjes = new Vakje[dim][dim]; for (int i = 0; i < dim; i++) for (int j = 0; j < dim; j++) vakjes[i][j] = new Vakje(this,i,j); public int getdim() { return dim; public Vakje getvakje(int i, int j) { if (0 <= i && i < dim && 0 <= j && j < dim) return vakjes[i][j]; else return null; b. (0 4 punten, 1 per fout antwoord.) (i) Levert een NullPointerException op. (ii) Mag niet volgens de preconditie; effect doet niet ter zake. (iii) Levert true op; na de aanroep is v.getstuk() gelijk aan s. (iv) Deze vraag niet meerekenen: het antwoord is niet eenduidig uit de specificatie op te maken. (v) v.getstuk() is s en s.getpos() is v: Stuk.zet houdt stuk en vakje consistent. (vi) Jawel: bij afwezigheid van een constructor wordt de klasse voorzien van een impliciete, parameterloze en lege constructor. c. (5 punten.) Voor het antwoord zie de volgende deelopgave. d. (6 punten, waarvan 2 voor de klasseninvariant. Als er een oplossing is geprogrammeerd waarbij geen instantievariabele is gebruikt, maar de positie uit het bord is berekend, is er dus geen sprake van een invariant!) public class Stuk { @invariant pos == null pos.getstuk() == this private Vakje pos;

6 Tentamen Programmeren 1 28 november 2002 (UITWERKING) * @ensure result == null result.getstuk() == this public Vakje getpos() { return pos; * @ensure result == (vakje.old.getstuk() == null) * if (result) then getpos() == vakje public boolean zet(vakje vakje) { if (vakje.getstuk() == null) { if (pos!= null) pos.haalaf(); vakje.setstuk(this); pos = vakje; return true; else return false; * @ensure result == (old.getpos()!= null) * this.getpos() == null public boolean sla() { if (pos!= null) { pos.haalaf(); pos = null; return true; else return false;

Tentamen Programmeren 1 28 november 2002 (UITWERKING) 7 Opgave 3 (25 punten) We gaan opnieuw uit van de klassen in Opgave 2. Bovendien mag u in onderstaande opgaven gebruik maken van een klasse List met functionaliteit zoals in het boek beschreven. a. (15 punten, waarvan 10 voor postconditie en lusinvariant.) Schrijf een methode List stukken(bord bord), die een lijst oplevert met alle stukken die op het Bord staan. Voorzie de methode van een postconditie die uitdrukt wat het resultaat is, en van een bijpassende lusinvariant. Aanwijzing: maak hierbij gebruik van de klassenmethode int abs(int a) in de klasse Math, die de absolute waarde van een getal oplevert. b. (10 punten, waarvan 5 voor analyse en commentaar.) Schrijf een methode List diagonaal(vakje van, Vakje tot), die een lijst oplevert met alle vakjes die een diagonaal vormen van vakje van tot en met vakje tot. (Dit hoeft dus geen complete dwarsdiagonaal van het bord te zijn.) De methode dient null op te leveren als dit geen correcte diagonaal oplevert. Houd rekening met alle (vier) diagonaalrichtingen! Analyseer het probleem aan de hand van één of meer kleine voorbeelden, en voorzie de methode van voldoende commentaar om de werking duidelijk te maken. Pre-/postcondities en invarianten hoeven niet gegeven te worden. Antwoord op Opgave 3 a. (15 punten, waarvan 10 voor postconditie en lusinvariant.) * @ensure result.contains(elem) desda * ((Stuk) elem).getpos().getbord() == bord public List stukken(bord bord) { List res = new ArrayList(); int i = 0; while (i < dim) { // res.contains(stuk) desda // stuk.getpos().getbord() == bord // en stuk.getpos().getx() < i int j = 0; while (j < dim) { // res.contains(stuk) desda // stuk.getpos().getbord() == bord // en stuk.getpos().getx() < i // of stuk.getpos().getx() == i en stuk.getpos().gety() < j Stuk stuk = bord.getvakje(i,j).getstuk(); if (stuk!= null) res.add(stuk); j++; i++; return res; b. (10 punten, waarvan 5 voor analyse en commentaar.) public List diagonaal(vakje van, Vakje tot) { // horizontale afstand tussen begin- en eindvakje int hor = tot.getx() - van.getx(); // absolute horizontale afstand int horabs = Math.abs(hor);

8 Tentamen Programmeren 1 28 november 2002 (UITWERKING) // horizontale richting van de diagonaal int horsign = hor/horabs; // verticale afstand tussen begin- en eindvakje int ver = tot.gety() - van.gety(); // absolute verticale afstand int verabs = Math.abs(ver); // verticale richting van de diagonaal int versign = ver/verabs; // test of dit wel een goede diagonaal oplevert if (horabs!= verabs) // horizontale en verticale afstand verschillen: // geen goede diagonaal return null; // maak lijst vakjes, te beginnen bij tot // x-coordinaat huidige vakje int i = van.getx(); // y-coordinaat huidige vakje int j = van.gety(); List res = new ArrayList(); // ga door tot eindvakje bereikt while (i!= tot.getx()) { // voeg vakje toe aan resultaatlijst res.add(van.getbord().getvakje(i,j)); // zet coordinaten stapje verder (in de goede richting) i += horsign; j += versign; // klaar return res; Opgave 4 (30 punten) We gaan opnieuw uit van de klassen in Opgave 2. a. (3 punten) Er zijn tenminste drie keuzemogelijkheden om een speler d.m.v. een java-type te representeren: als boolean, als int of als klasse Speler. Weeg deze mogelijkheden tegen elkaar af, door van elke keuze de voor- en nadelen te analyseren. b. (7 punten) Implementeer klassen Schaakbord en Schaakstuk die uit Bord resp. Stuk erven, en aan de volgende eisen voldoen. Pre-/postcondities en invarianten mag u achterwege laten. Schaakstuk heeft een eigenschap speler die de speler aangeeft van wie het stuk is (d.w.z., wit of zwart). Kies zelf een geschikt type voor deze eigenschap. Zorg dat de speler bij constructie van het Schaakstuk geïnitialiseerd wordt, en geef een methode om de speler op te vragen. Schaakstuk heeft een abstracte methode waarde, die een geheel getal levert die de waarde (d.w.z., de kracht) van dat stuk in het spel aangeeft. (De waarde van een pion is 1, van een loper en een paard 3, van een toren 5, van de koningin 9 en van de koning 0.) Schaakstuk heeft een abstracte methode kanzet, die een Vakje als parameter meekrijgt en een boolean oplevert die aangeeft of het Schaakstuk van zijn huidig positie naar dat vakje gezet mag worden. Schaakstuk overschrijft bovendien de methode zet in Stuk, door de zet alleen uit te voeren als hij wel kán (volgens kanzet). Een Schaakbord heeft altijd dimensie 8. c. (7 punten) Implementeer een subklasse Loper van Schaakstuk. Een loper beweegt altijd diagonaal, en kan niet over andere stukken springen; d.w.z., als er zich tussen het huidige vakje en de nieuwe

Tentamen Programmeren 1 28 november 2002 (UITWERKING) 9 positie een ander stuk bevindt is de zet niet mogelijk. Als er op de nieuwe positie een eigen stuk staat kan de zet ook niet; als er een stuk van de tegenstander staat wordt dit stuk geslagen. Aanwijzing: Maak gebruik van de methode diagonaal uit Opgave 3.b, en voorzie uw implementatie waar nodig van commentaar. Pre-/postcondities en invarianten hoeven niet gegeven te worden. d. (8 punten) Schets een klassendiagram met de klassen Bord, Stuk, Vakje, Schaakbord, Schaakstuk en Loper. De elementen (attributen en methoden) kunt u uit het diagram weglaten; geef echter wel de associatie- en abstractie-relaties tussen de klassen volledig weer. e. (5 punten) Schrijf een methode int evalueer(bord bord, Speler speler) (waarbij het type Speler het door uzelf gekozen representatietype is zie boven) die de som van de waarden van alle stukken van de betreffende speler oplevert. Aanwijzing: Maak hierbij gebruik van de methode stukken uit Opgave 3.a, en voorzie uw implementatie waar nodig van commentaar. Pre-/postcondities en invarianten hoeven niet gegeven te worden. Antwoord op Opgave 4 a. (3 punten; wees niet te pietluttig, geef punten zodra er iets zinnigs gezegd wordt.) int: weinig overhead, maar (veel) teveel mogelijke waarden. Kan eenvoudig mee gerekend worden. boolean: precies twee waarden, geschikt bij 2 spelers maar niet bij meer. Weinig overhead. Speler: de meest flexibele oplossing (kan bijv. gespecialiseerd worden, kunnen eigenschappen aan toegevoegd worden), maar ook met de meeste overhead (vergt klassendefinitie, constructie etc.). b. (7 punten; trek max. 2 af voor fouten in Schaakbord. Let op dat Schaakstuk abstract m óet zijn, omdat er twee abstracte methoden in zitten. Daarnaast moet ergens de codering voor de spelers (wit/zwart) aangegeven zijn (1 punt). Pre-/postcondities hoeven niet.) public class Schaakbord extends Bord { public final static int DIM = 8; public Schaakbord() { super(dim); public abstract class Schaakstuk extends Stuk { public static final int WIT = 0; public static final int ZWART = 1; @require speler == WIT speler == ZWART public Schaakstuk(int speler) { this.speler = speler; @ensure result >= 0 public abstract int waarde(); public abstract boolean kanzet(vakje nieuw); @ensure result == WIT result == ZWART public int getspeler() { return speler;

10 Tentamen Programmeren 1 28 november 2002 (UITWERKING) public boolean zet(vakje nieuw) { if (kanzet(nieuw)) return super.zet(nieuw); else return false; @invariant speler == WIT speler == ZWART private int speler; c. (7 punten; trek alleen punten af voor ontbrekend commentaar als de structuur van de oplossing niet helder is.) public class Loper extends Schaakstuk { public static final int WAARDE = 3; public Loper(int speler) { super(speler); public int waarde() { return WAARDE; public boolean kanzet(vakje nieuw) { // maak diagoaal waarover gezet moet worden List diag = diagonaal(getpos(), nieuw); // test of diagonaal wel ok is boolean res = (diag == null); if (res) { // diagonaal ok; test of tussenvakjes onbezet zijn int i = 1; while (res && i < diag.size()-1) { // tussenvaje is bezet; zet mag niet if (((Vakje) diag.get(i)).getstuk()!= null) res = false; i++; // test of er een stuk op het eindvakje staat Schaakstuk stuk = (Schaakstuk) ((Vakje) diag.get(i)).getstuk(); // zet mag alleen als geen eigen stuk op eindvakje if (res && (stuk == null stuk.getspeler()!= this.getspeler() )) res = false; return res; d. (8 punten: 3 voor elke ontbrekende klasse (max. 6), 2 voor elke ontbrekende of overtollige pijl (max. 4); 1 bij afhankelijkheids- (d.w.z. onderbroken) pijl i.p.v. associatie; 2 voor ontbrekende multipliciteit. De pijl van Stuk naar Vakje mag weggelaten zijn (zie ook het antwoord bij 2d.)) Zie Figuur 1.

Tentamen Programmeren 1 28 november 2002 (UITWERKING) 11 Figuur 1: Het gevraagde klassendiagram (Opgave 4.d) e. (5 punten; trek alleen punten af voor ontbrekend commentaar als de structuur van de oplossing niet helder is, bijv. bij roekeloos uit een lus springen.) public int evalueer(schaakbord bord, int speler) { // resultaatvariabele int res = 0; // vraag alle stukken op List stukken = stukken(bord); // doorloop de stukken for (int i = 0; i < stukken.size(); i++) { // volgende stuk Schaakstuk stuk = (Schaakstuk) stukken.get(i); // tel waarde van stuk bij res op als het van deze speler is if (stuk.getspeler() == speler) res += stuk.waarde(); return res;