Java: Övningar

Av Thomas Padron-McCarthy (Thomas.Padron-McCarthy@tech.oru.se). Senaste ändring: 6 november 2003.

Gör de här övningarna på labbtillfällena. Ni behöver inte visa upp resultaten eller lämna in några labbrapporter, men diskutera gärna eventuella problem eller andra frågor med labbhandledaren.

Uppgiter markerade med asterisk (*) kan hoppas över om man får ont om tid.

Snabblänk: API

De senare övningarna är fortfarande under arbete. Alla länkar kanske inte fungerar än, och det kan finnas fel.

Java på våra Windows-system

Flera olika versioner av Java finns installerade på våra Windows-maskiner, och det finns flera sätt att köra Java på våra Windows-maskiner. Läs mer i föreläsning 1. Den som har en egen dator kan också ladda hem Java och göra övningar hemma.

Övning 1

Deluppgift 1

Utveckla en applikation som tar emot argument och skriver ut dem på skärmen. Skapa en konstant för texten "Value argument".

Resultatet ska se ut enligt följande:

C:\PROGRAM\jdk\proj\AF>java uppg1 stina kalle sven lena
Value argument 1 = stina
Value argument 2 = kalle
Value argument 3 = sven
Value argument 4 = lena

Deluppgift 2

Ta hjälp av exemplet med figurer från föreläsning 1.

I en sportaffär vill man ha ett program för hantering av sina produkter. Början till en klasshierarki till stöd för sådan hantering ser ut så här:

Klasshierarki

Det här ska finnas i respektive klass:

Samtliga klasser ska få initialvärden till sina medlemsvariabler via konstruktorerna. Implementera klasserna enligt ovan. Skriv en applikation som instansierar två skor och två tröjor och lagrar dem i en array. Loopa över arrayen och anropa skrivData för respektive objekt.

Försök att reda ut vad som händer och vad som är fördelar med polymorfism och vad som är nackdelar.

Deluppgift 3

Utveckla applikationen från deluppgift 1 så att den sorterar parametersträngarna innan den skriver ut dem.


Övning 2

Deluppgift 1

Ta hjälp av exemplet med division med noll (DivZeroException) från föreläsning 2.

Vidareutveckla applikationen från deluppgift 1 i övning 1. Om en parametersträng innehåller en siffra ska ett undantag av klassen SifferException kastas. och programmet ska avslutas. Klassen SifferException skriver du i en egen fil som heter SifferException.java. Låt klassen ärva Exception.

Två körexempel:

M:\ PCSA\JAVA\OVNING\OVN2 >java uppg1 pel2e stina kalle
SifferException: Sträng får inte innehålla siffra.

M:\ PCSA\JAVA\OVNING\OVN2>java uppg1 pelle stina ka3le
Value argument 0: pelle
Value argument 1: stina
SifferException: Sträng får inte innehålla siffra.
Ledning:

Skriv en static void-metod som heter checkString, och som kollar igenom en inläst sträng och kastar ett SifferException om den innehåller en siffra. Anropa den metoden för varje argumentsträng.

Mainmetoden ska avslutas om det uppstår en exception. Undantagshanteringen ska alltså omsluta for-loopen.

Deluppgift 2

Utnyttja klassen Complex med finalize-metod från föreläsning 2:

Ersätt koden i main-metoden så att den skapar 10 stycken Complex-objekt och anropar skrivTal för vart och ett av dem. Sätt sedan alla tio objekten till null och anropa System.gc och System.runFinalization. Skriv sedan ut värdet av Complex.antalKomplexaTal. Kommentera bort System.gc och System.runFinalization och kolla vad som händer. Vilka slutsatser kan dras?

Deluppgift 3

Skapa en klass med en klassvariabel ca och en instansvariabel ia. Klassen ska också ha instansmetoden ifkn och klassmetoden cfkn. Metoden ifkn ska skriva ut värdena av de båda variablerna och det ska cfkn också göra. Skriv en applikation som anropar ifkn och cfkn.

Det kommer inte att gå bra. Korrigera till det blir rätt och red ut varför det fungerar som det gör.

Deluppgift 4

Skriv om koden för deluppgift 3 så att klassvariabel och klassmetod refereras med klassnamn. Utnyttja också this för instansvariabel där så är tillämpligt.


