Föreläsning 1
EDAA30
Programmering i Java - fortsättningskurs
cs.lth.se/edaa30 Kursansvarig: Marcus Klang
marcus.klang@cs.lth.se
Datavetenskap (LTH) Föreläsning 1 HT 2019 1 / 45
Föreläsning 1
Innehåll
Introduktion
Kursens mål och innehåll Undervisning
Abstrakta datatyper och delar av Javas klassbibliotek Arv, abstrakta klasser och metoder (repetition) Interface
Abstrakta datatyper - lista, stack, FIFO-kö, mängd, map, prioritetskö
Datavetenskap (LTH) Föreläsning 1 HT 2019 2 / 45
EDAA30 Programmering i Java - fortsättningskurs
Läsperiod lp 1+2 7.5 hp
Kursansvarig: marcus.klang@cs.lth.se cs.lth.se/edaa30
moodle.cs.lth.se Förkunskapskrav:
Godkänd på laborationer och inlämningsuppgifter i EDAA10 eller motsvarande.
Detta kan du ...
Förkunskaper
en hel del om programmering och objektorientering begrepp som klass, objekt, attribut, metod, parameter skriva mindre program i programspråket Java
skriva och debugga program i utvecklingsverktyget Eclipse använda vektorer, matriser och (delvis) klassen ArrayList
enkla algoritmer som t.ex. linjärsökning, insättning i en redan sorterad vektor
använda arv – superklass, subklass, abstrakt metod
Detta ska du lära dig ...
Kursens mål
mer om programmering och objektorientering interface, exceptions, generik ...
formulera och använda olika algoritmerför att effektivt lösa problem sökning, sortering, rekursiva algoritmer ...
Känna till olikaabstrakta datatyper
viktigaste operationerna, användningsområden lista, stack, kö, mängd, map, prioritetskö använda olikadatastrukturer
vektorer, länkade listor, binära sökträd, hashtabeller, heapar
dels genom att använda färdigaklassbibliotekoch dels genom att göra egna implementeringar
skriva program med grafiska användargränssnitt (JavaFX) testa klasser (jUnit)
analysera och jämföra algoritmers tidsåtgång
Datavetenskap (LTH) Föreläsning 1 HT 2019 5 / 45
Mål
Förklaring av termer
Algoritm – en beskrivning hur man stegvis löser ett problem.
Ex: matrecept, linjärsökning
Abstrakt datatyp – en abstrakt modell tillsammans med de operationer man kan utföra på den
Ex: lista med operationer för att sätta in och ta bort element Datastruktur – en samling variabler (ofta med samma datatyp) som hör ihop.
Ex: vektor
Klassbibliotek– färdiga klasser som är tänkta att användas i andra program. Fungerar som en utvidgning av programspråket.
Ex: Java Collections Framework
Datavetenskap (LTH) Föreläsning 1 HT 2019 6 / 45
Varför är detta viktigt att kunna?
Till skillnad mot övningsprogram är riktiga program stora, skrivs av flera personer, har lång livstid, kräver underhåll . . . .
Därför är följande viktigt:
bra design läsbar kod
att man kan välja lämpliga algoritmer, datastrukturer och färdiga byggstenar (klasser ur bibliotek)
bra verktyg för programutveckling, felsökning och testning
Exempel
Skriv program för att hantera kontakter (namn, mobil nr ...).
Att fundera på:
Ska vi använda en vektor eller finns det andra, bättre sätt att lagra posterna? Finns det färdiga klasser som kan användas?
Hur sker kommunikationen med användaren (utskrifter i konsolfönstret eller snyggare grafiskt användargränssnitt)? Hur designar man
programmet så att man lätt kan byta sätt?
Hur söker man snabbt om antal poster är stort?
. . .
Från problem till program
Specifikation av problemet Design
Val av lösningsmetoder (algoritmer, datastrukturer) för delproblem Implementering (programskrivning) Testning
Underhåll (korrigeringar och uppdateringar)
XX XX XX XX X y
Behandlas i EDAF25, OMD Behandlas i denna kurs
Parallellt: dokumentation
Datavetenskap (LTH) Föreläsning 1 HT 2019 9 / 45
Kursmoment
Laborationer – 6 st, lp 1 läsvecka 4, 6 och lp 2 läsvecka 2, 3, 4, 5 obligatoriska
Kräver förberedelser.
Ska lösas i grupper om två. Anmälan till önskad labbgrupp görs på kursens webbsida.
Inlämningsuppgift – andra halvan av kursenobligatorisk Löses normalt i grupper om två.
Finns på webbsidan. Det finns två alternativ att välja mellan.
Jourtider för frågor i samband med inlämningsuppgiften kommer att finnas.
Redovisas i läsvecka 7 i lp 2.
Övningsuppgifter
Viktigt komplement till laborationerna.Löses på egen hand.
Datavetenskap (LTH) Föreläsning 1 HT 2019 10 / 45
Examination
Skriftlig tentamen
Kursen inrapporteras i Ladok i två delar
Obligatoriska moment (laborationer + inlämningsuppgift) 3 hp Tentamen 4.5 hp
Kursmaterial och kursbok
Kurmaterial:
Föreläsningsbilderna – finns på kurshemsidan och moodle Laborationsuppgifter
PM om programutvecklingsmiljön Eclipse PM om testverktyget jUnit
Inlämningsuppgift
Övningsuppgifter – finns på Moodle
Java snabbreferens (tillåtet hjälpmedel på tentan)
Allt material finns på cs.lth.se/edaa30 eller moodle.cs.lth.se Kursbok: E. Koffman och A. T. Wolfgang:Data Structures:
Abstraction and Design Using Java, 3rd Edition, Wiley 2016.
Rekommenderad, men ej obligatorisk.
Läsanvisningar finns på cs.lth.se/edaa30 och moodle.cs.lth.se.
Det går även att använda den andra upplagan.
Om att lära sig programmera
Programmering är kul!
Programmering tar tid (fundera ut lösningar, hitta fel ...).
Man lär sig programmera genom att träna. Skriv program, testa, hitta på egna program, experimentera ...
Men inte bara - glöm inte bort teorin.
Starten är viktig. Häng med från början! Det man lär sig kommer att byggas på och användas genom hela kursen.
De olika undervisningsmomenten (övningsuppgifter, labbar, föreläsningar ...) finns av en anledning och kompletterar varandra.
Datavetenskap (LTH) Föreläsning 1 HT 2019 13 / 45
Nytt sedan förra kursomgången
Övningar finns nu på vår Moodle server
Ny kursansvarig: Marcus Klang tar över efter Niklas Fors
Datavetenskap (LTH) Föreläsning 1 HT 2019 14 / 45
Interface
Kort repetition av arv, abstrakta klasser och abstrakta metoder Interface i Java
Deklarera interface
Skriva klasser som implementerar interface
Arv – repetition
Exempel
I ett program ska geometriska figurer (kvadrater och cirklar) hanteras.
Figurerna ska kunna flyttas och ritas upp på skärmen.
Shape(int, int) moveTo(x, y) draw(SimpleWindow)
Shape {abstract}
x y
Circle(int, int, int) radius
Circle side
Square Square(int, int, int)
Arv
Superklassen Shape
public abstract class Shape { protected int x;
protected int y;
protected Shape(int x, int y) { this.x = x;
this.y = y;
}
public void move(int dx, int dy) { x = x + dx;
y = y + dy;
}
public abstract void draw(SimpleWindow w);
}
Datavetenskap (LTH) Föreläsning 1 HT 2019 17 / 45
Arv
Subklassen Square
public class Square extends Shape { private int side;
public Square(int x, int y, int side) { super(x, y);
this.side = side;
}
public void draw(SimpleWindow w) { w.moveTo(x, y);
w.lineTo(x + side, y);
w.lineTo(x + side, y + side);
w.lineTo(x, y + side);
w.lineTo(x, y);
} }
Datavetenskap (LTH) Föreläsning 1 HT 2019 18 / 45
Arv
Exempel
public class Main {
public static void main(String[] args) { Shape[] theShapes = new Shape[3];
theShapes[0] = new Square(100, 300, 100);
theShapes[1] = new Square(400, 200, 100);
theShapes[2] = new Circle(400, 400, 50);
SimpleWindow w = new SimpleWindow(600, 600, "Figurer");
for (int i = 0; i < theShapes.length; i++) { theShapes[i].move(10, 10);
}
for (int i = 0; i < theShapes.length; i++) { theShapes[i].draw(w);
} } }
Diskutera
Klassen Shape har den abstrakta metoden draw.
Vad är en abstrakt metod?
Varför finns den abstrakta metoden draw i klassen Shape?
Vad händer om vi tar bort metoden draw från klassen Shape?
Interface
I ett helt annat program är man bara intresserad av att beräkna figurernas area. Metoderna draw och move behövs ej och då inte heller de
gemensamma attributen x och y. Onödigt att använda arv!
Lösning: Skriv ettinterfaceMeasurable med en abstrakt metod för att beräkna arean. Låt klasserna Square och Circle implementera interfacet.
public interface Measurable { /** Returns the area. */
double area();
}
<<interface>>
Measurable area() : double
Circle(int) radius
Circle side
Square
Square(int)
Datavetenskap (LTH) Föreläsning 1 HT 2019 21 / 45
Implementera interface
Klassen Square implementerar interfacet Measurable
I en klass som implementerar ett interface måste alla abstrakta metoder i interfacet implementeras:
public class Square implements Measurable { private int side;
public Square(int side) { this.side = side;
}
public double getSide() { return side;
}
public double area() { return side * side;
} }
Datavetenskap (LTH) Föreläsning 1 HT 2019 22 / 45
Interface
Datatyp
Ett interface är en datatyp (precis som en klass).
Exempel 1:
Measurable m = new Square(50);
System.out.println(m.area());
Exempel 2:
public static double sumAreas(Measurable[] a) { double sum = 0;
for (int i = 0; i < a.length; i++) { sum += a[i].area();
}return sum;
}
Interface
Exempel
En variabel av typen Measurable kan referera till objekt av alla klasser som implementerar interfacet:
public class Main {
public static void main(String[] args) {
Measurable[] theShapes = new Measurable[3];
theShapes[0] = new Square(100);
theShapes[1] = new Square(100);
theShapes[2] = new Circle(50);
double sum = 0;
for (int i = 0; i < theShapes.length; i++) { sum += theShapes[i].area();
}System.out.println(sum);
} }
Interface
Deklarera interface
Innehåller oftast en eller flera publika, abstrakta metoder.
Metoderna är implicit publika och abstrakta, dvs. man behöver inte skriva public abstract ....
public interface Measurable { /** Returns the area. */
double area();
}
Datavetenskap (LTH) Föreläsning 1 HT 2019 25 / 45
Interface
Deklarera interface, forts
Från och med Java 8 kan interface innehålla abstrakta metoder
konstanter (statiska attribut som är final) statiska metoder
default-metoder (från Java 8) public interface Measurable {
/** Returns the area. */
double area();
/** Returns a String representation of the area. */
public default String areaAsString() { return String.valueOf(area());
} }
Datavetenskap (LTH) Föreläsning 1 HT 2019 26 / 45
Diskutera
Hitta likheter/skillnader mellan abstrakta klasser och interface?
Har du träffat på interface tidigare? Ge exempel i så fall.
Interface
Kontrakt
Interface betyder gränssnitt.
Interfacet fungerar som kontrakt eller specifikation.
En klass som implementerar interfacet måste implementera alla abstrakta metoder i interfacet. Annars går klassen inte att kompilera.
Flera olika klasser kan implementera samma interface.
Interface
Ger valmöjlighet
Genom att använda interfacenamnet som typnamn kan man skjuta upp valet av implementering.
lätt byta en implementerande klass mot en annan.
Man kan använda alla metoder i ett interface innan de är implementerade. Det är bara när man skapar instanser som man behöver en implementerande klass.
Exempel:
List<Integer> list = new ArrayList<Integer>();
eller
List<Integer> list = new LinkedList<Integer>();
List<E> är ett interface i java.util, medan ArrayList<E> och LinkedList<E> är konkreta klasser.
Datavetenskap (LTH) Föreläsning 1 HT 2019 29 / 45
Interface
Implementera flera interface
En klass kan implementera flera interface men bara ärva från en klass.
public class Square extends Shape implements Measurable, Cloneable { // implementering av alla abstrakta metoder i klassen Shape // och i interfacen Measurable och Cloneable
}
Datavetenskap (LTH) Föreläsning 1 HT 2019 30 / 45
Exempel: Komplexa tal
Interfacet ComplexNumber
public interface ComplexNumber { /** Returns real part. */
double getRe();
/** Returns imaginary part. */
double getIm();
/** Adds this number and rhs and returns result as a new complex number. */
ComplexNumber add(ComplexNumber rhs);
}
Exempel: Komplexa tal
Klass som implementerar interfacet
public class RectangularComplexNumber implements ComplexNumber { private double re;
private double im;
public RectangularComplexNumber(double re, double im) { this.re = re;
this.im = im;
}
public double getRe() { return re;
}
public double getIm() { return im;
} ...
Exempel: Komplexa tal
En annan klass som implementerar interfacet
public class PolarComplexNumber implements ComplexNumber { private double r;
private double theta;
public PolarComplexNumber(double re, double im) { r = Math.sqrt(re*re + im*im);
theta = Math.atan2(im, re);
}
/** returns real part */
public double getRe() {
return r * Math.cos(theta);
}
/** returns imaginary part */
public double getIm() {
return r * Math.sin(theta);
}...
Datavetenskap (LTH) Föreläsning 1 HT 2019 33 / 45
Abstrakta datatyper
Vad är en abstrakt datatyp?
Översikt över de abstrakta datatyperna som ingår i kursen
Datavetenskap (LTH) Föreläsning 1 HT 2019 34 / 45
Abstrakt datatyp (ADT)
Definition
En abstrakt modell tillsammans med de operationer man kan utföra på den.
Exempel:
Abstrakt modell: komplexa tal Operationer på modellen: ta reda på realdelen
ta reda på imaginärdelen
addera med ett annat komplext tal . . .
En ADT kan beskrivas av en specifikation eller av ett interface En klass är en implementering av en ADT
Viktiga abstrakta datatyper
Lista en samling element där positionering är möjlig (första, sista, element på plats i, ...)
Stack en följd av element där borttagning av ett element avser det element som senast satts in.
FIFO-kö en följd av element där insättning gör sist och borttagning först i kön.
Prioritetskö en kö där borttagning av element avser det viktigaste (minsta) elementet.
Mängd (eng. Set) en samling element där dubbletter är förbjudna.
Map en samling av nyckel-värde-par (jfr. lexikon)
Abstrakt datatypen lista
1:a elementet 2:a elementet 3:e elementet 4:e elementet
Abstrakt modell: lista Operationer på modellen:
Lägga in element i listan (först, sist ...) Ta bort ett element ur listan
Undersöka om ett visst element finns i listan Ta reda på ett elementet i listan (första, sista ...) Undersöka om listan tom
...
Datavetenskap (LTH) Föreläsning 1 HT 2019 37 / 45
Abstrakta modell
lista
Abstrakt modell Verkliga problem
Bokregister
Lista Schema
Inköpslista
Datavetenskap (LTH) Föreläsning 1 HT 2019 38 / 45
Stack
Definition
En stack är en följd av element där borttagning av ett element alltid avser det senast insatta elementet.
Kallas även LIFO-lista, Last In First Out Operationer sker på toppen av stacken.
push pop
Köer
I en FiFO-kö görs insättning sist i följden och borttagning avser första (äldsta) elementet.
First In First Out
offer poll
I en prioritetskö avser borttagning alltid det mest prioriterade (minsta) elementet.
Det viktigaste först.
Mängd
Definition
En mängd (eng. Set) är en en samling element där dubbletter är förbjudna.
Operationer:
sätta in ett element ta bort ett element
undersöka om ett element finns i mängden
Datavetenskap (LTH) Föreläsning 1 HT 2019 41 / 45
Map
I en map lagras nyckel-värde-par.
Kan också kallas lexikon eller nyckel-värdetabell Nycklarna är unika.
Man använder nyckeln för att söka tillhörande värde.
Exempel:
nyckel är månad, värde är antal dagar i månaden.
nyckel är personnummer, värde är Person-objekt med namn, adress ...
mars april maj ...
...
31 30 31 ...
...
nycklar (unika) värden (dubbletter ok)
Datavetenskap (LTH) Föreläsning 1 HT 2019 42 / 45
Diskutera
Välj den abstrakta datatyp (lista, stack, kö, prioritetskö, mängd, map) som passar bäst för att lösa respektive problem:
Givet en samling element, tag reda på antal unika element.
Hålla reda på ett antal arbetsuppgifter som ska utföras. Den arbetsuppgift som tar kortast tid ska utföras först.
Räkna antal förekomster av ord i en text.
Kontrollera att parenteser är korrekt nästlade – { () () } är ok, { (} ) är inte ok.
Sortera element.
Abstrakta datatyper i kursen
I kursen kommer du att använda de olika abstrakta datatyperna för att lösa problem.
Då måste du veta vad som utmärker de olika abstrakta datatyperna och vad man ska ha dem till.
Du kommer att använda färdiga klasser från Javas klassbibliotek som implementerar dessa abstrakta datatyper.
Men du kommer också att få se ”under huven” hur de kan implementeras.
Exempel på vad du ska kunna
Förklara begreppet abstrakt metod
Förklara begreppet interface och deklarera interface i Java Skriva klasser som implementerar interface
Förklara begreppet abstrakt datatyp
Ha kännedom om några viktiga abstrakta datatyper och vad som utmärker dem
Lista Stack FIFO-kö Prioritetskö Mängd Map
Datavetenskap (LTH) Föreläsning 1 HT 2019 45 / 45