Lärare: Markus Saers.
UPPSALA UNIVERSITET
Inst. f. lingvistik och filologi
Kurssidan
Uppsala universitet
Hoppa över länkar

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 filen MyClass.java:
public class MyClass { public static void main(String[] args) { System.out.println("Hello world!"); } }
Därefter vid prompten:
markuss@objekt$ javac MyClass.java markuss@objekt$ java MyClass Hello world! markuss@objekt$

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

  1. det största talet i vektorn (int).
  2. summan av det största och det minsta talet i vektorn (int).
  3. summan av samtliga tal i vektorn (int).
  4. medelvärdet av talen i vektorn (double).
  5. en mängd (något objekt som implementerar gränssnittet java.util.Set) med alla unika tal i vektorn (Set).
  6. antalet unika tal i vektorn (int).
Visa ledtråd Dölj ledtråd

public class IntArray { public static void main(String[] args) { int[] vector = { 12, 56, 109, 35, 12, 7, 40, 14, 2, 5, 56 }; } public static int firstExercise(int[] arg) { int solution; // Calculate the value of the solution return solution; } }

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

  1. en strängvektor som innehåller samma strängar som argumentet, men i omvänd ordning (String[]).
  2. en heltalsvektor med strängarnas längd (int[]).
  3. den sträng i vektorn som kommer först i bokstavsordning (String).
  4. 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?
  5. samtliga strängar i vektorn konkatenerade till en sträng (String).
  6. en mängd (java.util.Set) delsträngar av strängarna i argumentvektorn (Set). Använd String.substring(int start, int end) för att ta ut alla tänkbara delsträngar ur alla strängar i argumentvektorn.
  7. 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.
  8. 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...

  1. 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].
  2. 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.
  3. 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 (Set eller String[] – 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).