Övning 3

Deluppgift 1

Ta hjälp av klassen Sqrt från föreläsning 3.

Skriv en javaapplet som givet en cirkelarea beräknar motsvarande cirkeldiameter.

Deluppgift 2

Ta hjälp av klassen Presenter från föreläsning 4.

Skriv en applikation som startar två trådar, som vi kan kalla "1" och "2". Dessa trådar ska tävla om att komma först till position 30 på skärmen. För varje steg åt höger som trådarna tar ska namnet på tråden skrivas ut på skärmen. Varje tråd ska slumpvis sova mellan 1 och 1000 millisekunder efter varje steg som tas åt höger. Innan avslut ska programmet skriva ut vem som vann.

Resultatet ska se ut enligt följande:

C:\PROGRAM\jdk\proj\AF>java ovning2
1
 1
2
  1
 2
   1
  2
   2
    1
     1
    2
      1
och så vidare till position 30, följt av info om vem som vann.

Deluppgift 3

Saknas.

Deluppgift 4*

Utveckla ett tidtagarur (som en applet). Det ska finnas tre knappar, en för att starta tidtagningen, en annan för att stoppa tidtagningen och en tredje för att nollställa tidtagningen. Presentera tiden i en label.

Deluppgift 5*

Utöka klassen Integral från föreläsning 2 med en funktion som utnyttjar trapetsmetoden för att lösa en integral. (Se Skansholm: Vägen till C, avsnittet om funktionspekare.) Utöka provprogrammet IntegralTest och lös integralerna med både trapets- och den gamla metoden. Applikationen ska skriva ut svaren och differenserna dem emellan.


Övning 4

Deluppgift 1

Ta hjälp av folex\serverex. Utveckla en serverapplikation som (via Sockets) kan ta emot två kommandon: UP och DOWN för att öka respektive minska värdet på en heltalsvariabel. Minsta tillåtna värde på variabeln ska vara 0 och högsta tillåtna ska vara 25. Applikationen ska dessutom visa statusinformation om senaste mottagna kommando eller säga att ingen klient finns uppkopplad.

Kommunikation med teckensträngar:

"UP" från klient till server betyder räkna upp
"DOWN" från klient till server betyder räkna ned.

Server svarar med:

"OK" om det gick bra att räkna UPP/NED
"LIMIT" om UP slog i taket eller DOWN slog i botten

Testa er server med hjälp av telnet.

Deluppgift 2

Saknas.

Deluppgift 3

Ta hjälp av folex\klientex. Utveckla en klientapplikation som kan prata med serverapplikationen i övningen ovan och skicka den kommandona UP och DOWN. Klienten ska vidare presentera de data som kommer från servern. Maskin att koppla upp emot ska anges som parameter till programmet då det startas.

Prova att kommunicera med varandras klienter och servrar.

Deluppgift 4*

Gör applikationen grafisk (inte som en applet, utan som en applikation).


Extraövningar

Deluppgift 1*

Skriv en klass Number med en privat medlemsvariabel number som är av datatypen int och som har initialvärdet 5. Implementera medlemsfunktionerna increment och decrement, som ökar respektive minskar värdet av number. Minsta tillåtna värde för number ska vara 0 och största tillåtna värde ska vara 10. Implementera också en funktion addListener enligt nedan där händelselyssnare kan registrera sig.

Ifall medlemsvariablen number har eller får värdet 10 vid anrop av increment ska denna händelse rapporteras till alla registrerade lyssnare som en "HIGH_LIMIT"-händelse. Det görs genom att anropa metoden handleHighLimit hos respektive lyssnare.

Ifall number har eller får värdet 0 vid anrop av decrement ska denna händelse rapporteras till alla registrerade lyssnare som en "LOW_LIMIT"-händelse. Det görs genom att anropa metoden handleLowLimit hos respektive lyssnare.

Funktionen addListener ska som parameter ta ett objekt som implementerar det här gränssnittet:

public interface NumberListener {
  public void handle_low_limit();
  public void handle_high_limit();
}
Klassen Number måste lagra sina lyssnarobjekt någonstans. Lagra i någon typ av vektor, eller implementera en länkad lista internt i klassen.

