Institutionen för TENTAMEN CTH VT-13 Datavetenskap 2013-03-14 TDA143 Tentamen för TDA143 PROGRAMMERADE SYSTEM DAG: 13-03-14 TID: 8:30 13:30 Ansvarig: Christer Carlsson, ankn 1038 Förfrågningar: Resultat: Allmän info: Christer Carlsson erhålls via Ladok tentamen är uppdelad i två delar: del 1 omfattar översikt av datateknik och del 2 omfattar programmering Betygsgränser: 3:a 10 poäng på del 1 och 26 poäng på del 2 4:a 13 poäng på del 1 och 36 poäng på del 2 5:a 16 poäng på del 1 och 48 poäng på del 2 maxpoäng 20 poäng på del 1 och 60 poäng på del 2 Siffror inom parentes: Granskning: Hjälpmedel: Var vänlig och: anger maximal poäng på uppgiften. Onsdag 10/4 kl 12-13 och onsdag 10/4 kl 15-17, rum 6128 i EDIT-huset. En valfri lärobok i Java eller de på kursen utdelade föreläsningsanteckningarna (OH-bilderna) som behandlar programmeringsdelen av kursen. Förtydligande noteringar får finnas i boken resp. föreläsningsanteckningarna. Skriv tydligt och disponera papperet på lämpligt sätt. Börja varje uppgift på nytt blad. Skriv ej på baksidan av papperet. Observera: Uppgifterna är ej ordnade efter svårighetsgrad. Titta därför igenom hela tentamen innan du börjar skriva. Alla program skall vara väl strukturerade, lätta att överskåda samt enkla att förstå. Vid rättning av uppgifter där programkod ingår bedöms principiella fel allvarligare än smärre språkfel. På de programmeringsuppgifter som ingår i tentamenstesen kan vissa poäng erhållas även om ett fullständigt program inte redovisas, detta kräver dock att en algoritm som löser problemet presenteras. LYCKA TILL!!!!
Uppgift 1. Denna uppgift består av 10 påståenden. Frågorna skall besvaras med sant eller falskt. Ett korrekt svar ger 1 poäng, ett felaktigt svar ger -0.5 poäng och ett utelämnat svar ger 0 poäng. Totalt på uppgiften kan aldrig minuspoäng erhållas. a) Om talet -124 lagras med 8 bitar på två-komplementsform får det bitmönstret 10001000. b) Moores lag säger att antalet transistorer som ryms på en kiselbricka, historiskt sett, fördubblas vart 3:e år. c) När man ser på film över internet, och måste överföra stora datamängder, är UDP (User Datagram Protocol) ett lämpligare transportprotokoll än TCP (Transmission Control Protocol). d) Den del av operativsystemet som sköter all läsning och skrivning på datorns sekundärminne kallas för memory manager. e) Den viktigaste egenskapen hos en algoritm är att den är snabb. f) I ett binärt sökträd finns det största värdet i roten. g) En process med låg prioritet exekveras aldrig då starvation uppkommer. h) Open-source development är en typ av evolutionär programutveckling. i) Oracle och MySQL är två kända databashanterare. j) Inom datorgrafik innebär rendering att omvandla en beskrivning av ett objekt till en bild på en tvådimensionell yta. Uppgift 2. Ange sanningstabell för den logiska kretsen nedan. (10 poäng) B A NAND D AND F XOR G C NOR E Uppgift 3. (2 poäng) Att ha sin dator ansluten till Internet är inte helt riskfritt. Beskriv kort vilka faror man utsätts för och hur man kan skydda sig. (2 poäng) Uppgift 4. Förklara begreppet -notation, som används för att klassificera algoritmer med avseende på tidskomplexitet. Vad innebär det att en algoritm tillhör en viss -klass? Beskriv gärna med exempel. Uppgift 5. (2 poäng) Trenden inom mjukvaruindustrin är att jobba i små team. Vad är orsaken till detta? Ge också exempel på tumregler som visat sig bra att följa vid bildandet av ett team. (2 poäng)
Uppgift 6. Antag att du har följande databastabeller: Meny: Maträtt Typ Pris Kalorier Kokt ishavstorsk med hackat ägg Fisk 139 460 Pannbiff med stekt lök Kött 109 760 Omelett Vegetarisk 89 250 Wienerschnitzel av gödkalv Kött 119 550 Luncherbjudanden: Maträtt Typ Pris Kalorier Stekt sill Fisk 79 440 Wallenbergare med ärtor och potatispuré Kött 89 760 Pasta bolognese Kött 69 650 Hur ser tabellen ut som erhålls genom nedanstående SQL-query? SELECT Maträtt, Pris FROM Meny, Luncherbjudanden WHERE Kalorier < 500 (2 poäng)
DEL 2: Programmeringsteknik Uppgift 7. a) Vad blir utskriften när nedanstående program exekveras? public class Scope { private double d; public Scope(double d) { this.d = d; //konstruktor public double foo(int i) { if (i < 0) { double d = i * i; else { d = i * i * i; return d; //foo public static void main(string[] args) { Scope s = new Scope(5.0); System.out.println(s.foo(-2)); System.out.println(s.foo(2)); //main //Scope (3 poäng) b) Betrakta nedanstående klass: public class Uppgift 7b { public static int mystery(int[] nums, int target) { int lencount = 0; int maxlen = 0; for (int i = 0; i < nums.length; i = i + 1) { if (nums[i] == target) { lencount = lencount + 1; else { if (lencount > maxlen) { maxlen = lencount; lencount = 0; if (lencount > maxlen) { maxlen = lencount; return maxlen; //mystery public static void main(string[] arg) { int[] arr = {7, 10, 10, 15, 15, 15, 15, 10, 10, 10, 15, 10, 10; System.out.println(mystery(arr, 10)); //main //Uppgift7b i) Vad blir utskriften när main-metoden exekveras? ii) Förklara med ord vad metoden mystery gör. (3 poäng)
c) Vad skrivs ut när main-metoden i klassen Main nedan exekveras? public class Tricky { private int i, j; private static int k = 0; public Tricky(int i) { this.i = i; k = k + 1; j = k; public String tostring() { return " (" + i + ", " + j + ", " + k + ")"; // Tricky public class Main { public static void confuse( Tricky t1) { t1 = new Tricky(5); //confuse public static void main(string[] args) { Tricky myt1 = new Tricky(3); confuse(myt1); Tricky myt2 = new Tricky(4); System.out.println( myt1 + ", " + myt2 ); //main //Main (3 poäng) d) Betrakta nedanstående program, vars syfte är att läsa in ett tal och skriva ut talets kvadratrot: import javax.swing.*; public class Math { public static void main (String[] arg) { String indata = JOptionPane.showInputDialog("Ange ett tal: "); double tal = Double.parseDouble(indata); double root = Math.sqrt(tal); JOptionPane.showMessageDialog(null, "Roten ur talet " + tal + " är " + root); //main //Math När programmet kompileras fås följande felmeddelande Math.java:6: cannot resolve symbol symbol : method sqrt (double) location: class Math double root = Math.sqrt(tal); ^ i) Förklara vad som är felaktigt i programmet. ii) Ge (minst ett) förslag på hur felet kan rättas till. (3 poäng)
Uppgift 8. Livsmedelsverket har gjort följande klassificering när det gäller andelen kalorier som kommer från fett i våra livsmedel: Rött: Över 40 procent av kalorierna från fett Gult: Mellan 30 och 40 procent av kalorierna från fett Grönt: Max 30 procent av kalorierna från fett Skriv ett program som läser in antalet kalorier och hur många gram fett en förpackning livsmedel innehåller. Programmet skall beräkna och skriva ut hur stor procentuell andel av kalorierna som kommer från fettet, samt livsmedelsverkets klassificering av produkten. Det gäller att 1 gram fett innehåller 7,7 kalorier. Du får själv välja om du vill göra in- och utmatning via dialogrutor eller använda System.in respektive System.out (se exemplen nedan). För att kunna erhålla full poäng på uppgiften: skall programmet utformas på så sätt att inläsningen upprepas tills användaren avbryter exekveringen (vid användning av dialogrutor genom att användaren trycker på Cancel-knappen och vid användning av System.in genom att användaren lämpligen ger ctrl z) skall antalet kalorier och antalet gram fett läsas med en inläsningssats (dvs ett Scanner-objekt skall användas) skall en felutskrift ges om antalet kalorier eller antalet gram fett som läses in är mindre än 0 skall procenttalet i utskriften anges med exakt två decimaler skall programmet innehålla en metod public static double getcalories(double gram) som tar antalet gram fett och returnerar motsvarande antal kalorier skall en felutskrift ges om andelen fett överskrider 100% Med användning av dialogrutor Med användning av System.in resp System.out Antalet kalorier och antalet gram fett: 1345 28.7 16.43 procent av kalorierna kommer från fett. Kategori: GRÖN Antalet kalorier och antalet gram fett: 699 38.4 42.30 procent av kalorierna kommer från fett. Kategori: RÖTT Antalet kalorier och antalet gram fett: -1456-23.8 Negstiva värden får ej ges! Antalet kalorier och antalet gram fett: 758 122.3 Felaktig indata! Andelen fett kan inte överskrida 100%! (12 poäng)
Uppgift 9. Instanser av icke-muterbara klasser förändrar inte sitt tillstånd, utan en instans har samma tillstånd under hela sin livstid. Skriv en icke-muterbar klass Point för att beskriva punkter i det tvådimensionella planet. I klassen skall x- respektive y-koordinaten avbildas som ett heltal. Klassen skall ha en konstruktor som tar x- och y-koordinaten som parametrar, samt instansmetoder för att avläsa tillstånden hos instansvariablerna. Vidare skall klassen innehålla följande instansmetoder: Point translate(int dx, int dy) double distance(point p) boolean hassamevalue(point p) String tostring() returnerar en punkt som är förskjuten dx i x-led och dy i y-led i förhållande till den aktuella punkten returnerar avståndet mellan aktuella punkten och punkten p (beräknas mha Pythagoras sats) returnerar värdet true om den aktuella punkten och punkten p har samma koordinater, annars returneras värdet false returnerar en strängrepresentation av den aktuella punkten på formen "(x, y)" (10 poäng) Uppgift 10. a) I ett experiment läser man in värden som sedan skall ritas upp som en kurva. När kurvan ritas upptäcker man att den blir taggig pga slumpmässiga mätfel. Man vill därför jämna ut kurvan genom att ersätta varje mätvärde, utom det första och sista, med medelvärdet av det aktuella värdet och de två intilliggande värdena. Skriv en metod public static double[] smooth(double[] vekt) som tar ett fält vekt med mätvärden och returnerar ett nytt fält i vilket mätvärdena är utjämnade enligt beskrivningen ovan. Exempel: Antag att följande deklaration har gjorts double[] f = {3.0, 5.0, 1.0, 6.0, 19.0, 20.0, 15.0, 19.0, 21.0, 20.0; Ett anrop av smooth(f) returnerar då fältet {3.0, 3.0, 4.0, 8.6666, 15.0, 18.0, 18.0, 18.3333, 20.0, 20.0. (5 poäng) b) Steganografi handlar om att skriva dolda budskap på ett sådant sätt att ingen - bortsett från avsändaren och den avsedda mottagaren - misstänker att det finns ett meddelande. I denna uppgift skall ni gömma ett meddelande i en digital färgbild. En digital färgbild lagras, som bekant, på RGB-format. Varje bildpunkt utgörs av tre heltalsvärden i intervallet [0,255], där de enskilda värdena representerar intensiteten av färgerna rött, grönt respektive blått. En färgbild kan således avbildas med ett tredimensionellt fält av typen int[][][], är den första dimensionen definierar bildens höjd, den andra dimensionen bildens bredd och den tredje dimensionen de tre färgerna. Hur ett meddelande göms i en digital färgbild beskrivs nedan: I ASCII-koden (American Standard Code for Information Interchange) representeras varje tecken som ett heltal bestående av tre siffror. För alla bokstäver, siffror och andra tecken såsom?, $ och @, kan man i Java erhålla ASCII-koden genom att typomvandla tecknet till ett heltal, t.ex. evalueras (int) 'k' till heltalet 107 och (int) 'B' till heltalet 66 (vilket blir 066 angivet som ett 3-siffrigt heltal). Ett tecken kan gömmas i en bildpunkt genom att utnyttja att tecknet i ASCII-koden utgörs av ett 3-siffrigt heltal och att en bildpunkten utgörs av de tre komponenterna rött, grön och blått. Den första siffran i ASCII-koden döljas i den minst signifikanta siffran i komponenten som representerar rött, den andra siffran i ASCII-koden döljas i den minst signifikanta siffran i komponenten som representerar grönt och den tredje siffran i ASCIIkoden döljas i den minst signifikanta siffran i komponenten som representerar blått.
Exempel: Tecknet 'B', som har ASCII-koden 066, göms i en bildpunkt vars RGB-värden är [154, 228, 163] enligt: Ursprunglig bildpunkt Bildpunkten med 'B' gömd Red Green Blue göm 'B', vars ACSII-kod är 066 Red Green Blue 154 228 163 150 226 166 Modifikationen i bildpunkten är så liten att den inte kan upptäckas med blotta ögat. För att avkoda ett meddelande i en bild utför den omvända processen. Beräkna den minst signifikanta siffran i respektive färgkomponent, bilda ASCII-koden för tecknet från dessa tre siffror och typomvandla det erhållna heltalet till ett tecken (t.ex. evalueras (char) 66 till 'B'). Avkodningen av meddelandet förändrar inte bilden, utan meddelandet kommer att finnas i bilden för alltid. Din uppgift är att skriva en metod public static int[][][] hidemessage(int[][][] sample, String msg) som gömmer meddelandet msg i bilden sample enligt ovan beskrivna tillvägagångssätt. Tecknen i meddelandet läggs in i bilden radvis, med start i första kolumnen. Du får anta att meddelandet ryms i bilden, dvs inte är längre än antalet bildpunkter i bilden. (8 poäng) Uppgift 11. Skriv ett program som visar upp ett fönster, enligt figuren bredvid, för att avbilda ett kodlås som består av 5 komponenter, där varje komponent visar en siffra i intervallet [0, 9]. Siffran i varje komponent ändras genom att trycka på komponenten och när samtliga siffror är rätt inställda öppnas låset. I ditt program skall du använda klassen NumberButton nedan, för att avbilda komponenterna i kodlåset. import javax.swing.*; import java.awt.*; public class NumberButton extends JButton { private int number; public NumberButton(int number) { if (number < 0 number > 9) throw new IllegalArgumentException(); this.number = number; //konstruktor public void paintcomponent(graphics pen) { super.paintcomponent(pen); settext("" + number); //paintcomponent public void add() { number = (number + 1) % 10; repaint(); //add public int getnumber() { return number; //getnumber // NumberButton
Klassen NumberButton utökar (extends) JButton, därför är en instans av klassen NumberButton tryckbar (och har tillgång till alla metoder som finns i klassen JButton). I klassen NumberButton finns en instansvariabel number, som håller reda på vilken siffra som skall visar på knappen. När en instans av klassen skapas ges knappen ett värde via parametern till konstruktorn. Om parametern inte är ett heltal i intervallet [0, 9] kastas ett IllegalArgumentException. För att ändra siffran finns instansmetoden add(), som ökar instansvariabeln number med 1 och ritar om komponenten. Om den aktuella siffran är 9 när metoden add() anropas kommer den nya siffran att bli 0. Klassen innehåller också instansmetoden getnumber() för att avläsa den aktuella siffran på knappen. Implementera själva fönstret i en klass med namnet CodeLock. Denna klass skall ha en konstruktor CodeLock(int thecode) som har ett heltal som parameter, vilket utgör den korrekta koden för kodlåset. Om parametern är ett negativt tal eller ett tal större än 99999 skall ett undantag av typen IllegalArgumentException kastas (eftersom detta tal inte kan vara en giltig kod för kodlåset). Vilken inställning på siffrorna som visas upp initialt när en instans av klassen CodeLock skapas bestämmer du själv. Kan exempelvis, som i figuren ovan, sättas till 00000 eller till en kombination som beräknas slumpmässigt (med en slumptalsgenerator). När den korrekta koden ställts in, och kodlåset öppnas, skall detta illustreras genom att göra sifferkomponenterna otryckbara. För full poäng på uppgiften skall programmet naturligtvis skapa och visa upp ett fönster med kodlåset. Vidare krävs att gränssnittet har lämpliga färger, teckenstorlekar och fonter, samt att programmet skall kunna avslutas genom att trycka på stängningsrutan i fönsters ram. (13 poäng)