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