Arrays 3

Werbung
Grundlagen der
Programmierung –Teil1
Einheit III - 22. Okt. 2010
GDP
DDr. Karl D. Fritscher
basierend auf der Vorlesung
“Grundlagen der Programmierung”
von
DI Dr. Bernhard Pfeifer
Einschub
Bevor wir mit den „Anweisungen“ fortfahren, folgt
zuerst ein kleiner Einschub/Nachtrag zum Thema:
• Arrays
Arrays
• Arrays sind eine Reihung/Auflistung von Elementen eines festen Grundtyps.
• Arrays sind semidynamisch - d.h. ihre Größe wird zur Laufzeit (=d.h.
während der ein Programm von einem Rechner ausgeführt wird) festgelegt,
kann jedoch im Nachhinein nicht mehr geändert werden.
An dieser Stelle wieder einmal ein kleiner Ausblick:
• Arrays sind in Java im Grunde genommen Objekte. Obwohl dies bei der
Benutzung kaum auffällt hat dies folgende Konsequenzen :
 Array Variablen sind Referenzen
 Arrays besitzen Instanz-Variablen und Methoden
 Arrays werden erst zur Laufzeit erzeugt
Arrays 2
• Ein Array wird in Java wie folgt deklariert
 Deklaration der Array-Variablen
 Erzeugen eines Arrays und Zuweisung an die Array-Variable
• Die Deklaration entspricht dabei syntaktisch der einer einfachen
Variable, mit dem Unterschied, dass am Typnamen eckige Klammern
angehängt werden
int[] a;
double[] b;
• Die eckigen Klammern können theoretisch auch hinter dem Variablennamen geschrieben werden (eher unkonventionell)
71
Arrays 3
•
Bei der Erzeugung eines Arrays mit n Elementen werden die Elemente
von 0 bis n-1 durchnummeriert
Erzeugung eines int-Arrays mit 3 Elementen
int[] a
= new int[3];
oder
int[] a = {1, 5, 3};
Zugriff auf Arrayelemente 1
•
Der Zugriff auf die Elemente erfolgt dabei über den numerischen Index,
der nach der Arrayvariable in eckigen Klammern angegeben wird
public class ArrayTest
{
public static void main (String[] args)
{
int[] values = new int[10];
values[0] = 20;
System.out.println (“Erstes Element: “ + values[0]);
System.out.println (“Zweites Element: “ + values[1]);
}
Ausgabe ??
}
Zugriff auf Arrayelemente 2
values ai
20
15
2
44
77
12
2
9
0
1
index i
0
1
2
3
4
5
6
7
8
9
public class ArrayTest2
{
public static void main (String[] args)
{
int[] values
= {20,15,2,44,77,12,2,9,0,1};
}
System.out.println
(“Erstes Element: “ + values[0]);
}
System.out.println (“Zweites Element: “ + values[1]);
}
Ausgabe ??
}
Mehrdimensionale Arrays
• Mehrdimensionale Arrays werden erzeugt, indem zwei oder mehr Paare
eckiger Klammern bei der Deklaration angegeben werden.
• Mehrdimensionale Arrays werden als Arrays von Arrays angelegt.
• Die Initialisierung erfolgt analog zu eindimensionalen Arrays.
Beispiel:
int [][] twodim = new int[3][2];
i/j
0
1
0
0
0
1
0
0
2
0
0
Anzahl Zeilen Anzahl Spalten
74
Switch- Anweisung
Für eine Mehrfachselektion, d.h. eine Selektion mit mehreren Alternativen
kann die switch-Anweisung verwendet werden:
• Syntax
switch (ausdruck)
{
case constant :
anweisung;
……
break;
case constant :
………
default :
………
}
•
Die mit dem Wortsymbol case
eingeleiteten Konstanten mit nachfolgendem Doppelpunkt legen dabei so
genannte Einsprungmarken für den
Programmablauf fest.
•
Zwischen
dieses
Einsprungsmarken
müssen nicht unbedingt Anweisungen
stehen.
Außerdem sind auch die
Abbruchanweisung (break) sowie die
Marke default und die nachstehenden
Anweisungen optional.
82
Switch-Anweisung 2
• Syntax
switch (ausdruck)
{
case constant :
anweisung;
……
break;
case constant :
………
default :
………
}
Es handelt sich im switch Block um eine Folge von
Anweisungen, von denen einige als Einsprungsmarken
definiert sind.
Es wird zunächst der Ausdruck ausgewertet, dessen
Ergebnistyp byte, short, int oder char (auch
enum ist erlaubt) sein muss.
Daraufhin wird der Programmablauf genau an der caseMarke fortgesetzt, die mit der Auswertung
übereinstimmt. Es wird der Code ausgeführt, bis auf
eine break Anweisung gestoßen wird. Die break
Anweisung bewirkt, dass die switch Anweisung
verlassen wird.
Wird keine passende case Konstante gefunden, so
wird bei der default Marke (sofern vorhanden)
fortgesetzt.
82
Switch-Anweisung 3
b = 5;
???
a
b
1
20
2
20
3
20
4
40
5
0
83
Schleifen
•
In Java gibt es drei verschiedene Schleifenanweisungen. Diese werden wie
folgt bezeichnet:
 abweisende Schleife (while-Schleife)
 nichtabweisende Schleife (do-while-Schleife)
 Zählschleife (for-Schleife)
