EDAA20 Programmering och databaser

44
EDAA20 Programmering och databaser Föreläsning 9 – Filer & vektorer av objekt 2021-09-27, Niklas Fors, @Zoom

Transcript of EDAA20 Programmering och databaser

Page 1: EDAA20 Programmering och databaser

EDAA20Programmering och databaser

Föreläsning 9 – Filer & vektorer av objekt2021-09-27, Niklas Fors, @Zoom

Page 2: EDAA20 Programmering och databaser

Programmering F föreläsningar, L datorlaborationer (obligatoriska), R resurstidv4218/10-22/10

Instuderings-vecka

Tenta, måndag 25 oktober v43

2

Page 3: EDAA20 Programmering och databaser

Klassen Scanner för inläsningpublic class SumNumbers {

public static void main(String[] args) {Scanner scan = new Scanner(System.in);int sum = 0; while (scan.hasNextInt()) {

sum = sum + scan.nextInt();}System.out.println("Summa: " + sum);

}}

Vi har hittills använt Scanner-klassen för att läsa in saker från terminalen

3

Page 4: EDAA20 Programmering och databaser

• Läsa in från terminalfönstret:Scanner scan = new Scanner(System.in);

• Läsa in från fil:

Scanner scan = new Scanner(new File("filnamn"));

• Läsa in från en sträng:Scanner scan = new Scanner("1 23 34 56");

Klassen Scanner för inläsning

4

Page 5: EDAA20 Programmering och databaser

Inläsning från strängpublic class SumNumbersFromString {

public static void main(String[] args) {Scanner scan = new Scanner("1 23 34 56");int sum = 0; while (scan.hasNextInt()) {

sum = sum + scan.nextInt();}System.out.println("Summa: " + sum); // Skriver ut summan 114

}}

Programmet läser in flera heltal från en sträng och skriver ut deras summa

5

Page 6: EDAA20 Programmering och databaser

Scanner för att läsa in från filpublic class SumNumbersFromFile {

public static void main(String[] args) {Scanner scan = null;try {

scan = new Scanner(new File("numbers.txt"));} catch (FileNotFoundException e) {

System.out.println("Filen kunde inte öppnas");System.exit(1);

} int sum = 0;while (scan.hasNextInt()) {

sum = sum + scan.nextInt();}System.out.println("Summa: " + sum);scan.close();

}}Scanner-klassen kan också användas för inläsning från fil. Då måste man hantera om filen inte finns. 6

Page 7: EDAA20 Programmering och databaser

Scanner för att läsa in från filpublic class SumNumbersFromFile {

public static void main(String[] args) {Scanner scan = null;try {

scan = new Scanner(new File("numbers.txt"));} catch (FileNotFoundException e) {

System.out.println("Filen kunde inte öppnas");System.exit(1);

} int sum = 0;while (scan.hasNextInt()) {

sum = sum + scan.nextInt();}System.out.println("Summa: " + sum);scan.close();

}}

1) Öppna filen, skriv ut felmeddelande om filen ej finns och avsluta programmet

2) Läs in heltal och summera, precis som tidigare. Därefter skriv ut summan

3) Stäng filen

7Scanner-klassen kan också användas för inläsning från fil. Då måste man hantera om filen inte finns.

Page 8: EDAA20 Programmering och databaser

Scanner för att läsa in från filpublic class SumNumbersFromFile {

public static void main(String[] args) {Scanner scan = null;try {

scan = new Scanner(new File("numbers.txt"));} catch (FileNotFoundException e) {

System.out.println("Filen kunde inte öppnas");System.exit(1);

} int sum = 0;while (scan.hasNextInt()) {

sum = sum + scan.nextInt();}System.out.println("Summa: " + sum);scan.close();

}}

Variabeln måste deklareras innan try-satsen, så att den kan användas efter try-satsen om filen öppnas.

