bild
Skolan för
datorvetenskap
och kommunication

Labb 2 »
Labb 3 »
Labb 4 »
Labb 5 »
Labb 6 »

KTH / CSC / DD1346

Labb 1, Introduktion till Java

OBS! Vissa har haft problem med Netbeans på skolans ubuntu-datorer. Läs här om problemet och dess lösning.

Målet med denna labb är att lära sig grunderna i Java. Labben tar upp grundläggande syntax, variabler, kontrollstrukturer och enklare inläsning och utmatning. Skapa gärna en egen katalog för labben och alla filer som du skapar. Javakompilatorn kommer per automatik att hitta alla nödvändiga filer som ligger i samma katalog, och man slipper besväret att explicit ange var filerna finns.

Del E

För godkänt till betyg E på denna labb krävs att samtliga uppgifter i denna del skall vara utförda, samt att båda i labbgruppen kan svara på samtliga frågor.

E1. Introduktion till klasser och variabler

Rekommenderad läsning: Variables, Introduction to classes och Defining Classes in Java.

Den första upgiften går ut på att skriva en klassdefinition för klassen Human. Objekt från klassen Human ska kunna lagra information om personer, och det ska vara möjligt att hämta denna information från objekt ur klassen.

Klassen ska ha följande fält:
age : lagrar åldern (i hela år) på personen
name : lagrar namnet på personen

Klassen ska ha följande metoder:
Human(int ageIn, String nameIn) : konstruktor som skapar ett nytt objekt av klassen Human.
toString() : returnerar en String som innehåller data om personens namn och ålder, t.ex: "namn: Putte, ålder 25 år"
getAge() : returnerar åldern på personen
getName() : returnerar namnet på personen

Uppgift E1.1: Skriv klassdefinition för klassen Human.
Fråga E1.2: Vilka typer bör variablerna vara?
Fråga E1.3: Vilka typer bör metoderna returnera?
Fråga E1.4: Vilka fält/metoder bör vara private, och vilka bör vara public?

E2. Objekt och körbara program

Rekommenderad läsning: Hello World och Objects.

Nästa uppgift blir att skriva ett körbart program som skapar objekt av klassen Human, och anropar dess metoder.

Uppgift E2.1 Skriv ett ramprogram med en main-metod som skapar ett objekt av typen Human.
Uppgift E2.2 Låt programmet skriva ut ålder och namn på Human-objektet ovan. Använd dels de båda get-metoderna, och dels toString()-metoden.
Fråga E2.3 Måste man anropa toString() explicit? Vad händer om man skriver så här:

Human putte = new Human(25,"Putte");
System.out.println(putte);

Varför blir det så?

E3. Loopar och arrayer

Rekommenderad läsning: Arrays, The for statement och Beyond simple arithmetic.

Nästa uppgift blir att skriva ett körbart program som skapar en array av objekt av klassen Human, och anropar dess metoder. För att underlätta skapandet av flera objekt utökar vi klassen Human med en konstruktor som genererar slumpmässiga personer.

Först ska vi lägga till ytterliggare en konstruktor i klassen Human. Denna bör skapa en slumpmässig ålder och ett slumpmässigt namn, och sedan anropa den konstruktor som vi definierade i del E1 ovan. För att skapa slumptal kan man använda Math.random(). Denna metod returnerar en double mellan 0 och 1. Eftersom vi vill ha åldrar i hela det mänskliga spannet (ca 0-100 år) får vi multiplicera talet med 100. Eftersom den tidigare konstruktorn förväntar sig en int måste vi konvertera resultatet till en int innan vi kan anropa den.

För att skapa slumpmässiga namn kan vi förse klassen Human med en array av namn, och låta slumpen välja ett av dem. Tänk på att indexet som väljer ett element ur en array måste vara en int, och får ha värden från 0 till n-1, där n är antalet element i arrayen.

Uppgift E3.1 Lägg till en ytterligare konstruktor till klassen Human, som inte tar några argument, och som skapar en slumpmässig person. Låt denna konstruktor anropa den befintliga konstruktorn.

Som nästa steg ska vi låta ramprogrammet skapa en array av slumpmässigt skapade Human-objekt. När ni har skapat en hel array, ska programmet skriva ut alla personer i listan, en på varje rad. Använd toString()-metoden. Skapa en ny fil för denna uppgift, så att ni har kvar det ursprungliga programmet att visa upp när ni redovisar.

Uppgift E3.2 Låt ramprogrammet skapa en array med 15 st slumpmässiga personer, och skriv ut dessas namn och ålder.

E4. Arv

Rekommenderad läsning: Introduction to classes, Inheritance och The if statement.

Nästa uppgift blir att definiera den nya klassen Fysiker som ärver från klassen Human. Klassen Fysiker har, förutom de allmänna egenskaper som Human har, dessutom en årskurstillhörighet, t.ex F09. Om man har definierat fälten i Human som private så blir det svårare att komma åt dem från den ärvande klassen Fysiker. Ett sätt att komma åt dem är med hjälp av publika set-metoder. Notera att det går alldeles utmärkt att ersätta Fysiker med ett annat program, t.ex Simtek, Maskinare, Elektro eller vad man nu föredrar. Då får man givetvis också ändra möjliga startår, mm.

