Tentamen Imperatief Programmeren Maandag 22 oktober 2001 Toelichting Dit is een open boek tentamen, d.w.z. het cursusboek mag gebruikt worden. N.B.: Het tentamen is individueel: voor het maken van de opgaven mag niet worden samengewerkt. U dient de opgaven helder en precies te beantwoorden. Uw antwoord dient altijd gemotiveerd te worden. Er zijn 8 opgaven. In totaal zijn er 100 punten te behalen. Het tentamencijfer is het aantal behaalde punten gedeeld door 10. Het eindcijfer is het minimum van (O 0.45) + (E 0.3) + (T 0.3) en 10, waarbij O, E en T de cijfers voor de ingeleverde opgaven, de eindopdracht en het tentamen zijn respectievelijk. Inleveren Het tentamen dient maandag 29 oktober 2001 voor 17.00 uur persoonlijk bij Vincent van Oostrom (kamer 441A) of André van Kooij (kamer 482) te worden ingeleverd. 1. Deze opgave betreft de Java syntax. Beschouw het volgende Java programma fragment: public class LinkedQueue implements Queue { private Node head,tail; private int size; public Object dequeue() { Object o; if (size == 0) return null; o = head.getelement(); head = head.getnext(); size--; if (size == 0) tail = null; return o; Geef van ieder voorkomen van een woord in het programma de syntactische categorie aan (b.v. keyword, identifier) en ook de een korte beschrijving van de betekenis van het woord op die plek. (10 punten) 2. Deze opgave betreft types. (a) Leg uit wat het verschil is tussen primitive types en object (nonprimitive) types. (4 punten) 1
(b) Bepaal voor ieder van de volgende namen of het een naam van een type kan zijn, en zo ja of het een naam van een primitive type of een object type kan zijn: boolean, bool, integer, int, 1nt, public, Public, Publ1c, publiek, Publiek, String, string. (6 punten) (c) Het volgende programma compileert correct. Bepaal voor ieder van de 6 print regels (afzonderlijk) of er een runtime exception wordt gegenereerd en (als dat niet het geval is) wat er afgedrukt wordt en leg uit waarom. (6 punten) import java.io.*; public class Nonprimitive { String primitive_string; boolean equals(nonprimitive a_string) { return(this.primitive_string.equals(a_string.primitive_string)); public static void main(string[] argv) { String s = "test"; String t = "test"; System.out.println(s==t); System.out.println(s.equals(t)); Nonprimitive p = new Nonprimitive(); Nonprimitive q = new Nonprimitive(); System.out.println(p==q); System.out.println(p.equals(q)); p.primitive_string = s; q.primitive_string = t; System.out.println(p==q); System.out.println(p.equals(q)); 3. Deze opgave betreft de control flow in programma s. (a) Schrijf een programma dat de natuurlijke getallen vanaf 1 afdrukt totdat een getal afgedrukt zou moeten worden dat door zowel 7 als 11 als 13 deelbaar is. (5 punten) (b) Wat doet het onderstaande programma? Leg uit waarom. (5 punten) import java.io.*; class Watdoetditprogramma { public static void main(string[] argv) { 2
int i, j; int[] a = {3,7,3,2,1; int temp; int n = 5; for (i = 1; i < n; i++) { for (j = 0; j < n - i; j++) { if (a[j] > a[j+1]) { temp = a[j]; a[j]=a[j+1]; a[j+1]=temp; for (i= 0; i < n; i++) { System.out.println(a[i]); 4. Deze opgave betreft klassen en interfaces. (a) Schrijf een klasse AdresImpl die het volgende interface implementeert: public interface Adres { public void setnaam( String naam ); public String getnaam(); public void setadres( String adres ); public String getadres(); Zorg ervoor dat instanties van AdresImpl de waarde van een naam in een field naam en de waarde van het adres in een field adres opslaan. (7 punten) (b) Hoe kunt u ervoor zorgen dat de fields naam en adres alleen door middel van de methods uit het interface toegankelijk zijn? (4 punten) (c) Maak een subklasse van AdresImpl met de naam TelefoonImpl die niet alleen het Adres interface, maar ook het volgende interface implementeert: public interface Telefoon { public void settelefoonnummer( int telefoon ); public int gettelefoonnummer(); (4 punten) 5. Deze opgave betreft threads. Het volgende interface maakt deel uit van de besturingssoftware voor een thermostaat: public interface Thermostaat 3
{ /* Geeft aan welke temperatuur gewenst is. */ public int gewenstetemp(); /* Meet de huidige temperatuur. */ public int huidigetemp(); /* Zet de verwarming hoger. */ public void verwarminghoger(); /* Zet de verwarming lager. */ public void verwarminglager(); Veronderstel verder dat er een klasse ThermostaatImpl is die het bovenstaande interface implementeert. (a) Maak een klasse AutoThermostaat die een uitbreiding is van de klasse ThermostaatImpl. De klasse AutoThermostaat moet een method hebben die kijkt of de huidige temperatuur gelijk is aan de gewenste temperatuur en zonodig de verwarming hoger of lager zet. Deze method moet geschikt zijn om in een aparte thread aangeroepen te worden. (6 punten) (b) Maak een klasse die een instantie van AutoThermostaat in een aparte thread draait. Houd er rekening mee dat de temperatuur niet onmiddellijk verandert nadat de verwarming hoger of lager is gezet. (4 punten) 6. Probeer de volgende vragen in uw eigen woorden binnen enkele regels te beantwoorden: (a) Leg uit wat de voordelen zijn van het gebruik van getter en setter methods boven het direct uitlezen of veranderen van de waarden van de fields van een object. (5 punten) (b) Verklaar hoe het kan dat ieder Java object de tostring() method implementeert. (5 punten) (c) Leg uit wat encapsulatie inhoudt. (5 punten) 7. Deze opgave betreft exceptions. Gegeven een methode f die twee verschillende soorten exceptions kan geven: public static int f( int x ) throws IOException, SecurityException; Schrijf een methode g met signatuur public static int g( int x ); die het zelfde resultaat levert als f, behalve als er een exception optreedt indien er een IOException optreedt moet de waarde 0 worden teruggegeven en wanneer er een SecurityException optreedt moet de waarde 1 worden teruggegeven. (10 punten) 4
8. Deze opgave betreft inter-thread communicatie. Beschouw het programma bestaande uit de volgende 4 klassen: import java.io.*; public class Shared { public static void main(string[] args) { Common common = new Common(); Producer p = new Producer(common, 1); Consumer c = new Consumer(common, 1); p.start(); c.start(); public class Common { public int number; public class Producer extends Thread { private Common common; private int number; public Producer(Common common, int number) { this.common = common; this.number = number; public void run() { for (int i = 0; i < 1000; i++) { common.number = i; System.out.println("Producer #" + this.number + " put: " + i); try { sleep((int)(math.random() * 100)); catch (InterruptedException e) { public class Consumer extends Thread { private Common common; private int number; public Consumer(Common common, int number) { this.common = common; this.number = number; public void run() { 5
int value = 0; for (int i = 0; i < 1000; i++) { value = common.number; System.out.println("Consumer #" + this.number + " got: " + value); (a) Herschrijf het programma zodanig dat alle toegang tot het gemeenschappelijke object (common) via get en put methods loopt (U hoeft alleen de wijzigingen aan te geven). (5 punten) (b) De specificatie van het programma is dat de consumer ieder getal dat door de producer geproduceerd wordt, afdrukt. Geef aan waarom het programma niet aan deze specificatie voldoet. (3 punten) (c) Pas het programma dat in het eerste onderdeel gevonden is zodanig aan dat het aan de in het tweede onderdeel geformuleerde specificatie voldoet. (6 punten) 6