Java kräver i detta fall att vi tilldelar variabeln ett värde, även om vi kan se att det inte behövs i detta fall (då programmet stängs av om vi inte lyckas öppna filen).

8Scanner-klassen kan också användas för inläsning från fil. Då måste man hantera om filen inte finns.

Page 9: EDAA20 Programmering och databaser

Felhantering: try-catch-sats

• Ibland inträffar fel och då kan man hantera det med en try-catch-sats:

try {// Försöker göra något där fel kan inträffa

} catch (<Typen på felet> e) {// Felhantering om felet inträffar, // exempelvis skriv ut felmeddelande och avbryt programmet// Använd variabeln e för att få fram information om felet

}

• Om felet inträffar avbryts exekveringen i try-satsen och exekveringen övergår till catch-satsen.• Detta kallas Exceptions / Exception-hantering

9

Page 10: EDAA20 Programmering och databaser

Snabbreferensen

10

Page 11: EDAA20 Programmering och databaser

Klassen PrintWriter för utskrift till filpublic class PrintSquareRoots {

public static void main(String[] args) {PrintWriter out = null;try {

out = new PrintWriter(new File("utdata.txt"));} catch (FileNotFoundException e) {

System.out.println("Filen kunde inte öppnas");System.exit(1);

}

// Använd out som System.out, dvs, out.println("text") osv

out.close(); // stäng filen, så skrivs innehållet till filen}

}

11

Page 12: EDAA20 Programmering och databaser

Klassen PrintWriter för utskrift till filpublic class SquareRootsToFile {

public static void main(String[] args) {PrintWriter out = null;try {

out = new PrintWriter(new File("utdata.txt"));} catch (FileNotFoundException e) {

System.out.println("Filen kunde inte öppnas");System.exit(1);

}for (int i = 1; i <= 100; i++) {

out.println(Math.sqrt(i));}out.close(); // stäng filen, så skrivs innehållet till filen

}}

Programmet räknar ut kvadratroten av 1, 2, 3, …, 100 och skriver ut resultaten till filen utdata.txt 12

Page 13: EDAA20 Programmering och databaser

Repetition av vektorer

Deklarera och skapa vektor:int[] v = new int[5];

Användning av vektor:

for (int i = 0; i < v.length; i++) {v[i] = scan.nextInt();

}

v är en referensvariabel som kan referera till en int-vektor

En vektor med storlek 5 skapas, där alla element är av typen int och initieras till 0

v.length ger vektorns storlekv[index] för elementåtkomstindex ska vara mellan 0 och v.length-1

13

Page 14: EDAA20 Programmering och databaser

Vektorer är objekt

Vektorer i Java är objekt. Referensvariabeln v refererar till vektorn

0v 0 0

0 1 2

0 0

3 4

14

Page 15: EDAA20 Programmering och databaser

Övning: vektorer

Vad händer i detta exempel? Hur många vektorer skapas? Vad refererar b till? Komplettera bilden.

int[] a = new int[3];a[0] = 7;a[1] = 8;a[2] = 9;int[] b = a;

15

7

a

8 9

0 1 2

Page 16: EDAA20 Programmering och databaser

Övning: vektorer

Vad händer i detta exempel? Hur många vektorer skapas? Vad refererar b till? Komplettera bilden.

int[] a = new int[3];a[0] = 7;a[1] = 8;a[2] = 9;int[] b = a;

Enbart en vektor skapas. Både a och b refererar till samma vektor

16

7

a

8 9

0 1 2

b

Page 17: EDAA20 Programmering och databaser

Två vektorer

7

a

8 9

0 1 2

b7 8 9

0 1 2

17

Hur skapar man en till vektor med samma innehåll som vektorn a?

int[] a = new int[3];a[0] = 7;a[1] = 8;a[2] = 9;

???

Page 18: EDAA20 Programmering och databaser

Kopiera vektor

7

a

8 9

0 1 2

b7 8 9

0 1 2

Hur skapar man en till vektor med samma innehåll som vektorn a?

int[] a = new int[3];a[0] = 7;a[1] = 8;a[2] = 9;int[] b = new int[a.length];for (int i = 0; i < a.length; i++) {

b[i] = a[i];}

En ny vektor med samma storlek skapas och elementen kopieras18

Page 19: EDAA20 Programmering och databaser

Genvägar (överkurs)

• Skapa vektor när man vet innehållet:int[] a = {7, 8, 9};

• Skapa en kopia av en vektor a:int[] b = Arrays.copyOf(a, a.length);

• Skriv ut innehållet av en vektor a:

System.out.println(Arrays.toString(a));

19

Page 20: EDAA20 Programmering och databaser

Övning: vad skrivs ut?public class ArrayExercise {

public static void main(String[] args) {int[] v = new int[2];v[0] = 11;v[1] = 22;m(v);System.out.println(v[0]);

}

public static void m(int a[]) {System.out.println(a[0]);a = new int[2];a[0] = 33;a[1] = 44;

}}

20

Page 21: EDAA20 Programmering och databaser

public class ArrayExercise {public static void main(String[] args) {int[] v = new int[2];v[0] = 11;v[1] = 22;m(v);System.out.println(v[0]);

}

public static void m(int a[]) {System.out.println(a[0]);a = new int[2];a[0] = 33;a[1] = 44;

}}

Övning: vad skrivs ut?

21

0v 0

Page 22: EDAA20 Programmering och databaser

public class ArrayExercise {public static void main(String[] args) {int[] v = new int[2];v[0] = 11;v[1] = 22;m(v);System.out.println(v[0]);

}

public static void m(int a[]) {System.out.println(a[0]);a = new int[2];a[0] = 33;a[1] = 44;

}}

Övning: vad skrivs ut?

22

11v 0

Page 23: EDAA20 Programmering och databaser

public class ArrayExercise {public static void main(String[] args) {int[] v = new int[2];v[0] = 11;v[1] = 22;m(v);System.out.println(v[0]);

}

public static void m(int a[]) {System.out.println(a[0]);a = new int[2];a[0] = 33;a[1] = 44;

}}

Övning: vad skrivs ut?

23

11v 22

Page 24: EDAA20 Programmering och databaser

public class ArrayExercise {public static void main(String[] args) {int[] v = new int[2];v[0] = 11;v[1] = 22;m(v);System.out.println(v[0]);

}

public static void m(int a[]) {System.out.println(a[0]);a = new int[2];a[0] = 33;a[1] = 44;

}}

Övning: vad skrivs ut?

24

11v 22

aOBS! Referensen till vektorn kopieras till parametern a

Page 25: EDAA20 Programmering och databaser

public class ArrayExercise {public static void main(String[] args) {int[] v = new int[2];v[0] = 11;v[1] = 22;m(v);System.out.println(v[0]);

}

public static void m(int a[]) {System.out.println(a[0]);a = new int[2];a[0] = 33;a[1] = 44;

}}

Övning: vad skrivs ut?

25

11v 22

a

Skriver ut 11

Page 26: EDAA20 Programmering och databaser

public class ArrayExercise {public static void main(String[] args) {int[] v = new int[2];v[0] = 11;v[1] = 22;m(v);System.out.println(v[0]);

}

public static void m(int a[]) {System.out.println(a[0]);a = new int[2];a[0] = 33;a[1] = 44;

}}

Övning: vad skrivs ut?

26

11v 22

a 0 0

Ny vektor skapas

Page 27: EDAA20 Programmering och databaser

public class ArrayExercise {public static void main(String[] args) {int[] v = new int[2];v[0] = 11;v[1] = 22;m(v);System.out.println(v[0]);

}

public static void m(int a[]) {System.out.println(a[0]);a = new int[2];a[0] = 33;a[1] = 44;

}}

Övning: vad skrivs ut?

27

11v 22

a 33 0

Page 28: EDAA20 Programmering och databaser

public class ArrayExercise {public static void main(String[] args) {int[] v = new int[2];v[0] = 11;v[1] = 22;m(v);System.out.println(v[0]);

}

public static void m(int a[]) {System.out.println(a[0]);a = new int[2];a[0] = 33;a[1] = 44;

}}

Övning: vad skrivs ut?

28

11v 22

a 33 44

Page 29: EDAA20 Programmering och databaser

public class ArrayExercise {public static void main(String[] args) {int[] v = new int[2];v[0] = 11;v[1] = 22;m(v);System.out.println(v[0]);

}

public static void m(int a[]) {System.out.println(a[0]);a = new int[2];a[0] = 33;a[1] = 44;

}}

Övning: vad skrivs ut?

29

11v 22

Page 30: EDAA20 Programmering och databaser

public class ArrayExercise {public static void main(String[] args) {int[] v = new int[2];v[0] = 11;v[1] = 22;m(v);System.out.println(v[0]);

}

public static void m(int a[]) {System.out.println(a[0]);a = new int[2];a[0] = 33;a[1] = 44;

}}

Övning: vad skrivs ut?

30

11v 22

Skriver ut 11

Programmet skriver alltså ut:1111

Page 31: EDAA20 Programmering och databaser

Vektor av objektpublic class FiveDice {

public static void main(String[] args) {Dice[] dices = new Dice[5];

// Skapa tärningarnafor (int i = 0; i < dices.length; i++) {

dices[i] = new Dice();}

// Kasta tärningarnafor (int i = 0; i < dices.length; i++) {

dices[i].roll();System.out.println("Tärning pos " + i + " visar " + dices[i].getDots());

}}

}

