Föreläsning 1: Introduktion till Java

Datalogi har två huvuddelar: datastrukturer och algoritmer. Dessutom behövs ett språk att beskriva dessa datastrukturer och algoritmer. Kursboken är en god sammanställning av dom bästa algoritmer man känner till för att lösa praktiska problem som sortering, sökning och optimering. Boken förutsätter att man haft en inledande programmeringskurs och går därför igenom hela Java mycket snabbt och med väldigt lite exempel. Vi ska börja mer från början och lägga ner lite extra tid på bokens första kapitel.

Pascal och C är cirka trettio år gamla språk. Då anade ingen att orden mus och fönster skulle få betydelse i datasammanhang. Därför är dessa språk odugliga för program som ska reagera på musklickningar i fönster och därför är objektorienterade språk mer gångbara idag.

Ett fönster på skärmen är ett typiskt objekt. Det är inte bara text och grafik, det kan också göra saker, reagera på musklickningar etc. Java har ett mycket stort bibliotek av nyttiga programdelar, så kallade klasser. Klassen Frame beskriver ett vanligt fönster och varje gång man i sitt eget javaprogram skriver new Frame får man ett nytt fönster som kan visas på skärmen. Enkelt, va?


En javafil ska ha ett namn som slutar på java, till exempel Vikt.java. Först skriver man filen, till exempel i Emacs, sedan kompilerar man den med kommandot
    javac Vikt.java
och då översätts javafilen till en eller flera klassfiler, till exempel Vikt1.class och Vikt2.class. En klassfil kan köras med kommandot
    java Vikt1
och det märkliga är att den kan köras på vilken dator som helst. I andra programspråk kan en kompilerad fil bara köras på samma dator som den kompilerats på. Det är därför endast javaprogram kan köras på webben, där ju vilken dator som helst kan surfa till vilken webbsida som helst.
Vår första exempel är ett program med följande skärmdialog.
    Hur lång är du (cm): 189
    Idealvikt: 79 
Den algoritm som använts är att ta reda på längden, beräkna idealvikt=längd-110 och presentera resultatet. Så här ska filen Vikt.java se ut.
class Vikt1 {                                             // trams
    public static void main(String[] args) {              // trams
	System.out.print("Längd i cm: ");                 // sats
	int längd;                                        // deklarationssats
	längd = Mio.getInt();                             // sats
	System.out.println("Idealvikt: " + (längd - 110));// sats
    }
}

Tramsraderna är ointressanta för oss än så länge men måste finnas ändå. För varje minnesfack man behöver deklarerar man en variabel och anger typ. Variabeln längd har typen int som ger ett minnesfack med plats för ett niosiffrigt heltal.

Vill man skriva något på skärmen anropar man System.out.print() som bland annat skriver ut texter (inom citattecken) och uträknade talvärden (utan citattecken). Vill man ha ett avslutande radbyte använder man System.out.println() i stället.

System är en nyttig klass för utskrift på skärmen men ganska opraktisk för inläsning från tangenterna. Här är Mio en nyttig klass i stället. Mio.getInt() läser ett heltal, Mio.getDouble() ett tal med decimaler, Mio.getLine() en textrad osv. Se själv efter i filen Mio.java eller Mio-dokumentationen vilka anrop som finns. Mio och dess hjälp nås från kurshemsidan eller kurskatalogen.


Vi vill fortsätta programmets dialog så här.
   Vad väger du (kg): 80
   Banta 1 kg!
Algoritmen är nu att ta reda på vikten, räkna ut idealvikten, räkna ut bantning=vikt-idealvikt och presentera resultatet. Programmet blir så här:
class Vikt1 {
    public static void main(String[] args) {
	System.out.print("Längd i cm: ");
	int längd;
	längd = Mio.getInt();
	int idealvikt;
	idealvikt = längd - 110;
	System.out.println("Idealvikt: " + idealvikt);
	System.out.print("Vad väger du (kg): ");
	int vikt;
	vikt = Mio.getInt();
	if (vikt > idealvikt) 
	    System.out.println("Banta " + (vikt - idealvikt) + " kg!");
	if (vikt < idealvikt) 
	    System.out.println("Ät " + (idealvikt - vikt) + " kg!");
	if (vikt == idealvikt)
	    System.out.println("Perfekt!!!");
    }
}

Observera dubbla likhetstecken i jämförelsevillkoret.
Det mått som hälsovården använder för att definiera normalvikt är BMI, body mass index, som är vikten dividerad med (längden i meter) i kvadrat. Normalvikt definieras som 20<BMI<25.
   Ditt BMI=25.679302991
   Du är överviktig!
Observera att decimalkomma skrivs med punkt i datavärlden. Ett minnesfack som ska rymma ett decimaltal har typen double eftersom det är dubbelt så stort som ett int-fack. Vi får lägga till en deklaration och en beräkningssats enligt nedan.
   - - -
   double bmi;
   bmi = vikt / (längd * 0.01) / (längd * 0.01);// Ingen kvadrering i Java
   if(bmi > 25.0) 
       - - -;
Uträkningen av bmi är besvärlig och tråkig, därför vill man gärna kunna klara den med ett anrop till en funktion bmi(v,x)=v/(x*x) och alltså direkt kunna skriva
   if(bmi(vikt, längd) > 25.0)
	- - -;
och det kan man om man lägger in funktionsdefinitionen så här.
class Vikt2 {
    static double bmi(int v, int x) {
	return v / (0.01 * x) / (0.01 * x);
    }

    public static void main(String[] args) {
	// sats(er);
    }
}

Funktioner kallas metoder i Java. Ordet static betyder att metoden finns tillgänglig hela körningen. Står det inget static finns metoden bara i dom objekt man under körningen skapar med new Vikt2. Ordet double talar om vilken typ funktionens returvärdet har. Om funktionen inte returnerar något värde skriver man void i stället.

I anropet bmi(vikt, längd) kallas vikt och längd för argument eller anropsparametrar och i definitionen static double bmi(int v, int x) kallas v och x för formella parametrar. De formella parametrarna måste motsvara anropsparametrarna till typ och antal men behöver inte ha samma namn. I vårt exempel får v värdet av vikt och x värdet av längd när metoden anropas.

Om den metod man anropar ligger i en annan klass måste man säga till Java var metoden finns genom att sätta klassnamnet före metodnamnet med en punkt emellan. Om man ska anropa bmi från klassen Vikt1 ser alltså anropet ut så här.

    if (Vikt2.bmi(vikt, längd) < 20)
	System.out.println("Ät genast!");

^ Upp till kurssidan.


Sidansvarig: <efo@nada.kth.se>
Senast ändrad 29 oktober 2001
Tekniskt stöd: <webmaster@nada.kth.se>