LULE˚ A TEKNISKA UNIVERSITET
Tentamen i
Objektorienterad programmering och design Totala antalet uppgifter: 5
L¨arare: H˚akan Jonsson, 491000, 073-820 1700 Resultatet offentligg¨ors senast: 2011-04-02.
Kurskod D0010E Datum 2011-03-18 Skrivtid 5 tim Till˚atna hj¨alpmedel: Inga.
OBS! L¨osningar f˚ar inte baseras p˚a f¨ordefinierade klasser ur t ex Javas standardbibliotek annat ¨an d¨ar detta uttryckligen till˚ats. S˚adana l¨osningar ger inga po¨ang.
1. Teori
a) Ange en v¨asentlig skillnad mellan klass och objekt. (1p) b) Ett program best˚ar av fyra klasser A, B, C och D. Klasserna A och B ligger i paketet p medan C och D ligger i paketet q. Vidare ¨ar B och D abstrakta, och D inneh˚aller deklarationerna:
protected int i;
private int j;
int k;
Om nu A ¨arver B som ¨arver C som ¨arver D, i vilka av de fyra klasserna syns d˚a
i) ... i? (1p)
ii) ... j? (1p)
iii) ... k? (1p)
c) P˚a sida 3 finns en klass f¨or FIFO-k¨oer1 som fungerar trots att den har vissa brister. Vilka?
Svara kortfattat med radnummer och vad som ¨ar ol¨ampligt samt hur du ist¨allet skulle ha skrivit. L¨agg d¨arefter till en lista med eventuella brister
som inte har med enskilda rader att g¨ora. (2p)
2. Palindrom (6p)
Skriv en metod public static boolean isPalindrome(int[] num) som avg¨or om en listning av talen i en heltalsarray blir densamma oavsett fr˚an vilket h˚all man listar talen. Anta, om du vill, att arrayen inneh˚aller minst ett tal (beh¨over inte kollas).
Exempel: 1,2,3,2,1 ¨ar ett palindrom, och ¨aven 0, men inte 1,2,3,1,2,3.
3. Fotoalbum (6p)
Utg˚a fr˚an att det redan finns en klass Photo och skriv en klass PhotoAlbum f¨or fotoalbum med f¨oljande konstruktor och metoder:
• public PhotoAlbum(int maxSize) som skapar ett tomt album med plats f¨or som mest maxSize foton.
• public int maxSize() som ger maximala antalet foton som ryms i albumet.
• public int size() som ger tillbaka aktuellt antal foton i albumet.
• public void append(Photo p) som l¨agger till p sist. Fotot som l¨aggs till ett album inneh˚allande i foton ¨ar nr i + 1.
• public Photo photoNum(int n) som ger tillbaka foto nr n.
• public void replaceNum(int n, Photo p) som byter ut foto nr n mot p.
1Ungef¨ar som k¨on du implementerade i lab 3, men inte lika omfattade.
1
• public void deleteNum(int n) som tar bort foto nr n. Detta minskar albu- mets storlek med 1. Det minskar ocks˚a numret p˚a alla foton med nummer h¨ogre
¨an n med 1.
Undantag ska kastas n¨ar s˚a ¨ar l¨ampligt. Tips: Representera internt fotoalbumet med en array.
4. UML (6p)
+ EnLitersBurk(int vikt) EnLitersBurk
+ Behållare(double volym) + volym() : double + ärÖppen() : boolean + öppna() : void + stäng() : void
# volym : double
# öppen : boolean
<<abstract>>
Behållare
+ Burk(double volym, int vikt) + vikt() : int
# vikt : int
<<abstract>>
Burk RuntimeException
throws throws
+ Påse(double volym) Påse + KonservBurk(double volym, int vikt)
KonservBurk
Figur 1: UML-diagram f¨or uppgift 4.
Implementera klasserna i UML-diagramet i figur 1 enligt f¨oljande:
Beh˚allare En klass representerar allm¨anna beh˚allare som har viss volym (ml) och
¨ar antingen ¨oppna eller st¨angda. Endast en st¨angd beh˚allare kan ¨oppnas (med
¨
oppna()), och en¨oppen st¨angas (med st¨ang()). F¨ors¨ok att ¨oppna eller st¨anga i andra fall resulterar i att ett undantag kastas. Metoden ¨ar¨Oppen() avg¨or om en beh˚allare ¨ar ¨oppen och volym() ger beh˚allarens volym.
P˚ase En nyskapad p˚ase ¨ar till att b¨orja med ¨oppen.
Burk En burk ¨ar en beh˚allare med vikt (gram). Metoden vikt() ger vikten.
Konservburk En konservburk ¨ar till att b¨orja med st¨angd. S˚a snart den ¨oppnats kan den inte st¨angas; f¨ors¨ok att st¨anga den ger d˚a ett undantag.
EnLitersBurk En 1-litersburk ¨ar en burk med volymen 1000 ml.
5. Iteratorer
a) Utg˚a fr˚an klassen p˚a sidan 3 och inf¨or p˚a l¨ampligt s¨att en m¨ojlighet att skapa iteratorer enligt Iterator-gr¨anssnittet bifogat sist. Metoden remove ska endast kasta undantag.
Du f˚ar h¨ar, f¨or enkelhets skull, anta att en k¨o inte f¨or¨andras efter att en f¨orsta
iterator har skapats. (3p)
b) N¨ar en k¨o f¨or¨andras, genom att inneh˚all l¨aggs till eller tas bort, kan man s¨aga att det ¨over tiden uppst˚ar olika versioner av den.
Om vi vill att iteratorer som skapats f¨or en viss version av k¨on ska fungera endast s˚a l¨ange inga nya versioner av k¨on skapas, hur skulle du ˚astadkomma det? Ange kortfattat de f¨or¨andringar och till¨agg du skulle g¨ora i klassen p˚a
sidan 3 och din iterator. (3p)
2
Bilaga: En k¨ oklass
1 public c l a s s LIFO { 2 public Item f i r s t ; 3 public Item l a s t ; 4 public i n t s i z e = 0 ; 5
6 public LIFO ( ) {
7 f i r s t = new Item ( ) ; // h e a d e r 8 l a s t = f i r s t ;
9 }
10
11 public c l a s s Item {
12 public Item l i n k = n u l l ; 13 public O b j e c t c o n t e n t ;
14 }
15
16 public i n t s i z e ( ) { 17 return t h i s . s i z e ;
18 }
19
20 public void add ( O b j e c t e l e m e n t ) { 21 Item b2 = new Item ( ) ;
22 b2 . c o n t e n t = e l e m e n t ; 23 l a s t . l i n k = b2 ;
24 l a s t = b2 ;
25 s i z e ++;
26 }
27
28 public O b j e c t f i r s t ( ) { 29 return f i r s t . l i n k ;
30 }
31
32 public void r e m o v e F i r s t ( ) { 33 i f ( f i r s t . l i n k != n u l l ) { 34 Item r = f i r s t . l i n k ; 35 f i r s t = f i r s t . l i n k ;
36 s i z e −−;
37 }
38 }
39 }
3
Overview Package Class Use Tree Deprecated Index Help JavaTM 2 Platform Std. Ed. v1.4.2
PREV CLASS NEXT CLASS FRAMES NO FRAMES All Classes
SUMMARY: NESTED | FIELD | CONSTR | METHOD DETAIL: FIELD | CONSTR | METHOD
java.util
Interface Iterator
All Known Subinterfaces:
ListIterator
All Known Implementing Classes:
BeanContextSupport.BCSIterator
public interface Iterator
An iterator over a collection. Iterator takes the place of Enumeration in the Java collections framework. Iterators differ from enumerations in two ways:
Iterators allow the caller to remove elements from the underlying collection during the iteration with well-defined semantics.
Method names have been improved.
This interface is a member of the Java Collections Framework.
Since:
1.2
See Also:Collection
,
ListIterator,
EnumerationMethod Summary
boolean hasNext()
Returns
trueif the iteration has more elements.
Object next()
Returns the next element in the iteration.
void remove()
Removes from the underlying collection the last element returned by the iterator (optional operation).
Method Detail
hasNext
public boolean hasNext()
Returns
trueif the iteration has more elements. (In other words, returns
trueif
nextwould
return an element rather than throwing an exception.)
Returns:
true
if the iterator has more elements.
next
public Object next()
Returns the next element in the iteration.
Returns:
the next element in the iteration.
Throws:
NoSuchElementException
- iteration has no more elements.
remove
public void remove()
Removes from the underlying collection the last element returned by the iterator (optional operation). This method can be called only once per call to
next. The behavior of an iterator is unspecified if the underlying collection is modified while the iteration is in progress in any way other than by calling this method.
Throws:
UnsupportedOperationException
- if the
removeoperation is not supported by this Iterator.
IllegalStateException
- if the
nextmethod has not yet been called, or the
removemethod has already been called after the last call to the
nextmethod.
Overview Package Class Use Tree Deprecated Index Help JavaTM 2 Platform Std. Ed. v1.4.2
PREV CLASS NEXT CLASS FRAMES NO FRAMES All Classes
SUMMARY: NESTED | FIELD | CONSTR | METHOD DETAIL: FIELD | CONSTR | METHOD
Submit a bug or feature
For further API reference and developer documentation, see Java 2 SDK SE Developer Documentation. That documentation contains more detailed, developer-targeted descriptions, with conceptual overviews, definitions of terms, workarounds, and working code examples.
Copyright © 2003, 2010 Oracle and/or its affiliates. All rights reserved. Use is subject to license terms. Also see the documentation redistribution policy.
Errata (D0010E, 2011-03-18)
1. Kommentar: I sista deluppgiften ska det verkligen st˚a ”FIFO”; implementeringen p˚a sida 3 ¨ar en FIFO-k¨o trots klassens (missvisande) namn. Ett mera avvikande namn p˚a LIFO, t ex BankKonto, hade varit tydligare.
2.
3. F¨ortydligande: deleteNum minskar den aktuella storleken, inte den maximala.
F¨ortydligande: replaceNum ska bara byta ut foton som finns i albumet(!) Att albu- met inte ¨ar fullt, och det d¨arf¨or finns tomma platser, ska inte blandas ihop med att varje foto har ett unikt nummer och att endast foton kan bytas ut. Numreringen f¨oljer av den ordning i vilken albumets metoder anropats.
4.
5. Kommentar: Observera att det ska kunna finnas flera iteratorer till en och samma k¨o.
6
Existing suggested solutions (D0010E, 2011-03-18)
1
Kommentarer p˚a uppgift 1:
a) Klasser skrivs av programmerare och ing˚ar i programmets k¨allkod medan objekt skapas under k¨orning.
b) i) Alla.
ii) Endast D.
iii) C och D.
c) F¨oljande, som inte allt ¨ar lika sj¨alvklart, ¨ar brister:
• Klassnamnet ¨ar missvisande; borde vara FIFO.
• Interna tillst˚andet b¨or vara dolt, dvs private.
• Den interna nodklassen Item b¨or vara dold, dvs private.
• Det saknas javadoc.
• Det saknas interna kommentarer. T ex att first ¨ar en pre-pointer.
• removeFirst b¨or reagera om man f¨ors¨oker ta bort ur en tom k¨o, t ex genom att kasta undantag (en enkel l¨osning ¨ar att l¨agga till en else-gren p˚a if- satsen, och i den kasta undantaget).
• Klassen Item skulle kunna ha metoder och konstruerare med argument (t ex inneh˚allet).
• P˚a rad 17 beh¨ovs inte this.
• Rad 34 beh¨ovs inte.
• Metoden first b¨or inte returnera link utan content. Att det fungerar nu beror bara p˚a att den interna nodklassen exponeras utanf¨or LIFO, vilket ¨ar ol¨ampligt (se ovan).
• Idag skulle man med f¨ordel kunna parametrisera LIFO med elementtypen, och d¨arigenom komma ifr˚an problemet med att ett Object kan vara vad som helst. Detta skulle ocks˚a omdelbart r¨oja misstaget i first.
• ..
2
Kommentarer p˚a uppgift 2:
Metoden Math.abs b¨or man ha skrivit sj¨alv (ber¨aknar absolutbeloppet) men ¨ar s˚a enkel att den godtas i denna l¨osning.
1 p u b l i c s t a t i c b o o l e a n i s P a l i n d r o m e ( i n t [ ] num) { 2 r e t u r n iP (num , 0 , num . l e n g t h − 1 ) ;
3 }
4
5 p u b l i c s t a t i c b o o l e a n iP ( i n t [ ] num , i n t i , i n t j ) { 6 i f ( Math . abs ( i −j )<=1) {
7 r e t u r n t r u e ;
8 } e l s e {
9 r e t u r n num [ i ]==num [ j ] && iP (num , i +1 , j − 1 ) ;
10 }
11 }
3
Kommentarer p˚a uppgift 3:
7
1 p u b l i c c l a s s PhotoAlbum { 2
3 p r i v a t e i n t maxSize ; 4 p r i v a t e i n t s i z e ;
5 p r i v a t e Photo [ ] p h o t o s ; 6
7 p u b l i c PhotoAlbum ( i n t maxSize ) { 8 t h i s . maxSize = maxSize ;
9 p h o t o s = new Photo [ t h i s . maxSize ] ; 10 s i z e = 0 ;
11 }
12
13 p u b l i c i n t maxSize ( ) { 14 r e t u r n t h i s . maxSize ;
15 }
16
17 p u b l i c i n t s i z e ( ) { 18 r e t u r n t h i s . s i z e ;
19 }
20
21 p u b l i c v o i d append ( Photo p ) { 22 i f ( s i z e == maxSize ) {
23 throw new RuntimeException ( ” Album a l r e a d y f u l l . ” ) ;
24 } e l s e {
25 p h o t o s [ s i z e ++] = p ;
26 }
27 }
28
29 p r i v a t e b o o l e a n okPhotoNum ( i n t num) { 30 r e t u r n 0 <= num && num < s i z e ;
31 }
32
33 p u b l i c Photo photoNum ( i n t num) { 34 i f ( okPhotoNum (num ) ) {
35 r e t u r n p h o t o s [ num ] ;
36 } e l s e {
37 throw new RuntimeException ( ”No s u c h photo . ” ) ;
38 }
39 }
40
41 p u b l i c v o i d replaceNum ( i n t num , Photo p ) { 42 i f ( okPhotoNum (num ) ) {
43 p h o t o s [ num ] = p ;
44 } e l s e {
45 throw new RuntimeException ( ”No s u c h photo . ” ) ;
46 }
47 }
48
49 p u b l i c v o i d deleteNum ( i n t num) { 50 i f ( okPhotoNum (num ) ) {
51 f o r ( i n t i = num ; i <= s i z e − 2 ; i ++) { 52 p h o t o s [ i ] = p h o t o s [ i + 1 ] ;
53 }
54 s i z e −−;
55 } e l s e {
8
56 throw new RuntimeException ( ”No s u c h photo t o d e l e t e . ” ) ;
57 }
58 }
59 } 4
Kommentarer p˚a uppgift 4:
1 a b s t r a c t c l a s s B e h˚a l l a r e { 2 p r o t e c t e d d o u b l e volym ; 3 p r o t e c t e d b o o l e a n ¨oppen ; 4
5 p u b l i c B e h˚a l l a r e ( d o u b l e volym ) { 6 t h i s . volym = volym ;
7 }
8
9 p u b l i c d o u b l e volym ( ) { 10 r e t u r n volym ;
11 }
12
13 p u b l i c b o o l e a n ¨ar ¨Oppen ( ) { 14 r e t u r n ¨oppen ;
15 }
16
17 p u b l i c v o i d ¨oppna ( ) { 18 i f ( ¨oppen ) {
19 throw new RuntimeException ( ) ;
20 } e l s e {
21 ¨oppen = t r u e ;
22 }
23 }
24
25 p u b l i c v o i d s t ¨a n g ( ) { 26 i f ( ! ¨oppen ) {
27 throw new RuntimeException ( ) ;
28 } e l s e {
29 ¨oppen = f a l s e ;
30 }
31 }
32 } 33
34 c l a s s P˚ase e x t e n d s B e h˚a l l a r e { 35 p u b l i c P˚ase ( d o u b l e volym ) { 36 s u p e r ( volym ) ;
37 ¨oppen = t r u e ;
38 }
39 } 40
41 a b s t r a c t c l a s s Burk e x t e n d s B e h˚a l l a r e { 42 p r o t e c t e d i n t v i k t ;
43
44 p u b l i c Burk ( d o u b l e volym , i n t v i k t ) { 45 s u p e r ( volym ) ;
46 t h i s . v i k t = v i k t ;
47 }
48
9
49 p u b l i c i n t v i k t ( ) { 50 r e t u r n v i k t ;
51 }
52 } 53
54 c l a s s KonservBurk e x t e n d s Burk {
55 p u b l i c KonservBurk ( d o u b l e volym , i n t v i k t ) { 56 s u p e r ( volym , v i k t ) ;
57 ¨oppen = f a l s e ;
58 }
59
60 p u b l i c v o i d s t ¨a n g ( ) {
61 throw new RuntimeException ( ) ;
62 }
63 } 64
65 c l a s s E n L i t e r s B u r k e x t e n d s Burk { 66 p u b l i c E n L i t e r s B u r k ( i n t v i k t ) { 67 s u p e r ( 1 0 0 0 , v i k t ) ;
68 }
69 }
5 Kommentarer p˚a uppgift 5:
a) L¨agg till en intern klass MyIterator som implementerar granssnittet Iterator och en metod
1 p u b l i c I t e r a t o r i t e r a t o r ( ) { 2 r e t u r n new M y I t e r a t o r ( ) ; 3 }
Klassen berikas sen med en egen Item-referensvariabel som anv¨ands f¨or att referera in i nodlistan under iteration:
1 p r i v a t e c l a s s M y I t e r a t o r i m p l e m e n t s I t e r a t o r {
2 Item p t r ;
3
4 p u b l i c M y I t e r a t o r ( ) { 5 p t r = f i r s t . l i n k ;
6 }
7
8 p u b l i c b o o l e a n hasNext ( ) { 9 r e t u r n p t r != n u l l ;
10 }
11
12 p u b l i c O b j e c t n e x t ( ) {
13 i f ( hasNext ( ) ) {
14 O b j e c t c = p t r . c o n t e n t ; 15 p t r = p t r . l i n k ;
16 r e t u r n c ;
17 } e l s e {
18 throw new NoSuchElementException ( ) ;
19 }
20 }
21
22 p u b l i c v o i d remove ( ) {
23 throw new U n s u p p o r t e d O p e r a t i o n E x c e p t i o n ( ) ;
10
24 }
25 }
b) I huvudklassen l¨agger vi till en versionsvariabel, version, ett heltal, som ¨okas med 1 varje g˚ang vi f¨or¨andrar k¨on. V˚ar interna klass kopierar versionsnumret till en egen variabel, myVersion, och kollar sedan i samband med varje anrop till den att k¨ons versionsnummer inte f¨or¨andrats:
1 p r i v a t e c l a s s M y I t e r a t o r i m p l e m e n t s I t e r a t o r {
2 Item p t r ;
3 i n t myVersion ;
4
5 p u b l i c M y I t e r a t o r ( ) { 6 p t r = f i r s t . l i n k ; 7 myVersion = v e r s i o n ;
8 }
9
10 p u b l i c b o o l e a n hasNext ( ) { 11 i f ( myVersion != v e r s i o n ) { 12 r e t u r n f a l s e ;
13 }
14 r e t u r n p t r != n u l l ;
15 }
16
17 p u b l i c O b j e c t n e x t ( ) {
18 i f ( ( myVersion == v e r s i o n ) && hasNext ( ) ) { 19 O b j e c t c = p t r . c o n t e n t ;
20 p t r = p t r . l i n k ;
21 r e t u r n c ;
22 } e l s e {
23 throw new NoSuchElementException ( ) ;
24 }
25 }
26
27 p u b l i c v o i d remove ( ) {
28 throw new U n s u p p o r t e d O p e r a t i o n E x c e p t i o n ( ) ;
29 }
30 }
Man kan ocks˚a g¨ora k¨on observerbar och l˚ata iteratorer observera f¨or¨andringar i den. S˚a snart en f¨or¨andring sker s¨atts en stoppflagga i iteratorn. Denna flagga kollas i iteratorns metoder och f¨orhindrar vidare anv¨andning av iteratorn om k¨on f¨or¨andrats.
11