AID-nummer: Datum: 2014-12-18 Kurskod: 725G61 Provkod: LAB1 Grundkurs i programmering, 6 hp (725G61) Dugga 2 tillfälle 2 Skrivningstid: 2014-12-18 klockan 8.00-10.00. Hjälpmedel: Inga. För varje fråga gäller: Rätt svar: +1 poäng. Felaktigt svar: 0 poäng. Inget svar: 0 poäng. För godkänt krävs minst 7 poäng. Jour: Besöker salen cirka 9.00. Telefon: 013-281585. Ange ditt svar genom skriva ditt svarsalternativet i kolumnen Mitt svar. Om de exempelvis anser att alternativ C är det rätta svaret på fråga 1, skriver du C för den fråga. (Kolumnen Poäng fylls i av examinatorn.) Fråga Mitt svar Poäng 1 B 2 B 3 A 4 C 5 E 6 B 7 B 8 A 9 D 10 A 11 C 12 B Lämna in hela detta häfte. Frågorna och svaren publiceras på kursens hemsida strax efter att skrivningen har ägt rum. Lycka till!
Fråga 1. Vilket av följande fem påståenden beskriver korrekt vad som händer, när nedanstående program ska exekveras? a) En dialogruta med följande meddelande visas: Fel inträffade: / by zero b) En dialogruta med följande meddelande visas: Fel inträffade: For input string: "" c) Programmet exekverar men kraschar på grund av att ett exekveringsfel inträffade, dvs programmet upphör att fungera. d) En dialogruta med följande meddelande visas: Antal minuter: 0. e) En dialogruta med följande meddelande visas: Antal minuter: -0.1. Inmatning: Klickade på OK utan att ha skrivit in något. Programkod: import javax.swing.joptionpane; public class Nr01 { int minutpris = 0, totpris = 100, m = -1; boolean försökigen = true; String tot = JOptionPane.showInputDialog("Totalkostnaden:"); String pm = JOptionPane.showInputDialog("Pris per minut:"); while (försökigen) { if ( tot == null && pm == null ) System.exit(0); if ( pm.length() == 0) pm = "0"; try { minutpris = Integer.parseInt(pm); totpris = Integer.parseInt(tot); m = totpris / minutpris; försökigen = false; catch (Exception e) { JOptionPane.showInputDialog( "Fel inträffade: " + e.getmessage() ); tot = JOptionPane.showInputDialog( "Totalkostnaden:" ); pm = JOptionPane.showInputDialog( "Pris per minut:" ); JOptionPane.showMessageDialog(null, "Antal minuter: " + m + "."); (KOMMENTAR: Kapitel 7 om felhantering. )
Fråga 2. Vad skrivs ut när nedanstående program exekveras? a) En dialogruta med följande meddelande visas: a + c = 12 b) En dialogruta med följande meddelande visas: a + c = 10 c) En dialogruta med följande meddelande visas: a + c = 8 d) Det inträffar ett fel på grund av att variabeln c har deklarerats två gånger. Inmatning: Programkod: import javax.swing.joptionpane; public class Nr02 { String t = JOptionPane.showInputDialog("Skriv en text:"); int a = Integer.parseInt(t); int c = räkna( a ); JOptionPane.showMessageDialog(null, "a + c = " + (a + c) ); public static int räkna (int a) { a = a + 2; int c = a * 2; return c; (KOMMENTAR: Det grundläggande om metoder i kapitel 8.) Fråga 3. Vilket av följande påståenden är korrekt, när det gäller inmatning av numeriska värden från tangentbordet? a) När ett värde har matats in till en BufferedReader, måste det tas omhand av programkod, som omvandlar inmatningen till en numerisk datatyp. När en inmatning kommer till Scanner, behöver ingen konvertering göras, eftersom Scanner returnerar önskad datatyp. b) En Scanner läser in en hel rad och finner de olika värdena genom att dela upp raden i tokens. En BufferedReader kan inte läsa in en hel rad, och användaren måste därför mata in ett värde i taget. c) Inget av påståendena i a eller b är korrekt. (Kommentar: Grunderna om BufferedReader och Scanner i kapitel 9 samt laborationerna.)
Fråga 4. Filerna C:\\infilen.txt och C:\\utfilen.txt har detta innehåll: Vad händer när nedanstående program exekveras? a) Skrivningen till utfilen nekades på grund av att den redan finns. Det visas inget felmeddelande om detta. C:\\utfilen.txt innehåller denna rad: En rad i utfilen. b) Raden från infilen lades till i utfilen. C:\\utfilen.txt innehåller dessa två rader: En rad i utfilen. En rad i infilen. c) Utfilen togs bort, en ny fil med samma namn skapades och innehåller inte en enda rad. d) Utfilen togs bort, en ny fil med samma namn skapades och innehåller raden från infilen. C:\\utfilen.txt innehåller denna rad: En rad i infilen. import java.io.*; import javax.swing.joptionpane; public class Nr04 { public static void main(string[] args) throws IOException { BufferedReader infile = new BufferedReader (new InputStreamReader (new FileInputStream("C://infilen.txt"))); PrintWriter outfile = new PrintWriter ( new BufferedWriter ( new OutputStreamWriter ( new FileOutputStream("C://utfilen.txt")))); while (true) { String line = infile.readline(); // Behöver IOException if (line == null) break; outfile.println(line); (Kommentar: Kapitel 10.2 och laborationerna där skrivning till fil har gjorts. )
Fråga 5. Vad skrivs ut när nedanstående program exekveras? a) 3 8 b) 2 3 7 c) 7 8 d) 8 e) 7 int[] a = {2,3,8; int[] b = new int [ a.length ]; b = a; a[2] = 7; for( int i = a[1]-1; i < b.length; i++ ) System.out.print( b[i] + " " ); System.out.println(); Kommentar: Grundläggande om arrayer i kapitel 11, främst en del av innehållet i 11.3. Fråga 6. Vad skrivs ut när nedanstående program exekveras? a) Resultat 1 = 16 Resultat 2 = 16 b) Resultat 1 = 18 Resultat 2 = 25 c) Resultat 1 = 16 Resultat 2 = 26 d) Resultat 1 = 18 Resultat 2 = 18 e) Programmet kraschar på grund av att värdet på variabeln i blir större än arrayens högsta index. public class Nr06 { int[][] a = { {6,5,8,{10,13,5 ; int resultat1 = summera (a, 1); int resultat2 = summera (a, 1); System.out.println("Resultat 1 = " + resultat1); System.out.println("Resultat 2 = " + resultat2); public static int summera (int[][] a, int kolumn){ int summa = 0; for ( int i = 0; i < a.length; i++) summa = summa + a[i][kolumn]; a[1][1] = 20; return summa; Kommenterar: Tvådimensionell array. Parameter som är en array. Kapitel 11.5 och 12.3.
Fråga 7. Vilket av påståendena om nedanstående programkod är korrekt? a) saldo är en instansvariabel, p är en lokal referensvariabel, kontohavare är en lokal variabel, k är ett objekt. b) saldo är en instansvariabel, kontohavare är en referensvariabel, k avser en instans, p är referens till ett objekt. c) saldo är en instansvariabel, kontohavare är en referensvariabel, k avser en instans, p är ett objekt av klassen Person. d) personnummer är en lokal variabel, kontohavare är en referensvariabel, k avser en instans, p är referens till ett objekt. public class Nr07 { Person p = new Person(); p.namn = "Anders"; Konto k = new Konto(); k.kontohavare = p; public class Konto { Person kontohavare; double saldo; public class Person { String personnummer; (Kommentar: Begreppsdefinitionerna i kapitel 8 och 13.)
Fråga 8. Vad skrivs ut av nedanstående program, när det exekveras? a) Person 1: Katniss Person 2: August Kontohavare: Katniss b) Person 1: Katniss Person 2: August Kontohavare: August c) Person 1: Katniss Person 2: August Kontohavare: Primrose d) Person 1: August Person 2: August Kontohavare: Primrose public class Nr08 { Person p1 = new Person(); Person p2 = new Person(); p1.namn = "Primrose"; p2.namn = "Katniss"; Konto k1 = new Konto(); k1.kontohavare = p1; p1.namn = p2.namn; p2.namn = "August"; System.out.println("Person 1: " + p1.namn); System.out.println("Person 2: " + p2.namn); System.out.println("Kontohavare: " + k1.kontohavare.namn); public class Konto { Person kontohavare; double saldo; public class Person { String namn; (Kommentar: Referenser när det gäller objekt. Kapitel 13 har bra förklaringar och illustrationer.)
Fråga 9. Vilket av följande påståenden om nedanstående programkod är korrekt? a) Ett objekt av klassen Konto är enligt kursboken ett smart objekt, eftersom instansvariablerna är privata och endast går att komma åt via anrop till metoderna sättsaldo och avlässaldo. b) Ett objekt av klassen Konto är enligt kursboken ett smart objekt, eftersom det har en metod som innehåller en selektion. Därmed avlastas denna komplexitet från den anropande programkoden. c) Ett objekt av klassen Konto är enligt kursboken ett enkelt objekt, eftersom det inte har någon referensvariabel. d) Ett objekt av klassen Konto är enligt kursboken ett säkert objekt, eftersom instansvariablerna är privata och endast går att komma åt via anrop till metoderna sättsaldo och avlässaldo. public class Konto { private double saldo; public void sättsaldo ( double s ) { saldo = s; public double avlässaldo() { return saldo; public void insättning (double belopp) { saldo = saldo + belopp; public boolean uttag (double belopp) { boolean täckningfinns = true; if (saldo >= belopp) saldo = saldo - belopp; else täckningfinns = false; return täckningfinns; (Kommentar: Grundläggande definitioner i kapitel 13 och 15.) Fråga 10. Avgör vilket av dessa påståenden som är korrekt. a) Med överlagrade metoder menas, att en klass har flera metoder med samma namn, som har olika antal parametrar och/eller olika datatyper på parametrarna. När det står @override i programkoden, innebär det, att deklarationen av en metod ersätts med koden som står efter @override. a) Med överlagrade metoder menas, att en klass har flera metoder med samma namn, som har olika antal parametrar och/eller olika datatyper på parametrarna. När det står @override i programkoden, innebär det, att det är tillåtet att anropa den efterföljande metoden med andra parametrar än vad som anges i metodens deklaration. c) Med överlagrade metoder menas, att en klass har flera metoder med samma namn, vilka har samma antal parametrar men olika datatyper på parametrarna. När det står @override i programkoden, innebär det att deklarationen av en metod ersätts med koden som står efter @override. (Kommentar: Behandlades på den sista föreläsningen och beskrivs i underkapitel 15.3-15.5.)
Fråga 11. En metod kan returnera endast ett värde. Programmeraren önskar, att metoden görnågot i nedanstående programkod ska returnera flera av sina fem variabler. XYZ är en valfri datatyp, som än så länge är ospecifierad. Vilket av följande påståenden är korrekt? a) Variablerna a, b och s kan stoppas in som tre element i en array av datatypen String. Denna array deklareras som datatypen XYZ i metoderna main och görnågot. Den ges namnet ZZZ i görnågot. Sedan stoppas variabelvärdena in i ZZZ i metoden görnågot. Slutligen returneras ZZZ till anroparen. b) Skapa en ny klass med namnet XYZ, som har två variabler av datatypen int, en variabel av datatypen String och en av typen Person. Ett objekt med namnet ZZZ av denna klass skapas i görnågot, och dess variabler ges värdena för a, b, s, p1 och p2. Slutligen returneras ZZZ till anroparen, som därmed har erhållit a, b, s, p1 och p2. c) Variablerna p1 och p2 kan stoppas in som element i en array av typen Person (dvs XYZ är Person). Denna array deklareras som datatypen XYZ i metoderna main och görnågot. Den ges namnet ZZZ i görnågot. Sedan stoppas variabelvärdena in i ZZZ i metoden görnågot. Slutligen returneras ZZZ till anroparen, som därmed har erhållit p1 och p2. d) Inget av de ovanstående alternativen fungerar. public class Nr011 { XYZ detsomreturnerades = görnågot(); public static XYZ görnågot(){ int a = 10; int b = 0; String s = "Klart"; Person p1 = new Nr11_Person("Nils"); Person p2 = new Nr11_Person("Olga"); // här finns programkod som gör något så att ZZZ ges ett värde som på // något vis returnerar flera attribut return ZZZ; public class Person { private String namn; public Person (String n) { namn = n; public void sättnamn( String n) {namn = n; public String avläsnamn( String n) { return n; Kommentar: Olika delar av problemet behandlas på olika platser i kapitel 13-15.
Fråga 12. Vad händer, när nedanstående programkod exekveras? a) Programmet kraschar, när denna programsats ska utföras: Konto k3 = new Konto (2000.00); Orsaken är, att det finns två konstruktorer med samma antal parametrar. Så länge ingen av dem används, fungerar programmet felfritt. b) Följande utskrift görs: Generell kund 1000.0 Alvin 3000.0 2000.0 Anna 1000.0 c) Följande utskrift görs: OSPECAD_KUND 1000.0 Alvin 3000.0 2000.0 Anna 1000.0 d) Följande utskrift görs: Generell kund 1000.0 Alvin 3000.0 Generell kund 2000.0 Anna 1000.0 public class Nr12 { Konto k1 = new Konto (); Konto k2 = new Konto ("Alvin", 3000.00); Konto k3 = new Konto (2000.00); Konto k4 = new Konto ("Anna"); System.out.println(k1.getKund() + " " + k1.getsaldo()); System.out.println(k2.getKund() + " " + k2.getsaldo()); System.out.println(k3.getKund() + " " + k3.getsaldo()); System.out.println(k4.getKund() + " " + k4.getsaldo()); public class Konto { private final String OSPECAD_KUND = "Generell kund"; private String kund = ""; private double saldo = 1000; public Konto (){ kund = OSPECAD_KUND; public Konto (String k){ kund = k; public Konto (Double s){ saldo = s; public Konto (String k, Double s){ kund = k; saldo = s; public void setkund(string k) { kund = k ; public void setsaldo(double s) { saldo = s ; public String getkund() { return kund ; public Double getsaldo() { return saldo;