Uitwerking tentamen Programmeren in JavaScript, 2.11.2001 OPGAVE 1 a. Java wordt gecompileerd, JavaScript geinterpreteerd. b. 39, 39, 12 (bij de derde worden ze echt als getallen opgeteld, bij de eerste en de tweede als strings aan elkaar geplakt (geconcateneerd)) In JavaScript weet je soms niet of iets een string is of een getal; de functie parseInt levert in ieder geval een getal op, en maakt dus een getal van zijn (string)argument. c. var index = 0; // welk plaatje? var detimer; // hoe heet de wekker? function roteer ( ) { if ( index == 0 ) window.document.hetplaatje.src = "een.jpg"; // en evt. index = 1; else window.document.hetplaatje.src = "twee.jpg"; // en evt. index = 0 index++; // dan if ( index >= 2 ) // is dit index = 0; // niet nodig detimer = setTimeout ("roteer ( );", 5000); } // roteer roteer ( ); OPGAVE 2 a. function kl (A,n) { var klein = A[0]; // kleinste getal uit A var i; // tellertje for ( i = 1; i < n; i++ ) if ( A[i] < klein ) klein = A[i]; return klein; } // kl b. function eennakl (A,n) { var eenna; // op een na kleinste getal uit A var klein; // idem, kleinste var i; // tellertje if ( A[0] > A[1] ) { eenna = A[0]; klein = A[1]; } // if else { eenna = A[1]; klein = A[0]; } //else for ( i = 2; i < n; i++ ) { if ( A[i] < klein ) { eenna = klein; klein = A[i]; } // if else if ( A[i] < eenna ) eenna = A[i]; } // for return eenna; } // eennakl OPGAVE 3 a. Globale variabelen worden buiten de functies gedefinieerd en gelden overal, locale gelden (tijdelijk) binnen een functie. Tussen haakjes meegegeven variabelen zijn in feiote locale variabelen, die een startwaarde krijgen ("call by value"). b. Behalve bij telop3 geldt dat met de globale a en b niets gebeurd, dus die zijn na afloop nog steeds 5 en 3. Bij telop3 wordt a gelijk gemaakt aan 13, dat wordt geretourneerd, en a is dan ook 13; b blijft daar 3. Antwoord: 13 5 3 13 5 3 11 5 3 13 13 3 13 5 3 11 5 3 OPGAVE 4 a. function willekeur (n) { return ( 1 + Math.floor ( Math.random ( ) * n ) ); // 0 <= Math.random ( ) * n < n, dus afronden naar beneden // geeft geheel getal met 0 <= getal <= n-1 } // willekeur b. var i; // voor rijen var j; // voor kolommen A = new Array (m); for ( i = 0; i < m; i++ ) { A[i] = new Array (n); for ( j = 0; j < n; j++ ) A[i][j] = willekeur (10) - 1; } // for c. function hoeveel (A,i) { var waarde = 0; // getalswaarde i-de rij var j; // tellertje for ( j = 0; j < n; j++ ) waarde = 10 * waarde + A[i][j]; return waarde; } // hoeveel OF function hoeveel (A,i) { var waarde = ""; // getalswaarde i-de rij, opgevat als string var j; // tellertje for ( j = 0; j < n; j++ ) waarde = waarde + A[i][j]; return parseInt (waarde); // let op de parseInt: anders wordt 00835 // als 00835 in plaats van 835 uitgevoerd } // hoeveel OPGAVE 5 a. F haalt de niet-nullen uit A en stopt deze (in dezelfde volgorde) in B; in het voorbeeld: 1,7,2,5,6; de lengte van van B is het aantal niet-nullen van A. b. Nu ontstaan er in B gaten (hopelijk worden deze met undefined gevuld), namelijk op plaatsen waar A nullen heeft; B wordt evenlang als A, of preciezer: als de positie van de laatste nietnul van A; in het voorbeeld: 1,7,-,2,5,-,6 c. Nu komen in B alle getallen uit A die onmiddellijk gevolgd worden door een groter getal (in het voorbeeld 1,0,2,0). De test is er voor om te voorkomen dat je buiten het array komt, en had beter in de for-loop kunnen staan. d. De tests mogen niet omgewisseld worden: als nu de eerste false is, wordt de tweede terecht niet meer gedaan ("shortcircuiting").