Uppgift E4.1 skapa klassen Fysiker som ärver från klassen Human.
Uppgift E4.2 Ge klassen Fysiker fältet year, som innehåller året som personen började på teknisk fysik. Lägg till en konstruktor som utöver de tidigare parametrarna även tar årskurs. Se till att det inte går att skapa personer som börjat tidigare än 1932 eller senare än 2015 och att inga fysiker skapas som var yngre än 15 år när de började. Utöka den slumpmässiga konstruktorn till att även generera en slumpmässig årskurs.
Uppgift E4.3 Utöka toString() så att även årskursen skrivs ut, t.ex "namn:Putte, ålder 25 år, började Fysik 2009". Lägg desutom till metoden getYear() som returnerar årskursen.
Uppgift E4.4 Låt ramprogrammet skapa en array med 15 st slumpmässiga fysiker, och skriv ut dessas namn, ålder och årskurs.
Uppgift E4.5 Låt ramprogrammet skapa en array med 5 st slumpmässiga fysiker och 5 st slumpmässiga personer av klassen Human, och skriv ut dessas namn, ålder, och i förekommande fall årskurs.

E5. Sortering och interface

Rekommenderad läsning: Interfaces,Interfaces, Arrays.sort(object[] a) och Comparable .

Den sista uppgiften blir att sortera de arrayer som vi skapat ovan. Java har färdiga metoder för att sortera arrayer som är snabba och utrymmeseffektiva, som vi ska använda här. För att sorteringsmetoden ska veta hur den ska sortera objekt av klasser den aldrig sett förut, t.ex Fysiker, måste man deklarera att dessa går att jämföra, och definiera en metod som jämför dem. Sorteringsalgoritmen kan då då jämföra elementen i arrayen och lägga dem i en stigande ordning så att alla element är större än eller lika med tidigare element, enligt jämförelsemetoden.

Man deklarerar att en klass definierar jämförelsebara objekt genom att låta den implementera interfacet Comparable. Detta interface garanterar att man har definierat en metod som heter compareTo(Object o). Om man har två objekt a och b av samma Comparable typ, skall a.compareTo(b) returnera en int som är större än noll om a är större än b, mindre än noll om a är mindre än b och noll om de är lika.

Uppgift E5.1 Låt klassen Human implementera interfacet Comparable. Definiera compareTo så att man jämför åldrar på personer.
Uppgift E5.2 Låt ramprogrammet skapa två slumpmässiga personer a och b. Låt programmet skriva vem som är äldst, eller om de är lika gamla, t.ex "Putte, som är 25 år är yngre än Stina, som är 36 år".
Fråga E5.3 Går det att jämföra två Fysiker med varandra? Går det att jämföra en Fysiker med en generell Human?
Uppgift E5.4 Låt ramprogrammet skapa en array med 5 st slumpmässiga fysiker och 5 st slumpmässiga personer av klassen Human, och skriv ut dessas namn, ålder, och i förekommande fall årskurs. Sortera sedan listan och skriv ut den i sorterad ordning.

Del C

För godkänt till betyg C på denna labb krävs - utöver godkänd E-del - att samtliga uppgifter i denna del skall vara utförda, samt att båda i labbgruppen kan förklara hur koden fungerar, och varför ni löste problemen som ni gjorde. Notera att C3 troligtvis kommer att ta längre tid att lösa än de andra två uppgifterna.
Uppgift C1 Gör om toString() metoden för klassen Fysiker så att den skriver ut årskursen på formen FXX, där XX är det tvåsiffriga året, med inledande nolla efter behov. Ledning: String.format
Uppgift C2 Gör om compareTo-metoden så att man sorterar objekt av klassen Fysiker efter deras årskurs om de skulle ha samma ålder. Det ska fortfarande gå att sortera blandade arrayer som innehåller objekt av båda typerna Fysiker och Human. Ledning: instanceof
Uppgift C3 Gör om ramprogrammet så att man på kommandoraden kan ange hur arrayen med personer skall skapas. Om vi antar att ramprogrammet är definierat i filen Lab1_ram.java, så ska man kunna skriva t.ex såhär:

>java Lab1_ram -F Anna 25 06 -H Babak 19 -F Carl 22 09

Programmet skall då skapa en array som innehåller två Fysiker med åldrarna 25 respektive 22 år, och startåren 2006 resp. 2009, samt en Human med åldern 19 år. -H betyder förstås att de efterföljande argumenten definierar en Human, medan -F indikerar en Fysiker. Antalet efterföljande argument påverkas förstås av typen. Ert program ska kunna klara en godtycklig mängd indata, och ska kunna ge ett felmeddelande om det har fått inparametrar som inte passar mönstret.
Ledning Command Line Arguments. I Netbeans kan du hitta kommandoradsargumenten genom att öppna menyn Run -> Set Project Configuration -> Run, och fylla i fältet "Arguments".
Sidansvarig: Christian Smith <ccs@kth.se>
Uppdaterad 2011-05-20