Helsingfors universitet/ Institutionen för
datavetenskap / Java-programmering / Copyright © 2002 Arto Wikla.
581325-0 Java-programmering,
tent 18.12.2002/AW
Skriv överst på varje
svarspapper namnet på kursen, datum för tenten, samt ditt namn, personnummer
och din namnteckning. Skriv varje svar på ett skilt konceptark!
Undantagsvis får man använda en ”luntlapp” på denna
tent. Den får inte vara större än ett A4-ark.
- ”Jag står inte ut med ditt snack om
’abstrakta klasser’ och ’gränssnittsklasser’!” Så utbrister din kompis när han hört
dig entusiasmera om finesserna hos Java. Din kompis behärskar annars
Java-språket riktigt bra – t.o.m. klasser och klasshierarkier känner han
till – men de ovannämnda verktygen gör honom bara irriterad i hans
osakkunnighet. Hjälp din kompis förstå vad det riktigt handlar om och vad
man kan använda verktygen till.
Skriv alltså en förklaring, som förstås innehåller även upplysande
programexempel (maximilängd 1 konceptark, d.v.s. 4 sidor). Då
svaret bedöms tas den tilltänkta läsaren i beaktande. Skriv alltså inte
till bedömaren, som redan känner till saken, utan till den där kompisen!
(17 poäng)
- En Saga består av en eller
flera String-textrader. Varje saga har ett unikt kodnummer som
aldrig kan förändras, och ingen annan saga kan nånsin ha samma kodnummer.
Innehållet i en saga kan aldrig förändras.
- Programmera klassen Saga för att förverkliga
sagan. Alla
datastrukturer i Saga skall naturligtvis vara private,
och den skall ha de publika verktygen (konstruktör och metod):
- public Saga(String[] rader) skapar Saga-objektet och dess
unika kodnummer.
- public int vadArSagansKod()
- public int vadArSagansLangd(), d.v.s. antalet rader
- public String vilkenAvSagansRad(int
i) ger den rad
vars nummer är i
- public void utmataSagan() utmatar hela sagan med radnummer
- public Saga foga(Saga annan) ger som värde ett nytt
Saga-objekt, där sagan består av this-sagan, till vilken har
fogats annan-sagan, som getts som parameter.
- KommenteradSaga är lik Saga, men till skillnad från
en vanlig saga kan det finnas en textkommentar i samband med varje rad.
Det behöver inte finnas en kommentar till varje rad. Och inte nödvändigtvis
till en enda rad! Implementera KommenteradSaga som en underklass till
klassen Saga. Programmera om endast de delar som behöver
omprogrammeras.
- public KommenteradSaga(String[] rader)skapar objektet KommenteradSaga,
där ingen rad ännu har kommenterats
- public void fogaKommentar(String kommentar,
int rad) fogar den
givna kommentaren till den givna raden. Om det finns en gammal
kommentar, ersätts den med en ny
- public String vadArKommentar(int rad) ger som sitt värde sagans i:te rads
kommentar (eller null, om raden inte har någon kommentar)
- public void utmatarKommentarer() utmatar alla icke.tomma kommentarer
med radnummer, d.v.s. kommentarförteckningen
- public KommenteradSaga foga(KommenteradSaga
annan) ger som
värde ett nytt KommenteradSaga-objekt, där sagan består av this-sagan,
till vilken har fogats annan-sagan, som getts som parameter. En ny
kommenterad saga får förstås kommentarerna från de gamla sagorna!
OBS! Kom ihåg att förbereda dig på felsituationer.
(18 poäng)
- Du har till ditt förfogande klassen Teckenfil, som består
av char-värden d.v.s. tecken, för att läsa filer. Klassen har
knostruktören Teckenfil(String filNamn). Som parameter ges
inmatningsfilens namn. Tecknen läses med instansmetoden public char
lasTecken(). Metoden tillkännager att en fil har tagit slut genom att
ge som sitt värde ett så-kallat ”null-tecken” d.v.s. det konstanta
tecknet '\u0000'. När alltså tecknet som metoden ger är lika stort som konstanten '\u0000' är filen slut. Metoden lasTecken abger slutet på en rad
medatt ge tecknet '\n'.
Klassen Teckenfil
kan inte fånga avvikelser! Den som kallar på konstruktören och metoden
måste alltså själv fånga avvikelserna!
- Implementera klassen RadFil med hjälp av klassen
Teckenfil. KlassenRadfil har konstruktören Radfil(String
filNamn).
Med hjälp av
objektet Radfilkan man läsa filen rad för rad. Man får alltså
varje rad som ett String-objekt, där det inte finns med radens
sluttecken '\n' som finns i teckenfilen.
Raderna i Radfilen
läses med metoden public String lasRad(), som ger som
sitt värde filens följande rad.
När filen
tar slut, ger lasRad värdet null.
Avvikelser
måste fångas i klassen Radfil så att användaren av dess instanser
inte behöver bekymra sig om dem. Om du misslyckas med att skapa objektet Teckenfil
ger metoden lasRad() från början värdet null. Om det blir en
avvikelse då man kallar metoden lasTecken(), ger metoden lasRad() värdet
null. För användare av objektet Radfil ser alltså en trasig fil,
eller en fil som fattas, ut som en fil där det inte finns några rader. En fil
som går sönder mitt i allt ser bara ut som om den tar slut.
OBS! Det räcker
om Radfil fångar avvikelserna som orsakas av Teckenfil på det
mest allmänna planet, som Exception-avvikelser.
- Programmera Radfilen med en applikation som räknar antalet rader i en fil som användaren
ger.
OBS! Klassen Teckenfil
finns alltså redan, så börja för gudsskull inte programmera den mera!
(18 poäng)
Lycka till med tenten
& God Jul!