Vi kan skapa en vektor av objekt! (Eller snarare en vektor av referensvariabler)Programmet skapar 5 tärningar och kastar dem 31

Page 32: EDAA20 Programmering och databaser

Skapa vektor av objekt

• Skapa vektorn dices med plats för 5 Dice-objekt:Dice[] dices = new Dice[5];

• Varje vektorelement är en referensvariabel av typen Dice• Notera att vi inte har skapat Dice-objekten än, utan enbart en vektor

med plats för 5 referensvariabler som inte pekar på något (null)

nulldices null null

0 1 2

null null

3 4

32

Page 33: EDAA20 Programmering och databaser

Skapa objekten i vektorn

Skapa objekt och lägg in deras referenser i vektorn:for (int i = 0; i < dices.length; i++) {

dices[i] = new Dice();}

dices0 1 2 3 4

6side

... ...

6side

... ...

6side

... ...

6side

... ...

6side

... ...33

Page 34: EDAA20 Programmering och databaser

Klassen Triangle

Implementera klassen Triangle med följande specifikation:

/** Skapar en triangel med hörnpunkterna x1 y1, x2 y2 och x3 y3. */Triangle(int x1, int y1, int x2, int y2, int x3, int y3);

/** Flyttar triangeln dx i x-led och dy i y-led. */void move(int dx, int dy);

