EDAA20 Programmering och databaser
Transcript of EDAA20 Programmering och databaser
EDAA20Programmering och databaser
Föreläsning 9 – Filer & vektorer av objekt2021-09-27, Niklas Fors, @Zoom
Programmering F föreläsningar, L datorlaborationer (obligatoriska), R resurstidv4218/10-22/10
Instuderings-vecka
Tenta, måndag 25 oktober v43
2
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
• 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
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
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
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.
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.
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
Snabbreferensen
10
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
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
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
Vektorer är objekt
Vektorer i Java är objekt. Referensvariabeln v refererar till vektorn
0v 0 0
0 1 2
0 0
3 4
14
Ö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
Ö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
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;
???
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
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
Ö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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
Attributet vertices
Vektor av referensvariabler
vertices0 1 2
90x
y 120
50x
y 10
10x
y 150
40
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
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
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
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