Helsingin yliopisto / Tietojenkäsittelytieteen laitos / Java-ohjelmointi / Copyright © 2000 Arto Wikla.

581325-0 Java-programmering tent, 18.12 2001/AW

Skriv namnet på kursen, datum för tenten, ditt namn, personnummer och din namnteckning på varje svarspapper. Skriv varje svar på ett skilt konceptark!
1. "Jag orkar inte med ditt prat om 'abstrakta datatyper' och
   inkapsling'!" Så gnäller din kompis då han hört dig entuasmera om
   god programmeringsstil. Din kompis vet nog hur man programmerar - 
   han kan det där med algoritmer och att kalla på metoder (dock endast
   dedär 'små hjälpredorna för huvudprogram'), parameterförmedling
   klarar han också av - men en av de centrla idéerna med
   objektsprogrammering inger honom endast oförstående frustrering.
   Hjälp din kompis förstå vad det egentligen är fråga om. Skriv
   alltså en förklaring som innehåller belysande programmeringsexempel
   (högst 1 konceptark). Då svaret bedöms tas den tilltänkta läsaren i
   beaktande. Skriv alltså inte för bedömaren, som redan känner till
   saken, utan för den där kompisen. 
                                                              (15 poäng)

2. Bobban är en enkel men ändå mycket individuell figur. Varje bobba har
   ett entydigt ordningsnummer som den får vid födelsen. Detta nummer 
   är dess s.k. individualitet som aldrig kan förändras, och som ingen
   annan kan få.

   Bobbans arvsanlag är ett String-objekt. Bobborna förökar sig endast
   genom att paras. Barnet får någondera förälderns arvsanlag som
   sådant. Sannolikheten är densamma för båda. Arvsanlaget kan lottas
   ut med expressionen if (Math.random()<0.5) ...

  a. Gör en modell av bobban som klassen Bobba, där alla fält
     naturligtvis är private, och som har de följande publika redskapen
    (konstruktör och accessor):

    - public Bobba(String arvsanlag)
    - public String vilketArvsanlag
    - public Bobba paras(Bobba annan)
    - public String toString(), utdatan tar formen: (individualitet):
      arvsanlag, se exemplet.

  b. DubbelBobban är bobbans släkting. Dess enda skillnad till bobban
     är dess parningsmetod: DubbelBobbans barn får en katenation av
     sina föräldrars arvsanlagssträng som sitt arv. Arvsanlagssträngarna
     förenas alltså. Implementera klassen DubbelBobba som en underklass
     till klassen Bobba. Programmera på nytt endast de behövliga delarna
     - nya fält behövs till exempel inte. Exempel: (just såhär skall det
     utmatas: figurens ordningsnummer hör alltså till utdatan, den
     tredje utmatningen kan förstås vara antingen "(3): Maja" eller 
     "(3): Matts".)

     Bobba pappa = new Bobba ("Matts");
     Bobba mamma = new Bobba ("Maja"):
     Bobba barn = pappa.paras(mamma);
     System.out.printIn(pappa); // utdata: (1): Matts
     System.out.printIn(mamma); // utdata: (2): Maja
     System.out.printIn(barn);  // utdata: (3): Maja

     DubbelBobba gubbe = new DubbelBobba ("Kalle"); // nummer 4
     DubbelBobba gumma = new DubbelBobba ("Kajsa"); // nummer 5
     DubbelBobba unge = gumma.paras(gubbe);
     System.out.printIn(unge); // utdata (6): KajsaKalle
                                                               (14 poäng)

3. Rubriken på en konstruktör är public Varelse(Inälva parameter).
   Hur gör du en instans av klassen Varelse, om Inälva är
 
   a) public abstract class Inälva {
        public void görDittochDatt ();
      }

   b) pubic interface Inälva {
        public void görDittochDatt();
      }                                                        (10 poäng)


4. Du har klassen Inmatningsfil till att läsa textfiler. Klassen har
   konstruktören Inmatningsfil(String namn). Filens namn ges som
   parameter. Raderna läses med instansmetoden public String läsRaden().
   När filen tar slut ger metoden värdet null. Man har inte förberett
   sig på avvikelser i den här klassen! Den som kallar på konstruktören
   och accessorn måste alltså själv behandla avvikelser.

  a. Implementera klassen Heltalsfilter med hjälp av klassen
     Inmatningsfil. Klassen heltalsfilter har konstruktören
     Heltalsfilter(String filNamn).

     Med hjälp av objektet Heltalsfilter kan man utläsa heltalen i en
     textfil, så att alla andra tecken förbigås. (Alla enhetliga
     sifferrader ses som heltal, förtecken tas inte i beaktande.)

     Talen i filen läses med hjälp av accessorn public int 
     läsFöljandeSiffra(), som ger följande heltal som finns i textfilen
     som sitt värde. När det inte finns fler heltal i filen ger metoden
     värdet -1.

     Avvikelser skall behandlas i klassen Heltalsfilter så att
     användaren av instanserna inte behöver oroa sig för dem. Om
     alstrandet av objektet Inmatningsfil misslyckats ger metoden
     läsFöljandeSiffra -1 från början. För användaren av objektet
     Heltalsfilter ser alltså en fil som är trasig eller fattas från
     början ut som en fil där det inte finns några heltal. En fil som
     går sönder mitt i allt ser ut att ta slut.

     OBS! Det räcker att Heltalsfiltret behandlar avvikelser förorsakade
          av Inmatningsfilen på det mest generella planet, som en
          Exception-avvikelse.

     OBS! Om du kan, får du använda metoden Integer.parseInt(String m).

  b. Gör ett program som testar klassen Heltalsfilter genom att fråga
     användaren om namnet och räknar ut medeltalet av heltalen i filen.
     Om filen är

         asdf10 asd4
         ö2xcv?+das-9asd,

     till exempel, ger programmet medeltalet 6.25.

     OBS! Du har alltså redan klassen Inmatningsfil, börja inte
          programmera den mera!
                                                            (14 poäng)
Lycka till & God Jul!