Uitwerking Tentamen Programmeren 1 - Java dinsdag 17 december 2002 1. a. In iets[99]. b. applet: eventgestuurd mechanisme, in HTML pagina stand-alone: main, gewone control flow, in gewone omgeving c. 1010, respectievelijk 100010, respectievelijk 1010 In het tweede geval worden de strings "opgeteld": achter elkaar geplakt. d. met Graphics g = getGraphics ( ); Bij (re)paint wordt het HELE scherm ververst, nu kun je "bij"schrijven. 2. a. public int som (int[ ] A) { int i; int totaal = 0; for ( i = 0; i < A.length; i++ ) totaal = totaal + A[i]; return totaal; } // som b. public int gem (int[ ] A) { return som (A) / A.length; // eventueel met (double) erbij } // gem c. Bekijk steeds het middelste element van het deel van de rij waarin je nog moet zoeken. Als het getal dat je zoekt daar staat, ben je klaar. Anders, als het kleiner is, ga je door in het linker deel van de rij, en anders, als het dus groter is, in het rechter deel. Het werkt alleen als de rij GESORTEERD is. d. Een int wordt "call by value" doorgegeven: je geeft alleen de waarde door. Van een array wordt het adres doorgegeven; je kunt eigenlijk zeggen: het array wordt ZELF doorgegeven. Een functie kan dus array-elementen wel degelijk wijzigen, een gewone int kan -als hij als parameter wordt doorgeveven- niet gewijzigd worden door een functie. 3. a. De functie doewat mishandelt de globale variabele globaal. In doewat is temp een locale variabele, die even gebruikt wordt en daarna weer verdwijnt. De locale variabele x krijgt bij aanroep de waarde van de "actuele" parameter (bijvoorbeeld 3 bij aanroep doewat (3)); veranderingen aan deze x zijn plaatselijk. b. Respectievelijk: 15 4 11 15 4 11 15 4 -11 11 0 11 15 4 11 15 4 -11 4. a. public void drukaf (int[ ][ ] A) { int i, j; for ( i = 0; i < A.length; i++ ) { for ( j = 0; j < A[0].length; j++ ) { if ( A[i][j] < 10 ) System.out.print (" "); // voor het uitlijnen System.out.print (A[i][j]); } // for System.out.println (" "); } // for } // drukaf b. int[ ][ ] A = new int[m][n]; for ( int i = 0; i < A.length; i++ ) for ( int j = 0; j < A[0].length; j++ ) if ( i + j < 100 ) A[i][j] = i + j; else A[i][j] = 0; c. public int hoeveel (int[ ][ ] A) { int i, j, tel = 0, bool okee; for ( i = 0; i < A.length; i++ ) for ( j = 0; j < A[0].length; j++ ) { okee = true; if ( i-1 > 0 && A[i-1][j] == 0 ) okee = false; if ( i+1 < m && A[i+1][j] == 0 ) okee = false; if ( j-1 > 0 && A[i][j-1] == 0 ) okee = false; if ( j+1 < n && A[i][j+1] == 0 ) okee = false; if ( okee) tel++; } // for return tel; } // hoeveel 4. a. init initialiseert het venster (de applet), en bouwt dit op. Verder worden alle zaken die op events moeten letten aangemeld. adjustmentValueChanged wordt automatisch aangeroepen wanneer een event in een aangemelde scrollbar optreedt paint hertekent op bevel van repaint het venster b. public int kwadraat (int i) { return i * i; } // kwadraat c. bovenaan erbij: private Scrollbar trekker2; private int waarde2 = 0; in init erbij: trekker2 = new Scrollbar (Scrollbar.HORIZONTAL,0,1,0,100); add (trekker2); trekker2.addAdjustmentListener (this); in paint in plaats van het huidge draw-statement: g.drawString ("Nu is het " + kwadraat (waarde + waarde2),100,100); in adjustmentValueChanged erbij: waarde2 = trekker2.getValue ( ); d. if ( e.getSource ( ) == trekker ) ... Zo voorkom je ook problemen als het proberen te lezen van resultaten van events uit dingen die geen event veroorzaakt hebben.