UMEÅ UNIVERSITET Datavetenskap 030920 LÖSNINGSFÖRSLAG: TENTAMEN Programmering i Java, 5p Datum Betygsgränser: U 0 - 21,5 3 22 - 28 4 28,5 - 34,5 5 35 - 44 : 030920 Uppgift 1. (8p) Förklara följande begrepp (ge gärna exempel där det är lämpligt) a) Syntax beskriver hur giltiga programstrukturer (satser) måste se ut; grammatik b) Semantik beskriver vad precis olika satser betyder (dvs hur datorn ska tolka programmen) c) Överlagring … innebär att man i en klass kan ha två metoder med samma namn förutsatt att dessa har olika signatur (typ, ordning, antal parametrar) d) Abstrakt klass En klass som man inte kan skapa objekt utifrån. Abstrakta klasser kan innehålla abstrakta metoder (metoder som saknar implementation). Används som basklasser där de klasser som ärver från den abstrakta klassen måste implementera alla abstrakta metoder för att inte själva bli abstrakta. Uppgift 2. (4p) Vilka värden och datatyper har följande uttryck? Om ett fel uppstår skriv detta. a) (1.0/10)*4 0.4 double b) (float) 10/4 2.5 float c) 10+ 10%4+10/2 17 int UMEÅ UNIVERSITET 901 87 UMEÅ Johan Eliasson, Tel.: 070-2378695, E-mail: [email protected] Johan Tordsson, E-mail: [email protected] Tentamen: Programmering i Java. 030920 d) !(10<20 && 10.0<20.0) false boolean Uppgift 3. (5p) I koden nedan kan ett undantag av typen IOException inträffa detta är ett ”checked”/kontrollerat undantag och måste alltså hanteras på något sätt. Din uppgift är att fixa detta problem. En underklass till IOException är FileNotFoundException. Om det IOException som inträffar är av denna typ så ska användaren få mata in ett nytt filnamn. Detta skall upprepas ända tills användaren lyckas hitta ett filnamn som inte genererar detta undantag. Är det något annat IOException som inträffar skall texten ”Ett IOException har inträffat” skrivas ut och programmet avslutas. public class ExceptionHandling { public static void main(String[] args) { FileWriter fw; boolean correct; String filnamn=Keyboard.readString(); do { correct=true; try { fw= new FileWriter(filnamn); } catch(FileNotFoundException e) { System.out.println(”Felaktigt filnamn: Försök igen”); correct=false; } catch(IOException e) { System.out.println(”Ett IOException har inträffat”); return; } } while(!correct); /* resten av metoden */ } Uppgift 4. (3p) Fel i program kan delas upp i olika kategorier. Ge ett exempel på en bit kod innehållandes ett fel ur varje kategori nedan. Förklara varför det är ett sådant fel. a) Kompileringsfel (Syntaxfel) Här skulle man tex kunna tänka sig en sats som saknar ett semikolon efter sig b) Run-time fel Tex division med 0; eller ett (annat) undantag som ej fångas upp c) Logiskt fel Ett program som fungerar men ej gör det som det var tänkt 2/7 Tentamen: Programmering i Java. 030920 Uppgift 5. (6p) Skriv en klass för att representera rationella tal (bråk). Du minns att rationella tal kan skrivas som en täljare och nämnare, exempelvis 1/3, eller hur? Klassen skall åtminstone innehålla metoder för att addera och multiplicera två rationella tal. Man ska också kunna jämföra om två rationella tal är lika (tänk på att 1/3=2/6 osv). Metoderna du skriver ska ta objekt som tillhör din klass som parameter/ar. För att objekt av din klass skall kunna skrivas ut, exempelvis med hjälp av System.out.println, så måste du också omdefiniera metoden toString (som returnerar en representation av objektet som en sträng och inte tar några parametrar). Om man försöker skapa ett rationellt tal med 0 i nämnaren skall ett ArithmeticException kastas (ArithmeticException har en konstruktor som inte tar några parametrar). Skriv även ett litet testprogram som visar att du förstått hur man använder din klass och de metoder som finns i den. public class Rat { private int numerator; private int denominator; public Rat(int num, int denom) { numerator=num; denominator=denom; if (denominator==0) throw new ArithmeticException(); } public Rat multiply(Rat num2) { Rat temp; temp= new Rat(numerator*num2.numerator, denominator*num2.denominator); return temp; } public Rat add(Rat num2) { Rat temp; temp= new Rat(numerator*num2.denominator + denominator*num2.numerator, denominator*num2.denominator); return temp; } public boolean equals(Rat num2) { 3/7 Tentamen: Programmering i Java. 030920 return (numerator*num2.denominator == denominator*num2.numerator); } public String toString() { return (””+ numerator +”/”+ denominator); } } Uppgift 6. (6p) Sänka skepp är ett klassiskt spel mellan två spelare som har var sin (för varandra dold) spelplan med en flotta av skepp. Det gäller sedan att gissa vart motståndaren har gömt sina skepp. Varje spelare placerar ut flottan i ett 10x10-rutsystem och sedan gissar de två spelarna omväxlande koordinater till någon av dem har "träffat av" och därmed sänkt alla motståndarens skepp. I en enklare version av detta spel består varje skepp av två närliggande rutor, antingen horisontellt eller vertikalt. Ett skepp kan med andra ord inte ligga diagonalt. Vi lagrar spelbräder som en tvådimensionell array med element av typen char. Skepp lagras som 'X' och alla andra tecken räknas som hav (i exemplet används ' för hav). Ett exempel på ett spelbräde med 4 skepp: ''''''''''' 'XX'''''''' ''''''''X'' ''''''''X'' ''''''''''' ''''''''''' '''XX'XX''' ''''''''''' ''''''''''' ''''''''''' Uppgiften går ut på att skriva en metod public int countShips(char board[][]) som räknar hur många skepp som finns på spelplanen. Observera att våra skepp behöver lite utrymme, det är alltså inte möjligt att två skepp ligger intill varandra, som i exemplet nedan. ''''XXX'''' ''''''X'''' ''''''''''' '''XXXX'''' ''''''''''' '''''''''XX 4/7 Tentamen: Programmering i Java. 030920 '''XX''''XX ''''XX''''' ''''''''''' ''''''''''' Den enkla varianten (som fungerar så länge skeppen är lika stora) public int countShips(char board[][]) { int counter=0; for int i=0;i<10;i++) for(int j=0;j<10;j++) if(board[i][j]==’X’) counter++; return counter/2; } Uppgift 7. (6p) Det nystartade flygbolaget SAS (Staffans Aviation Service) behöver ett system för att planera sin verksamhet. Rita ett klassdiagram som skall kunna användas vid konstruktion av systemet. Ni vet följande om deras verksamhet: SAS har ett flertal flyglinjer. Varje flyglinje går mellan två städer (det finns med andra ord inga anslutningsflyg eller mellanlandningar). Varje flyglinje trafikeras med flera avgångar vilka sker på regelbundna tider enligt ett veckoschema. Till varje avgång krävs naturligtvis ett flygplan. Ett specifikt flygplan får dock användas på flera olika flyglinjer, men naturligtvis inte samtidigt. Varje gång ett flygplan används på en avgång krävs 2 piloter för att flyga planet samt 3 till 8 personer som arbetar som kabinpersonal. För att underlätta för piloterna får dessa bara flyga avgångar på upp till tre olika flyglinjer. Någon sådan restriktion finns inte för kabinpersonalen. Observera att uppgiften går ut på att modellera (ej implementera) systemet. Du behöver heller inte fundera över något som rör användargränssnittet. Förslag till lösning med det viktigaste klasserna / metoderna / attributen / relationerna: Veckoschema KabinPersonal LäggTillAvgång(Tid, LinjeId, PersonalId) Personal Namn Adress Schema Id SchemaläggAvgång(Avgång):boolean Avgång Avgångstid Personal HämtaFlyglinje():Flyglinje Flyglinje Stad1:String Stad2:String Id UpskattadFlygtid Pilot GodkändaFlyglinjer:Flyglinje[] Flygplan Bokningar Position:String 5/7 SchemaläggAvgång (Avgång):boolean TaBortFlyglinje(Flyglinje) Boka(Tid) NyPosition(String) Tentamen: Programmering i Java. 030920 Uppgift 8. (6p) Vad skrivs ut av följande program? public class Integerish { private int intValue; public Integerish(int intValue) { this.intValue = intValue; } public int getIntValue() { return intValue; } public void setIntValue(int newValue) { intValue = newValue; } public String toString() { return ""+ intValue; } } public class Confusion { public static void aMethod(int a, Integerish b, int c) { int tmp = a; a = b.getIntValue(); b.setIntValue(tmp); c *= 2; System.out.println("a = " + a + ", b = " + b + ", c = " + c); } public static void main(String []args) { int x; int y; Integerish z; Integerish w; x = y = 3; y++; z = new Integerish(x + y); w = z; 6/7 Tentamen: Programmering i Java. 030920 w.setIntValue(9); System.out.println("x = " + x + ", y = " + y + ", z = " + z); aMethod(x, z, w.getIntValue()); System.out.println("x = " + x + ", y = " + y + ", z = " + z); } } x = 3, y = 4, z = 9 a = 9, b = 3, c = 18 x = 3, y = 4, z = 3 7/7