/** Ritar triangeln i fönstret w. */void draw(SimpleWindow w);

34

Page 35: EDAA20 Programmering och databaser

Program som använder Triangle

public class TriangleExample {public static void main(String[] args) {Triangle t = new Triangle(10, 150, 50, 10, 90, 120); SimpleWindow w = new SimpleWindow(200, 200, "Triangel");t.draw(w);t.move(20, 20);t.draw(w);

}}

35

Page 36: EDAA20 Programmering och databaser

Vilka attribut ska klassen Triangle ha?

• Hur ska klassen hålla reda på hörnen?• 6 st attribut med typen int: x1, y1, x2, y2, x3, y3?• 3 st attribut med typen Point: p1, p2, p3?• 1 vektor med tre punkter (med typen Point)?

36

Page 37: EDAA20 Programmering och databaser

Vilka attribut ska klassen Triangle ha?

• Hur ska klassen hålla reda på hörnen?• 6 st attribut med typen int: x1, y1, x2, y2, x3, y3?• 3 st attribut med typen Point: p1, p2, p3?• 1 vektor med tre punkter (med typen Point)?

• Vi väljer den tredje varianten, där vi antar att det finns en färdigimplementerad klass Point med följande specifikation:Point(int x, int y);int getX();int getY();void move(int dx, int dy); // flyttar punkten relativt

