Faculteit der Exacte Wetenschappen Tentamen Inleiding Programmeren Vrije Universiteit 21 augustus 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 Getal { int i; Getal () { i = 3; } void verdubbel () { i *= 2; } } class Z { Getal getal; Z () { getal = new Getal(); } void put (Getal getal) { this.getal = getal; } } en een programma dat de classes Getal en Z gebruikt waarin de volgende declaraties staan Output out = new Output(); Getal getal = new Getal(); Z z = new Z(); void m1 (Getal par1, int par2) { par1.i = par2; par2 = 100; } void m2 (Z par1, Getal par2) { par1.put(par2); par2.verdubbel(); } void print () { out.println(z.getal.i); out.println(getal.i); } 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 () { int i = 5; getal.verdubbel(); print(); m1(getal, i); print(); m2(z, getal); print(); m1(getal, i); m2(z, getal); print(); } b) Schrijf voor positieve getallen de onderstaande methode int aantalKwadraatDelers (int h) // getal > 0 welke retourneert voor hoeveel verschillende gehele getallen g geldt dat het meegegeven getal h deelbaar is door het kwadraat van dit getal g. voorbeelden: 12 is deelbaar door 4 kwadraten, namelijk door de kwadraten van -2, -1, 1 en 2. 100 is deelbaar door 8 kwadraten, namelijk door de kwadraten van -10, -5, -2, -1, 1, 2, 5, en 10. c) Schrijf de onderstaande methode rijmaxima() int[] rijmaxima (int[][] m) welke in de 2-dimensionale matrix m van iedere rij het maximum bepaalt en deze maxima in een 1-dimensionaal array retourneert. Voorbeeld: bij m = 1 2 3 4 5 levert rijmaxima(m) het array [5, 3, 4, 9] op 1 2 3 2 1 4 4 4 4 4 6 7 8 9 0 d) Welke uitvoer geeft het programma in de onderstaande class? class Opgave1d { Output out; int a = 4, b = 3; Opgave1d () { 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); a = methode2(b, a); print(b, a); } public static void main(String argv[]) { new Opgave1d().start(); } } Opgave 2. a) Maak een class Huis voor het opslaan van huizen. Voor deze opgave wordt een huis gekarakteriseerd door het grondoppervlak, de waarde (afgerond op een geheel aantal euro's) en de naam van de gemeente waarin het huis ligt. Voorzie de class Huis van een constructor die via parameters het grondoppervlak en de gemeentenaam een waarde geeft. Voeg verder een methode toe aan de class Huis die een waarde aan het huis kan toekennen void putWaarde (int huiswaarde) b) Maak een class Makelaar waarmee een object gedefinieerd wordt waarin maximaal 100 Huis-objecten kunnen worden opgeslagen. Voorzie de class Makelaar van een methode voegToe() om een Huis-object toe te kunnen voegen aan het Makelaar-object. Bij het programmeren van de methode voegToe() mag er vanuit gegaan worden dat er nooit meer dan 100 Huis-objecten in het Makelaar-object opgeslagen zullen zijn. c) Voeg nu aan de class Makelaar de onderstaande methode zoek() toe die alle huizen retourneert die niet duurder zijn dan de opgegeven maximumprijs, waarvan het grondoppervlak niet kleiner is dan de opgegeven minimumoppervlakte en die in de opgegeven gemeente liggen. Makelaar zoek (int maximumprijs, double minimumoppervlakte, String gemeente) 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, int eindindex) welke de substring van de gehele String retourneert vanaf de gegeven beginindex tot de gegeven eindindex, m.a.w. van beginindex t/m eindindex-1 Voorbeelden: "12345".substring(0, 3).equals("123") "12345".substring(2, 3).equals("3") "12345".substring(1, 4).equals("234") "12345".substring(0, 5).equals("12345") "12345".substring(4, 4).equals("") Schrijf nu een recursieve oplossing voor de onderstaande methode buitensteVooraan() String buitensteVooraan (String s) die van de meegegeven String s een nieuwe String maakt bestaande uit het eerste character van s gevolgd door het laatste character van s gevolgd door de characters tussen het eerste en laatste character van s waarbij op deze tussenliggende characters dezelfde bewerking wordt toegepast. Indien het eerste character ook het enige character is wordt dit character 1 keer aan de resultaatstring toegevoegd. Voorbeelden: buitensteVooraan("aba").equals("aab") buitensteVooraan("abcdefghij").equals("ajbichdgef") buitensteVooraan("12345").equals("15243") buitensteVooraan("X").equals("X") buitensteVooraan("").equals("") Bij het schrijven van de methode buitensteVooraan() mag gebruik gemaakt worden van de gegeven methode substring(). b) Schrijf een recursieve methode voor het afdrukken van de volgende rij tekens: p(1) = (a) p(2) = (aa(a)aa) p(3) = (aaa(aa(a)aa)aaa) p(4) = (aaaa(aaa(aa(a)aa)aaa)aaaa) De heading van de methode moet er als volgt uitzien: void p (int i) // i > 0 Waardering Opgave a b c d totaal 1. 4 4 4 4 16 2. 4 2 5 11 3. 5 4 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