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.

  1. ”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)
  1. 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.
    1. 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.
    2. 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)
  1. 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!

    1. 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.

    1. 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!