Tentamen Datalogi I, grundkurs med Java 10p, 2D4112, 2003-2004 Lördagen den 29 november 2003 kl 9.00 14.00, sal D34 Inga hjälpmedel 30 poäng varav minst 15 poäng på programmeringsuppgifter ger säkert godkänt, gränserna kan bli lägre men ej högre Preliminära gränser för betygen 4 och 5 är 42 respektive 54 poäng Maxpoäng är 61 fördelat på 17 poäng allmän datalogi, uppgift 1 5 14 poäng flervalsfrågor i Java, uppgift 6 19 30 poäng programmeringsuppgifter i Java, uppgift 20 23 Allmän datalogi 1a) Beräkna10001 2 + 110 2. Ge svaret både på binär och på decimal form.(2p) Visa hur du räknat! Endast fel svar ger 0p! 1b) Vad menas med ett hexadecimalt tal? Varför förekommer bokstäverna A, B, C, D, E och F i sådana tal? (2p) 2a) Ange för vart och ett av de tre programmeringsspråken Fortran, Lisp och C++ vilken programmeringsparadigm de ligger närmast (ledtråd: de tre språken tillhör olika paradigmer) (1p). 2b) Ange tre andra språk och deras paradigmtillhörighet. Det måste vara andra språk än de i 2a) och språken måste tillhöra olika paradigmer (1p). 3a) Vad är en algoritm? (1p) 3b) Vad är pseudokod och varför använder man det? (1p) 3c) Du skall skriva ett program där du behöver sortera stora mängder data och du vill att det ska gå så fort som möjligt. Du har två sorteringsmetoder att välja mellan och båda finns i biblioteksklasser så du behöver inte skriva dem själv. Du läser om metod 1 att sorteringen tar C 1 n 2 sekunder där n är antalet poster som sorteras och om metod 2 att sorteringen tar C 2 n log n sekunder, där C 1 och C 2 är ungefär lika stora. Vilken metod väljer du att använda? Varför? (2p) Enbart rätt svar ger 0.5p. En bra motivering krävs för 2p. 4) Vad menas med syntaxen respektive semantiken hos ett programspråk? Ge exempel på ett syntaktiskt fel och ett semantiskt fel i Java. När/hur upptäcks syntaxfel senast i ett program? Hur upptäcks semantiska fel? (4p) 5) I samband med anrop av metoder (procedurer, funktioner,...) förekommer något som kallas aktiveringspost Vad är det? Förklara gärna med hjälp av ett exempel på en metod och dess anrop och rita gärna en figur. Det krävs dock inte! (3p) 1
Java flervalsfrågor Skriv svaren till alla flervalsfrågor på samma blad! Endast ett svar är rätt på varje fråga, 1p per fråga. 6) Metoden Math.sin som beräknar värdet av sinusfunktionen är en A) Klassmetod B) Instansmetod C) Callback-metod D) Konstruktormetod 7) Vilket av följande påståenden om konstruktormetoder är sant? A) Konstruktormetoden anropas varje gång en instans (ett objekt) av en klass skapas, dvs en gång per instans. B) Konstruktormetoden anropas endast första gången en klass används i ett program, dvs högst en gång per program och klass. C) En konstruktormetod anropas precis som andra metoder, när programmeraren så önskar vilket kan betyda flera gånger per objekt. D) En konstruktormetod anropas aldrig. 8) Vilket värde har b efter nedanstående kod är exekverad? (1p) int x = 1; boolean b = (x == 1); A)b=0 B)b=1 C)b=false D)b=true 9)Endast ett av följande påståenden om metoder i Java är sant. Vilket? A) En metod som anropar sig själv får inte förekomma i Java-program B) En metod som anropar sig själv kallas destruktiv C) En metod som anropar sig själv kallas iterativ D) En metod som anropar sig själv kallas rekursiv 10) Ett uttryck i Java av typen yyy.xxx(); måste vara A) en deklaration B) ett anrop av en metod som heter yyy C) en anrop av en metod som heter xxx D) ett reserverat ord 11) Om en klassdeklaration börjar class X extends Y så uttrycker det en relation mellan klasserna. Vilken? A) Y är en X B) X är en Y C) Y känner till en X D) X känner till en Y 12) Vilken av följande grafiska komponenter i Java representerar ett fristående fönster (kan visas utan att det läggs in i en annan komponent)? A) Canvas B) Frame C) TextArea D) Panel 2
13) Följande kodavsnitt exekveras i en main-metod. Hur många gånger skrivs texten Java-student ut? for (int i=1; i<=10; i++) for (int j=1; j<=5; j++) System.out.println("Java-student"); A) 1 gång B) 5 gånger C) 10 gånger D) 50 gånger 14) Deklarationen och initieringen int[] resultat = new int[10]; reserverar plats i minnet för A) endast en referensvariabel B) endast 10 heltalsvariabler C) en referensvariabel och 10 heltalsvariabler D) 11 st referensvariabler 15) En metod har följande huvud double f (double y, int w) Vilken av följande rader innehåller ett korrekt anrop av metoden? A) double y = 12.5; int w = 3; double r = f(); B) double y = f(0.2, 13); C) double y = 9.9; int w = 14; f(double y, int w); C) double y = 11.2; int w = 48; f(); 16) Ett av följande påståenden om variabler och metoder är falskt. Vilket? A) I en parameterlös klassmetod får man använda klassens klassvariabler. B) I en parameterlös klassmetod får man använda klassens instansvariabler. C) I en parameterlös instansmetod får man använda klassens klassvariabler. D) I en parameterlös instansmetod får man använda klassens instansvariabler. 17) Här nedan ses huvuden och antydan till kropp för tre metoder med samma namn, m. Vilket av påståendena nedan är sant? 1) int m() {... 2) void m () {... 3) int m (int k) {... A) 1) och 2) och 3) i samma klass går bra (ger inte kompileringsfel) B) 1) och 2) i samma klass går bra C) 1) och 3) eller 2) och 3 i samma klass går bra D) Det går bara att ha en enda metod som heter m i en klass, alltså man kan ha 1) eller 2) eller 3) 3
18) Metoden ritafigur ritar en intressant figur. Metoden deklareras i en Applet och skall ha en skalfaktor, x- och y-värden för dess position samt ett Graphics - objekt som parametrar: void ritafigur (int skala, int xpos, int ypos, Graphics g) { // Här finns de satser som ritar figuren. I vilket av följande alternativ görs ett korrekt anrop av metoden ritafigur? Vi antar i samtliga fall att g är definierad där anropet sker och refererar till ett Graphics-objekt. Metodanropen görs i paint-metoden i den Applet där ritafigur är deklarerad. A) Figur f = ritafigur(20, 100, 200, g); B) int skala = 30; int xpos = 250; int ypos = 100; ritafigur(g); C) for (int x = 100; x <= 800; x +=50) ritafigur(40, x, 200, g); D) for (int x = 100; x <= 800; x +=50) ritafigur(g, 40, x, 200); 19) Studera följande klasser. Vad blir utskriften från main-metoden? class X { void m () { System.out.print("Hej "); class Y extends X { void m () { System.out.print("Hopp "); class Test { public static void main (String[] a) { X x1 = new X(); X x2 = new Y(); Y y = new Y(); x1.m(); x2.m(); y.m(); System.out.println(); A) Hej Hej Hopp B) Hej Hopp Hopp C) Hej Hej Hej D) Hopp Hopp Hopp 4
Java programmeringsuppgifter Inga eller små avdrag görs för rena syntaxfel, sådant som man normalt kan slå upp när man programmerar. Poäng kan ges även om man bara löst en del av ett problem. Försök lösa uppgifterna även om du inte förstår fullständigt! 20) (6p) Skriv en metod som har två heltalsvektorer, t.ex. a och b, som parametrar och som räknar i hur många positioner a och b är lika. Om t.ex. a = {-1,5,7,12,10 och b = {100,5,7,-2,10,55,199 så skall svaret bli 3. Resultatet från metoden ska vara antalet lika värden. Metoden skall klara av att a och b har olika längd (antal element) och då förstås bara jämföra så många element som finns i den kortare vektorn. Ledtråd: Om a är en vektor i Java så anges antalet element i vektorn av a.length. 21) (4p) Skriv en metod i Java som har en heltalsvektor som parameter och som permuterar vektorn ett steg. Om indata är {17,1,9,3,4 så skall utadata bli vektorn {1,9,3,4,17. Välj själv om metoden skall ändra i den vektor som ges som parameter eller skapa en ny vektor och ge som resultat! 22) (5p) Följande grafiska program är tänkt att vara en omvandlare mellan Celsiusgrader och Fahrenheit-grader. Användaren skall se ett fönster med två textrutor för inmatning, en för vardera typen av grader. Det skall finnas en rubrik före varje inmatningsruta. Om användaren matar in ett gradtal i F i F-rutan så skall motsvarande gradtal i C dyka upp i C-rutan. Inmatning i C-rutan skall på motsvarande sätt ge utskrift i F-rutan. Programmet är ofullständigt och uppgiften är att fylla i de delar som fattas. Om du vet hur programkoden ska se ut så skriv den. Är du osäker på koden så beskriv med ord. Kombinera gärna kod och förklarande text. Full poäng kan ges även om du inte skrivit någon programkod alls, bara de saknade delarna är riktigt beskrivna. import java.awt.*; import java.applet.*; import java.awt.event.*; public class CF extends Applet implements ActionListener{ private TextField celsius, fahrenheit; public void init () { add(new Label("Grader Celsius")); celsius = new TextField(5); add(celsius); add(new Label("Grader Fahrenheit")); fahrenheit = new TextField(5); add(fahrenheit); 5
23a) (11p) Skriv en klass för att representera en svensk glosa med ett antal engelska översättningar. Instansvariabler i klassen skall vara ett svenskt ord och en lista av engelska ord. Varje svenskt ord skall alltså motsvaras av godtyckligt många engelska ord. Klassen skall ha en konstruktor vars parametrar ska vara det svenska ordet och ett engelskt ord. Klassen ska ha följande instansmetoder: metod som skriver ut eller visar endast det svenska ordet (1p) metod som skriver ut eller på annat sätt visar alla de engelska orden (2p) metod som lägger till en engelsk översättning (1p) metod som har en gissning (engelska) som parameter och returnerar true om gissningen är något av orden i listan och false annars. (3p) För rätt struktur, instansvariabler och konstruktor ges 4p. Instansvariablerna ska vara dolda. Insansvariabel som borde varit lokal variabel i metod ger poängavdrag. 23b) (4p) Skriv ett testprogram för glosklassen, dvs en klass med endast en mainmetod. En glosa, t.ex. det svenska ordet svår med första översättning difficult skall skapas. Lägg därefter till översättningarna hard och serious till glosan. Prova metoden som skriver ut eller visar glosan och dess översättningar och prova gissningsmetoden på ett lämpligt sätt, med en riktig gissning och med en fekaktig, och gör utskrifter så att det framgår om metoden gör rätt eller ej. Lite hjälp till 23a): Man kan ha nytta av någon av klasserna ArrayList eller Vector. Där finns bl.a. följande metoder: add(o) lägger till objektet o till listan get(i) returnerar objekt nr i från listan size() returnerar antalet element i listan Någon av instansmetoderna equals(s) equalsignorecase(s) i klassen String kan också behövas. Båda jämför strängars värden och returnerar resultat av typ boolean. 6