Nada

Föreläsning 1: Introduktion till Java

Datalogi har två huvuddelar: algoritmer och språk. 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 några veckor 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 är ett vanligt fönster och varje gång man i sitt eget javaprogram skriver new Frame dyker ett nytt fönster upp 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 idealvikt=längd-110, och så här ska filen Vikt.java se ut.
class Vikt1                                  {  //trams
  public static void main(String[] args)     {  //trams
    int x                                    ;  //deklaration 
    System.out.print("Längd i cm: ")         ;  //sats
    x=Mio.GetInt()                           ;  //sats
    System.out.println("Idealvikt: "+(x-110));}}//sats
Tramsraderna gör ingen nytta men måste finnas ändå. För varje minnesfack man behöver deklarerar man en variabel och anger typ. Variabeln x 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.GetReal() ett tal med decimaler, Mio.GetLine() en textrad osv. Se själv efter i filen Mio.java vilka anrop som finns. Den ligger på kurskatalogen.


Vi vill fortsätta programmets dialog så här.
   Vad väger du (kg): 80
   Banta 1 kg!
Algoritmen är nu bantning=vikt-idealvikt och programmet blir så här.
class Vikt1                                                         {
  public static void main(String[] args)                            {
    int x,ideal,vikt                                                ;
    System.out.print("Längd i cm: ")                                ;
    x=Mio.GetInt()                                                  ;
    ideal=x-110                                                     ;
    System.out.println("Idealvikt: "+ideal)                         ;
    System.out.print("Vad väger du (kg): ")                         ;
    vikt=Mio.GetInt()                                               ;
    if (vikt>ideal) System.out.println("Banta "+(vikt-ideal)+" kg!");
    if (vikt<ideal) System.out.println("Ät "+(ideal-vikt)+" kg!")   ;
    if (v==y)    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/(x*0.01)/(x*0.01);  //Kvadrering finns inte 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/x2 och alltså direkt kunna skriva
   if(bmi(vikt,x)>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)    {
   - - -                               
                                            ;}}
Ordet static betyder att funktionen finns tillgänglig hela körningen. Står det inget static finns funktionen bara i dom objekt man under körningen skapar med new Vikt2. Ordet double talar om vilken typ funktionsvärdet har. Om funktionen inte returnerar något värde skriver man void i stället.

I anropet bmi(vikt,x) kallas vikt och x för argument och i definitionen static double bmi(int v, int x) kallas v och x för parametrar. Parametrarna måste motsvara argumenten till typ och antal men behöver inte ha samma namn. I vårt exempel blir v ett aliasnamn för vikt.

Om den funktion man anropar ligger i en annan klass sätter man klassnamnet före funktionsnamnet med en punkt emellan. Om man ska anropa bmi från klassen Vikt1 ser alltså anropet ut så här.

   if(Vikt2.bmi(vikt,x)<20) System.out.print("Ät genast!");

Sidansvarig: <henrik@nada.kth.se>
Senast ändrad 20 januari 1999
Tekniskt stöd: <webmaster@nada.kth.se>