84
While-Schleife
• Die while Schleife
while (ausdruck)
anweisung;

Zuerst wird der Ausdruck, der vom Typ boolean sein muss
ausgewertet. Ist er true, wird die Anweisung ausgeführt, andernfalls wird
mit der ersten Anweisung hinter der Schleife weitergemacht.

Nachdem die Schleifenanweisung ausgeführt wurde, wird der Ausdruck
erneut geprüft usw.
85
While-Schleife
• Die while Schleife
while (ausdruck)
anweisung;
public class WhileSchleife
{
public static void main(String args[])
{
int i=0;
while (i<10) // Solange i < 10 …
{
i=i+1;
System.out.println("Die Zahl ist: " + i);
}
}
}
85
do-while-Schleife
• Die do-while-Schleife
do
anweisung;
while(ausdruck);

Die do-while-Schleife arbeitet nichtabweisend. Dies bedeutet, dass sie
zumindest einmal ausgeführt werden muss, denn erst nach dem ersten
Durchlauf wird der Ausdruck geprüft.

Die Schleife wird immer dann beendet, wenn der Ausdruck false
ergibt
86
do-while-Schleife
• Die do-while Schleife
do
anweisung;
while(ausdruck);
public class DoWhileSchleife
{
public static void main(String args[])
{
int i = 11;
do
Wird Schleife durchlaufen ??
{
System.out.println("i = " + i);
} while (i < 10);
}
}
86
for-Schleife
• Die for-Schleife:
for (init; test; update)
anweisung;
(Schleifen)-Kopf
• Der Kopf der for Schleife besteht aus drei Ausdrücken - jeder ist optional:
 Der init Ausdruck wird einmal vor dem Start der Schleife aufgerufen.
Dort werden Initialisierungen durchgeführt. Der init Teil darf aus
mehreren Ausdrücken bestehen, wenn die einzelnen Teilausdrücke durch
Kommata getrennt sind. Fehlt dieser Teil, so wird keine Initialisierung
durchgeführt.
 Der init Teil darf auch Variablendeklarationen enthalten
(Schleifenzähler)
 Der test Teil bildet den zu testenden Ausdruck. Analog zur while
Schleife wird dieser zu Beginn der Schleife ausgeführt. Ist der Ausdruck
true wird in die Schleife gegangen. Fehlt der Testausdruck wird vom
Compiler true eingesetzt.
87
for-Schleife 2
• Die for-Schleife
for (init; test; update)
anweisung;
• Der
update Ausdruck dient dazu, den Schleifenzähler zu verändern. Er
wird nach jedem Schleifendurchlauf ausgewertet. Fehlt dieser Ausdruck, so
wird nichts gemacht.
88
for-Schleife 3
public class ForSchleife
{
public static void main (String [] args)
{
for (int i = 0; i < 4; i++)
{
Was passiert hier ??
for (int j = 0; i < 4; j++)
{
System.out.println((i+1)+ " * "+ (j+1) +" = " + (i+1)*(j+1));
}
System.out.println();
}
}
Test-Ausdruck in 2. Schleife
}
führt zu Endlosschleife!!
Typischer copy-paste bug!!
Korrekt:
for (int j = 0; j < 4; j++)
88
for-Schleife + Array
„Befüllen“ eines 2 dimensionalen Arrays mit Zahlen:
public class Fill2DimArray
{
public static void main (String [] args)
{
int [][] multiTab = new int [4][4];
for (int i = 0; i < 4; i++)
{
for (int j = 0; j < 4; j++)
{
multiTab[i][j] = (i+1) * (j+1);
}
}
}
}
multiTab
i
j
0
0,1,2,3
1,2,3,4
1
2
3
0,1,2,3
0,1,2,3
0,1,2,3
2,4,6,8
3,6,9,12
4,8,12,16
i/j
0
1
2
3
0
1
2
3
4
1
2
4
6
8
2
3
6
9
12
3
4
8
12
16
88
Die erweiterte for-Schleife
•
Mit Java 5.0 (1.5) wurde die for-Schleife um eine syntaktische
Variante erweitert, die den Umgang mit listenartigen Strukturen
stark erleichtert.
• Diese Variante ist auch als foreach bekannt
for(formalparameter
anweisung;
: ausdruck)
• Der »formalparameter« ist dabei eine aus Datentyp und Variablenname
bestehende Parameterdeklaration (der Art java.lang.Object obj)
•
»ausdruck« ist eine Instanz oder ein Ausdruck des Typs
java.lang.Iterable oder ein Array.
90
Die erweiterte for-Schleife
•
Wendet man die erweiterte for-Schleife auf Arrays an, so ist
wie folgt vorzugehen:
int[] a = {1,2,3,4,5};
for(int element : a)
{ //”Für jedes Element aus a …
System.out.println (element);
}
äquivalent zu:
int[] a = {1,2,3,4,5};
for (int i = 0; i < a.length; i++)
{
System.out.println (a[i]);
}
91
Labels, Break & continue
• In Java gibt es zwei verschiedene Möglichkeiten, die normale Auswertungsreihenfolge in einer Schleife mit den Sprunganweisungen break und
continue zu verändern:
•

