Faculteit Wiskunde en Informatica Tentamen Inleiding Programmeren Vrije Universiteit 25 mei 1998 tijdsduur : 3 uur ------------------------------------------------------------------------------- Voor alle opgaven in dit tentamen zijn de volgende declaraties gegeven: Output out = new Output(); Input in = new Input(); Er kan in opgaven waar dit gewenst is dus zonder meer gebruik gemaakt worden van de variabelen in en out voor inlezen respectievelijk afdrukken. Opgave 1. a) Gegeven zijn de volgende declaraties: static final int ROOD = 1, BLAUW = 2, GEEL = 3, ZWART = 4; Schrijf nu de onderstaande methode String naam (int kleur) welke de kleur die in de meegegeven int-waarde gecodeerd zit als string retourneert. Bijvoorbeeld: bij de int-waarde 3 wordt de string "geel" geretourneert. Bij int-waardes die niet voor een kleur coderen moet de string "onbekende kleur" geretourneerd worden. Implementeer de methode naam() m.b.v. een switch-statement. b) Gegeven is de onderstaande class X class X { int getal; String naam; } Schrijf de methode boolean gelijk (X x1, X x2) die true retourneert als de variabelen in x1 en x2 dezelfde waarde hebben en false retourneert als dit niet het geval is. c) Is voor een methode mogelijk om de inhoud van een als parameter meegekregen object te veranderen? Verklaar je antwoord. Wat is de uitvoer van het onderstaande stukje code? String s = "declaratie"; void init (String string) { string = new String("test"); } init(s); out.print(s); d) Gegeven is het programma in de onderstaande class: class Opgave_1d { Output out; int a = 1, b = 2; Opgave_1d() { out = new Output(); } void methode1 (int a) { a = 2 * a; } int methode2 (int a, int b) { a += 1; methode1(a); b *= 2; methode1(b); out.println(a); out.println(b); return methode3(b); } int methode3 (int a) { int x = 2; out.println(a); out.println(b); if (a > b) { return a - x; } else { return a + x; } } void start() { a = methode2(b, b); out.println(a); out.println(b); } public static void main(String argv[]) { new Opgave_1d().start(); } } welke uitvoer geeft dit programma? Opgave 2. Gegeven is de onderstaande class 'Land'. class Land { String naamLand; double oppervlakte; // in km2 int aantalInwoners; } a) Voeg aan de class Land een constructor zonder parameters toe die het Land-object initialiseert op een leeg land, d.w.z. dat het String-object als startwaarde de lege string krijgt en dat de primitieve variabelen 'oppervlakte' en 'aantalInwoners' als startwaarde respectielveijk 0.0 en 0 krijgen. b) Voeg nu aan de class Land een tweede constructor met drie parameters toe. Deze parameters bevatten de startwaarden voor de drie variabelen van het Land-object. c) Maak een class Continent welke, gebruik makend van de in de onderdelen a) en b) van deze vraag uitgebreidde class Land, een object definieert dat maximaal 50 landen kan bevatten en een methode voegToe bevat om een land aan het Continent-object toe te voegen. d) Voeg aan de class Continent een methode 'aantalDichtbevolkt' toe die het aantal landen telt met een bevolkingsdichtheid >= 250 inwoners/km2. Pak dit gestructureerd aan door eerst aan de class Land een methode 'bevolkingsdichtheid' toe te voegen. e) Gegeven is dat in een class die gebruik maakt van de class Continent de volgende declaratie staat: Continent continent = new Continent(); Schrijf voor deze class een methode 'percentageDichtbevolkt' welke het percentage van de dichtbevolkte landen in 'continent' retourneert. Opgave 3. a) De driehoeksgetallen zijn als volgt gedefinieerd: d(0) = 0 d(1) = 0+1 d(2) = 0+1+2 d(3) = 0+1+2+3 d(4) = 0+1+2+3+4 enz. Schrijf een recursieve methode voor de berekening van het i-de (i >= 0) driehoeksgetal). b) Deze opgave gaat over int-expressies in prefixnotatie, d.w.z. berekeningen (expressies) met int-waarden waarbij de uit te voeren operatie (b.v sommatie) niet tussen de operanden (zoals bij 2 + 3) maar voor deze staat (dus + 2 3). De operanden mogen zelf ook weer int-expressies in prefixnotatie zijn. De enige operatoren die voor deze opgaven gebruikt worden zijn +, - en * voor respectievelijk sommatie, verschil en product. Om het programmeren wat makkelijker te maken geldt verder voor deze opgave dat iedere int-expressie in prefixnotatie tussen ronde haken, d.w.z. tussen '(' en ')', staat en dat tussen de twee operanden een komma staat. Voorbeelden van int-expressies in prefixnotatie zijn: (+2,3) betekent (2 + 3) (*4,5) betekent (4 * 5) (*(+2,3),4) betekent ((2 + 3) * 4) (*(+2,3),(*4,5)) betekent ((2 + 3) * (4 * 5)) of, al wat ingewikkelder (+(*3,(+(*2,4),(+3,5))),(+(-10,7),6)) wat overeenkomt met: ((3 * ((2 * 4) + (3 + 5))) + ((10 - 7) + 6)) Als gegeven is dat de leeswijzer het eerste character van een (NIET-lege) regel invoer aanwijst en dat de invoer een int-expressie in prefixnotatie bevat, schrijf dan een recursieve methode leesExpressie() die de uitkomst van de prefix-expressie op de invoer retourneert. De heading van de methode leesExpressie() is: int leesExpressie () HINTS: Als we naar het voorbeeld (*(+2,3),(*4,5)) kijken dan zien we dat om de totale expressie uit te rekenen, de operanden (+2,3) en (*4,5) uitgerekend moeten worden. Deze twee operanden zijn zelf ook weer (kleinere) int-expressies in prefixnotatie. Hier herkennen we dus de recursiestap. Bij het uitrekenen van b.v. (+2,3) hoeven de operanden 2 en 3 slechts ingelezen te worden om hun waarde te bepalen, m.a.w. als een operand niet met een '(' begint is de waarde ervan te bepalen met in.readInt(). Dit leidt tot de stopconditie. Waardering Opgave a b c d e f totaal 1. 4 2 4 4 14 2. 2 2 4 4 2 14 3. 2 6 8 -- + 36 Het eindcijfer E volgt uit het puntentotaal T als volgt : E = T / 4 + 1