Uitwerkingen van het Proeftentamen Programmeren 1 - Java (zie http://www.liacs.nl/home/kosters/java/proef.html) 1. In serie[41]. 2. Java wordt gecompileerd (naar bytecode), JavaScript wordt regel voor regel geinterpreteerd. Java is "strenger": er wordt bijvoorbeeld bij variabelen erop gelet of ze wel gedeclareerd zijn, en bij toekenningen moeten de types precies kloppen. JavaScript ziet wat meer door de vingers. Java is een complete programmeertaal, JavaScript verzorgt (kleinere) programma's in HTML-pagina's. 3. Een applet draait in een webpagina, is grafisch fraai verzorgd, en bevat doorgaans allerlei functies om de gebruikers-interactie (met muis etc.) af te handelen. Een applicate met main erin kan stand-alone in een tekstgeorienteerde omgeving (DOS, UNIX) draaien. Input en output verlopen op een niet-grafische laag-bij-de-grondse manier. 4. In init wordt de userinterface opgebouwd; ook worden hier de diverse knoppen, schuifbalken etc. aangemeld. De functie paint beeldt alles opnieuw af (op de juiste manier). Er is een functie die op acties reageeert (muis, tekstveld) en een functie die op "adjustments" reageert (schuifbalken); deze functies doen hun werk, eventueel via andere functies, en roepen daarna (via repaint) de functie paint aan. 5. Met leeftijd = Integer.parseInt (leeftijdVeld.getText ( )); zorg je ervoor dat de string (een serie karakters) die de gebruiker in het tekstveld leeftijdVeld heeft ingevoerd wordt omgezet naar een getal. Bij g.drawString (i+j,10,10); worden de getallen i en j niet bij elkaar opgeteld, maar achter elkaar geplakt (geconcateneerd) en afgebeeld. Met g.drawString (" " + (i+j),10,10); druk je de som van de int's i en j af. Let op de " " die erbij "opgeteld" wordt om af te dwingen dat het een string wordt. De functie parseInt kun je hier soms ook bij gebruiken. 6. De functie maaknul1 maakt de variabele getal 0. De functie maaknul2 werkt met een "locale variabele" getal (die per ongeluk hetzelfde heet), en maakt die 0. De globale variabele getal blijft 42. Dit zelfde geldt voor maaknul3. Alleen heet hier de locale variabele: variabele. De functie maaknul4 creeert een locale variabele geheten variabele, initialiseert deze op 42, en maakt vervolgens de globale variabele getal 0. 7. De functie wissel1 verwisselt de waarden van de globale variabelen a en b. De functie wissel2 zorgt ervoor dat a en b beide de waarde van de oorspronkelijke b krijgen. De functies wissel3 en wissel4 doen niks met de globale variabelen a en b, ze rommelen wat met locale variabelen. 8. Een int-functie retourneert een getal, een int. Dat gebeurt met een return-statement. Een void-functie doet iets, verricht een taak, en stopt dan - maar geeft dan geen getal terug. Typische voorbeelden: public int som (int x, int y) levert de som van de getallen x en y; public void drukaf (int x) drukt het getal x netjes af, bijvoorbeeld met sterretjes eromheen. 9. public void drukaf (int n) { int i; for ( i = 1; i <= n; i++ ) { System.out.println (i + " " + (i*i)); if ( ( i % 5 ) == 0 ) System.out.println ("*** 50 sterretjes ***"); // gebruik eventueel een for-loop // en System.out.print (dat levert geen nieuwe regel erbij) } // for } // drukaf 10.public void drukafgrafisch (int n, Graphics g) { int i; int x = 20, y = 20; for ( i = 1; i <= n; i++ ) { g.drawString (i + " " + (i*i),x,y); x = x + 30; if ( ( i % 5 ) == 0 ) { // vooraan nieuwe rij x = 20; y = y + 20; } // if } // for } // drukafgrafisch 11.public int graden (int graad, int welkekantop) { // als welkekantop 1 is, wordt graad van Celsius naar // Fahrenheit omgezet, en als welkekantop 2 is andersom if ( welkekantop == 2 ) return (int) ( (5/9.0) * (graad-32) ); else ... } // graden Let er op dat 5/9.0 gebruikt wordt, en niet 5/9: dat laatste is namelijk 0! 12.public void ontbinden (int x) { int deler = 2; boolean eerste = true; while ( x != 1 ) { // nog niet klaar if ( x % deler == 0 ) { while ( x % deler == 0 ) { if ( ! eerste ) // alleen voor eerste factor GEEN maal System.out.print (" maal "); System.out.print (deler); x = x / deler; eerste = false; } // while } // if deler++; } // while } // ontbinden Alternatief: public void ontbinden2 (int x) { int deler = 2; while ( x != 1 ) { // nog niet klaar if ( x % deler == 0 ) { System.out.print (deler); x = x / deler; if ( x != 1 ) // er komt nog een deler! System.out.print (" maal "); } // if else deler++; } // while } // ontbinden2 13.public void pyramide (int hoogte) { int i, j; for ( i = 1; i <= hoogte; i++ ) { for ( j = 1; j <= hoogte-i; j++ ) System.out.print (" "); for ( j = 1; j <= 2*i-1; j++ ) System.out.print ("*"); System.out.println (" "); // naar nieuwe regel } // for } // pyramide 14.public int eenna (int[ ] A) { int i, gr = A[0], een = A[1]; if ( A[0] < A[1] ) { gr = A[1]; een = A[0]; } // if for ( i = 2; i < A.length; i++ ) { if ( A[i] > gr ) { een = gr; gr = A[i]; } // if else if ( A[i] > een ) een = A[i]; } // for return een; } // eenna // OF in de eerste for-loop de grootste opzoeken, en dat in een // tweede for-loop nog eens doen - maar dan de grootste overslaan 15.public void andersom (double[ ] A) { int i; double temp; for ( i = 0; i <= A.length/2; i++ ) { temp = A[i]; A[i] = A[A.length-1-i]; A[A.length-1-i] = temp; } // for } // andersom 16.public int plekgrootste (int[ ] array, int m) { // zoek plek van grootste uit array[0] ... array[m] int i; int index = 0; int groot = array[0]; for ( i = 1; i <= m; i++ ) { if ( array[i] > groot ) { groot = array[i]; index = i; } // if } // for return index; } // plekgrootste public void sorteer (int[ ] A) { int i, m, temp; for ( m = A.length-1; m > 0; m-- ) { i = plekgrootste (A,m); temp = A[i]; A[i] = A[m]; A[m] = temp; } // for } // sorteer 17.Een meegegeven parameter int i kan door een functie niet gewijzigd worden (bij aanroep gaat alleen de waarde van de variabele naar de functie toe, en die functie maakt hiervoor nieuwe geheugenruimte aan). Maar de array-inhoud kan WEL van waarde veranderen bij een functie-aanroep! In feite geef je niet het hele array door, maar de PLEK (geheugenlocatie) waar dat array staat - en die plek verandert niet. 18.public void vul (int[ ][ ] A) { int i, j; for ( i = 0; i < 20; i++ ) // A.length is 20 for ( j = 0; j < 50; j++ ) // en A[0].length is 50 if ( i < j ) A[i][j] = j; else A[i][j] = i; } // maak ... A = new int[20][50]; vul (A); ... 19.public int som (int[ ][ ] A) { int i, j, totaal = 0; for ( i = 0; i < A.length; i++ ) for ( j = 0; j < A[0].length; j++ ) totaal = totaal + A[i][j]; return totaal; } // som 20.public int rijgem (int[ ][ ] A, int i) { int j, totaal = 0; for ( j = 0; j < A[0].length; j++ ) totaal = totaal + A[i][j]; return totaal/A[0].length; // naar beneden afgerond gemiddelde } // rijgem 21.public bool even (int[ ][ ] A) { int i, j; for ( i = 0; i < A.length; i++ ) for ( j = 0; j < A[0].length; j++ ) if ( A[i][j] % 2 != 0 ) return false; // stoppen maar ... return true; } // even 22.public int willekeur (int m, int n) { return (int) ( (n-m+1) * Math.random ( ) ) + m; } // willekeur Walter Kosters, 28 oktober 2002, Leiden http://www.liacs.nl/home/kosters/java/uit.txt