UPPSALA UNIVERSITET  
Inst. f. lingvistik och filologi Lärare: Mats Dahllöf (kursansvarig) och Markus Saers.
Uppsala universitet
Hoppa över länkar

kurssida



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.

Eko-ekemplet från lektionen

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