PROEF-Tentamen Inleiding programmeren (IN1608WI), X januari 2010, 9.00-11.00, Technische Universiteit Delft, Faculteit EWI, Afdeling 2.
Open boek tentamen: bij het tentamen mag alleen gebruik worden gemaakt van het studieboek, niet van college slides, practicumopdrachten of ander materiaal. Opgave 1 (20 punten) Gegeven de specificatie van een klasse Verzameling die getallen kan bevatten uit het interval [0,n-1]. Geef een implementatie van deze klasse. Verzameling -elementen: boolean[] +Verzameling(n : int) post: heeft een lege verzameling gecreëerd voor getallen uit[0,n-1] +bevat(e : int): boolean pre: 0 <= e < n post: retourneert true dsd e in de verzameling voorkomt +voegToe(e : int) pre: 0 <= e < n post: indien pre en indien e nog niet in de verzameling voorkwam, is e toegevoegd +toString() post: retourneert de inhoud van de verzameling +verschil(that: Verzameling) : Verzameling post: retourneert de verzameling van de getallen die wel in this maar niet in that voorkomen
Toelichting van het attribuut elementen: de indices van elementen zijn de getallen uit het interval [0,n-1]. Als elementen[i] true is, betekent dat getal i in de verzameling voorkomt, is elementen[i] false, dan komt getal i niet in de verzameling voor. Toelichting van toString(). Als verzameling de getallen 2 en 6 bevat is de waarde van toString():
Gedeeltelijke uitwerking: bevat: zoeken naar aanwezigheid van het element, element gevonden indien gestopt voor het eind van de rij. voegToe: eerst methode bevat gebruiken, alleen toevoegen als bevat() false is verschil: voor elk element van this nagaan of het voorkomt in that, is dat niet zo dan aan verzameling res toevoegen
1
Opgave 2 (8 punten) In Appendix A is een aantal interfaces en klassen gedefinieerd. Bestudeer de definities goed voordat je begint aan het beantwoorden van de vraag. Geef een volledig klassendiagram van de klassen en interfaces. Gedeeltelijke uitwerking: Resettable: pijl naar IntEnum Numbers: pijl naar IntEnum ResettableNumber: pijl naar Numbers en naar Resettable BoundedNumbers: pijl naar Numbers Opgave 3 (17 punten) De volgende code fragmenten verwijzen naar de definities van Appendix A. Geef voor elk codefragment aan: - of er tijdens het compileren een compileerfout zal optreden, en zo ja waarom, - zo niet, of er tijdens de uitvoering een runtime error zal optreden, en zo ja waarom, - zo niet, wat de waarde van x is na de uitvoering. a
Numbers numbers = new BoundedNumbers(1); int x = numbers.nextInt(); if (numbers.hasMoreInts()) x = numbers.nextInt(); else x = 0;
b
Numbers numbers = new ResettableNumbers(); int x = numbers.nextInt(); numbers.reset(); x = numbers.nextInt();
c
Numbers numbers = new ResettableNumbers(); int x = numbers.nextInt(); ((ResettableNumbers)numbers).reset(); x = numbers.nextInt();
d
Numbers numbers = new BoundedNumbers(1); int x = numbers.nextInt(); x = numbers.nextInt();
e
IntEnum numbers = new Numbers(); int x = numbers.nextInt(); ResettableNumbers rn = (ResettableNumbers)numbers; x = rn.nextInt();
2
Gedeeltelijke uitwerking: a: 0 b: compile error, Numbers kent geen methode reset() c: 1 d: 2, merkwaardig aangezien de waarden van BoundedNumbers lopen van 1 t/m 1 e: ClassCastException, Number is geen implementatie van ResttableNumber numbers. Opgave 4 (25 punten) Appendix B bevat een definitie van klasse Punt. Bestudeer deze definitie goed voordat je begint aan het beantwoorden van de vraag. Met behulp van klasse Punt construeren we een klasse PuntenLijst die een lijst bevat van Puntobjecten. Een deel van de implementatie van PuntenLijst is hieronder gegeven: public class PuntenLijst{ private Punt[] punten; private int aantal; private int capaciteit; public PuntenLijst(int n){ aantal = 0; punten = new Punt[n]; capaciteit = n; } public void voegToe(Punt p){ if (aantal < capaciteit){ punten[aantal] = p; aantal = aantal + 1; } } //op deze plaats worden andere methoden gedefinieerd. } Geef de implementaties voor de volgende methoden van klasse PuntenLijst. Als er een hulpmethode nodig is, dien je volledige implementatie van de hulpmethode te geven. Voor sommige berekeningen is het nodig om het middelpunt van een verzameling punten te kennen. De x-coordinaat van het middelpunt is het afgeronde, gemiddelde van x-coordinaten van de punten, de y-coordinaat van het middelpunt is het afgeronde, gemiddelde van y-coordinaten van de punten. a.
public Punt middelPunt() //post: retourneert het middelpunt van de punten van de //PuntenLijst. Als de lijst leeg is, wordt een punt met //coördinaten (0,0) teruggegeven.
3
Bij de volgende methode zoeken we naar een punt dat het verste weg ligt vanaf een gegeven punt. b.
public Punt versteWeg(Punt p) //pre: aantal > 0 //post: retourneert het punt dat het verste weg ligt van //het opgegeven punt. Indien er twee of meer punten ver weg //liggen, wordt er willekeurig een van die punten gegeven.
Bij de volgende methode zoeken we de twee punten in de puntenlijst die het verst van elkaar afliggen. Het resultaat is een nieuwe puntenlijst die de twee punten bevat met de grootste onderlinge afstand. c. public PuntenLijst extremen() //pre: aantal > 1 //post: retourneert een puntenlijst met de twee punten //die het verst van elkaar af liggen.
Gedeeltelijke uitwerking: a.
bereken gemiddelde van de x-waarden en de y-waarden van de opgeslagen punten, rond het gemiddelde af, retourneer een Punt met de gemiddelde waarden.
b.
Definieer methode afstand(p : Punt) : double. Bepaal de grootste afstand tussen het gegeven punt en elk van de andere punten, retourneer punt met de grootste afstand.
c.
Gebruik methode versteWeg() om voor elk punt uit de lijst het punt te vinden dat verste weg is, retourneer paar dat het verst uit elkaar ligt.
Opgave 5(20 punten) Hieronder zie je de grafisch user interface van een eenvoudig programma. In Appendix C is de volledige code van dit programma vermeld.
Met het programma kunnen afspraken zoals “Kapper 10.00” of “Tandarts 13.45” worden opgeslagen en tevoorschijn worden gehaald. De user interface bestaat uit twee knoppen met opschriften “VoegToe:” en “AfspraakNummer:” en een tekstveld. Als er op een van de knoppen wordt geklikt gebeurt er (nog) niets.
4
Gevraagd wordt om de uitbreiding van de code van het programma. Na de uitbreiding moet het volgende gelden: 1. Er wordt een nieuwe afspraak ingevoerd in het tekstveld. Als er dan op de knop met opschrift “VoegToe:” wordt geklikt, wordt de afspraak toegevoegd aan de lijst afspraken. Het tekstveld wordt daarna leeg gemaakt.
na klikken ->
2. Er wordt in het tekstveld een nummer ingevoerd behorend bij een van de afspraken. Het nummer moet positief zijn en kleiner dan het aantal afspraken. Na klikken op de knop “Afspraaknummer:” wordt de bijbehorende afspraak getoond. Is het nummer niet correct dan wordt de boodschap “Onjuist nummer” getoond. na klikken->
Maak de bijlage los van het tentamen, schrijf je naam en studienummer erop. Geef in de bijlage aan welke veranderingen en uitbreidingen er nodig zijn om het programma op de gewenste manier te laten werken. Gedeeltelijke uitwerking: Importeer een extra package. Laat de klasse het interface ActionListener implementeren. Voeg een ActionListener aan beide knoppen toe. Implementeer methode actionperformed, zoals is aangegeven. Bij het invoeren van een geheel getal, moet het type van de invoer worden omgezet van String naar int.
5
Appendix A interface IntEnum{ boolean hasMoreInts(); int nextInt(); } interface Resettable extends IntEnum{ public void reset(); } public class Numbers implements IntEnum{ int next = 1; public int nextInt(){ return next++; } public boolean hasMoreInts(){ return true; } } public class ResettableNumbers extends Numbers implements Resettable{ public void reset(){ next = 1; } } public class BoundedNumbers extends Numbers{ private int last; public BoundedNumbers(int last){ this.last = last; } public boolean hasMoreInts(){ return next <= last; } }
6
Appendix B public class Punt{ private String label; private int x; private int y; public Punt(String l, int x, int y){ setLabel(l); setX(x); setY(y); } public String getLabel(){ return label; } public void setLabel(String l){ label = l; } public int getX(){ return x; } public void setX(int x){ this.x = x; } public int getY(){ return y; } public void setY(int y){ this.y = y; } public boolean equals(Object other){ Punt that = (Punt)other; return getX() == that.getX() && getY() == that.getY(); } }
7
Appendix C import java.awt.*; import javax.swing.*; public class AgendaFrame extends JFrame{ private private private private
JButton voegToeKnop = new JButton("VoegToe: "); JTextField tekstVeld = new JTextField(); JButton zoekKnop = new JButton("Afspraaknummer: "); JPanel panel = new JPanel(new GridLayout(2,2));
private String[] afspraken = new String[10]; private int aantal = 0; public AgendaFrame(){ setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setBounds(100,100,350,100); Container c = getContentPane(); panel.add(voegToeKnop); panel.add(tekstVeld); panel.add(zoekKnop); c.add(panel); setVisible(true); } }
8