Programmeringsstuga VT-HT 2009
Kort introduktion
Lite kort kan man säga att alla Java-program är klasser, och att klasser skrivs i en
fil som heter samma sak som klassen och har extentionen .java. Klassen
MyClass ska således skrivas i filen MyClass.java.
För att kompilera klassen använder man programmet javac, som är en förkortning
av ”Java Compiler”. Som argument ger man i regel bara namnet på de klasser man
vill kompilera: javac MyClass.java. Under kompieringen skapas en fil i formatet
”Java bytecode” som går att köra. Denna fil heter samma sak som klassen, men har
extentionen .class. När vi kompilerar MyClass får vi således filen
MyClass.class.
För att köra en kompilerad klass används programmet java. Som argument ger man
i regel bara namnet på den klass man vill köra: java MyClass.
För att det ska gå att köra en klass direkt från kommandopromten krävs att det finns en
klassmetod som heter main i klassen. Den ska ha signaturen
public static void main(String[]).
Sammanfattning
I filenMyClass.java:
Heltalsvektorer
Under den här rubriken ska vi titta lite på hur man kan analysera och modifera vektorer med heltal.
Generellt ska programmet ha formen av en klass med en main-metod, som i sin tur
anropar en klassmetod. Den anropade klassmetoden varierar beroende på uppgiften,
men den ska ta en int[] som argument, och returnera...
- det största talet i vektorn (
int). - summan av det största och det minsta talet i vektorn (
int). - summan av samtliga tal i vektorn (
int). - medelvärdet av talen i vektorn (
double). - en mängd (något objekt som implementerar gränssnittet
java.util.Set) med alla unika tal i vektorn (Set). - antalet unika tal i vektorn (
int).
Där det står ”// Calculate the value of the solution”
skriver du in din lösning på uppgiften.
Strängvektorer
Som ovan ska det skrivas klassmetoder som anropas från programmets main-metod,
men i dessa fall är det en vektor med strängar som ska behandlas.
Skriv och anropa klassmetoder som tar en String[] som argument, och returnerar...
- en strängvektor som innehåller samma strängar som argumentet, men i omvänd ordning (
String[]). - en heltalsvektor med strängarnas längd (
int[]). - den sträng i vektorn som kommer först i bokstavsordning (
String). - den sträng i vektorn som är längst (
String). Beroende på hur du implementerar kan metoden hantera lika långa längsta strängar olika. Antingen returneras den första strängen som har den längsta längden, eller så rturneras den sista. Vad är det som styr vilken det blir? Kan du implementera båda? - samtliga strängar i vektorn konkatenerade till en sträng (
String). - en mängd (
java.util.Set) delsträngar av strängarna i argumentvektorn (Set). AnvändString.substring(int start, int end)för att ta ut alla tänkbara delsträngar ur alla strängar i argumentvektorn. - en mängd med alla delsträngar som ovan, men som förekommer i minst två av strängarn i argumentvektorn (
Set). Istället för att läsa in delsträngarna i en mängd läser du in dem i en associativ mängd, där delsträngarna är nycklar och antalet förekomster är värdena. När du väl läst in dem kan du avgöra vilka delsträngar som ska vara med i den slutgiltiga mängden som ska returneras. - den längsta delsträngen som förekommer i minst två av strängarna i argumentvektorn (
String). Använd med fördel den metod du implementerade ovan.
Kombination av strängvektorer
Den här gången ska vi skriva metoder som tar två strängvektorer som argument.
Skriv och anropa klassmetoder som tar (String[] a, String[] b)
som argument, och returnerar...
- konkatenationen av de två vektorerna (
String[]). Vektorerna[a, b, c]och[aa, bb, cc]ska alltså kombineras till en vektor:[a, b, c, aa, bb, cc]. - en mängd som representerar ”snittet” mellan de två vektorerna, alltså den mängd strängar som finns i båda vektorerna (
Set). Vektorerna[a, b, c, d]och[c, d, e, a]ska alltås ge en mängd innehållandes[a, c, d], eftersom det är dessa element som finns representerade i båda vektorerna. - produkten (i mängdteoretisk mening) av de två vektorerna, det vill säga den mängd strängar man får genom att kombinera alla strängar ur första vektorn med alla strängar i andra vektorn (
SetellerString[]– välj själv). Välj själv hur du vill kombinera strängarna, enklast är att bara konkatenera dem. Vektorerna[a, b, c]och[d, e]skulle i så fall ge vektorn[ad, ae, bd, be, cd, ce].
Klockan
För att öva på objektorientering ska vi börja med att implementera en klass som håller reda på en tidsangivelse. Den behöver hålla reda på hur många timmar, minuter och sekunder den ska ange, och det ska finnas metoder för att manipulera vilken tid som anges.
Börja med att definier en klass som heter Clock. Ge den sedan attributen
hour, minute och second, samtliga är lämpliga
att representera som heltal (int).
Sedan är det dags att skapa en konstruktor. Börja med att skapa en utan argument, som bara nollar attributen.
Implementera en metod som ”tickar” fram klockan ett angivet antal sekunder.
Metoden ska ha signaturen public void tickSeconds(int seconds). Kom ihåg
att antalet sekunder bara kan vara mellan 0 och 59, hamnar man utanför det intervallen
behöver antalet minuter räknas upp eller ner, och antalet sekunder justeras. Samma sak
om antalet minuter skulle gå utanför sitt intervall, och samma sak igen med antalet timmar.
Om antalet timmar går utanför sitt intervall behöver inget annat än dessa justeras.
Implementera metoden public String toString(), så att objekt av klassen
Clock kan skrivas ut enkelt. Avgör själv hur du vill representera tidsangivelsen
i strängform, men alla tre komponenterna (timmar, minuter och sekunder) ska framgå tydligt.
En variant är ISO-fomatet HH:MM:SS.
Skriv en till klass (exempelvis ClockTest) som innehåller en main-metod.
I den ska du skap en nya klocka, och kontrollera så att den fungerar som den ska (räkna upp
till minut- och timmbyte och kontrollera så att den hanterar dessa korrekt genom att skriva
ut tidsangivelsen före och efter det kritiska bytet).
