luleå tekniska universitet

LULEÅ TEKNISKA UNIVERSITET
Tentamen i
Objektorienterad programmering och design
Totala antalet uppgifter: 5
Lärare: Håkan Jonsson, Tomas Johansson, 491000
Resultatet offentliggörs senast: 2009-05-25.
Kurskod
D0010E
Datum
2009-05-15
Skrivtid
5 tim
Tillåtna hjälpmedel: Inga. Javas standardbibliotek får endast användas i den utsträckning
detta uttryckligen tillåts.
1. Teori
a) Ange två goda anledningar till att arv finns i objektorienterade språk (t ex
Java).
(2p)
b) Hur ska man deklarera en klass i Java så att . . .
1) . . . det inte går att skapa dynamiska objekt av den?
(1p)
2) . . . den inte går att ärva?
(1p)
c) G är ett publikt deklarerat gränssnitt i paketet p1 som innehåller en metod
m() deklarerad protected. Paketet p2 innehåller 1200 klasser A1 ,A2 , . . . ,A1200
sådana att A1 implementerar G och Ai ärver Ai−1 för 2 ≤ i ≤ 1200. Slutligen
finns ett tredje paket p3 i vilket det ligger en klass X som ärver A1200 .
I vilka av alla klasserna syns m()?
(1p)
d) Skriv en rekursiv metod som tar en sträng som argument, samt returnerar
den reverserade strängen. I bilagan listas tillåtna strängfunktioner.
(1p)
2. Naturliga tal
(6p)
Ett naturlig tal kan sägas vara ett heltal som inte är negativt. Implementera en klass
Nat för att representera muterbara naturliga tal och med följande innehåll:
public Nat(int n) skapar ett naturligt tal med värdet n. Om n < 0 ska ett undantag med lämpligt felmeddelande kastas.
public Nat() skapar ett naturligt tal med värdet 0.
public void add(Nat n) adderar n till talet.
public void sub(Nat n) subtraherar n från talet. Om resultatet blir negativt ska
ett undantag med lämpligt felmeddelande kastas.
public int toInt() ger talet som ett int.
3. Polynom
(6p)
Ett polynom i x är en summa där termerna är potenser med basen x och den största
exponenten anger polynomets gradtal. Polynomet 2x4 + x3 − 8x2 + 4x + 7 har t ex
gradtalet 4.
Polynom adderas genom att kooefficienterna adderas. Om t ex f1 (x) = 2x3 + 3x2 −
8x + 4 och f2 (x) = 6x2 − 2x + 7, så är
f1 (x) + f2 (x) = (2 + 0)x3 + (3 + 6)x2 + (−8 − 2)x + (4 + 7)
= 2x3 + 9x2 − 10x + 11.
Skriv en metod som adderar två polynom och returnerar resultatet.
!
Antag att ett polynom f (x) = ni=0 ci xi representeras med en array med doubles,
där arrayelementet på index i är ci och arrayens längd minus 1 således är polynomets
gradtal.
4. Grindar
En grind är en digital elektronisk komponent som ger en boolsk utsignal som beror
av boolska insignaler1 . Välkända grindar beräknar logiska funktioner som AND, OR
och NOT men även andra är möjliga. Grindar kopplas ihop till kretsar genom att
utsignaler från vissa grindar används som insignaler till andra. I exemplet i Fig. 1
x
AND
u
OR
y
z
AND
NOT
Figur 1: Kretsexempel.
finns en krets med fyra grindar varav två AND, en OR och en NOT. Signaler överförs
längs streck och alltid in på vänster sida om en figur och ut på höger sida. T ex så
består den ena av insignalerna till OR-grinden av utsignalen från NOT-grinden. Vidare
är x, y och z insignaler till kretsen samtidigt som u är hela kretsens utsignal. Kretsen
motsvarar (x ∧ (y ∧ z)) ∨ (¬(y ∧ z)).
a) Implementera klasserna i UML-diagrammet i Fig. 2 så att de representerar
de välkända grindarna samt klassen Input.
(4p)
Konstruerarna för de välkända grindarna tar som argument grindar vars utsignaler ska användas som insignaler.
<<abstract>>
Gate
+ boolean output()
Input
+Input(boolean a)
+void set()
+void clear()
And
+And(Gate a, Gate b)
Or
+Or(Gate a, Gate b)
Not
+Not(Gate a)
Figur 2: UML-diagram till uppgift 4.
Input används för en speciall slags grindar som saknar insignaler men som
ändå ger en utsignal. Utsignalen ges som argument till konstruktorn men kan
även ändras genom anrop till metoderna set (som gör utsignalen till true)
och clear (som gör den till false).
Metoden output beräknar då den anropas en grinds utsignal, som förstås
beror av vad insignalerna är just då.
Om x, y och z alla är sanna kan exemplet i Fig. 1 kodas så här:
...
Input x
Input y
Input z
And and
Or or =
...
1
= new Input(true);
= new Input(true);
= new Input(true);
= new And(y,z);
new Or(new And(x,and), new Not(and));
Ibland använder man 1 och 0 istället för true och false.
(Notera den dubbla användningen av and.)
Kretsens utsignal, som är densamma som utsignalen från grinden or, ges av
or.output().
b) Antag att vi vill kunna ändra i kretsar under programkörningen och därför
tillför metoder i grindklasserna som byter ut insignalkällorna.
Hur skulle du ändra/vad skulle du lägga till för att det inte skulle gå att skapa
en krets i vilken en insignal till en grind direkt eller indirekt beror av dess
egen utsignal (en slags ”rundgång”)?
(2p)
5. Lista
(6p)
Implementera en klass för godtyckligt långa listor. Förutom en konstruktor ska det
finnas metoder för att
(a) stoppa in ett element,
(b) ta ut det äldsta elementet (det som funnits i listan längst tid vid anropet) samt
(c) få reda på antalet element i listan.
Skapa internt en länkad lista genom att använda en intern nodklass; du får inte
använda arrayer eller färdiga klasser ur Javas standardbibliotek.
Strängfunktioner till 1d
Följande strängfunktioner får användas i uppgift 1d:
• public int length(): Returns the length of this string.
• public char charAt(int index): Returns the character at the specified index. An
index ranges from 0 to length() - 1. The first character of the sequence is at index
0, the next at index 1, and so on, as for array indexing.
• public String substring(int beginIndex, int endIndex): Returns a new string
that is a substring of this string. The substring begins at the specified beginIndex
and extends to the character at index endIndex - 1. Thus the length of the substring
is endIndex-beginIndex.
Examples:
"hamburger".substring(4, 8) returns "urge"
"smiles".substring(1, 5) returns mile"
Sanningstabeller
AND
a
true
true
false
false
b
true
false
true
false
a∧b
true
false
false
false
a
true
true
false
false
b
true
false
true
false
a∨b
true
true
true
false
OR
NOT
a
true
false
¬a
false
true