INE2 (Die weite Reise ) von C zu Java Teil 1: Grundlagen

Werbung
INE2
(Die weite Reise ) von C zu Java
Teil 1: Grundlagen
■ Anweisungen
■ Variablen und Datentypen
■ Ausdrücke und Operatoren
■ Entscheidungen
■ Wiederholungen
■ Methoden und Parameterübergabe
Anweisungen
School of Engineering
© G. Burkert, K. Rege, ZHAW
2 von 87
Anweisungen in Java
■ Wie in anderen imperativen Programmiersprachen (C...) werden Anweisungen in Java
der Reihe nach von links nach rechts und oben nach unten abgearbeitet
■ Jede Anweisung muss mit einem ";" enden
■ Ein Anweisung kann auch leer sein:
; // Dies ist eine Leeranweisung
■ Beispiel
System.out.println("Hello");
School of Engineering
© G. Burkert, K. Rege, ZHAW
3 von 87
Anweisungssequenz
public class HelloYouThere {
public static void main(String[] args) {
System.out.println("Hello");
System.out.println ("you");
System.out.println ("there");
}
}
Das Programm erzeugt auf der Konsole folgende Zeilen:
Hello
you
there
School of Engineering
© G. Burkert, K. Rege, ZHAW
4 von 87
Anweisungssequenz
School of Engineering
© G. Burkert, K. Rege, ZHAW
5 von 87
Variablen
■ Variablen müssen vor ihrer Verwendung vereinbart werden
■ Vereinbarung einer Variablen laenge vom Typ int (integer):
int laenge;
School of Engineering
© G. Burkert, K. Rege, ZHAW
6 von 87
Zuweisung
■ Eine Zuweisung ist eine Anweisung, die einer Variablen einen neuen Wert zuweist
■ Allgemeine Form einer Zuweisung in Java:
■ Ausdruck: Bezeichnet eine einzelne Zahl, Variable oder eine ganze Berechnung
Beispiele
flaeche = laenge * breite;
n = n + 1;
x = Math.cos(winkel) * radius
School of Engineering
© G. Burkert, K. Rege, ZHAW
7 von 87
Kommentare
// this line is ignored by Java
■ bezeichnet einen einzeiligen Kommentar (geht bis zum Ende der Zeile)
/* comment1
comment2 */
■ bezeichnet einen mehrzeiligen Kommentar
/** comment1
comment2 */
■ bezeichnet einen mehrzeiligen Kommentar für die Dokumentation (JavaDoc)
School of Engineering
© G. Burkert, K. Rege, ZHAW
8 von 87
Variablen und Datentypen
School of Engineering
© G. Burkert, K. Rege, ZHAW
9 von 87
Gültige Variablennamen in Java
■ Erstes Zeichen: Buchstabe (Unicode) , _ oder $
■ Nachfolgende Zeichen: Buchstaben , Ziffern , _ oder $
■ Namen können beliebig lange sein
■ Keine reservierten Wörter erlaubt (public, class, extends, implements etc.) à beliebter
Fallstrick!
■ Java ist case sensitive:
Gross- und Kleinbuchstaben werden unterschieden!
D.h. A und a sind zwei verschiedene Variablen (Speicherplätze)
■ Variablennamen dürfen beliebige UNICODE Zeichen enthalten also auch Umlaute
School of Engineering
© G. Burkert, K. Rege, ZHAW
10 von 87
Variablennamen
■ Beispiele für gültige Variablennamen:
breite
Hoehe
LÄNGE
jahr2000
x
b$3_n
■ Beispiele für illegale Variablennamen:
neues Haus
1Ka
School of Engineering
© G. Burkert, K. Rege, ZHAW
11 von 87
Namenskonventionen
■ Variablen und Methodennamen beginnen in Java mit einem Kleinbuchstaben
■ Klassennamen beginnen mit einem Grossbuchstaben
■ Bei Namen aus mehreren Wörtern wird der Anfangsbuchstabe jedes neuen Wortes
gross geschrieben
■ Beispiele : paint, drawString, Grafik , Applet, rateProMonat, dezemberLohn, setzeFarbe,
liesBuchstaben, endeMonat, besteNote
■ Wichtig beim Programmieren: Sinnvolle und präzise Namen verwenden (Länge des
Namens ist weniger wichtig)
School of Engineering
© G. Burkert, K. Rege, ZHAW
12 von 87
Variablendeklaration
public class Berechnung {
public static void main(String[] args){
// Deklaration lokaler Variablen
int laenge;
// einfache Deklaration
int breite = 10;
// Deklaration mit Initialisierung
int flaeche, flaeche2 = 100;
// Mehrere Deklarationen
// Hier folgen die Anweisungen
laenge = 20;
// Dies ist eine Anweisung!
flaeche = laenge * breite;
// 2. Anweisung
System.out.println("Flaeche = " + flaeche);
}
}
School of Engineering
© G. Burkert, K. Rege, ZHAW
13 von 87
Lokale Variablen
■ Werden Variablen innerhalb einer Methode deklariert, so sind sie nur in dieser Methode
sichtbar
(nicht-lokale Variablen siehe später)
■ Empfehlung: Alle Variablen an derselben Stelle vor der ersten Anweisung deklarieren
School of Engineering
© G. Burkert, K. Rege, ZHAW
14 von 87
Variablendeklaration
■ Beispiele gültiger Deklaration einer lokalen Variablen in Java
double laenge;
int laenge = 4;
String name = "Quadrat"
■ Interpretation:
■ Zuerst muss ein Datentyp angegeben werden:
Typ ersetzen z.B. durch int oder double
■ Dann muss ein Variablennamen angegeben werden:
Variablennamen z.B. durch laenge ersetzen
School of Engineering
© G. Burkert, K. Rege, ZHAW
15 von 87
Einfache Datentypen (Primtive Datatypes)
■ Ganze Zahlen
■ Fliesskommazahlen
■ Wahrheitswerte (Boolean)
■ Alphanumerische Zeichen
School of Engineering
© G. Burkert, K. Rege, ZHAW
16 von 87
Ganze Zahlen
■ Vier Datentypen mit unterschiedlichen Wertebereichen
■ byte (8 Bit), short (16 Bit), int (32 Bit), long (64 Bit)
uC
z
d
e
i
sch
Unter
?
■ Beispiele von Variablendeklarationen mit Initialisierung:
byte b = 127;
short s = -1214;
long l = 104L;
School of Engineering
int i = -25;
int k = 0x6B; // hex, dez: 107
© G. Burkert, K. Rege, ZHAW
17 von 87
Ganze Zahlen
■ Wertebereiche
Typ
Grösse
[Bits]
byte
8
short
negativer
Maximalwert
positiver
Maximalwert
-128
127
16
-32768
32767
int
32
-2147483648
2147483647
long
64
-9223372036854775808
9223372036854775807
School of Engineering
© G. Burkert, K. Rege, ZHAW
18 von 87
Fliesskommazahlen
■ Zwei Datentypen mit unterschiedlichen Wertebereichen und Genauigkeiten
float (32 Bit), double (64 Bit)
Typ
Grösse
[Bits]
Max.wert
Min.wert
Präzision
float
32
± 3.4e+38
±1.4e-45
6-7 Dez.Stellen
double
64
± 1.79e+308
±4.9e-324
14-15 Stellen
School of Engineering
© G. Burkert, K. Rege, ZHAW
19 von 87
Fliesskommazahlen
■ double
■
Beispiele:
1.34, -10.3, 1.e5, 5d, 0.3D, .001
■ float (diesen Datentyp vermeiden)
■
Beispiele:
1.34f, -234.837F, 1E-3F, 3f, 0.75f, .001f
■
Ohne f am Schluss wird automatisch der Datentyp double angenommen
School of Engineering
© G. Burkert, K. Rege, ZHAW
20 von 87
Logische Werte
■ Datentyp boolean
■ Umfasst nur die Werte true und false
■ Beispiele von Variablendeklarationen mit Initialisierung:
boolean ready = false;
boolean ok = true;
uC
z
d
e
i
sch
Unter
School of Engineering
© G. Burkert, K. Rege, ZHAW
?
21 von 87
Zeichen (Character)
■ Einfacher Datentyp für einzelne Zeichen: char
■ char-Literale mit einfachen Anführungsstrichen:
'a', 'T', '3', ' ', '@', '.', 'ü'
■ Länge: 16 Bit (Unicode eines Zeichens)
■ Unicode 0x0000 bis 0x007F entsprechen dem ASCII-Code
Deklaration:
Zuweisung zu einer char-Variablen:
char ch;
char grossM =
'M';
char ue = 'ü';
ch = 'a';
ch = grossM;
School of Engineering
© G. Burkert, K. Rege, ZHAW
22 von 87
Vergleich von Zeichen
■ Characters sind nach ihrem Unicode geordnet
■ 'A' hat den Unicode 0041 (Hex), 'B' hat den Unicode 0042 usw.
■ Die Kleinbuchstaben beginnen bei Unicode 0061
if (ch == 's') {...}
// falls ch das Zeichen 's' ist ...
'b' > 'a'
// ist true, da der Unicode von 'b'
// grösser ist als der von 'a'
if (ch > 'a') {...}
// true für ch = 'b', 'c', 'd', ...
if (ch != ' ') {...}
// falls ch nicht der Leerschlag ist, ...
School of Engineering
© G. Burkert, K. Rege, ZHAW
23 von 87
Übung
■ wahr oder falsch?
'n' == 'n'
// immer true
'k' > 'o'
// false
'3' > '2'
// true
'A' <= 'a'
// true
ch >= 'a' && ch <= 'z'
// true für a-z
School of Engineering
© G. Burkert, K. Rege, ZHAW
24 von 87
Spezielle Zeichen
'\n'
Neue Zeile
'\t'
Tabulator
'\r'
Carriage return (Wagenrücklauf)
'\f'
Form Feed (neue Seite)
'\"'
Anführungszeichen
'\''
Apostroph
'\\'
Backslash '\'
'\uxxxx'
Unicode-Zeichen mit Hexcode xxxx
Beispiel: '\u0040' für '@'
School of Engineering
© G. Burkert, K. Rege, ZHAW
25 von 87
Einfache Datentypen (Wertetypen)
■ Speichern und Verarbeiten einzelne Werte (Zahlen, Buchstaben, logische Werte)
■ Variablenname bezeichnet den Speicherplatz, wo der Wert abgespeichert ist
■ Speicherplatz wird bei der Deklaration der Variablen reserviert
School of Engineering
© G. Burkert, K. Rege, ZHAW
26 von 87
Einfache Datentypen (Wertetypen)
■ Nur ein Wert
int, double, double, boolean, char, ...
■ Bei Zuweisungen und Methodenaufrufen wird nur Kopie des Wertes übergeben („by
value“)
a = 5;
a
5
b
7 5
b = 7;
b = a;
School of Engineering
© G. Burkert, K. Rege, ZHAW
27 von 87
Referenz Datentypen (= Pointer)
■ Speichern und Verarbeiten mehrerer Werte zusammen
■ Die einzelnen Werte vom gleichen oder von unterschiedlichem Datentyp sein
■ Beispiel: Arrays, Objekte (später)
■ Bei der Deklaration der Variablen wird nur Platz für die Adresse der eigentlichen Daten
reserviert
int[] a
= new int[10];
int[] b = a;
School of Engineering
© G. Burkert, K. Rege, ZHAW
28 von 87
Keine Pointer in Java?
■ In Java bestimmt immer der Datentyp, ob in den Variablen der Wert oder lediglich eine
Referenz (ein Pointer) in der Variablen gespeichert wird.
Werte(Typ)
Werte(Typ)->->Variable
Variableenthält
enthält
Wert
Wert
int a
= 5;
int b = a;
Referenz(Typ)
Referenz(Typ)->->Variable
Variableenthält
enthält
"Pointer"
"Pointer"
int[] a
= new int[10];
int[] b = a;
School of Engineering
© G. Burkert, K. Rege, ZHAW
29 von 87
Ausdrücke und Operatoren
School of Engineering
© G. Burkert, K. Rege, ZHAW
30 von 87
Ausdruck (Expression)
■ Ein Ausdruck ist eine einzelne Zahl oder eine ganze Berechnung, d.h. eine Folge von
Operanden und Operatoren
■ Ein Ausdruck liefert immer ein Ergebnis mit einem bestimmten Datentyp, z.B. int
■ Operanden können sein:
■
Literale (z.B. Zahlen) und Variablen
■
Funktionsaufruf (ein Aufruf liefert immer einen Funktionswert zurück)
■ Operatoren: z.B. +, -, *, /, aber auch > , <
School of Engineering
© G. Burkert, K. Rege, ZHAW
31 von 87
Arithmetische Operatoren
■ Präzedenz (Vorrang) bestimmt die Reihenfolge
der Auswertung der Ausdrücke
■ Ein Operator der Präzedenz 2 wird vor den
Operatoren der Präzedenz 3 ausgeführt!
■ Bei gleicher Präzedenz werden die Ausdrücke
von Links nach Rechts ausgewertet.
■ Mit Klammern kann die Präzedenz übersteuert
werden.
Beispiele
int resultat;
resultat = 4 * 8 + 2;
resultat = 6 + 3 * 4 - 1;
resultat = 3 + ( 2 - 2 ) * 3;
School of Engineering
© G. Burkert, K. Rege, ZHAW
// = 34
// = 17
// = 3
32 von 87
Division
■ Division / führt je nach Typ der beteiligten Variablen eine normale Division oder aber
eine Ganzzahldivision durch
■ Achtung: Bei Ganzzahldivision wird (wie in C) nicht gerundet, sondern der Rest nach
dem Dezimalpunkt abgeschnitten!
■ Beispiele:
int
a =
x =
a =
x =
a; double x;
15 / 4;
15 / 4;
9 / 4;
9 / 4;
School of Engineering
//
//
//
//
a
x
a
x
=
=
=
=
3
3.75
2 !!
2.0!!
© G. Burkert, K. Rege, ZHAW
33 von 87
Modulo, %
■ Modulo (Rest-Operator) gibt den Rest der Division zurück
■ Er ist auch für Fliesspunktzahlen definiert (double, double);
dabei verhält er sich wie bei ganzen Zahlen
■ Beispiele:
int
a =
a =
a =
x =
x =
x =
a; double x;
12 % 4;
// a
13 % 4;
// a
15 % 4;
// a
7.0 % 2.0; // x = 1.0
8.6 % 2.0;
// x
7.1 % 2.5;
// x
School of Engineering
= 0 (kein Rest)
= 1 (Rest 1)
= 3
= 0.6
= 2.1
© G. Burkert, K. Rege, ZHAW
34 von 87
Operatoren
School of Engineering
© G. Burkert, K. Rege, ZHAW
35 von 87
Bibliothek der mathematischen Funktionen
■ Klasse mit den wichtigsten mathematischen Funktionen und Konstanten:
java.lang.Math
■ Wird automatisch importiert
■ Konstanten
Math.E
Math.PI
Konstante e
Konstante pi
■ Methoden: es muss jeweils die Klasse (= Math) angegeben werden
double ceil(double x)
Aufrunden auf nächst grössere ganze Zahl
double floor(double x)
Abrunden auf nächst kleinere ganze Zahl
int round(double x)
Math. Runden auf nächste ganze Zahl.
...
...
Bsp: i = Math.round(d);
School of Engineering
© G. Burkert, K. Rege, ZHAW
36 von 87
Ausnahmebedingungen
■ Beim Rechnen mit Ganzzahlendatentypen können unterschiedliche Ausnahmen
auftreten:
■
Überläufe führen zu falschem Ergebnis
■
Division durch 0 bei ganzen Zahlen führt zu einer Arithmetic-Exception (Programmabbruch)
■ Bei Fliesskommazahlen können spezielle Grenzwerte auftreten:
1.0/0
-1.0/0
0/0
-> POSITIVE_INFINITY
-> NEGATIVE_INFINITY
-> NaN
School of Engineering
plus unendlich
minus unendlich
keine Zahl
© G. Burkert, K. Rege, ZHAW
37 von 87
Typenumwandlungen
School of Engineering
© G. Burkert, K. Rege, ZHAW
38 von 87
Typumwandlung (Type Cast)
■ Bevor ein Ausdruck ausgewertet wird, müssen alle Operanden in denselben Datentyp
umgewandelt werden à Typkonversion
■ Einzelne Typkonversionen werden von Java automatisch ausgeführt
■ Andere müssen vom Programmierer explizit angegeben werden
School of Engineering
© G. Burkert, K. Rege, ZHAW
39 von 87
Implizite Typumwandlung
■ Regel:
■ Bei Operationen mit gemischten Datentypen wird jeweils der Wert mit dem niedrigeren
Datentyp in den höheren Datentyp des anderen umgewandelt
■ Typenhierarchie:
Genauigkeitsverlust
möglich !
School of Engineering
double
float
long
int
short
byte
(höchster Typ)
(niedrigster Typ)
© G. Burkert, K. Rege, ZHAW
40 von 87
Explizite Typkonversion
■ Eine explizite Typkonversion erreicht man mit dem Cast-Operator:
■ Der gewünschter Datentyp wird dabei in runden Klammern (Typ) vor die zu
konvertierende Variable gestellt
(int)x
(double)x
// x wird in int-Wert umgewandelt
// x wird in double-Wert umgewandelt
School of Engineering
© G. Burkert, K. Rege, ZHAW
41 von 87
Typkonversion – Beispiel
■ Achtung:
Cast-Operator hat Präzedenz 1 und wird deshalb zuerst ausgeführt!
x = (double) (10+11)/2;
x = (double) ((10+11)/2);
x = (int) 0.5 * 100;
x = (int) (0.5 * 100);
School of Engineering
// x = 10.5
// x = 10.0
// x = 0
// x = 50
© G. Burkert, K. Rege, ZHAW
42 von 87
Umwandlungen mit Datentyp char
■ Implizite Typumwandlung
■
char nach int oder long
■ Explizite Typumwandlung
■
■
int oder long nach char mit Type-Cast: (char)
nur die niedrigsten 16 Bit berücksichtigt
int
i =
c =
i =
c =
i; char c = 'A';
c; System.out.println(i);
// 65
65; System.out.println(c);
// A
0x10000 + 65; System.out.println(i);
// 65601
(char)i; System.out.println(c);
// A
School of Engineering
© G. Burkert, K. Rege, ZHAW
43 von 87
String (Einführung)
■ String ist in Java ein eigener Datentyp (eigentlich eine Klasse)
String s = "hallo";
System.out.println(s);
■ Strings können mit dem + -Operator zusammengehängt werden
String s = "Hallo " + "Welt";
System.out.println(s);
School of Engineering
© G. Burkert, K. Rege, ZHAW
44 von 87
Stringverkettung
■ Wird ein String mit dem + -Operator mit einer numerischen Variablen (hier area)
verknüpft, so wird der Wert der Variablen automatisch in einen String konvertiert!
System.out.println("Area is " + area);
■ Typkonversion von int zu String geschieht fortlaufend (normalerweise von links nach
rechts):
System.out.println("Resultat = " + 1 + 2);
Achtung: Resultat = 12
System.out.println("Resultat = " + (1 + 2));
Achtung: Resultat = 3
School of Engineering
© G. Burkert, K. Rege, ZHAW
45 von 87
Entscheidungen
School of Engineering
© G. Burkert, K. Rege, ZHAW
46 von 87
Der Block
■ Grundbaustein einer Ablaufstruktur
■ Enthält beliebig viele (auch gar keine!) Anweisungen
■ Genau ein Eingang und ein Ausgang
■ Block in Java:
■
■
■
Umgeben von geschweiften {...} Klammern, aneinandergereiht
Ein Block wird wie eine einzelne Anweisung behandelt
Wo einzelne Anweisungen erlaubt sind, kann auch ein Block eingefügt werden
School of Engineering
© G. Burkert, K. Rege, ZHAW
47 von 87
Auswahlanweisung: if...else
if (alter > 6) {
if (alter < 16) {
System.out.println("Junior");
} else {
System.out.println("Erwachsen");
}
}
zu C
d
e
i
h
sc
Unter
School of Engineering
© G. Burkert, K. Rege, ZHAW
?
48 von 87
Mehrfachauswahl: switch
School of Engineering
© G. Burkert, K. Rege, ZHAW
49 von 87
Mehrfachauswahl: switch (Beispiel)
int day = 3;
switch( day ) {
case 1: System.out.println("Montag");
break;
case 2: System.out.println("Dienstag");
break;
case 3:
case 4: System.out.println("Mittwoch oder " +
"Donnerstag");
break;
…
default: System.out.println("kein Tag");
}
School of Engineering
© G. Burkert, K. Rege, ZHAW
50 von 87
Vergleichsoperatoren
■ Auswahlanweisungen enthalten als Bedingungen häufig Vergleichsoperatoren
■ Ausdrücke mit solchen Operatoren liefern als Resultat einen der zwei Werte true (wahr;
richtig) oder false (falsch)
■ Java bietet die Vergleichsoperatoren:
■
Grösser als
>
■
Kleiner als
<
■
Gleich
==
(NICHT: =)
■
Nicht gleich
!=
(NICHT: <>)
■
Kleiner oder gleich
<=
■
Grösser oder gleich
>=
School of Engineering
© G. Burkert, K. Rege, ZHAW
51 von 87
Logische Operatoren
■ Zum Verknüpfen
mehrerer
Bedingungen
UND-Operator &&
ODER-Operator ||
NICHT-Operator !
School of Engineering
© G. Burkert, K. Rege, ZHAW
52 von 87
Logische Variablen
■ Logische Ausdrücke haben als Resultat entweder „wahr“ oder „falsch“
■ Eigener Datentyp in Java:
boolean
■ Wertebereich:
{ true, false }
■ Deklaration:
boolean gezeichnet;
boolean fertig = false;
School of Engineering
© G. Burkert, K. Rege, ZHAW
53 von 87
Logische Variablen
■ Zuweisung
fertig = true;
■ In Bedingungen:
if (fertig) { System.out.println("bye"); }
■ Bitte verwenden Sie solche „Flags“ sparsam!
School of Engineering
© G. Burkert, K. Rege, ZHAW
54 von 87
Rückgabewert boolean
■ Definition einer Methode mit Rückgabewert vom Typ boolean:
public boolean istGeradeZahl (int n) {
return (n%2) == 0;
}
■ Der Methodenname soll ausdrücken, dass die Methode den Typ boolean zurückgibt:
istIrgendwas(...), existsSomething(...), ...
School of Engineering
© G. Burkert, K. Rege, ZHAW
55 von 87
Ausdruck mit Bedingung
■ Für eine einfache Auswahl innerhalb eines Ausdrucks gibt es eine Kurzform:
min = a < b ? a : b ;
■
Ist eine Kurzform für:
if (a < b ) min = a;
else min = b;
■ Allgemein:
<bedingung> ? <wert wenn true> : <wert wenn false>
■ Nur verwenden, wenn nicht auf Kosten der Lesbarkeit!
School of Engineering
© G. Burkert, K. Rege, ZHAW
56 von 87
Wiederholungen
School of Engineering
© G. Burkert, K. Rege, ZHAW
57 von 87
Schleifen in Java
School of Engineering
© G. Burkert, K. Rege, ZHAW
58 von 87
Schleifen in Java: while
■ Form:
while ( Bedingung ) Block
■ Bedingung: logischer Ausdruck, der wahr oder falsch ist
■ Block wird solange ausgeführt, wie die Bedingung erfüllt ist (evtl. gar nicht)
■ Block kann auch leer sein!
School of Engineering
© G. Burkert, K. Rege, ZHAW
59 von 87
Schleifen in Java: do..while
■ Form:
do
Block
while ( Bedingung );
■ Bedingung: logischer Ausdruck, der wahr oder falsch ist
■ Block wird mindestens einmal ausgeführt
■ Block wird danach solange ausgeführt, wie die Bedingung erfüllt ist (evtl. kein weiteres
mal)
School of Engineering
© G. Burkert, K. Rege, ZHAW
60 von 87
Beispiel: do..while
■ Wir würfeln:
int wurf = 0;
int versuch = 0;
do {
wurf = (int)(Math.random()*6)+1;
versuch++;
System.out.println("Versuch " + versuch + " : " + wurf);
}
while( wurf != 6 );
School of Engineering
© G. Burkert, K. Rege, ZHAW
61 von 87
Schleifen in Java: for
■ Form:
for ( [ Initialisierung ] ; [ Bedingung ] ; [ Aufdatierung ] )
Block
■ Die for-Schleife ist primär dazu gedacht, einen Block eine fixe Anzahl mal zu
wiederholen
■ Achtung: Unterschied zu C
■ In der Initialiserung der for-Schleife wird i.d.R. die Schleifenvariable deklariert
for (int i = 0; i < 10; i++) {
}
School of Engineering
© G. Burkert, K. Rege, ZHAW
uC
z
d
e
i
sch
Unter
?
62 von 87
Verschachtelte Schleifen
for (int rows = 0; rows < 3; rows++ ) {
for (int counter = 0; counter < 8; counter++ ) {
System.out.println("*");
}
}
■ Schreibt 3 Reihen à 8 Sternchen
■ Die "Zweidimensionalität" drückt sich in zwei verschachtelten Schleifen aus
School of Engineering
© G. Burkert, K. Rege, ZHAW
63 von 87
break
■ Mit break kann eine Schleife vorzeitig beendet werden:
Aus einer Schleife heraus springen
■ Bitte verwenden Sie dieses Konstrukt sparsam!
■ Beispiel:
boolean found = false;
for( int i = 0; i < liste.length; i++ ) {
if( liste[i] == meineVar ) {
found = true;
break;
}
}
School of Engineering
© G. Burkert, K. Rege, ZHAW
64 von 87
continue
■ Mit continue kann der Rest eines Schleifenkörpers übersprungen werden
■ Bitte verwenden Sie dieses Konstrukt sparsam!
■ Beispiel:
for( int i = 0; i < liste.length; i++ ) {
if( liste[i] != meineVar )
continue;
// sonst machen wir etwas Komplexes,
// was viele Zeilen Code lang ist
}
School of Engineering
© G. Burkert, K. Rege, ZHAW
65 von 87
Methoden und Parameterübergabe
School of Engineering
© G. Burkert, K. Rege, ZHAW
66 von 87
Einführung
■ Grosse (lange) Programme sind komplex
■
■
■
unübersichtlich
aufwendig zu lesen und verstehen
schwierig zu testen und debuggen
(Fehler zu finden)
■ Wie kriegt man die Komplexität in den Griff
School of Engineering
© G. Burkert, K. Rege, ZHAW
67 von 87
Lösung komplexer Probleme
■ Idee:
"Teile und herrsche"
■ Zwei Phasen:
■
■ Analyse
■
Analyse
■ Design
■
■
??
Analyse
Analyse
Problem aufteilen
in Teilprobleme
Problem
Problem
Teillösungen für
Teilprobleme finden
Teillösungen
zusammensetzen
School of Engineering
TeilTeilproblem
problem
TeilTeilproblem
problem
TeilTeilproblem
problem
TeilTeilproblem
problem
© G. Burkert, K. Rege, ZHAW
Lösung
Lösung
Design
Design
■
TeilTeillösung
lösung
TeilTeillösung
lösung
TeilTeillösung
lösung
TeilTeillösung
lösung
68 von 87
Aufteilung in Unterprogramme
■ Umsetzung in prozeduraler Programmierung
■
Problem (Programmablauf) in Teilprobleme (Teilabläufe) aufteilen
■
Teillösungen für Teilprobleme suchen -> Unterprogramme (Funktionen -> Methoden)
■
Teillösungen zusammensetzen -> Hauptprogramm (main Funktion/Methode)
■ Vorteile der Aufteilung in Unterprogramme
■
Reduktion der Komplexität
■
Bessere Lesbarkeit
■
Erlaubt Denken in auf höheren Abstraktionsebene
■
Wiederverwendung -> kein redundanter Code
School of Engineering
© G. Burkert, K. Rege, ZHAW
69 von 87
Unterprogramm -> Methode
■ Unterprogramme haben ihren Ursprung in der prozeduralen Programmierung
■ In der objektorientierten Programmierung werden Unterprogramme durch Methoden
realisiert
■
Objekte bestehen aus Daten und Methoden (Verhalten)
■
Methoden sind immer an ein Objekt/eine Klasse gebunden und
übernehmen eine spezifisch Aufgabe für dieses Objekt
z.B. Vogel.sucheFutter()‚ Fisch.sucheFutter()
■
Methoden können selber wieder andere Methoden aufrufen
School of Engineering
© G. Burkert, K. Rege, ZHAW
70 von 87
Beispiel
public class Zufall {
public static void main(String[] args) {
int ergebnis;
ergebnis = (int)(Math.random()*6)+1;
System.out.println("Würfelzahl: " + ergebnis);
ergebnis = (int)(Math.random()*49)+1;
System.out.println("Lottozahl: " + ergebnis);
}
}
School of Engineering
© G. Burkert, K. Rege, ZHAW
71 von 87
Beispiel
■ Falls das Erzeugen von zufälligen ganzen Zahlen mehrfach benötigt wird (oder auch
nur zum Verdeutlichen der Programmstruktur), sollte dieser Teil in eine Methode
ausgelagert werden
■ Die Methode muss hier ebenfalls static sein (mehr dazu später)
■ Wenn sie für andere Klassen nicht zugänglich sein soll, fügt man sie als private
Methode ein
School of Engineering
© G. Burkert, K. Rege, ZHAW
72 von 87
Beispiel
public class Zufall {
Reihenfolge
Reihenfolgespielt
spieltininJava
Java
keine
keineRolle
Rolle
public static void main(String[] args) {
System.out.println("Würfelzahl: " + zufallsZahl(1, 6));
System.out.println("Lottozahl: " + zufallsZahl(1, 49));
}
private static int zufallsZahl(int von, int bis) {
int ergebnis;
ergebnis = (int)(Math.random() * (bis-von+1)) + von;
return ergebnis;
}
}
School of Engineering
© G. Burkert, K. Rege, ZHAW
73 von 87
Weitere Beispiele
public static int berechneFlaeche (int hoehe, int breite) {...}
private static void vergrössern (double faktor) {...}
public static void bremsen () {...}
■ Die Parameterliste kann leer sein!
School of Engineering
© G. Burkert, K. Rege, ZHAW
74 von 87
Methodenkopf (Signatur)
private static int zufallsZahl (int von, int bis)
■ Methodenname: zufallsZahl
■ Parameterliste: (int von, int bis)
■
Parameterdeklarationen, durch Kommas getrennt
■
in runden Klammern unmittelbar nach dem Methodennamen
■
Parameterdeklaration sieht gleich aus wie die Deklaration lokaler Variablen
■
Methode mit leerer Parameterliste: methodenname () {...}
School of Engineering
© G. Burkert, K. Rege, ZHAW
75 von 87
Methodenkopf (Signatur)
private static int zufallsZahl (int von, int bis)
■ Resultattyp
■
In Java kann jede Methode einen Wert zurückgeben
■
Der Resultattyp gibt den Datentyp des Rückgabewertes an, z.B. int oder double
■
void wird als Resultattyp verwendet, wenn eine Methode nichts zurückgibt
■ Zugriffsmodifikator (access control modifier)
■
public überall sichtbar (auch für andere Klassen; main Methode muss public sein)
■
private nur innerhalb derselben Klasse sichtbar
■ static: Methode kann auch Aufgerufen werden, ohne dass man eine Instanz (i.e. Objekt)
erstellt.
■
main-Methode muss static sein
■
Methoden die von main direkt aufgerufen werden ebenfalls
School of Engineering
© G. Burkert, K. Rege, ZHAW
76 von 87
Methodenkörper (Body)
■ ist alles innerhalb der geschweiften Klammern { ... } nach dem Methodenkopf
■ Der Methodenkörper entspricht einem Block
■ Er besteht dementsprechend aus:
■
Deklaration lokaler Variablen (local variables)
■
Anweisungen
School of Engineering
© G. Burkert, K. Rege, ZHAW
77 von 87
Methodenaufruf (method invocation)
■ In Java muss für den Aufruf einer Methode der Name
zusammen mit einer Parameterliste angegeben werden:
zufallsZahl(1, 6)
■ Bezeichner: Kann ein Objektname oder Klassenname sein
■ Argumente (auch aktuelle Parameter genannt) können sein:
Konstante Werte, Variablen und ganze Ausdrücke
School of Engineering
© G. Burkert, K. Rege, ZHAW
78 von 87
Parameterübergabe
■ Ausserhalb der Methode sind nur die Anzahl und Typ der Parameter bekannt, nicht die
Namen der Parameter
■ Beim Aufruf der Methode muss die Anzahl der Argumente mit der Anzahl Parameter
der Methode übereinstimmen
■ Es werden nur die Werte der Argumente, nicht die Argumente selbst an die Methode
übergeben (pass by value)
■ Bei der Zuordnung von Argumenten zu den Parametern ist nur die Reihenfolge
massgebend, nicht etwa die Namen
School of Engineering
© G. Burkert, K. Rege, ZHAW
79 von 87
Parameterübergabe
■ Compiler prüft, ob die Datentypen der Argumente mit den Parameter übereinstimmen
■ Innerhalb der Methode verhalten sich die Parameter genau wie lokale Variablen, die mit
den übergebenen Argumentwerten initialisiert wurden. Die Werte der Parameter können
deshalb in der Methode beliebig verändert werden. In der aufrufenden Methode
verändern sich die Werte der Variablen dadurch nicht
School of Engineering
© G. Burkert, K. Rege, ZHAW
80 von 87
Rückgabe von Resultaten - return
private static double gradNachRadiant (double grad ) {
double radiant = grad * Math.PI / 180;
return radiant;
}
■ Falls der Resultattyp einer Methode nicht void ist, muss sie ein Resultat zurückgeben:
return Ausdruck;
■ Der Datentyp des Rückgabewertes muss mit der Deklaration übereinstimmen.
■ Nach der return-Anweisung kehrt Programm sofort aus der Methode zurück
School of Engineering
© G. Burkert, K. Rege, ZHAW
81 von 87
Verwendung des Rückgabewerts
■ In der aufrufenden Methode muss der Rückgabewert der Methode direkt verwendet
werden:
double rad = gradNachRadiant(60.0) * 2.5;
■ Ablauf:
■
Die Methode gradNachRadiant() wird aufgerufen
■
Der Methodenaufruf in der Anweisung wird durch den Rückgabewert der aufgerufenen Methode ersetzt:
double rad = 1.047197551196598 * 2.5;
■
Die Anweisung wird ausgeführt
■ Test:
■
Falls beim Ersetzen des Methodenaufrufs durch den Rückgabewert keine gültige Anweisung entsteht, ist der
Methodenaufruf falsch
School of Engineering
© G. Burkert, K. Rege, ZHAW
82 von 87
Entwicklung einer Methode
■ Vorgehen
■ Genau festlegen, was Methode machen soll
-> Methodenname festlegen
■ Welche Informationen braucht die Methode dazu?
-> Parameterliste festlegen
■ Welche Resultate gibt die Methode zurück?
-> Resultattyp festlegen
School of Engineering
© G. Burkert, K. Rege, ZHAW
83 von 87
Entwicklung einer Methode
■ Aufgabe:
■ Schreiben Sie eine Methode, die eine Rechteckfläche berechnet.
■ folgende Fragen sind offen:
■ Sinnvoller Namen
■ Datentyp der Parameter, Resultattyp?
int (Pixel)
■ Was passiert mit negativen Parameterwerten?
Fall wird nicht
berücksichtigt
School of Engineering
© G. Burkert, K. Rege, ZHAW
84 von 87
Beispiel: Entwickeln einer Methode
■ Was soll die Methode machen?
■
Rechteckfläche berechnen aus Breite und Höhe
Æ Name: rechteckFlaeche()
■ Parameterliste festlegen
■
Input: Breite, Höhe (negative Werte nicht beachten)
■
Datentyp int (da nur ganze Pixel darstellbar)
■
Æ int breite, int hoehe
■ Resultattyp festlegen
■
Æ int (Resultat < 2 Milliarden)
School of Engineering
© G. Burkert, K. Rege, ZHAW
85 von 87
Beispiel: Entwickeln einer Methode
■ Methode (und ev. bain dazu) schreiben
public class Test {
private static int rechteckFlaeche (int breite, int hoehe) {
int flaeche = length * height;
return flaeche;
}
public static void main(String[] args) {
int f = rechteckFlaeche(4,4);
System.out.println("Fläche = "+ f);
}
}
School of Engineering
© G. Burkert, K. Rege, ZHAW
86 von 87
Noch Fragen?
School of Engineering
© G. Burkert, K. Rege, ZHAW
87 von 87
Herunterladen