Tentamen för TTIT71 Programmering 2007-01-10 kl. 08-12 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. 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. 09.30. Uppgift 1. (2 p) Vad kommer att skrivas ut när man kör nedanstående program? public class Adder { Adder(int i) { addition(j); j = j + i; addition(j); System.out.println(j); private void addition(int a) { a = a + i; public static void main(string[] args) { new Adder(34); private int i = 1; private int j = 10; 1
Uppgift 2. (4 p) Skriv ett program som tar emot ett heltal av användaren och skriver ut en likbent, rätvinklig triangel enligt nedanstående exempel. Heltalet som användaren anger är alltså längden på de två katetrarna. ASCII-grafiken gör att trianglarna inte blir likbenta i verkligheten men de har i alla fall lika många tecken i varje katet. ida> java TrianglePrinter 0 Error: Integer value must be larger than 0 ida> java TrianglePrinter 1 _ / ida> java TrianglePrinter 2 / ida> java TrianglePrinter 15 / Uppgift 3. (4 p) Förklara nedanstående begrepp med 2 3 meningar vardera: (a) referenstyp (b) konstruktor (c) multipelt arv (d) information hiding (e) accessmodifierare (f) inkapsling (g) överlagring (h) åsidosättning 2
Uppgift 4. (±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) Om en metod explicit kastar ett undantag med throw så måste den metoden också explicit deklareras med throws i signaturen. (b) Genom att deklarera (minst) en metod som final så ser man till att man inte kan ärva från den klass metoden är deklarerad i. (c) En variabel som är deklarerad protected är bara synlig i objekt av den egna klassen och i objekt som har ärvt den egna klassen. (d) Metoder deklarerade i interface är alltid public. (e) Att välja mellan att relatera två klasser via arv eller inkapsling får konsekvenser för hur kloning implementeras i de klasserna. (f) Konstanterna i en uppräkning (enumeration) är alltid statiska (static). Uppgift 5. (3 p) Förklara nedanstående tre koncept gällande arv i Java. Relatera också koncepten till varann. Med relatera menas t.ex. om det ena implicerar det andra eller huruvida det ena är nödvändigt för det andra eller ej. Ange Javas nyckelord där sådana finns. 1. Subklassning 2. Subtypning 3. Substituerbarhet Uppgift 6. (16 p) Fumliga Fia och Snillrike Sune har gått med i festeriet. Äldre studenter varnade dem för att de skulle missa sina tentor pga hårt arbete och ändlöst festande, men Fia och Sune är smartare än så. Det borde gå att kombinera festeriarbete med studierna i programmering, sa Sune. Ja, vad smart! sa Fia. De båda mindes hur gamla avdankade festerister beklagat sig över strul med biljetter, anmälningar, sponsorer och bordsplacering vid sittningar. Vi borde kunna göra ett program som löser det, tyckte Fia. Så föddes idén om PartyAdmin, ett program för hantering av gäster på studentfester. Du känner Fia och Sune har du lovat att hjälpa till lite med programmeringen. Projektet innehåller redan klassen Party som representerar en fest, den abstrakta klassen Person med subklasserna Student och SponsorPerson som representerar olika typer av gäster, klassen Sponsor som representerar ett företag eller en organisation som sponsrar festen, samt klassen Money som representerar svenska pengar. Källkoden i sin nuvarande status finns på sidorna 5 7. På nästa sida hittar du de sex uppgifter som har hamnat på din todo-lista. 3
Uppgifter: (a) Metoden Party.pay() har ingen kropp än. Implementera kroppen med lämplig felhantering. Vid fel ska undantag kastas. (2 p) (b) Överlagra metoden Party.addSponsor() så att den tar emot en String och en double som parametrar. Kedja den med den befintliga Party.addSponsor(). (2 p) (c) Studenter bör kunna anmäla varsin extern gäst, t.ex. en kompis hemifrån. Inför en ny klass GuestToStudent. Varje sådant objekt ska hålla reda på vilket Student-objekt som är dess värd. Modifiera övriga klasser så att varje student kan ha en extern gäst, och att alla objekt av typen GuestToStudent hanteras som de andra gästerna. (3 p) (d) Som du ser har programmet inget stöd för bordsplacering än. Ett första steg är att lagra uppgift om kön på gästerna, om man nu vill placera dem varannan tjej, varannan kille. Implementera en uppräkning (enum) Sex och inför den i systemet så att en placeringsmetod sedermera kan placera alla gäster efter kön. (3 p) (e) Metoden Party.print() har ingen kropp än. Implementera kroppen så att metoden skriver ut festinformation enligt följande exempel (4 p): DömD i samarbete med Omegapoint Consulting AB och Enea Epact AB Pris 90 kr per gäst, max 1000 gäster Anmälda gäster: Kristin Johansson (har betalat), Joakim von Anka (har betalat), Lotta Frisell (har betalat), Gurra Svensson (har betalat), John Wilander (har betalat), Fredrik Kuivinen (har inte betalat än), Lena af Grepe (har betalat), Gunhild Myrhage (har betalat) Om du vet att det finns en klass eller metod i Javas API som löser en viss sak men du inte kommer ihåg exakt vad den heter eller i vilket paket den finns så är det OK att införa ett eget metodanrop som löser samma sak så länge du beskriver det. Det är dock inte OK att anta att API:et innehåller fiktiva metoder som förenklar uppgiften i stil med metodensomfixartilllite(). (f) Gästerna och uppgifter om huruvida de har betalat eller ej lagras i en viss typ av mappning (map). Har de klasser som lagras där ett lämpligt stöd för den mappningen, eller har Fia och Sune missat något? Motivera ditt svar och hänvisa till koden om du vill peka på något särskilt. (2 p) 4
class Party { private String partyname; private int maxguests; private Money entrancefee; private Map<Person, Boolean> guests; private Map<Sponsor, Money> sponsors; Party(String partyname, int maxguests, Money entrancefee) { this.partyname = partyname; this.maxguests = maxguests; this.entrancefee = entrancefee; this.guests = new HashMap<Person, Boolean>(); this.sponsors = new HashMap<Sponsor, Money>(); void addguest(person guest) { addguest(guest, false); void addguest(person guest, boolean haspaid) { guests.put(guest, haspaid); void pay(person guest) { // Din kod här boolean haspaid(person guest) throws NoSuchPersonException { if(guests.containskey(guest)) { return guests.get(guest); else { throw new NoSuchPersonException(); void addsponsor(sponsor sponsor, Money amount) { sponsors.put(sponsor, amount); public void print() { // Din kod här 5
abstract class Person { private final String name; Person(String name) { this.name = name; public String getname() { return name; public int hashcode() { return name.hashcode(); class Student extends Person { Student(String name) { super(name); class SponsorPerson extends Person { private final Sponsor organization; SponsorPerson(String name, Sponsor organization) { super(name); this.organization = organization; Sponsor getorganization() { return organization; 6
class Sponsor { private final String name; Sponsor(String name) { this.name = name; public String tostring() { return name; public int hashcode() { return name.hashcode(); class Money implements Cloneable { double amount; Money(double amount) { if(amount < 0.0) { throw new IllegalArgumentException(); else { this.amount = amount; protected Money clone() { try { return (Money)super.clone(); catch(clonenotsupportedexception e) { throw new AssertionError(); // Should never happen public String tostring() { return Double.toString(amount); 7