Föreläsning 18 19 REPETITION & EXTENTA
Programmeringsteknik på 45 minuter Klasser och objekt Variabler: attribut, lokala variabler, parametrar Datastrukturer Algoritmer Dessa bilder är inte repetitionsbilder de täcker givetvis inte hela kursen!
Program i Java Java-program består av klasser Varje klass beskrivs i en egen fil Klasser beskriver objekt Om en klass innehåller metoden public static void main(string[] args) kan den köras som ett program
Klasser Innehåller metoder (med Java-satser) Innehåller attribut Tillstånd för objekt Består under objektets livstid Vanliga (icke-statiska) metoder och attribut är knutna till objekt Statiska metoder och attribut är gemensamma för en klass
Klasser, objekt och arv Klasser beskrivs i Java-koden Objekt finns bara i datorns minne när programmet kör En klass kan vara en subklass (specialisering) av en annan (superklass) Ett objekt av en subklass innehåller allt som finns i superklassen (och ofta något mer) Ett objekt av en subklass passar in överallt där ett objekt av superklassen efterfrågas
Variabler i datorns minne Variablernas värden lagras i datorns primärminne. Minnet är uppdelat i olika minnesceller. Vid deklarationen av en variabel reserveras plats för variabeln i minnet. Vid tilldelning läggs variabelns värde i motsvarande minnescell/er. double nbr1 = 12.5; double nbr2 = 0.7; double sum = nbr1 + nbr2; 5200 5208 5216 12.5 0.7 13.2 nbr1 nbr2 sum Variabelns namn hänvisar alltså till en plats i datorns minne.
Variabler, uttryck och typer Typ Används till Exempel double Reella tal double r = 3.72; double c = r * 2 * Math.PI; int Heltal int a = 5; int b = a + 3; boolean Villkor, logiska värden (true eller false) int c = (int) Math.PI; boolean isold = (a > 100); if (isold) {
Att deklarera och att använda variabler När vi deklarerar en variabel, t ex int x; inför vi en ny variabel med ett namn och en typ. När namnet används någon annanstans i programmet, t ex x = 5; System.out.println(x); slår kompilatorn upp rätt variabel. Denna uppslagning följer vissa regler synlighetsregler.
public class Scopes { private int a; public Scopes(int a) { this.a = a; System.out.println(a); public void p1() { double a = 5.3; System.out.println(a); public void p2() { if (6 * 7 == 42) { boolean a = true; System.out.println(a); public void p3() { { a = 9; System.out.println(a); public static void main(string[] args) { Scopes s = new Scopes(29); s.p1(); s.p2(); s.p3(); Varje gång namnet a används söker kompilatorn upp motsvarande deklaration. Börja leta bland föregående satser i det block { där namnet används Sök därefter utåt, från blocket, via metoden, till klassen Sökningen fortsätter i superklassen Den närmsta deklarationen (enligt denna ordning) används Alltså: En deklaration är giltig i det block { där den står En deklaration kan skuggas av en annan (närmare) Parametrar är giltiga i metoden
En särskild sorts variabler: referensvariabler Objekt nås alltid med referenser Square sq1 = new Square(10, 10, 5); Square sq2 = sq1; sq2.move(5, 5); System.out.println(sq2.getX()); Även vektorer och matriser nås med referenser int[] i1 = new int[10]; int[] i2 = new int[10]; i1[0] = 7; i2 = i1; i2[0] = 5; System.out.println(i1[0]); Referensvariabler kan (till skillnad från vanliga variabler som int, double, boolean osv) peka på ingenting (null)
Datastrukturer En datastruktur kan innehålla många element har ett namn, men man kan även komma åt enskilda element. Exempel: Listor: Träd: Grafer: I kursen behandlas vektorer (ett av flera sätt att implementera listor), matriser och klassen ArrayList.
Vektor för att representera en polygon Antag att vi vill hantera polygoner med ett godtyckligt antal hörnpunkter. Då får vi gissa hur stor vektor vi behöver för punkterna: 0 1 2 3 4 5 6 7 vertices null null null null x 50 y 50 x 70 y 300 x 350 y 350 x 320 y 200 Det behövs också en variabel som håller reda på hur många punkter vi satt in i vektorn: n 4
Matriser: vektorer av vektorer int[][] m = new int[2][3]; m[0][0] = 7; m[1][2] = 6; System.out.println(m.length); System.out.println(m[0].length); [ 7 9 1 ] 3 0 6 Ofta första index som radindex, andra som kolonnindex men det är bara en konvention
Vektorernas begränsningar Här har vi valt ett maximalt antal punkter i polygonen. Hur väljer man ett sådant värde? Om man gör vektorn för liten från början kan inte alla polygoner representeras (t ex en 40-hörning). Om man gör vektorn stor från början (säg, 1000 element) blir många element oanvända (t ex 997 st för en triangel). Då slösar vi med minne. Ibland är det inte praktiskt möjligt att ange ett maximalt antal element på förhand!
ArrayList ArrayList: är en standardklass i Java (paketet java.util). innehåller alltid objekt (inte int, double,... ). lagrar sina element i en vektor. utökar vektorns storlek vid behov. har metoder för att sätta in och ta bort element
ArrayList och primitiva datatyper Elementtypen i ArrayList anger elementens klass. Men vad gör man om man vill ha element av primitiva datatyper som int eller double? Detta går alltså inte: ArrayList<int> list = new ArrayList<int>(); Javas lösning på detta har två delar: Typklasser (för objekt som innehåller tal) Autoboxing (specialregler för typklasser)
En heltalslista med autoboxing public class ArrayListExample { public static void main(string[] args) { ArrayList<Integer> list = new ArrayList<Integer>(); Scanner scan = new Scanner(System.in); while (scan.hasnextint()) { int nbr = scan.nextint(); list.add(nbr); // samma sak som: list.add(new Integer(nbr)); for (int i = list.size() - 1; i >= 0; i--) { int nbr = list.get(i); // samma sak som: int nbr = list.get(i).intvalue(); System.out.println(nbr);
Algoritmer: saker du ska kunna Ta bort element från en vektor Både sorterad och osorterad Söka upp element i en vektor Linjärsökning räcker (vi har även sett binärsökning) Registrering (d.v.s. att använda en vektor för att räkna förekomster av något) Sortering Vi har sett urvalssortering och bubbelsortering Sätta in element i sorterad följd
Linjärsökning /** Sök efter talet nbr i vektorn v. Om nbr finns returneras platsen för nbr, annars -1 */ public static int indexof(int[] v, int nbr) { int i = 0; while (i < v.length && v[i]!= nbr) { i++; if (i < v.length) { return i; else { return -1;
Linjärsökning, en variant till Eftersom metoden inte ska göra något annat än att returnera ett index, så kan man göra det direkt om man vill. /** Sök efter talet nbr i vektorn v. Om nbr finns returneras platsen för nbr, annars -1 */ public static int indexof(int[] v, int nbr) { for (int i = 0; i < v.length; i++) { if (v[i] == nbr) { return i; return -1;
Sortering Det ingår i kursen att kunna sortera en befintlig (osorterad) vektor. Det finns många olika sorteringsalgoritmer: - Urvalssortering - Insättningssortering - Bubbelsortering - Quicksort - m.fl..
Urvalssortering: idén Sortera vektorn v. 5 v 2 9 22 31 42 97 76 72 61 56
Urvalssortering: Java-kod public static void selectionsort(int[] a) { for (int i = 0; i < a.length - 1; i++) { // hitta det minsta elementet efter a[i] for (int k = i + 1; k < a.length; k++) { if (a[k] < a[i]) { int temp = a[i]; // byt a[i] och a[k] a[i] = a[k]; a[k] = temp; i k
Urvalssortering med en ArrayList public static void selectionsort(arraylist<integer> a) { for (int i = 0; i < a.size() - 1; i++) { // hitta det minsta elementet efter element i for (int k = i + 1; k < a.size(); k++) { if (a.get(k) < a.get(i)) { int temp = a.get(i); // byt element #i och #k a.set(i, a.get(k)); a.set(k, temp); i k