Introduktion till objektorienterad programmering. HT 2007.
Föreläsningsanteckningar för lektionstillfället 071206
Laboration 2
Klasser och objekt: Tidsangivelse
Börja med att hämta filerna Tidsangivelse.java och
TestaTidsangivelse.class från katalogen
~markuss/undervisning/Java07/labb/.
I filen Tidsangivelse.java är en del av funktionaliteten
borttagen, och det är din uppgift att återuppbygga den. Till varje borttaget
moment finns kommentarer som beskriver vad det är som saknas.
Det finns också en förkompilerad klass (TestaTidsangivelse.class)
som kan användas för att testa din version av Tidangivelse. Du testar
genom att köra
java -enableassertions TestaTidsangivelse
från den katalog de båda
filerna ligger i. När ditt program fungerar som det är tänkt kommer TestaTidsangivelse
att rapportera
Alla tester avklarade!
Den här övningen behöver inte lämnas in!
Nyhet! Nu finns det en fil till att använda om ni vill.
~markuss/undervisning/Java07/labb/TestaTidsangivelseInformativt.java.
Ett mer informativt testprogram som ni dessutom får källkoden till.
Arv: Djur
Börja med att hämta alla filer i katalogen
~markuss/undervisning/Java07/djur/.
Dessa filer motsvarar de djur jag visade under lektionen, fast åäö blev fel när jag skulle kopiera över dem från min Window-dator till numerus, så ni får tolka namnen kreativt.
Utöver de filer jag visade på lektionen finns det några till:
Djurfabrik.java
Test.java
zoo.txt
Djurfabriken skapar de djur som specificeras i en fil, och Test tar en zoo-fil
som argument (denna läses in, och alla djuren skrivs ut).
Uppgiften består i att lägga till däggdjuret Fladdermus.java (ej köttätande flygare),
och sedan ytterligare en underklass till fladdermus: Vampyrfladdermus (som är köttätande).
Lägg sedan till metoden
public abstract boolean kanSimma();
till Djur.java. Se till att däggdjur och fåglar inte kan simma.
Lägg till gruppen fiskar (Fisk.java) som generellt kan simma, och
skapa två djurarter: Haj.java och Sill.java.
Skapa också arten Val.java som är ett däggdjur som kan simma.
Ändra också i Djurfabrik.java så att de nya djuren kan läsas in, samt lägg till
några individer av de nya djurarterna i zoo.txt
Den här övningen behöver inte lämnas in!
Input/Output
Konstruera ett program som läser in rader från en fil och skriver ut dem baklänges.
Enklast är att använd java.io.BufferedReader för att läsa in en rad i taget, därefter
kan ni med fördel återanvända den kodsnutt ni skrev i första labben för att vända på
en strän, och anpassa den till att vända på rader.
Konstruera ett program som läser in rader från en fil och skriver ut varje token
på en egen rad. Enklast är att använd java.lang.String.split()
(se on-line-dokumentationen av Java),
och ange \\s+ som reguljärt uttryck (det betyder ungefär
ett eller flera whitespace-tecken).
Modifiera ovanstående program så att de skriver till en specificerad fil.
När ett filnamn ska anges (antingen för inläsning eller utskrift) är det lämpligt att ge namnet
på filen som ett argument som hamnar i String[] args, så att man kan variera
namnet på de inblandade filerna från kommandoprompten.
Den här övningen behöver inte lämnas in.
Att köra klasser i paket
När en klass i ett paket innehåller en public static void main som man
vill köra behöver man köra java lite speciellet. Ponera att vi har följande katalog-/
paketstruktur:
io
Echo.java
Det vill säga vi har ett paket (io) med en klass (Echo.java).
Kompilera som vanligt med javac io/Echo.java.
Kör sedan klassen med paketnamnet explicit angivet: java io.Echo.
Inlämningsuppgiften
Detta är den examinerande uppgiften för kursen. Kopiera de filer coh kataloger
som finns i ~markuss/undervisning/Java07/inlupp. Det är viktigt att
filstrukturen är intakt, så använd gärna cp -R (recursive).
Du borde nu ha en katalogstruktur som ser ut såhär:
corpus.txt Test.java ngram/ Counter.java NGramCollection.java NGram.java ProtoNGram.java ProtoTokenBuffer.java TokenBuffer.java
Anledningen till att en del filer ligger i en egen katalog är att dessa utgör ett
paket. Dokumentationen om det här paketet finns här. Paketet
är uppbyggt så att det finns två klasser som jag bjuder på: Counter
och NGramCollection. Sedan finns det två abstrakta klasser som utgör
prototyper för den funktionalitet jag vill att ni implementerar: ProtoNGram
och ProtoTokenBuffer. De sista två klasserna är de ni ska fylla på i:
NGram och TokenBuffer, det enda som finns specificerat i dem
är de nödvändiga konstruktorerna (utan implementation) samt vilken abstrakt klass
de ska konkretisera.
De övriga två filerna (corpus.txt och Test.java) är till
för att få en bild av hur det går. corpus.txt innehåller en väldigt
kort bit av Europarl-korpusen (protokoll från europaparlamentet), och Test.java
fungerar så att den tar två argument: ett filnamn och ett nummer. Sedan skapar den en
osorterad frekvenslista med alla <nummer>-gram i filen. Med n-gram menas här
ord-n-gram.
En bra början kan vara att titta i Test.java för att se vad det programmet behöver kunna
göra för att skapa frekevenslistan. Därefter är det lämpligt att sätta sig in i vad de två
klasser ni ska skriva själva ska kunna göra. Detta beskrivs i respektive prototyp (ProtoNGram
för NGram och ProtoTokenBuffer for TokenBuffer).
Dessa innehåller ett antal abstrakta metoder, som måste implementeras.
För att komma igång med själva implementationen kan det vara bra att ta sig en funderare
på hur informationen ska representeras för att de två klasserna (NGram och TokenBuffer)
ska klara av att göra det de ska klara av. Många datastrukturer finns redan definierade
för Java, bland annat i paketet java.util. Titta efter om det finns något där som passar!
För att kompilera klasserna i paketet ngram gör man på samma sätt som med io
paketet. Man ställer sig med andra ord så att man har Test.java, corpus.txt
och katalogen ngram i den katalog man står i. Det är viktigt att kompilera filerna
härifrån (med kommandot javac ngram/*.java eller analogt för enskilda filer) för att
Java ska fårstå var de filer som tillhör paketet ligger.
För att bli godkänd på labben krävs att ovanstående uppgifter löses och lämnas in. Med inlämning menas att utskrifter av källkoden läggs i mitt (Markus Saers) fack. En elektronisk version av källkoden ska också finnas tillgänglig på begäran.
Sista dag för inlämning är 2008-02-29 (skottdagen).