37

Page 38: EDAA20 Programmering och databaser

Klassen Triangle

Implementera klassen Triangle med följande specifikation:

/** Skapar en triangel med hörnpunkterna x1 y1, x2 y2 och x3 y3. */Triangle(int x1, int y1, int x2, int y2, int x3, int y3);

/** Flyttar triangeln dx i x-led och dy i y-led. */void move(int dx, int dy);

/** Ritar triangeln i fönstret w. */void draw(SimpleWindow w);

38

Page 39: EDAA20 Programmering och databaser

Konstruktornpublic class Triangle {

private Point[] vertices;

/** Skapar en triangel med hörnpunkterna x1 y1, x2 y2 och x3 y3. */public Triangle(int x1, int y1, int x2, int y2, int x3, int y3) {vertices = new Point[3];vertices[0] = new Point(x1, y1);vertices[1] = new Point(x2, y2);vertices[2] = new Point(x3, y3);

}

...}

Konstruktorn skapar både vektorn och Point-objekten39

Page 40: EDAA20 Programmering och databaser

Attributet vertices

Vektor av referensvariabler

vertices0 1 2

90x

y 120

50x

y 10

10x

y 150

40

Page 41: EDAA20 Programmering och databaser

Metoden movepublic class Triangle {

private Point[] vertices;...

/** Flyttar triangeln dx i x-led och dy i y-led. */public void move(int dx, int dy) {

for (int i = 0; i < vertices.length; i++) { vertices[i].move(dx, dy);

}}

...}

Gå igenom vektorn med punkter och anropa metoden move på varje punkt41

Page 42: EDAA20 Programmering och databaser

Metoden draw

public class Triangle {private Point[] vertices;...

/** Ritar triangeln i fönstret w. */public void draw(SimpleWindow w) {

// använd w.moveTo och w.lineTo

}

...}

Flytta först till sista punkten, därefter ritar vi ett sträck till punk 0, till punkt 1, till punkt 2.

vertices[2]

vertices[1]

vertices[0]

42

Page 43: EDAA20 Programmering och databaser

Metoden draw

public class Triangle {private Point[] vertices;...

/** Ritar triangeln i fönstret w. */public void draw(SimpleWindow w) {w.moveTo(vertices[2].getX(), vertices[2].getY());w.lineTo(vertices[0].getX(), vertices[0].getY());w.lineTo(vertices[1].getX(), vertices[1].getY());w.lineTo(vertices[2].getX(), vertices[2].getY());

}

...}

vertices[2]

vertices[1]

vertices[0]

Flytta först till sista punkten, därefter ritar vi ett sträck till punk 0, till punkt 1, till punkt 2.

43

Page 44: EDAA20 Programmering och databaser

Metoden draw

public class Triangle {private Point[] vertices;...

/** Ritar triangeln i fönstret w. */public void draw(SimpleWindow w) {w.moveTo(vertices[2].getX(), vertices[2].getY());for (int i = 0; i < vertices.length; i++) {

w.lineTo(vertices[i].getX(), vertices[i].getY());}

}

...}

vertices[2]

vertices[1]

vertices[0]

Använd en for-sats istället för att upprepa koden!

Flytta först till sista punkten, därefter ritar vi ett sträck till punk 0, till punkt 1, till punkt 2.

44