Einführung in die Java- Programmierung

Werbung
Einführung in die JavaProgrammierung
Dr. Volker Riediger
Tassilo Horn
riediger|[email protected]
WiSe 2012/13
1
Wichtig...
●
Mittags keine Pommes...
●
Praktikum
●
●
●
A 230 → C 207
(Madeleine + Esma)
●
F 112 → F 113
(Kevin + Ich?)
●
E 413 → E 313
(Jan)
Evaluation
Teilnahmebescheinigungen: E-Mail an
[email protected]
2
Rückblick
●
Rechen(un)genauigkeit
●
Arrays als Referenztypen
●
Mehrdimensionale Arrays
3
Heutige Themen
●
Erste Einblicke in die objektorientierte
Programmierung
4
Objektorientierte
Programmierung
●
Motivation: Wir erinnern uns, dass
Fließkommazahlen (double) nicht beliebig
präzise sind
2.05 – 0.05 // = 1.9999999999998
●
Es ist aber 2.05 = 41/20, 0.05 = 1/20, so
dass wir präzise mit den Brüchen rechnen
können
41/20 – 1/20 = 40/20 = 2/1 = 2
●
Leider gibt es in Java keinen Datentyp für
rationale Zahlen :-(
5
Rationale Zahlen
●
Analog zur Darstellung von Punkten
mittels mehrerer Variablen, könnten wir
auch Brüche mit 2 Variablen darstellen
int a_z = 41; int a_n = 20;
int b_z = 1;
int b_n = 20;
int c_z = a_z – b_z;
int c_n = a_n;
6
Rationale Zahlen
●
Blöd wird es, wenn die Nenner nicht
gleich sind:
int a_z = 41; int a_n = 3;
int b_z = 1;
int b_n = 4;
// Wir müssen auf Nenner 12 erweitern
int c_z = a_z * 4 – b_z * 3;
int c_n = 3 * 4;
7
Rationale Zahlen
●
Ein wenig besser wird es, wenn wir Brüche als
Arrays der Länge 2 auffassen
int[] a = {41, 3};
int[] b = {1,
4};
// Wir müssen auf Nenner 12 erweitern
int[] c = {a[0] * b[1] – b[0] * a[1],
a[1]*b[1]};
// Die Rechnung an sich ist immer noch
// unübersichtlich!
8
Rationale Zahlen
●
Was wir eigentlich sagen wollen, ist in etwa:
Rational a = 41/3;
Rational b = 1/4;
// Um richtiges erweitern wollen wir uns
// nicht selbst kümmern müssen!
Rational c = a - b;
System.out.println(c); // Ausgabe???
9
Wunsch
●
Wir möchten einen eigenen Datentyp
Rational definieren
●
●
Wir wollen alle arithmetischen Operationen
mit Werten dieses Typs nutzen können
Wir (als Programmierer, die diesen Typ
benutzen) wollen uns nicht um
Nebensächlichkeiten wie Erweitern, Kürzen,
etc. kümmern
10
Klassen & Objekte
●
●
Eine Klasse ist ein (Referenz-)Datentyp
Eine Klasse beschreibt die Eigenschaften,
die Werte dieses Datentyps haben
●
●
●
Zunächst beschränken wir uns darauf, dass
eine Eigenschaft eine Variable (Attribut) ist
Frage: Welche Eigenschaften hat eine rationale
Zahl?
Einen Wert vom Typ einer Klasse nennt man
meist Objekt oder Instanz der Klasse
11
Klassen & Objekte
●
Ohne es zu wissen, haben wir schon die
ganze Zeit mit Klassen und Objekten
gearbeitet
String ist eine Klasse
"Alice" ist ein Objekt der Klasse String
●
●
Im Gegensatz dazu sind alle klein
geschriebenen Typen (int, long, double,
boolean) keine Klassen, sondern sog.
primitive Typen
Nicht wichtig, aber der Vollständigkeit halber: Ein Array ist
ein Objekt, aber int[] ist keine Klasse
12
Demo: Rational.java
●
Aufgabe: Schreibe eine Klasse Rational, welche die
Eigenschaften (Bestandteile) einer rationalen Zahl als
Attribute deklariert
●
●
Aus welchen Bestandteilen besteht eine rationale
Zahl?
Grundgerüst einer Klasse:
public class MyClass {
// Deklaration der Bestandteile
// als Attribute
}
13
Erzeugung von Objekten
●
●
●
Um ein Objekt einer Klasse zu erzeugen, muss die Klasse
einen Konstruktor definieren
Ein Konstruktor ist eine spezielle Methode, die genau wie
die Klasse heißt und keinen Return-Typ deklariert
Beispiel:
public class MyClass {
public MyClass(double x, int y) {
// Initialisiere Attribute anhand von
// den gegebenen Parametern
}
}
14
Demo: Rational.java
●
Aufgabe: Definiere einen Konstruktor für
unsere Klasse Rational
●
●
Welche Parameter sollte dieser Konstruktor
bekommen?
Gibt es ungültige Parameterwerte?
15
Erzeugung von Objekten
●
●
Definiert eine Klasse einen Konstruktor, so kann
man ein Objekt dieser Klasse mit dem von
Arrays bekannten new-Operator erzeugen
Beispiel:
MyClass mc = new MyClass(1.4, 17);
16
Demo: Rational.java
●
Aufgabe: Erstelle in unserer RationalKlasse eine main()-Methode und erzeuge
dort ein paar Rational-Objekte
●
Gib die erzeugten Objekte mit
System.out.println() aus
17
Ein Ausgabeformat definieren
●
●
Falls ein Objekt (für die Ausgabe) in einen String konvertiert
wird, dann ruft Java automatisch eine Methode toString() auf
Möchte man ein eigenes Ausgabeformat definieren, dann kann
man in seiner eigenen Klasse einfach eine toString()-Methode
definieren
public class MyClass {
// kein static: diese Methode gehört Objekten
// der Klasse, nicht der Klasse an sich
public String toString() {
// Ausgabe-String x berechnen
return x;
}
}
18
Demo: Rational.java
●
Aufgabe: Definiere eine toString()Methode für unsere Rational-Klasse
●
●
Ist der Nenner gleich 1, dann soll
einfach der Zähler (als String)
zurückgegeben werden
Ansonsten soll die übliche Form
"Zähler/Nenner" verwendet werden
19
Demo: Kürzen!
●
Prima, bis jetzt können wir rationale Zahlen
●
●
●
erzeugen (Konstruktor mit new aufrufen)
ausgeben (da toString() geeignet definiert
wurde)
Aufgabe: Verbessere unsere Rational-Klasse
derart, dass alle rationalen Zahlen automatisch
gekürzt werden!
System.out.println(new Rational(2, 4));
// Es soll 1/2 statt 2/4 ausgegeben werden
20
Demo: Kürzen!
●
●
●
Aufgabe: Verbessere unsere Rational-Klasse
derart, dass alle rationalen Zahlen (Brüche)
automatisch gekürzt werden!
Idee: Direkt bei der Initialisierung von Zähler
und Nenner im Konstruktor kürzen
Regel zum Kürzen: ???
21
Demo: Kürzen!
●
●
●
Aufgabe: Verbessere unsere Rational-Klasse
derart, dass alle rationalen Zahlen (Brüche)
automatisch gekürzt werden!
Idee: Direkt bei der Initialisierung von Zähler
und Nenner im Konstruktor kürzen
Regel zum Kürzen:
●
Bestimme den ggT von Zähler und Nenner
●
Dividiere Zähler und Nenner durch den ggT
22
Demo: Multiplizieren
●
Aufgabe: Ergänze unsere Rational-Klasse um
eine Methode mul(), mit der wir eine rationale
Zahl mit einer anderen rationalen Zahl
multiplizieren können
●
Die Methode soll unser Rational-Objekt nicht
verändern, d.h. dessen Attribute ändern,
sondern es soll ein neues Rational-Objekt
zurückgegeben werden
23
Demo: Dividieren
●
Aufgabe: Ergänze unsere Rational-Klasse um
eine Methode div(), mit der wir eine rationale
Zahl durch eine anderen rationalen Zahl
dividieren können
●
●
Es soll wieder ein neues Rational-Objekt
zurückgegeben werden
Frage: Wie dividiert man rationale Zahlen
(Brüche)?
24
Demo: Dividieren
●
Aufgabe: Ergänze unsere Rational-Klasse um
eine Methode div(), mit der wir eine rationale
Zahl durch eine anderen rationalen Zahl
dividieren können
●
●
Es soll wieder ein neues Rational-Objekt
zurückgegeben werden
Frage: Wie dividiert man rationale Zahlen
(Brüche)?
–
Einfach mit dem Kehrwert multiplizieren
25
Demo: Addieren
●
Aufgabe: Ergänze unsere Rational-Klasse um
eine Methode add(), mit der rationale Zahlen
addieren können
●
●
Es soll wieder ein neues Rational-Objekt
zurückgegeben werden
Frage: Wie addiert man rationale Zahlen
(Brüche)?
26
Demo: Addieren
●
Aufgabe: Ergänze unsere Rational-Klasse um
eine Methode add(), mit der rationale Zahlen
addieren können
●
●
Es soll wieder ein neues Rational-Objekt
zurückgegeben werden
Frage: Wie addiert man rationale Zahlen
(Brüche)?
–
Man muss die Brüche auf den gleichen
Nenner bringen (erweitern)!
27
Demo: Subtrahieren
●
Aufgabe: Ergänze unsere Rational-Klasse um
eine Methode sub(), mit der rationale Zahlen
voneinander subtrahiert werden können
●
●
Es soll wieder ein neues Rational-Objekt
zurückgegeben werden
Frage: Wie subtrahiert man rationale Zahlen
(Brüche)?
28
Demo: Subtrahieren
●
Aufgabe: Ergänze unsere Rational-Klasse um
eine Methode sub(), mit der rationale Zahlen
voneinander subtrahiert werden können
●
●
Es soll wieder ein neues Rational-Objekt
zurückgegeben werden
Frage: Wie subtrahiert man rationale Zahlen
(Brüche)?
–
Na klar, einen der Brüche negieren und
dann addieren
29
Demo: Vergleichen
●
●
●
Soweit können wir rationale Zahlen
●
erzeugen
●
ausgeben
●
und damit Rechnen
Was uns noch fehlt ist eine Möglichkeit,
rationale Zahlen zu vergleichen
Klassen sind Referenztypen, bei denen
man mit equals() einen inhaltlichen
Vergleich macht
30
Demo: Vergleichen
●
Aufgabe: Füge der Rational-Klasse eine
equals()-Methode hinzu, mit der man
zwei Rationalzahlen vergleichen kann
31
Demo: Nach double
konvertieren
●
Aufgabe: Füge der Rational-Klasse eine
toDouble()-Methode hinzu, die eine
Fließkommarepräsentation der rationalen
Zahl liefert
32
Für die Übung
●
●
Wer in der Übung gerne eine OO-Aufgabe
lösen möchte, der kann gerne die
folgende Aufgabe bearbeiten
Aufgabe: Erstelle nach dem Muster der
Klasse Rational eine Klasse Complex, mit
der sich komplexe Zahlen darstellen
lassen
●
Die Rechenregeln sind einfacher als bei
Rational und sind auf der Wikipedia gut
beschrieben
33
Herunterladen