Tentamen för TTIT71 Programmering 2006-10-16 kl. 14-18 Institutionen för datavetenskap Linköpings universitet Antal uppgifter: 6 Max: 32 poäng Betyg: 3:a 16 poäng, 4:a 24 poäng, 5:a 28 poäng Hjälpmedel: Inga Jourhavande lärare: John Wilander, ank. 2463 Anvisningar Såvida inget annat anges skall Javakod användas för att lösa uppgifterna. Inga kraftfullare språkkonstruktioner än vad som finns att tillgå i språket Java får användas. Radvis in- och utmatning till fil, tangentbord, skärm etc. antas finnas. Syntaktiska fel ger inga avdrag såvida felen inte leder till oklarheter eller om uppgiften är av syntaktisk natur. Alla icke uppenbara antaganden skall redovisas i lösningen. Jourhavande kommer förbi lokalen vid ett tillfälle: kl. 15.30. Uppgift 1. (2 p) Vad kommer att skrivas ut när man kör nedanstående program? public class Adder { private int addition(int a) { return a + b; public static void main(string[] args) { Adder adder = new Adder(); int b = 35; b = adder.addition(b); b = adder.addition(b); System.out.println(b); private int b = 34; 1
Uppgift 2. (4 p) Sorteringsalgoritmen Bubble sort sorterar en heltalsarray genom att gå igenom den osorterade arrayen från och med lägsta index till högsta. Låt oss kalla det element som finns på det index algoritmen just nu behandlar för det aktuella elementet. Det första aktuella elementet blir alltså det första elementet i den osorterade arrayen. Om det aktuella elementet är större än elementet på nästa, högre index så byter de två elementen plats. Detta fortsätter tills det aktuella elementet har jämförts med alla högre index. På det sättet bubblar det aktuella elementet upp till sin rätta position i arrayen. Algoritmen fortsätter sedan med nästa element. Resultatet blir en sorterad array. Ett exempel: Innan sortering: Osorterad array 2 9 1 5 3 Sortering (alla heltal i fetstil har bytt plats): 1:a elementet, 2, bubblar upp. Resultat: 1 9 2 5 3 2:a elementet, 9, bubblar upp. Resultat: 1 2 5 3 9 3:e elementet, 5, bubblar upp. Resultat: 1 2 3 5 9 4:e elementet, 5, bubblar upp. Resultat: 1 2 3 5 9 Nedanstående klass är inte färdigskriven metoden sort() måste implementeras. Eftersom klassen heter BubbleSorter så ska sorteringsalgoritmen vara den så kallade Bubble sort (beskriven ovan). Skriv klart metoden sort() så att BubbleSorter sorterar korrekt. Din sort() ska anropa metoden swap(). public class BubbleSorter { public int[] sort(int[] unsorted) { // Din kod här private void swap(int a, int b, int[] array) { if(a < 0 b < 0 a >= array.length b >= array.length) { throw new IllegalArgumentException(); else { int temp = array[a]; array[a] = array[b]; array[b] = temp; 2
Uppgift 3. (±3 p) Ange sant eller falskt för nedanstående påståenden. Ett korrekt svar ger 0,5 poäng, ett felaktigt svar ger 0, 5 poäng och ett blankt svar ger 0 poäng. Uppgiften kan alltså ge negativ poäng totalt. (a) Ett catch-block som inleds med catch(exception e) fångar alla undantag, även så kallade runtime-undantag. (b) Alla objekt kan klonas eftersom de ärver metoden clone() från Object (så kallad grund kloning). (c) En variabel som är deklarerad private är bara synlig inom det egna objektet. (d) Verktyget JavaDoc används för att dokumentera Javakod i så kallade diagram. (e) Inkapsling skapar en svagare koppling mellan två objekt och kan vara ett alternativ till arv om en svagare koppling önskas. (f) I Java kan alltid en superklass substitueras av en av sina subklasser. Uppgift 4. (4 p) Förklara begreppen med 2 3 meningar vardera (0,5 p för varje korrekt förklaring): (a) attribut (b) accessmodifierare (c) interface (d) instans (e) primitiv typ (f) statisk metod (g) generisk typ (h) singelton Uppgift 5. (3 p) Förklara nedanstående tre sorters implementationsarv av metoder (ange Javas nyckelord för de eventuella koncept som ingår i din förklaring): 1. 2. Åsidosättningsbar med default Åsidosättningsbar utan default 3. Icke-åsidosättningsbar med default Uppgift 6. (16 p) Efter att tidigare ha byggt och programmerat sin egen kaffeautomat så bestämmer sig Fiffiga Fia och Sunkige Sune för att söka en egenutvecklad lösning även i fallet personaldatabas. I sitt företag har de tillsvidareanställda som antingen är heltids- eller deltidsanställda. I databasen ska de hålla reda på namn, personnummer, anställningsform och lön. Till den här uppgiften hör källkod för klasserna Personaldatabas, Personnummer, Lön, Pengar, Heltidsanställd och Deltidsanställd. Därtill hör källkod för den abstrakta klassen Tillsvidareanställd och interface:et Anställd. Koden är mestadels på svenska trots att god programmeringssed säger att man bör skriva på engelska. Skälet till att klassnamn m.m. är på svenska är att förenkla för dig som skriver tentan. Det är trots allt lättare att förstå begrepp som tillsvidareanställd på svenska än på engelska. Du hittar källkoden på sidorna 4 8. De sju uppgifter du ska lösa finns på nästa sida (sida 4). 3
Uppgifter: (a) Implementera metoden Deltidsanställd.setProcentAnställd() med lämplig felhantering. Vid fel ska ett undantag kastas. (2 p) (b) Interface:et Anställd är än så länge ett taggningsinterface. Men med tanke på hur det används av den övriga koden så kommer det ge kompileringsfel. Inför nödvändiga metoder i Anställd. (2 p) (c) Inför en uppräkning (eng. enum) Lönetidsenhet med konstanterna PER_MÅNAD och PER_TIMME. Titta i klassen Lön på hur Lönetidsenhet används. (3 p) (d) Överlagra Tillsvidareanställd.setLön() så att den tar emot Lön och Lönetidsenhet som parametrar. (1 p) (e) Metoden Tillsvidareanställd.equals() är inte implementerad. Skriv den metoden så att två tillsvidareanställda anses lika om de har samma personnummer. (2 p) (f) Som du ser i Tillsvidareanställd.getLön() så klonas lönen innan den returneras för att den inte ska kunna ändras av något annat objekt. Men i klassen Lön ser vi att kloning inte stöds än, dvs CloneNotSupportedException kommer att kastas vid anrop till clone(). Se till att Lön stödjer kloning och att ett anrop till Lön.clone() returnerar en djup klon. Du behöver bara ange förändringarna i koden så länge du också anger var du ändrar. (4 p) (g) Måste klassen Tillsvidareanställd vara abstrakt? Motivera ditt svar. (2 p) public final class Personaldatabas { private List<Anställd> databas; public Personaldatabas() { databas = new LinkedList<Anställd>(); public void addanställd(anställd anställd) { if(!databas.contains(anställd)) { databas.add(anställd); Collections.sort(databas); public String tostring() { String result = ""; for(anställd a : databas) { result += a.getnamn() + " " + a.getpersonnummer().tostring() + " " + a.getanställningsform() + " " + a.getlön().tostring() + "\n"; return result; 4
public interface Anställd extends Comparable<Anställd> { // Din kod här public class Personnummer { private String personnummer; public Personnummer(String pnr) { if(iscorrect(pnr)) { personnummer = pnr; else { throw new IllegalArgumentException(); public String tostring() { return personnummer; public boolean equals(object obj) { if (obj instanceof Personnummer) { Personnummer nyttpersonnummer = (Personnummer) obj; return personnummer.equals(nyttpersonnummer.personnummer); else { return false; private boolean iscorrect(string pnr) {... // Koden inte redovisad 5
public class Lön { private Pengar pengar; private Lönetidsenhet tidsenhet; public Lön(Pengar lön, Lönetidsenhet tidsenhet) { this.pengar = lön; this.tidsenhet = tidsenhet; public String tostring() { return new String(pengar.toString() + " " + tidsenhet.tostring()); public class Pengar { private double summa; private Valuta valuta; public Pengar(double summa, Valuta valuta) { this.summa = summa; this.valuta = valuta; public double getsumma() { return summa; public Valuta getvaluta() { return valuta; public String tostring() { return valuta.tostring(summa); 6
public abstract class Tillsvidareanställd implements Anställd { private String namn; private Personnummer personnummer; private Lön lön; public Tillsvidareanställd(String namn, Personnummer personnummer, Lön lön) { this.namn = namn; this.personnummer = personnummer; this.lön = lön; public String getnamn() { return namn; public Personnummer getpersonnummer() { return personnummer; public void setlön(lön lön) { this.lön = lön; public Lön getlön() { return (Lön)lön.clone(); public boolean equals(object obj) { // Din kod här public int compareto(anställd anställd) { return namn.compareto(anställd.getnamn()); 7
public class Heltidsanställd extends Tillsvidareanställd { public Heltidsanställd(String namn, Personnummer personnummer, Lön lön) { super(namn, personnummer, lön); public String getanställningsform() { return "heltidsanställd"; public class Deltidsanställd extends Tillsvidareanställd { private double procentanställd; public Deltidsanställd(String namn, Personnummer personnummer, Lön lön, double procentanställd) { super(namn, personnummer, lön); setprocentanställd(procentanställd); public String getanställningsform() { return "tillsvidareanställd " + procentanställd + " %"; public double getprocentanställd() { return procentanställd; public void setprocentanställd(double procentanställd) { // Din kod här private boolean iscorrectprocent(double procent) { return (procentanställd > 0.0) && (procentanställd < 100.0); 8