Kein Folientitel - Institut für Geodäsie und Geoinformation der

Werbung
Institut für Kartographie und Geoinformation
Prof. Dr. Lutz Plümer, Dr. Gerhard Gröger
Einführung in die
Programmierung mit Java
4. Vorlesung WS 2002/2003
Übersicht
• Besprechung der Übungsaufgaben
• Boolesche Ausdrücke (Werte wahr/falsch)
– Relationale Operatoren (==, >,<, ..)
– boolesche Operatoren (und, oder, nicht)
•
Kontrollstrukturen
– while
– do - while
– switch
– break
• Arrays
G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03
2
1. Hausaufgabe vom 7. 11.
Erzeugen Sie 1000 zufällige double-Werte und geben
Sie das Minimum, das Maximum sowie den
Durchschnitt aller Werte aus.
G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03
3
Lösung zur Hausaufgabe
public class Statistik extends Object {
public static void main (String args[]) {
double zufallswert, mittelwert;
double min = 1; //Zufallswerte zwischen 0 und 1
double max = 0;
double summe = 0;
for (int i=0; i<1000; i=i+1){
zufallswert = Math.random();
summe = summe + zufallswert;
if (zufallswert < min) min = zufallswert;
if (zufallswert > max) max = zufallswert;
}
mittelwert = summe / 1000;
System.out.print("Minimum: " + min + " Maximum: " +
max + " Mittelwert: " + mittelwert);
}}
G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03
4
Alternative Lösung:
• statt
if (zufallswert < min) min = zufallswert;
if (zufallswert > max) max = zufallswert;
• min = Math.min(min,zufallswert);
max = Math.max(max,zufallswert);
G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03
5
Boolesche Ausdrücke
• Bedingungen in if oder for: Boolesche Ausdrücke
• Boolesche Ausdrücke liefern als Rückgabewert
nur einen der zwei (Wahrheits-)Werte true oder false
• Beispiele:
– if(i == 0) ...
– for(int i = 0 ; i < 1000 ; i = i + 1)...
G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03
6
Relationale Operatoren
• Relationale Operatoren bilden spezielle Boolesche
Ausdrücke
• Relationale Operatoren setzen ihre Operanden
zueinander in Beziehung und liefern den
Wahrheitswert der Beziehung zurück.
– Beispiele:
5<3
(4-2)=2
ergibt false
ergibt true
Mathem. Notation
Java
Erläuterung
=
==
Identität (Gleichheit)

!=
Ungleichheit
<
<
kleiner als

<=
kleiner oder gleich als
>
>
größer als

