581326-3 Java-programmering, tent 24.6.2004/AW (Avoin yliopisto) Skriv överst på varje svarspapper namnet på kursen, datum för tenten, samt ditt namn, personnummer och din namnteckning. Man får använda en "luntlapp" på denna tent. Den får inte vara större än ett A4-ark. 1. 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 (18 poäng) 2. "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) 3. 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! a) 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. b) 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! (17 poäng) Lycka till med tenten & rolig sommar!