2D1342 Programkonstruktion för F1, ht 2006 Lappskrivning 1 Tisdag 7/11 2006 kl 11.15 12.00 Endast ett svar är rätt på varje fråga! Om mer än ett svar givits blir det noll poäng på frågan. Alla skriftliga hjälpmedel är tillåtna. 9-10 rätt av 15 möjliga ger godkänt och 1poäng. 11-12 rätt ger 1.5 poäng och 13-15 rätt ger 2poäng. Skriv alla svar på svarsblanketten! 1. Endast en av typerna nedan duger till variabeln x om if-satsen skall gå att kompilera utan fel. Hur ska x deklareras? x har förstås fått ett värde före if-satsen. if (x > 1) { //... A) boolean x; B) double[] x; C) int x; D) String x; 2. Vilket värde har variabeln z efter satserna nedan, vilket värde skrivs alltså ut? int z = 0; boolean b = (z>=0); if (b) { z = 42; z = 2*z; else { z = 100; z = z+1; System.out.println(z); A) 85 B) 84 C) 100 D) 101 3. Vilket av följande påståenden om Javaprogram är falskt? A) En klass kan innehålla metoder. B) För alla klassvariabler, instansvariabler, formella parametrar till metoder samt lokala variabler i metoder måste datatyp anges. C) Applet-program behöver inte kompileras innan de exekveras. D) Exekvering av ett fristående program (application) börjar alltid i en metod som heter main. 1
4. Vilken av ustskrifterna produceras av kodavsnittet? int n = 5; for (int i=1; i<=n; i++) { for (int j=1; j<=i; j++) { System.out.print("*"); System.out.println(); for (int i=n; i>=1; i--) { for (int j=1; j<=i; j++) { System.out.print("*"); System.out.println(); A) * B) * C) * D) ***** ** ** ** **** *** *** *** *** **** **** **** ** ***** ***** ***** * * ***** * ** **** ** *** *** *** **** ** **** ***** * ***** 5. Hur många Hej skrivs ut av programraderna nedan? int r = 9; while (r >= 0) { System.out.println("Hej"); r = r-2; System.out.println(r); A) 0 B) 1 C) 3 D) 5 6. Vilket värde har variabeln r efter kodavsnittet i uppgift 5 är exekverat, dvs vad skrivs ut med satsen System.out.println(r)? A) 9 B) 1 C) -2 D) -1 2
7. Vilket värde har variabeln p efter saterna är utförda, dvs vilket tal skrivs ut efter Svaret blir? int t = 3; int[] e = {1,1,0; int p = 1; for (int i=0; i<e.length; i++) { p = p*p; if (e[i] == 1) p = p*t; System.out.println("Svaret blir " + p); A) 1 B) 27 C) 729 D) 2187 8. Två metoder definieras double f (double x) { return 1/(1 + x*x); double g (double x) { return Math.sin(x)/x; På tre av följande rader görs korrekta anrop av metoderna. Vlken rad innehåller minst ett fel? Vi antar att alla anropen görs i den klass där metoderna f och g är definierade. A) double y = f(0.22); B) double z = f(g(1.0 + f(0.5))); C) double t = 0.3; double u = g(t*t-1); D) double x = 0.14; double z = f() + g(); 9. Vilket av följande påståenden om metoder i Java är falskt? A) Vid ett metodanrop måste de aktuella parametrarna ha samma namn som de formella parametrarna har i metoddefinitionen. B) Samma regler gäller för parameterlistan till en void-metod som för parameterlistan till en metod med returtyp. C) När en metod anropas måste man ange lika många aktuella parametrar som det finns formella parametrar i metoddefinitionen. D) När en metod anropas utförs satserna i metodkroppen. 3
10. I en statistiktillämpning behöver man beräkna summan av alla värden i vektorn x och summan av kvadraterna av värdena i vektorn x, alltså summorna n 1 n 1 sumx = x i och sumx2 = i=0 där n är antalet värden i vektorn x. Itreavdefyrakodavsnittennedanberäknas summorna korrekt men i ett av alternativen beräknas inte de sumx och sumx2 som definieras ovan. Vilket alternativ är felaktigt? i=0 x 2 i A) double sumx = 0, sumx2 = 0; for (int j=0; j<x.length; j++) { sumx = sumx + x[i]; sumx2 = sumx2 + x[j]*x[j]; B) double sumx = 0, sumx2 = 0; for (int i=0; i<x.length; i++) sumx = sumx + x[i]; for (int i=0; i<x.length; i++) sumx2 = sumx2 + x[i]*x[i]; C) double sumx = 0, sumx2 = 0; sumx = sumx + x[i]; sumx2 = sumx2 + x[i]*x[i]; D) double sumx = 0, sumx2 = 0; double t = x[i]; sumx = sumx + t; sumx2 = sumx2 + t*t; 4
11. Metoden f skall kunna anropas så som följande exempel visar. Vilken av metoddefinitionerna nedan stämmer med anropsexemplet? Exempel på anrop: double z = f(5, 0.99); A) double f (int n, double x) { double r = 1; for (int i=1; i<=n; i++) r = r*x; f = r; B) double f (int n, double z) { double tmp = z; for (int i = 1; i<=n; i++) tmp = 1/(1+tmp); return tmp; C) void f (int n, double x) { double r = 1; for (int i=1; i<=n; i++) r = r*x; return r/n; D) double f (double z, int n) { double tmp = z; for (int i = 1; i<=n; i++) tmp = 1/(1+tmp); return tmp; 12. Om en metod har huvudet void mysko(string s, String t, int h) Vilket av följande förslag är garanterat ett riktigt anrop av metoden? Alla förslag står i en metod i samma klass som mysko är definierad och det finns inga variabler eller parametrar av typ String tillgängliga vid anropet. A) mysko("troll", "Häxa", "999"); B) mysko(troll, Häxa, 999); C) mysko("troll", "Häxa", 999); D) System.out.println(mysko(String s, String t, String h)); 5
13. I appleten nedan är avsikten att rita upp den funktion som definieras i metoden f genom att dra många små streck mellan närliggande punkter på kurvan. Metoden f fungerar, dess värden är rimliga och positiva. Du behöver inte detaljstudera hur funktionsvärdet beräknas! Vilket av påståendena nedan om programkoden är riktigt? import java.awt.*; import java.applet.*; public class RitaKurva extends Applet { public void paint (Graphics g) { int grans = 600; int x1 = 0, y1 = f(0); int x2 = 0, y2 = 0; int steg = 2; while (x2 < grans) { // A) x2 = x1 + steg; y2 = f(x2); g.drawline(x1,y1,x2,y2); // B) x1=x2; y1=y2; // C) int f (double x) { double t = x-300; return (int) (300-200*(Math.exp(-0.0001*t*t)) + 0.5); A) Man måste använda en for-sats när man ritar. While-sats duger inte då det inte finns någon uppdatering av x-värden i while-satsen. B) Satsen g.drawline(x1,y1,x2,y2) ritar exakt samma streck varje gång den utförs. Det kan inte bli en kurva utan endast ett streck. C) Satserna x1=x2; och y1=y2; gör att punkten (x1,y1) och punkten (x2,y2) är samma punkt och nästa g.drawline(x1,y1,x2,y2) kommer bara att rita en punkt. Det kan inte bli någon kurva. D) Inget av påståendena A), B) och C) stämmer för appleten ovan. En kurva kommer att ritas. 6
14. Vad är sant om följande metod? static boolean what (int[] x) { for (int i=0; i < x.length; i++) { if (x[i] <=0) return false; return true; A) Metoden räknar hur många av värdena i vektorn som ges som parameter som är positiva och returnerar detta antal. B) Metoden går igenom parameter-vektorn och sätter alla dess värden till noll. C) Metoden tar reda på om alla värden i parameter-vektorn är positiva och returnerar true i så fall och returnerar false om något värde är negativt eller noll. D) Metoden returnerar true om värdena i parameter-vektorn kan vara sidor i en månghörning med lika många sidor som det finns värden i vektorn och false om detta inte är möjligt. 15. Följande applet ska rita blå rutor i de positioner som anges av vektorerna x och y. X-koordinater för rutornas vänsterkanter ligger i vektorn x och y-koordinater för rutornas nederkanter ligger i vektorn y. Rutornas storlekar slumpas och ska ligga mellan 10 och 50. En sats saknas i programmet och ska stoppas in där kommentaren // ** här ** finns. Hur ska den utelämnade satsen se ut? import java.awt.*; import java.applet.*; public class Rutor extends Applet { int[] x = {10, 100, 200, 150, 300, 40, 70; int[] y = {200, 50, 300, 130, 150, 250, 170; public void paint (Graphics g) { int newsize = (int) (10 + Math.random()*40 + 0.5); // ** här ** void ritaruta (int x, int y, int size, Graphics picasso) { picasso.setcolor(color.blue); picasso.fillrect(x, y-size, size, size); A) picasso.ritaruta(x[i], y[i], newsize, newsize); B) g.ritaruta(x[i], y[i], newsize, newsize); C) ritaruta(x[i], y[i], newsize, picasso); D) ritaruta(x[i], y[i], newsize, g); 7