>=
größer oder gleich als
G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03
7
Arithmetische und Boolesche Ausdrücke
• Die Operanden von Relationalen Operatoren können
arithmetische Ausdrücke sein
• Beispiel:
Math.min(5,9) == 5 * 5 - 20 * Math.sin(Math.Pi/2)
Arithmetischer
Ausdruck
5
Arithmetischer
Ausdruck
5
Boolescher
Ausdruck
wahr
G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03
8
Komplexe Boolesche Ausdrücke
• Bildung komplexer Boolescher Ausdrücke mit
aussagenlogischen Operatoren (nicht, und, oder):
•
Nicht / Negation:
in Java: ! Wert
¬ true = false
¬ false = true
•
Und-Verknüpfung:
in Java: Wert1 & Wert2
false  false = false
false  true = false
true  false = false
true  true = true
•
Oder-Verknüpfung:
in Java: Wert1 | Wert2
false  false = false
false  true = true
true  false = true
true  true = true
•
Beispiel: ((x < 7) | (y == 6)) & !(z < 5)
•
Wert bei x = 2 ; y = 6 ; z = 1?
G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03
9
Operatorenreihenfolge (Priorität)
Priorität
Operatoren
Assoziativität
1
+ -
Vorzeichen (unär)
rechts
1
!
logische Negation
rechts
1
(Typ)
Typkonversion
rechts
2
* / %
Multiplikation, Division, Rest
links
3
+ -
Addition, Subtraktion
links
4
< <=
kleiner, kleiner gleich
links
4
> >=
größer, größer als
links
5
==
Gleichheit
links
5
!=
Ungleichheit
links
6
&
logisches Und
links
7
|
logisches Oder
links
8
=
Wertzuweisung
rechts
G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03
10
Verkürzte Auswertung Bool. Ausdrücke (I)
• Vor der Berechnung des Wertes eines (logischen)
Operators werden die Werte aller seiner Operatoren
bestimmt.
• Die Und-Verknüpfung && (Konjunktion) und OderVerknüpfungen || (Disjunktion) verkürzen u.U. die
Auswertung:
– Eine Oder-Verknüpfung ist generell wahr, sobald der erste wahre
Operand gefunden wird.
– Eine Und-Verknüpfung ist generell falsch, sobald der erste falsche
Operand gefunden wird.
– In diesen Fällen werden bei den Operatoren && und || die restlichen
Operanden nicht mehr ausgewertet.
– Die Auswertung findet im Regelfall von links nach rechts statt, es sei
denn sie wird durch runde Klammern anders vorgegeben.
G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03
11
Verkürzte Auswertung Bool. Ausdrücke (II)
• Vorteile von && und || gegenüber & und |
– oftmals schnellere Programmausführung
– Realisierung von Bedingungen mit Vorbedingungen
Beispiel:
if (d!=0 && 20/d > 5) ...
Für den Fall d=0 darf der zweite Operand des &&-Operators
nicht ausgewertet werden.
• Aber: auch die Nebeneffekte abgekürzter Operatoren
werden nicht ausgeführt (wie z.B. Bildschirmausgaben
innerhalb von Funktionen u.ä.)
G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03
12
Übung im GIS-Labor
• Schreibt ein Programm, das die Zahlen von 1 bis 50
aufzählt, wobei anstelle der durch drei oder durch
sieben, aber nicht durch 5 teilbaren Zahlen „autsch“
ausgegeben werden soll.
• Tip: Verwendet die Operation % (Rest der
ganzzahligen Division):
• z.B. 11 % 3 = 2
• z.B. 33 % 9 = 6
(11 geteilt durch 3 ist 9 mit Rest 2)
(33 geteilt durch 9 ist 27 mit Rest 6)
G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03
13
Kontrollstrukturen: while- und do-while-Schleife
while-Schleife:
do-while-Schleife:
Syntax:
Syntax:
while ( boolean-Ausdruck )
Anweisung;
do
• Schleife mit
Eintrittsbedingung
• Schleife mit
Wiederholungsbedingung
– Anweisung wird 0 bis
x-mal ausgeführt
Anweisung;
while ( boolean-Ausdruck );
– Anweisung wird mindestens
einmal ausgeführt
Hinweis: Sollen mehrere Anweisungen im Schleifenrumpf ausgeführt werden, so müssen diese durch geschweifte Klammern
zu einem Block zusammengefasst werden.
G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03
14
Übung im GIS-Labor
• Schreibt ein Programm, das die natürlichen Zahlen
solange summiert, bis die Summe die Zahl 3000
erstmals überschreitet. Gebt die Summe und die
Anzahl der natürlichen Zahlen aus.
• Tip: Verwendet while-Schleifen:
– while ( boolean-Ausdruck )
Anweisung;
– do
Anweisung;
while ( boolean-Ausdruck );
G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03
15
Kontrollstrukturen: switch-Anweisung
• dient zur Realisierung von Fallunterscheidungen
• Syntax:
switch (Ausdruck ) {
case Wert1 : Anweisung1; // 1. Fall Ausdruck=Wert1
case Wert2 : Anweisung2; // 2. Fall Ausdruck=Wert2
...
default: Ansonsten-Anweisung; // ansonsten
}
• es werden alle Anweisungen ab der ersten erfüllten caseBedingung ausgeführt (inkl. der Ansonsten-Anweisung )
• Ausdruck muss vom Typ byte, short, int oder char sein
• Werti muss eine Konstante vom gleichen Typ wie Ausdruck sein
G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03
16
Beispiel 1 zur switch-Anweisung
Programm:
Ausgabe:
class Switch1 {
public static void main (String args[]) {
int i;
for (i=0; i < 10; i=i+1)
switch(i) {
case 1: System.out.println("eins");
case 2: System.out.println("zwei");
case 5: System.out.println("fünf");
default: System.out.println(i);
}
}
}
0
eins
zwei
fünf
1
zwei
fünf
2
3
4
fünf
5
6
7
8
9
Problem: fehlerhafte Ausgabe, da jeweils nach der ersten
passenden case-Bedingung alle anderen Anweisungen
ohne weitere Überprüfung ausgeführt werden!
G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03
17
Die break-Anweisung (1)
• dient zum Abbruch von switch-Fallunterscheidungen
• Syntax:
switch ( Ausdruck ) {
case Wert1 : { Anweisung1; break; }
case Wert2 : { Anweisung2; break; }
...
default: Ansonsten-Anweisung;
}
• Der Programmablauf wird bei Ausführung eines breakBefehls hinter der switch-Anweisung fortgesetzt!
G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03
18
Beispiel 2 zur switch-Anweisung
Programm:
Ausgabe:
class Switch2 {
public static void main (String args[]) {
int i;
for (i=0; i < 10; i=i+1)
switch(i) {
case 1: {System.out.println("eins"); break;}
case 2: {System.out.println("zwei"); break;}
case 5: {System.out.println("fünf"); break;}
default: System.out.println(i);
}
}
}
0
eins
zwei
3
4
fünf
6
7
8
9
Die Ausgabe ist nun korrekt, da die switch-Anweisung jeweils nach der
Ausführung der passenden case-Bedingung mittels break verlassen wird.
G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03
19
Die break-Anweisung (2)
• kann auch zum Abbruch von Schleifen (for, while, dowhile) eingesetzt werden
Beispiel while-Schleife:
while ( boolean-Ausdruck1 ) {
...
if ( boolean-Ausdruck2 ) break; // Abbruch
...
}
• Der Programmablauf wird hinter der
Schleifenanweisung fortgesetzt
G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03
20
Arrays
Index
Wert
0
45
1
-117
2
12
3
0
4
999
Integer-Array mit
fünf Elementen
• Bisher: primitive Datentypen
(int, double, ...)
• Arrays als erster nicht-primitiver
Datentyp
• Alle Werte haben denselben Typ
(z.B. int)
• Zugriff über Index:
my_array[2] = 12;
• Indizes fangen mit 0 an
G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03
21
Arbeiten mit Array-Variablen (I)
3 Schritte:
(nur Schritt 2 ist wirklich neu)
1. Deklaration
int[] my_array;
// Array von Integerzahlen
2. Instantiierung
my_array = new int[3];
// Erschafft Array mit 3 Elem.
3. Initialisierung
my_array[0] = 17;
my_array[1] = 0;
my_array[2] = -4*my_array[0];
G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03
22
Arbeiten mit Array-Variablen (II)
Alternative:
• alle drei Schritte auf einmal
• Deklaration mit impliziter Erschaffung und Initialisierung:
int[] my_array = {45, -117, 12, 0, 999};
erschafft ein 5-elementiges Array und initialisiert es mit den
aufgezählten Werten (angefangen bei Index 0).
G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03
23
Hinweise zu Arrays (I)
•
Größe eines Arrays kann erst zur Laufzeit feststehen:
int[] my_array;
int i = ...;
//zur Laufzeit berechnet
my_array = new int[i];
•
Die Größe eines einmal instantiierten Arrays kann
nicht verändert werden.
•
Größe eines Arrays kann mittels
arrayname.length abgefragt werden:
int laenge = my_array.length;
G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03
24
Beispiel zu Arrays
Programm:
Ausgabe:
// Bestimmung der kleinsten Zahl eines ganzzahligen Arrays
class Minimum {
public static void main (String args[]) {
int[] my_array = {45,12,1,13,-4,0,-23,1001};
int minimum, i;
Die kleinste
Zahl ist -23
minimum=my_array[0];
for (i=0; i<my_array.length; i=i+1)
if (my_array[i]<minimum)
minimum=my_array[i];
System.out.print("Die kleinste Zahl ist ");
System.out.println(minimum);
}
}
G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03
25
Mehrdimensionale Arrays
• Anwendungen
– zweidimensional: Repräsentation von Matrizen
– zwei- und mehrdimensional: Speicherung von Wertetabellen
• Mehrdimensionale Arrays werden durch Arrays von
Arrays dargestellt
• Syntax zur Deklaration und Instantiierung eines
n-dimensionalen Arrays:
Typ [ ][ ]...[ ] Arrayname = new Typ [d1][d2]...[dn];
• Beispiel:
int[][] matrix = new int[6][3];
erschafft eine zweidimensionale Matrix mit 6 Zeilen und 3 Spalten
G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03
26
Hinweise zu Arrays (I)
• Arrays sind keine primitiven Datentypen
– Array-Variablen enthalten nicht selbst das Array, sondern
verweisen auf ein Array, das durch new irgendwo im
Hauptspeicher angelegt wird (Array-Variablen sind
Referenzen).
Beispiel: int[] myArray=new int[3];
myArray
Wert1 Wert2 Wert3
 kein simpler Vergleich zweier Arrays möglich:
int[] a = {7,12,13,0};
int i = 3;
int[] b = {7,12,13,0};
int j = 3;
System.out.println(a = = b);
System.out.println(i = = j);
ergibt die Ausgabe false
ergibt die Ausgabe true
G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03
27
Hinweise zu Arrays (II)
• Arrayvariablen sind Referenzen
– Wertzuweisung zweier Arrayvariablen kopiert nicht das
Array, sondern setzt beide auf denselben Speicherbereich:
– Bsp:
int[] a = {1,2,3};
int[] b = {4,5,6};
a = b;
a[0] = 77;
System.out.println(b[0]);
vor Wertzuweisung a = b
a
b
1 2 3
4 5 6
nach Wertzuweisung a = b
a
1 2 3
b
4 5 6
G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03
28
Hausaufgabe
Schreibt ein Programm, das den Wert einer ganzzahligen Variablen w
im Bereich von 20 bis 99 so als Text ausgibt, wie er ausgesprochen
wird. Gebt dabei alle Werte von 20 bis 99 entsprechend aus.
Ausgabe:
w = 20
.....................
w = 98
w = 99
Ausgabe: "zwanzig"
Ausgabe: „achtundneunzig"
Ausgabe: "neunundneunzig"
G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03
29
Herunterladen