Faculteit der Exacte Wetenschappen Tentamen Inleiding Programmeren Vrije Universiteit 25 maart 2002 ------------------------------------------------------------------------------- Voor studenten die het tentamen Inleiding Programmeren II uit de opleiding Medische Natuurwetenschappen doen geldt: - het tentamen bestaat uit de opgaven 1 en 2, opgave 3 hoeft niet gemaakt te worden - de tijdsduur is 2:30 uur Voor alle andere studenten geldt: - het tentamen bestaat uit alle drie de opgaven - de tijdsduur is 3:00 uur ------------------------------------------------------------------------------- Opgave 1. a) Gegeven zijn de onderstaande classes class Hoofdletter { char c; Hoofdletter () { c = 'A'; } void volgende () { if (c == 'Z') { c = 'A'; } else { c = (char) (c + 1); } } } class X { Hoofdletter hoofdletter; X () { hoofdletter = new Hoofdletter(); } void put (Hoofdletter hoofdletter) { this.hoofdletter = hoofdletter; } } en een programma dat de classes Hoofdletter en X gebruikt waarin de volgende declaraties staan Output out = new Output(); Hoofdletter hoofdletter = new Hoofdletter(); X x = new X(); void m1 (Hoofdletter par1, char par2) { if ('A' <= par2 && par2 <= 'Z') { par1.c = par2; par2 = 'F'; } } void m2 (X par1, Hoofdletter par2) { par1.put(par2); par2.volgende(); } void print () { out.println(x.hoofdletter.c); out.println(hoofdletter.c); } Wat is nu de uitvoer van een aanroep van de hierna gegeven methode doeIets() die in hetzelfde programma staat als de gegeven declaraties? void doeIets () { char c = 'D'; hoofdletter.volgende(); print(); m1(hoofdletter, c); print(); m2(x, hoofdletter); print(); m1(hoofdletter, c); m2(x, hoofdletter); print(); } b) Schrijf voor positieve getallen de onderstaande methode boolean bijzonder (int getal) // getal > 0 welke true retourneert als het meegegeven getal een bijzonder getal is. Een bijzonder getal is een getal waarvoor geldt dat de som van alle positieve gehele delers, die kleiner zijn dan het getal zelf, groter is dan dit getal. voorbeelden: 12 is een bijzonder getal want 1 + 2 + 3 + 4 + 6 > 12 18 is een bijzonder getal want 1 + 2 + 3 + 6 + 9 > 18 c) Schrijf de onderstaande methode som() int[][] som (int[][] a, int[][] b) // gegeven is a.length >= b.length en a[0].length >= b[0].length welke uit twee matrices een nieuwe matrix maakt die even groot is als de grootste van die twee matrices door de overeenkomstige elementen te sommeren. Elementen waarvoor geldt dat er in de ene matrix geen overeenkomstig elementen is met de andere matrix blijven ongewijzigd. Voorbeeld: bij a = 1 1 1 1 1 en b = 2 2 2 levert som(a, b) dan 3 3 3 1 1 op 1 1 1 1 1 2 2 2 3 3 3 1 1 1 1 1 1 1 2 2 2 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 d) Welke uitvoer geeft het programma in de onderstaande class? class Opgave1d { Output out; int a, b; Opgave1d () { a = 3; b = 5; out = new Output(); } void print (int a, int b) { out.println(a); out.println(b); } int methode1 (int b) { a = 2; b = b-1; print(a, b); return b+a; } int methode2 (int a, int c) { int b = c; a *= 2; c = methode1(a); print(b, c); return b+c; } void start() { print(b, a); b = methode1(a); print(b, methode2(b, a)); } public static void main(String argv[]) { new Opgave1d().start(); } } Opgave 2. a) Maak een class AudioCD voor het opslaan van audio-CD's. Voor deze opgave wordt een audio-CD gekarakteriseerd door het jaartal van eerste persing, de naam van het album en de songtitels. De songtitels vormen een lijst met de namen van alle "liedjes" op de audio-CD. Voorzie de class AudioCD van een constructor die via parameters het jaartal van eerste persing en de naam van het album een waarde geeft. Voeg verder een methode toe aan de class AudioCD die 1 songtitel kan toevoegen aan een AudioCD-object. void voegSongtitelToe (String songtitel) b) Maak een class AudioRack waarmee een object gedefinieerd wordt waarin maximaal 100 AudioCD-objecten kunnen worden opgeslagen. Voorzie de class AudioRack van een methode voegToe() om een AudioCD-object toe te kunnen voegen aan het AudioRack-object. c) Gegeven is dat de class String een methode int indexOf (String str) bevat die de startindex van het eerste voorkomen van een substring str retourneert indien deze substring aanwezig is en die -1 retourneert indien deze substring str niet aanwezig is. Voorbeelden: "abcdefghifgh".indexOf("def") == 3 "abcdefghifgh".indexOf("fgh") == 5 "abcdefghifgh".indexOf("piet") == -1 Voeg nu aan de class AudioRack een methode zoek() toe die een AudioCD retourneert met als jaartal van eerste persing 2002 en als naam van het album "tentamen IP2 25-03-2002", welke alle songtitels bevat van de audio-CD's in het audiorack die het woord "love" bevatten. Pak dit gestructureerd aan. Maak indien nodig hulpmethodes. Opgave 3. a) Gegeven is dat de class String een methode substring() als volgt bevat: String substring (int beginindex) welke de substring van de gehele String retourneert vanaf de gegeven beginindex. Voorbeelden: "12345".substring(0).equals("12345") "12345".substring(1).equals("2345") "12345".substring(2).equals("345") "12345".substring(5).equals("") Schrijf nu een recursieve oplossing voor de onderstaande methode reverse() die van een meegegeven String een nieuwe String maakt waarin alle characters in de omgekeerde volgorde staan. String reverse (String s) Voorbeelden: reverse("12345").equals("54321") reverse("").equals("") reverse("X").equals("X") Bij het schrijven van de methode reverse() mag gebruik gemaakt worden van de gegeven methode substring(). b) Uit de wiskunde zijn de zogenaamde Stirling-getallen {k, r} bekend. Deze zijn gedefinieerd als het aantal verschillende manieren om een verzameling van k elementen in r disjuncte verzamelingen te splitsen. Voor k, r >= 0 geldt: {k, r} = r * {k-1, r} + {k-1, r-1} en {k, 0} = 0 {0, r} = 0 {0, 0} = 1 {k, k} = 1 Schrijf een recursieve methode stirling() die voor willekeurige waarden van k en r retourneert op hoeveel verschillende manieren een verzameling van k elementen in r disjuncte verzamelingen gesplitst kan worden. Neem aan: k>=0 en r>=0. Waardering Opgave a b c d totaal 1. 4 4 4 4 16 2. 4 2 5 11 3. 4 5 9 -- + 36 Voor MNW-studenten: Het eindcijfer E volgt uit het puntentotaal T als volgt : E = T / 3 + 1 Voor alle andere studenten: Het eindcijfer E volgt uit het puntentotaal T als volgt : E = T / 4 + 1