Skriv en klass Low som implementerar gränssnittet NumberListener. Klassen ska han en medlemsvariabel namn som instansieras via konstruktorn. Hanteringen av LOW_LIMIT ska bestå i att medlemsvariabeln namn, namnet på klassen och " hanterar LOW_LIMIT" skrivs ut. Händelsen HIGH_LIMIT ska inte hanteras.

Skriv en klass High som implementerar NumberListener Klassen ska han en medlemsvariabel namn som instansieras via konstruktorn. Hanteringen av HIGH_LIMIT ska bestå i att medlemsvariabeln namn, namnet på klassen och " hanterar HIGH_LIMIT" skrivs ut. Händelsen LOW_LIMIT ska inte hanteras.

Skriv en klass HiLo som implementerar NumberListener Klassen ska han en medlemsvariabel namn som instansieras via konstruktorn. Hanteringen av HIGH_LIMIT ska bestå i att medlemsvariabeln namn, namnet på klassen och " hanterar HIGH_LIMIT" skrivs ut. Hanteringen av LOW_LIMIT ska bestå i att medlemsvariabeln namn, namnet på klassen och " hanterar LOW_LIMIT" skrivs ut.

Skriv en main-funktion som instansierar ett Number-objekt num, ett Low-, ett High- och ett HiLo-objekt. De tre senare objekten ska registreras som lyssnare hos det första. Lägg sedan programmet i en loop som läser tecken från tangentbordet. Om tecknet är 'u' ska num.increment() anropas, annars ska num.decrement() anropas. Vad bör hända och vad händer? Red ut.

Deluppgift 2*

Fortsättning på deluppgift 1. Skriv en adapterklass som implementerar NumberListener. Låt Low och High ärva adapterklassen istället för att implementera interfacet. Vad vinner man i dessa klasser? Hur kan det komma sig att Low och High fortfarande duger som händelselyssnare för Number-klassen?

Deluppgift 3

Ta hjälp av folex\copyfile. Skapa en applikation som tar emot två filnamn på kommandoraden och kopierar innehållet i den ena filen till den andra i omvänd ordning bytemässigt. Applikationen anropas enligt:
java omvkopia från-fil-namn till-fil-namn
Kom ihåg att hantera alla upptänkliga fel i applikationen, till exempel att frånfilen saknas eller läsfel. Tips: implementera en stack och pusha inlästa bytes på den. Poppa sedan av dem vid skrivning till omvända filen.

Deluppgift 4*

Ta hjälp av folex\pipesex. Skriv en applikation som hämtar en textfil från en webserver m.h.a. URL-hantering. Applikationen ska gå igenom varje inläst rad och skriva ut hur många HTML-taggar där fanns. Den ska också för varje rad skriva ut en ackumulerad siffra som talar om hur många taggar som hittats totalt hittills. Lägg läsning av URL i mainmetoden och låt den skriva data till en pipe. Lägg läsning av pipe och datahantering i en egen tråd som också får skriva till terminalen. En HTML-tagg inleds med tecknet <.

Deluppgift 5

Skapa en grafisk applikation innehållande en stapel som kan växa i till exempel 25 steg. Applikationen ska innehålla en bakgrundstråd som räknar upp stapelvärdet och begär omritning av applikationens fönster 1 gång i sekunden.

Omritningen ska göras flimmerfritt. (Vill man istället för en stapel ha något annat animerat går det förstås också bra). En stapel blir inte så illustrativ. Prova gärna att plocka bort det som gör det hela flimmerfritt i raketexemplet från föreläsningarna, se folex\animer.

Deluppgift 6

Skriv en javaböna med följande properties: width, height, weightBeforeUnloading. Skriv en applikation som provar alla metoder i bönan.

Deluppgift 7*

Ta hjälp av folex\beanex. Utveckla en applet som tar emot en textsträng och hastighet från en HTML-parameter och därefter rullar textsträngen i en rubrik-remsa från höger till vänster. När textsträngen försvunnit ut från rubrik-remsans vänstra sida ska den börja om och rulla textsträngen från höger till vänster igen och så vidare. Utgå från föreläsningarnas beanex, och modifiera flowtext_c till en applet som läser parametrar enligt ovan. Försök göra någonting åt flimret.