Uppgift 1 a) Falskt. Bitmönstret blir 10000100. b) Falskt. Fördubblingen sker var 18:e månad. Lösningsförslag till tentamen 130314 c) Sant. UDP är ett enklare protokoll än TCP. UDP har t.ex. inga funktioner för att rätta överföringsfel, TCP har. Men om man tittar på en film behöver inte varje filmruta vara helt perfekt. Hastigheten, att filmen flyter på, är viktigare en kvalitén. d) Falskt. Memory manager sköter läsning och skrivning från primärminnet. Läsning och skrivning från sekundärminnet sköts av file manager. e) Falskt, den viktigaste egenskapen är att algoritmen är korrekt. f) Falskt. Det största värdet finns i noden längst till höger i trädet. g) Sant. h) Sant. i) Sant. j) Sant Uppgift 2 A B C D E F G 0 0 0 1 1 1 1 0 0 1 1 0 0 1 0 1 0 1 0 0 0 0 1 1 1 0 0 1 1 0 0 1 1 1 1 1 0 1 1 0 0 1 1 1 0 0 0 0 0 1 1 1 0 0 0 1 Uppgift 3 En risk är att man kan bli utsatt för sabotage av olika slag, t.ex virus, maskar och trojanska hästar. När nya sådana börjar florera utvecklas snabbt olika "virusskydd". Således skall man installera virusskydd och uppdatera dessa ofta. Vanligtvis sprids virus via email varför man bör installera spamfilter samt vara försiktigt med att öppna filer som finns bifogade i email från okända avsändare. En annan risk är att råka ut för "informationsstöld". Det finns olika typer av skyddsåtgärder som kan vidtas. För att förhindra otillbörlig tillgång till information kan kryptering användas. En skyddsmekanism mot både sabotage och informationsstöld är installera en brandvägg.
Uppgift 4 -notationen används för att beskriva en algoritms tidsåtgång utan att ta hänsyn till detaljer och utan att ange tidsåtgången i absoluta mått (vilket naturligtvis är beroende av hur snabb hårdvaran är). Det som beskrivs är hur tidsåtgången växer beroende på storleken av den datamängd som algoritmen bearbetar. Man tar endast hänsyn till den "dominerande termen", dvs endast den del i algoritmen där största tidsåtgången förbrukas. Att två algoritmer tillhör samma -klass innebär att båda algoritmerna har samma tillväxthastigheten på tidsåtgången. En algoritm som har tidskomplexiteten (n 2 ) har således en tillväxt på tidsåtgången som är kvadratisk med hänseende till den bearbetade datamängdens storlek. Eftersom -notationen inte anger någon absolut tidsåtgång, kan en algoritm som tillhör en -klass med en snabb tillväxthastighet i absoluta mått kräva mindre tidsåtgång för små datamängder än en algoritm som tillhör en -klass med en långsammare tillväxthastighet. Uppgift 5 För vara konkurrentkraftiga måste företagen lansera nya produkter i allt snabbare takt. Inom mjukvaruutvecklingen pratar man ofta om need for speed, att produkterna måste utvecklas i samma hastighet som hela marknaden utvecklas, annars försvinner man snabbt. Stora team styrs ofta mer eller mindre hierarkiskt med tidsödande byråkrati. För att minska cykeltiden väljer företagen idag att arbeta i mindre team med en handfull personer som arbetar utan större kontroll ovanifrån, vilket gynnar kreativitet och fantasi. Små team, korta cykler och direkt kontakt med kunden skapar ett smidigare system. Vanliga tumregler är bland annat The Two Pizza Rule (som används på Amazon) och 3x3 persons rule (Google). Den första av dessa innebär att projektgruppen ska kunna bli mätt på 2 pizzor, och den andra innebär att 3 personer ska jobba i lag i 3 månader, för att även få variation bland kollegorna. Uppgift 6 Följande tabell erhålls: Maträtt Pris Kokt ishavstorsk med hackat ägg 139 Omelett 89 Stekt sill 79
Uppgift 7 a) Utskriften blir: 5.0 8.0 Förklaring: b) När instansen s skapas kommer dess instansvariabel d att få värdet 5.0. Vid anropet av s.foo(-2) kommer den formella parametern i att få värdet -2. Villkoret (i < 0) i if-satsen är alltså sant och en lokal variabel d skapas vilken tilldelas värdet -2 * -2 => 4. Därefter lämnas programblocket som hör till ifsatsen. I satsen return d; är det därför instansvariabeln d som avses (vilken har värdet 5.0). Vid anropet av s.foo(2) kommer den formella parametern i att få värdet 2. Villkoret (i < 0) i if-satsen är alltså falskt och instansvariabeln d tilldelas värdet 2 * 2 * 2 => 8. Därefter lämnas programblocket som hör till if-satsen och värdet av instansvariabeln d returneras (vilken har värdet 8.0). i) Utskriften blir: 3 ii) Metoden mystery tar ett heltalsfält nums och ett heltal target och returnerar längden av den längsta sammanhängande sekvensen av värdet target som finns i fältet nums. c) Utskriften blir: (3, 1, 3), (4, 3, 3) d) Vad kompilatorn klagar på är att metoden Math.sqrt() inte finns! Detta kan ju verka något mystiskt eftersom vi alla vet att det i klassen java.lang.math finns en klassmetod sqrt(). Alla vet också att paketet java.lang inte behöver importeras. Så varför blir det då fel? Problemet är att den egna klassen heter Math!! Vid namngivning i Java gäller närhetsregeln, därför avser Math i anropet Math.sqrt(tal) den egna klassen Math och inte java.lang.math. I den egna klassen finns ingen metod sqrt definierad, varför kompilatorn inte hittar metoden sqrt. För att rätta till felet kan vi således ändra namnet på den egna klassen eller specificera att det är klassen java.lang.math vi avser. Ändra namnet på klassen: public class AnOtherMath { 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 //AnOtherMath Specificera namnet på metoden: public class Math { public static void main (String[] arg) { String indata = JOptionPane.showInputDialog("Ange ett tal: "); double tal = Double.parseDouble(indata); double root = java.lang.math.sqrt(tal); JOptionPane.showMessageDialog(null, "Roten ur talet " + tal + " är " + root); //main //Math
Uppgift 8 import java.util.*; public class Calories { public static void main(string[] arg) { while(true) { String indata = JOptionPane.showInputDialog("Antalet kalorier och antalet gram fett: "); if (indata == null) break; Scanner sc = new Scanner(indata); double nrcalories = sc.nextdouble(); double gramsoffat = sc.nextdouble(); double caloriesfromfat = getcalories(gramsoffat); if (nrcalories <= 0 gramsoffat < 0) { JOptionPane.showMessageDialog(null,"Negativa värden kan får ej ges!"); else { double precentagefromfat = caloriesfromfat/ nrcalories *100; if (precentagefromfat > 100) JOptionPane.showMessageDialog(null,"Felaktig indata!\n" + "Andelen fett kan inte överskrida 100%!"); else if ( precentagefromfat < 30) JOptionPane.showMessageDialog(null, String.format("%.2f", precentagefromfat) + " procent av kalorierna kommer från fett. \n" + " Kategori: GRÖN " ); else if (precentagefromfat <= 40) JOptionPane.showMessageDialog(null,String.format("%.2f", precentagefromfat) + " procent av kalorierna kommer från fett.\n" + " Kategori: GULT " ); else JOptionPane.showMessageDialog(null, String.format("%.2f", precentagefromfat) + " procent av kalorierna kommer från fett.\n" + " Kategori: RÖTT " ); //while //main public static double getcalories(double grams) { return 7.7*grams; // getcalories // Calories
Uppgift 9 public class Point { private int x; private int y; public Point (int x, int y) { this.x = x; this.y = y; //constructor public int getx () { return x; //getx public int gety () { return y; //gety public Point translate(int dx, int dy) { return new Point(x + dx, y +dy); //translate public double distance(point p) { return Math.sqrt(Math.pow(x-p.x, 2) + Math.pow(y-p.y, 2)); //distance public boolean hassamevalue(point p) { return (x == p.x && y == p.y); // hassamevalue public String tostring() { return "(" + x + ", " + y + ")"; //tostring //Point
Uppgift 10 a) b) public static double[] smooth(double[] vekt) { double[] res = new double[vekt.length]; res[0] = vekt[0]; for (int i = 1; i < vekt.length -1; i = i + 1) { double value = (vekt[i-1] + vekt[i] + vekt[i+1]) / 3; res[i] = value; res[vekt.length-1] = vekt[vekt.length-1]; return res; //smooth public static int[][][] hidemessage(int[][][] sample, String msg) { int[][][] newsample = new int[sample.length][sample[0].length][3]; int nrofletters = 0; for (int x = 0; x < newsample.length; x = x + 1) { for (int y = 0; y < newsample[x].length; y = y + 1) { if (nrofletters < msg.length()) { char ch = msg.charat(nrofletters); nrofletters = nrofletters + 1; int ascii = (int) ch; int r = ascii / 100; int g = ascii / 10 % 10; int b = ascii % 10; newsample[x][y][0] = 10 * (sample[x][y][0] / 10) + r; newsample[x][y][1] = 10 * (sample[x][y][1] / 10) + g; newsample[x][y][2] = 10 * (sample[x][y][2] / 10) + b; else for (int i = 0; i < 3; i++) newsample[x][y][i] = sample[x][y][i]; return newsample; //hidemessage
Uppgift 11 import java.awt.*; import java.awt.event.*; public class CodeLock extends JFrame implements ActionListener { private NumberButton[] t = new NumberButton[5]; private int thecode = 0; public CodeLock!v(int thecode) { if (thecode < 0 thecode > 99999) throw new IllegalArgumentException(); this.thecode = thecode; Font font = new Font("Times", Font.PLAIN, 36); setlayout(new GridLayout(1, 5,3,3)); for (int i = 0; i < t.length; i = i + 1) { t[i] = new NumberButton(0); add(t[i]); t[i].addactionlistener(this); t[i].setbackground(color.yellow); t[i].setopaque(true); t[i].setfont(font); setdefaultcloseoperation(exit_on_close); setsize(320, 100); setvisible(true); //konstruktor public void actionperformed(actionevent e) { for (int i = 0; i < t.length; i = i + 1) { if (e.getsource() == t[i]) { t[i].add(); correctcodegiven(); // actionperformed private void correctcodegiven() { int givencode = 0; for (int i = 0; i < t.length; i = i + 1) { givencode = 10 *givencode + t[i].getnumber(); if (givencode == thecode) { for (int i = 0; i < t.length; i = i + 1) t[i].setenabled(false); //correctcodegiven public static void main (String[] arg) { CodeLock k = new CodeLock(12221); //main // CodeLock