Laboration 1 i Objektorienterad programmering

Denna laboration ska göras klar under labbpasset onsdagen 23 januari 2013 och godkännas av en handledare. Handledarna är i labbsalarna på onsdag mellan 13 och 15:

I sal 5355: Maryana Wånggren
I sal 6225: Cecilia Kjellman
Ambulerande: Björn von Sydow

Innan labbpasset bör ni ha bildat grupper om två personer.

Uppgift 1. Registrering i Fire

Logga in på ett av era konton och sök upp kursens webbplats (om ni läser detta på skärmen har ni redan lyckats).

Er första uppgift är att registrera er själva som personer och er labbgrupp i inlämningssystemet Fire. Läs om detta på kursens webbplats under Labbinlämning.

Uppgift 2. Kompilera och köra program.

Skapa en lämplig mapp i er hemmakatalog för denna kurs. Skapa sedan en undermapp, förslagsvis kallad lab1, för denna laboration. Om du är osäker på att hantera enkla kommandon i ett terminalfönster i Linux, börja med att läsa denna inledning.

Ladda sedan ner filen HarmonicSum.java till mappen lab1.

Om ni inte redan gjort det, öppna ett terminalfönster och placera er i mappen lab1. Kontrollera att filen finns där:

> ls
HarmonicSum.java
>

För att kunna köra programmet måste det först kompileras:

> javac HarmonicSum.java
> ls
HarmonicSum.java   HarmonicSum.class
>

Java-kompilatorn javac har läst programmet och översatt det till så kallad bytekod, som sparats i filen HarmonicSum.class. Detta är en så kallad binärfil, dvs den är skriven i ett format som inte är avsett att läsas av människor. .java-filen kan listas med more, men det är ingen idé att göra så med .class-filen.

Däremot kan .class-filen läsas och exekveras av Java-interpretatorn:

> java HarmonicSum 10000
Summan med 10000 termer blir 9.787606036044348
>
Notera speciellt att filnamnssuffixet .class inte ska ges här!

Talet 10000 som ges sist på raden är ett så kallat kommandoradsargument. Det utgör indata till programmet och kan i main kommas åt under namnet args[0].

Provkör programmet igen med andra argument i stället för 10000. Prova stora tal (för att se om det tar lång tid) och små tal (så små att ni kan räkna ut summan i huvudet och kolla att programmet räknar rätt). Vad händer om man ger ett negativt tal som kommandoradsargument?

Uppgift 3. En utvidgning av programmet.

Vi ska nu utvidga programmet så att det kan skriva ut en tabell som denna:

> java HarmonicSum 10
Antal         Harmonisk
termer         summa
1         1.0
2         1.5
3         1.8333333333333333
4         2.083333333333333
5         2.283333333333333
6         2.4499999999999997
7         2.5928571428571425
8         2.7178571428571425
9         2.8289682539682537
10         2.9289682539682538

Programmets kommandoradsargument har nu en annan betydelse; det anger antalet rader i tabellen. Det är inte nödvändigt att tabellen blir så snygg; om till exempel antalet siffror i talen i första kolumnen varierar mellan raderna, så får andra kolumnen bli litet "sned" som syns ovan.

För att åstadkomma detta måste vi redigera programmet i en texteditor. Det finns flera sådana att välja på, till exempel gedit eller emacs. Är du redan bekant med någon av dessa så använd den; om inte så är nog gedit enklast att använda:

> gedit HarmonicSum.java

Ett nytt fönster öppnas på skärmen där klassen HarmonicSum är synlig. Ni kan nu ändra och lägga till, spara, kompilera och köra programmet.

När ni ska lösa detta problem ska ni inte ändra funktionen hSum alls. Alla ändringar görs i main. Där måste man utnyttja en loop för att anropa funktionen hSum flera gånger med de olika antalen termer och skriva ut resultaten.

Någon kanske tycker att det innebär att datorn gör en massa onödigt arbete. Om programmet redan räknat ut summan av de 9 första termerna och nu ska räkna ut summan av de 10 första, så verkar det dumt att börja om från början. Så är det kanske, men det viktiga är att det bli mycket enklare att programmera en lösning som använder hSum upprepade gånger. En gyllene regel i programmering är att lösa varje problem på så enkelt sätt som möjligt; först om detta visar sig leda till ett alltför ineffektivt program ger man sig på något mer komplicerat.

Om olika typer av fel

Vid all programmering är risken stor att det första försöket blir fel på något sätt. Fel kan vara av olika natur:

Testa ert program med olika kommandoradsargument. Vad händer om argumentet är noll eller negativt? Om det är mycket stort?

När ni är klara med detta är ni klara med laboration 1 och kan kalla på en handledare för att få godkännande. I väntan på att handledaren får tid rekommenderar vi er att fortsätta med nästa, frivilliga, uppgift.

Uppgift 4. Frivillig extrauppgift

Vi fortsätter med den harmoniska summan. Ovan beräknade vi summan när antalet termer är givet. Nu ska ni skriva ett program som gör tvärtom; vi ger ett värde på summan som kommandoradsargument och programmet ska räkna ut antalet termer som minst måste tas med för att uppnå detta värde:

> java HarmonicSum 10
Antalet termer är 12367
> java HarmonicSum 20
Antalet termer är 272400600

Eftersom detta är en frivillig uppgift ger vi ingen ledning. Notera att antalet termer redan för att uppnå summan 20 är mycket stort; programmet har gjort nästan 300 miljoner divisioner och additioner. Ni kan alltså inte räkna med att programmet ska kunna användas för argument som är mycket större än 20. Det är också så att den enklaste versionen av programmet kommer att ta lång tid redan för mindre värden än 20 (kanske redan för summan 12 eller så).

Visa gärna ert program för handledaren för att få kommentarer.