Taucht innerhalb der Schleife ein break auf, wird die Schleife verlassen,
und das Programm wird mit der ersten Anweisung nach der Schleife
fortgesetzt.

Taucht ein continue auf, so springt das Programm an das Ende des
Schleifenrumpfs und beginnt mit der nächsten Iteration.
Darüber hinaus gibt es in Java die Möglichkeit Schleifen mit Labels zu versehen.
Zusätzlich zu den Anweisungen break und continue gibt es daher in Java
noch break label; und continue label; - In diesem Fall wird zum definierten
Label gesprungen bzw. zur ersten Anweisung nach dem definierten Label.
89
Break & continue
Beispiel gelabeltes break:
public class LabeledBreak
{
public static void main(String args[])
{
int[][] a = new int [10][10];
loop1: for (int i=0; i<10; ++i)
{
for (int j=0; j<10; ++j)
{
if (a[i][j] > 42)
{
break;
}
if (a[i][j] == 0)
{
System.out.println("a ist 0. j = " + j + ", i = "+ i);
break loop1;
}
}
}
}
}
89
Break & continue
Beispiel gelabeltes loop:
public class LabeledLoop
{
public static void main(String args[])
{
int[][] a = new int [10][10];
loop1: for (int i=0; i<10; ++i)
{
for (int j=0; j<10; ++j)
{
if (a[i][j] > 42)
{
continue;
}
if (a[i][j] == 0)
{
System.out.println("a ist 0. j = " + j + ", i = "+ i);
continue loop1;
}
}
}
}
}
89
assert - Anweisung
Die assert Anweisung
assert ausdruck1
[
: ausdruck2
];
•
Diese Anweisung dient dazu, an einer bestimmten Stelle im Programm
einen logischen Ausdruck (ausdruck1) zu platzieren, von dem der
Programmierer annimmt, dass er stets wahr ist. In diesem Fall fährt das
Programm mit der nächsten Anweisung fort, andernfalls wird eine
Ausnahme des Typs AssertionException ausgelöst (bzw. der
optionale Ausdruck 2 als Fehlermeldung ausgegeben)
•
Ein solcher Ausdruck wird auch als Invariante bezeichnet, denn er bleibt
unverändert true, solange das Programm korrekt funktioniert.
•
Eine assert Anweisung erlaubt den Zustand eines Programmes zu
überprüfen und sicherzustellen, dass die prinzipielle Forderung für
einen korrekten Programmablauf eingehalten wird.
BEACHTE: Assertions sind in JAVA standardmässig deaktiviert.
Aktiviertung durch Parameter –ea zB: Java –ea HelloWorld
92
assert - Anweisung
•
Die assert Anweisung
assert ausdruck1
[
: ausdruck2
];
• Beispiel:
int[] a = {1,2,3,4,10};
for(int element : a)
{ //”Für jedes Element aus a …
assert (el<=5) : ”Zahl muss kleiner oder gleich 5 sein!!”;
System.out.println (element);
}
92
assert - Anweisung
• Ein assert kann natürlich auch mit einem if simuliert werden. Assert hat
jedoch folgende Vorteile
 Code ist kürzer
 es ist sofort zu erkennen, dass es sich um einen Korrektheitscheck und
nicht um ein logisches Programmkonstrukt handelt
 Assertions können zur Laufzeit wahlweise an als auch ausgeschaltet
werden
Herunterladen