E N D
1. 1 Programmieren in Java Daten und Typen, Ein-/Ausgabe, Kontrollstrukturen, Methoden und Rekursion, Felder, Bubblesort, Matrizen
2. Prof. Dr. Fritz Jobst 2 Änderungsgeschehen SS 2008 Uebernommen von Prof. Jobst
Aenderungen H. Feyrer
Beispiele hinzugefuegt
Stand: 15.3.2008
4. Prof. Dr. Fritz Jobst 4 Grundlagen: prozedurale Elemente Elementare Daten: Variable im RAM
int : ganze Zahlen
float: Gleitkommazahlen
Operatoren: Verarbeitung von Daten
+ - * / % > >> >>> etc.
Wertzuweisung als elementare Anweisung
Zuweisung von Werten an Variable
Kontrollfluss: Anweisungen zur Steuerung von Abläufen
if, switch: Fallunterscheidungen
do, while, for: Wiederholte Ausführung
Methoden: Folgen von Anweisungen
System.out.println ("hello");
Felder: Folgen von Variablen
int[] zahlen = {30, 5, 2001};
5. Prof. Dr. Fritz Jobst 5 Verarbeitung im Rechner
6. Prof. Dr. Fritz Jobst 6 Daten erklären: elementare Datentypen Ganzzahlige Datentypen: ganze Zahlen mit Vorzeichen
byte 8-Bit-Zahlen von -128 bis +127 (-27 bis 27-1)?
short 16-Bit-Zahlen von -32768 bis +32767 (-215 bis 215-1)?
int 32-Bit-Zahlen von –2147483648 bis 2147483647
long 64-Bit-Zahlen von –9223372036854775808 bis 9223372036854775807Beispiel 1l, 12345l (Zusatz l ist zu beachten, d.h. klein-L)?
Gleitkommazahlen: Nach IEEE-754-Standard
float Zahlen mit 32 Bit Genauigkeit. Beispiel: 1.0f (Zusatz f ist zu beachten)?
double Zahlen mit 64 Bit Genauigkeit. Beispiel: 1.0 oder 1.0d
Beispiele:
k02/src/DemoFuerSchreibweisen.java
k02/src/DemoFuerBereichsUeberschreitungen.java
7. Prof. Dr. Fritz Jobst 7 Daten erklären: elementare Datentypen Zeichentyp
char 16-Bit-Unicode-Zeichen. Beispiel: 'A', 'a'‚
Achtung: nur ein einzelnes Zeichen
Boolescher Typ
boolean Wahrheitswert. Entweder true oder false
Die elementaren Datentypen werden direkt von der CPU bearbeitet.
Die Verarbeitung erfolgt effizient.
Dies ist mit ein Grund für die relativ gute Performance von Java-Programmen.
Beispiele:
k02/src/DemoFuerDeklarationen.java
k02/src/DemoFuerDaten.java
8. Prof. Dr. Fritz Jobst 8 Ergänzung: Zeichenketten Zeichenketten können in Java mit dem Typ String definiert werden. Dieser Typ ist nicht elementar (d.h. kein im Rechner eingebauter Typ). Vgl. Kapitel 3.
Die Beschreibung der Methoden zur Bearbeitung von Zeichenketten findet sich in java.lang.String.
String Text1 = "Hello ";
String Text2 = "World";
System.out.println (Text1 + Text2);
System.out.println (Text1 + 5555);
Bei Zeichenketten bedeutet + das Zusammenfügen der Texte der einzelnen Zeichenketten. Auch der Text für Zahlen kann so an Zeichenketten angehängt werden.
9. Prof. Dr. Fritz Jobst 9 Info: Darstellung ganzer Zahlen im Rechner
10. Prof. Dr. Fritz Jobst 10 Die Wertzuweisung Schreibweise:
Variable = Ausdruck;
Funktion:
Variablen bezeichnen Speicherplätze im RAM.
Der Wert des Ausdrucks (rechte Seite) wird berechnet und in diesen Speicherplatz (linke Seite) geschrieben.
Der Typ des Ausdrucks muss mit dem Typ der Variablen verträglich sein:
int i;
i = 99; // richtig
i = true; // falsch
i = 2 + 3 * 4; // richtig
11. Prof. Dr. Fritz Jobst 11 Ablauf von i = i + 1 Anweisungen:
int i = 99;
i = i + 1;
Die Wertzuweisung = ist nicht als Gleichheit zu sehen, sondern als Zuweisungsoperator.
Ablauf:
Der Wert von i wird gelesen. Ergebnis: 99
Dieser Wert wird erhöht.
Dieser neue Wert wird zurück geschrieben
i hat nun den Wert 100
12. Prof. Dr. Fritz Jobst 12 Ablauf von i = 99; i = i + 1; Skizze
13. Prof. Dr. Fritz Jobst 13 Beispiel: Mehrwertsteuer berechnen Das Programm soll einen Betrag einlesen.
Danach soll die Mehrwertsteuer berechnet werden. Annahme: 19% MWSt-Satz.
Das Ergebnis soll ausgegeben werden:
Netto-Betrag, MWSt-Betrag, Gesamt-Betrag
Einlesen von Zahlen:
Benutze nextDouble()-Methode von java.util.Scanner.
Ausgeben:
Benutze printf (…)-Methode von java.io.PrintWriter.
14. Prof. Dr. Fritz Jobst 14 Programm zur MWSt-Berechnung import java.util.*;
import java.io.*;
public class MWSt {
public static void main(String[] args) {
System.out.println
("Bitte einen Betrag OHNE MWSt eingeben (z.B. 3,5):");
// Gleitkommazahlen bei Text-Eingabe in deutscher Darstellung
Scanner input = new Scanner(System.in);`
double netto = input.nextDouble();
double mwst = netto * 0.19; // Gleitpunktzahlen in Java
double gesamt = netto + mwst;
System.out.printf("netto=%f mwst=%f gesamt=%f\n",
netto, mwst, gesamt);
System.out.printf("netto=%7.2f mwst=%6.2f gesamt=%8.2f\n",
netto, mwst, gesamt);
}
}
Beispiel: k02/src/Formeln.java
15. Prof. Dr. Fritz Jobst 15 Ein-/Ausgabe Eingabe mit Scanner
double-Zahlen einlesen mit nextDouble
int-Zahlen einlesen mit nextInt()?
Ausgabe mit printf
System.out.printf("%f\n", Gleitpunktzahl);
System.out.printf("%7.2f\n", Gleitpunktzahl);
System.out.printf("%d\n", Ganze Zahl);
System.out.printf("%s\n", Text-String);
\n bedeutet: neue Zeile nach Ausgabe
System.out.printf("%b\n", Boolescher Wert);
Beispiel: k02/src/GrundRechenarten.java
16. Prof. Dr. Fritz Jobst 16 Packages Packages sind Zusammenfassungen von Klassen zu Paketen.
Jedes Paket liegt in einem eigenen Verzeichnis
Der Name setzt sich dann aus den Verzeichnisnamen zusammen, getrennt durch „.“ (Punkt)?
Im Prinzip: Der Name einer Klasse muss vollständig angegeben werden: java.awt.Graphics
Aber: Packages können importiert werden
import java.awt.Graphics;
import java.awt.*; // Gleich alle awt-Klassen
Dann kann man im Java-Programm einfach Graphics schreiben
Das Package java.lang muss nicht angegeben werden:
Z.B.: String statt java.lang.String
Beispiel:
k02/src/NameDemo/MyFirstClass.java
k02/src/PackageDemo.java
17. Prof. Dr. Fritz Jobst 17 Beispiel Das folgende Beispiel zeigt
Deklarationen von Daten
Wertzuweisung auf die Daten
Ausgabe der Daten auf Konsole mit println
18. Prof. Dr. Fritz Jobst 18 public class JavaSchreibweisen {
public static void main (String args[]) {
// Daten erklären : definieren
// int, double, char, boolean
// String für Zeichenketten
int ganzeZahl;
// Speicherplatz für ganze Zahl
double gleitKommaZahl;
// Speicherplatz für Gleitkommazahl
char buchstabe;
// buchstabe: Speicherplatz für EINEN Buchstaben
boolean wahrHeitswert;
// true oder false?
String text; // KEINE elementare Variable
// text: Zeichenkette bearbeiten Beispiel: Deklarationen
19. // Werte zuweisen
ganzeZahl = 1357867;
gleitKommaZahl = 3.1415;
buchstabe = 'a';
wahrHeitswert = false;
text = "Was gibt es in der Mensa?";
// Ausgeben der Werte mit println-Befehl
System.out.println (ganzeZahl);
System.out.println (gleitKommaZahl);
System.out.println (buchstabe);
System.out.println (wahrHeitswert);
System.out.println (text);
20. Prof. Dr. Fritz Jobst 20 // Ergänzung: Definition+Wertzuweisung
long langeganzeZahl = 1357l;
System.out.println (langeganzeZahl);
// Noch eine Wertzuweisung
ganzeZahl = ganzeZahl + 1 + 7 * 300;
System.out.println
("Wert der ganzen Zahl= " + ganzeZahl);
}
} Beispiel: Wertzuweisungen
21. Prof. Dr. Fritz Jobst 21 Schreibweisen für ganze Zahlen
22. Prof. Dr. Fritz Jobst 22 Ziffern der Darstellung von 1234 1234 Dezimal =
Binär: 0100.1101.0010
Hex. 4d2
Oktal 2322
1234 Hex =
Binär: 0001.0010.0011.0100
Hex.: 1234
Oktal: 11064
1234 Oktal =
Binär: 0010.1001.1100
Hex.: 29c
Oktal: 1234
23. Prof. Dr. Fritz Jobst 23 Darstellung von Zahlen public class OperatorTest {
public static void main(String[] args) {
int x1 = 1234;
int x2 = 0x1234;
int x3 = 01234;
System.out.println(Integer.toBinaryString(x1));
System.out.println(Integer.toHexString(x1));
System.out.println(Integer.toOctalString(x1));
… analog für x2 und x3
}
}
Nützliche Methoden für Zahlen: Klasse Integer (bzw. java.lang.Integer): http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Integer.html
24. Prof. Dr. Fritz Jobst 24 Ausdrücke zum Rechnen und Bearbeiten Variable = Ausdruck;
Der Wert des Ausdrucks wird berechnet. Dann wird dieser Wert auf den durch Variable benannten Speicherplatz geschrieben.
Für Gleitkommazahlen gibt es die Rechenarten + - * /
Für ganze Zahlen ist Vorsicht bei der Division geboten: Was soll 3 / 2 als ganze Zahl liefern?
i / j
Quotient. 7 / 2 liefert 3, 9/4 liefert 2
i % j
Rest 7 % 2 liefert 1
Es gilt stets:
i = (i / j) * j + (i % j)?
Dividend = Quotient * Divisor + Rest
Beispiel: k02/src/DemoFuerElementareAusdruecke.java
25. Prof. Dr. Fritz Jobst 25 Verarbeitung ganzer Zahlen Ganze Zahlen (byte, short, int bzw. long) sind Bitketten der Länge 8, 16, 32 bzw. 64.
Solche Bitketten können bitweise verarbeitet werden:
& Bitweises und (0xff00 & 0xf0f0 liefert 0xf000)?
| Bitweises oder (0xff00 | 0xf0f0 liefert 0xfff0)?
^ Bitweises exklusives oder (0xff00 ^ 0xf0f0 liefert 0x0ff0)?
~ Bitweise Negation (~0xff00 liefert 0x00ff)?
Bitketten können geschoben (shift) werden. Dies erfolgt im Sinne dualer Zahlen (binäre Werte)?
Die Variable a wird um b Stellen nach links geschoben a << b
1 << 2 ? 4
Die Variable a wird um b Stellen nach rechts geschoben a >> b
8 >> 2 ? 2
Die Variable a wird um b Stellen nach rechts geschoben. Dabei wird von links 0 nachgezogen a >>> b.
Unterschied zu >> nur bei negativen Zahlen (höchstes Bit auf 1)?
26. Prof. Dr. Fritz Jobst 26 Rechnen mit Wahrheitswerten
27. Prof. Dr. Fritz Jobst 27 Typumwandlungen byte m_byte = 0 ;
short m_short = 1 ;
// Der folgende Type-Cast heißt im Klartext:
// Auf das Risiko des Programmierers hin:
// Umwandlung erzwingen
// Denn: die linke Seite kann den Wert der
// rechten Seite nicht aufnehmen
m_byte = (byte)m_short;
//... aber die folgende Zeile ist problemlos:
int m_int = m_short;
Beispiel: k02/src/DemoFuerTypumwandlungen.java
28. Prof. Dr. Fritz Jobst 28 Vereinfachte Regel bei Wertzuweisungen Wenn die rechte Seite in die linke Seite passt, dann ist die Wertzuweisung möglich.
Dies gilt jeweils für den Typ der rechten bzw. linken Seite, nicht die aktuellen Werte.
Ausnahme: Vorsicht bei boolean
Genaue Darstellung: Siehe nächste Folie
Cast:
Typumwandlung mit Gewalt erzwingen.
Der Compiler weist auf ein Risiko hin.
Der Programmierer kann die Warnung abschalten.
29. Prof. Dr. Fritz Jobst 29 Wertzuweisungen a = b
30. Prof. Dr. Fritz Jobst 30 Umwandlung von Zeichenketten
31. Prof. Dr. Fritz Jobst 31 Beispiel: Parameter der Kommandozeile public class DemoFuerParameter {
public static void main (String[] args) {
int i = Integer.parseInt (args[0]);
int j = Integer.parseInt (args[1]);
System.out.println (i+j);
}
}
Mit einem Aufruf
java DemoFuerParameter 3 4
erhält man als Ergebnis die erwartete Zahl 7
Die Parameter der Kommandozeile werden als Argumente args[0], args[1], usw. übergeben, sofern vorhanden.
32. Prof. Dr. Fritz Jobst 32 Zusammenfassen von Anweisungen: {} Mehrere Anweisungen können innerhalb von {}-Klammern zu einer Anweisung zusammengefaßt werden.
public static void main (String[] args) {
int i = 0;
{
int j = i;
System.out.println (j);
}
// Hier gilt j nicht mehr
Die so geklammerte Folge von Anweisungen wird wie eine einzige Anweisung behandelt.
Innerhalb dieser Klammern können wieder Daten definiert werden, die dort und nur dort gelten.
j ist außerhalb der Klammer, in der es definiert wurde, nicht mehr ansprechbar.
33. Prof. Dr. Fritz Jobst 33 Informationen zu Java Das Java-System enthält Tausende von Klassen
Diese können nicht alle im Rahmen der Vorlesung behandelt werden.
Zugriff über die Original-Dokumentation von Sun
http://java.sun.com/j2se/1.5.0/docs/api
Sun gliedert den Zugriff dreistufig über die
Packages (Verzeichnise),
Klassen (Dateien) und dann die
Beschreibung der Methoden etc.
34. Prof. Dr. Fritz Jobst 34
35. Prof. Dr. Fritz Jobst 35 Beschreibung der Sprache Java Programme sind keine einfachen Sammlungen von Anweisungen.
Sie sind in Sprachen verfasst.
Diese Sprachen haben einzelne Worte.
Token, lexikalische Bestandteile
Für den Aufbau der Sprache gelten bestimmte Regeln.
Syntax „mögliche Reihenfolge der Worte“
Die Programme können eine Bedeutung haben
Semantik
36. Prof. Dr. Fritz Jobst 36 Java-Syntax (Einstieg)? Die Sprache Java ist von der Fa. Sun (Autoren: James Gosling, Bill Joy, Guy Steele, Gilad Bracha) unter der folgenden Adresse (URL, Uniform Resource Locator) definiert:
http://java.sun.com/docs/books/jls/third_edition/html/j3TOC.html
Die o. a. Definition ist komplex. Sie ist die Referenz, wird in dieser Einführung in Auszügen benutzt.
Die folgenden Folien beschreiben die Worte der Sprache Java und einige Regeln.
Zusammenfassungen finden Sie nach den Abschnitten über Anweisungen bzw. Methoden.
37. Prof. Dr. Fritz Jobst 37 Reservierte Worte Java 5 abstract continue for new switch
assert default if package synchronized
boolean do goto private this
break double implements protected throw
byte else import public throws
case enum instanceof return transient
catch extends int short try
char final interface static void
class finally long strictfp volatile
const float native super while
38. Prof. Dr. Fritz Jobst 38 Weitere Worte der Sprache Java Literale:
Zahlen 12324, Zeichen 'a', Zeichenfolgen
Trennzeichen
( ) { } [ ] ; , .
Operatoren
= > < ! ~ ? :
== <= >= != && || ++ --
+ - * / & | ^ % << >> >>>
+= -= *= /= &= |= ^= %= <<= >>= >>>=
Und: vom Programmierer festgelegte Benennungen ? Folie über Namen
39. Prof. Dr. Fritz Jobst 39 Vorrangbeziehungen und Auswertung
40. Prof. Dr. Fritz Jobst 40 Vorrangbeziehungen und Auswertung Die Operatoren sind in Zeilen nach wachsendem Vorrang angeordnet.
Die 1. Zeile enthält Operatoren des höchsten Vorrangs, die letzte die des Niedrigsten.
Es gibt die Regel "Punkt vor Strich":
* hat Vorrang vor +
a+b*c wird wie a + (b*c) ausgewertet
Auch die Auswertung spielt eine Rolle:
a=b=c wird wie a = (b=c), also von rechts her ausgewertet.
a+b+c wird von links her, also wie (a+b)+c ausgewertet.
Merkregeln
Es gibt keine Überraschungen (fast, siehe nächste Zeile)?
Vermeiden Sie exotische Operatoren (rot gekennzeichnet)!
41. Prof. Dr. Fritz Jobst 41 Namen und ihre Gültigkeit Alle in einem Programm deklarierten Dinge können benannt werden: int i;
Namen beginnen mit einem Buchstaben. Danach folgen weitere Buchstaben bzw. Ziffern oder das Zeichen _
Reservierte Worte dürfen nicht zur Benennung benutzt werden.
Im Programm definierte Dinge können über ihre Namen angesprochen werden:
i = 3;
Jede Deklaration erfolgt innerhalb von Klammern der Art {}.
Diese Klammern können geschachtelt werden. Die hierdurch bedingten Regeln für die Gültigkeit von Namen innerhalb der Schachtelung sind zu beachten.
42. Prof. Dr. Fritz Jobst 42 Namensräume Ein durch {} begrenzter Bereich wird auch als Namensraum bezeichnet.
Namen gelten in dem durch {} begrenzten Namensraum, in dem sie definiert wurden.
Auf der Ebene der Klasse: Namen gelten auch vor der Definition
Namen können auch außerhalb der Klasse gelten.
Innerhalb von Methoden: Namen gelten ab der Definition
Sie gelten auch in allen darin enthaltenen Namensräumen.
Weiter innen definierte Namen verdecken außen definierte Namen.
Da dies gefährlich ist, ist ein Verdecken von Namen in Java innerhalb von Methoden nur für Namen auf der Klassenebene erlaubt, sonst nicht.
43. Prof. Dr. Fritz Jobst 43 Namen und ihre Gültigkeit Geschachtelte Namensräume
44. Prof. Dr. Fritz Jobst 44 Deklarationen mit static static: diese Dinge gehören zur Klasse
Die Daten werden beim Laden der Klasse initialisiert und können innerhalb der Klasse benutzt werden.
Sie stehen beim Ablauf eines Programms oder Programmsystems allen anderen Java-Klassen zur Verfügung (soweit public).
Ansprechen:
Klassenname.Bezeichner
Beispiel: die Farbe rot
java.awt.Color.red
Die Bedeutung von static wird im Rahmen der Objektorientierung in Kapitel 3 erläutert.
Beispiel: k02/src/StaticInitTest.java
45. Prof. Dr. Fritz Jobst 45 Aufbau von Java-Programmen Ein Programm besteht aus Anweisungen:
System.out.println (....);
x = 2;
Diese werden der Reihe nach ausgeführt, sofern man dies nicht mit speziellen Anweisungen für den Kontrollfluss steuert:
Fallunterscheidungen, Wiederholungen
Einzelne Programmteile (sog. Methoden) fassen Folgen von Anweisungen zusammen und können mit variablen Parametern ausgeführt werden.
46. Prof. Dr. Fritz Jobst 46 Kontrollfluss: Übersicht Fallunterscheidung Wiederholungen
47. Prof. Dr. Fritz Jobst 47 Elemente von Struktogrammen (1)? Verarbeitung (Prozess)?
Mit dem Verarbeitungssymbol werden die Struktur- und Elementarblöcke dargestellt, die Ein- und Ausgabebefehle, Berechnungen und Unterprogrammaufrufe enthalten.
Folge (Sequenz)?
Folgen mit zwei oder mehreren Arbeitsschritten werden durch aneinander gereihte Strukturblöcke dargestellt. Diese Blöcke müssen gleich breit sein.
Alternative (Verzweigung)?
Wird im Programmablauf eine Bedingung gestellt, wird dies mit dem Symbol "Alternative" dargestellt. Ist die Bedingung erfüllt, wird der Strukturblock 1 (Anweisung1) ausgeführt, sonst Strukturblock 2 (Anweisung2).
48. Prof. Dr. Fritz Jobst 48 Elemente von Struktogrammen (2)? Fallauswahl (Mehrfachverzweigung)?
Eine mehrfache Bedingung im Programmablauf wird mit diesem Symbol dargestellt.
Es wird kontrolliert, welche Auswahl vorgenommen wurde, und in den entsprechenden Strukturblock verzweigt.
Trifft keine der Bedingungen zu, wird der Alternativblock (default-Anweisung) ausgeführt.
Wiederholung (Schleife)?
Diese Wiederholungssymbole dienen der Darstellung von Anweisungen in Schleifen.
Der Rumpf der Schleife wird in Abhängigkeit einer Bedingung ausgeführt.
Bedingung am Anfang der Schleife: (while-Schleife)
Vorsicht: Es gibt Fälle, bei denen der Rumpf der while-Schleife niemals durchlaufen wird.
Bedingung am Ende der Schleife: (do-Schleife)?
Vorsicht: der Rumpf der do-Schleife wird in jedem Fall mindestens einmal durchlaufen.
49. Prof. Dr. Fritz Jobst 49 Fallunterscheidungen Fallunterscheidung mit zwei Alternativen. Genau eine Anweisung wird ausgeführt!
Falls Haltbarkeit abgelaufen:
wegwerfen
Sonst
Verbrauchen
Fallunterscheidungen mit mehreren Alternativen. Auswahl einer Anweisung
Tätigkeit:
falls Informatiker: Gehalt = x
falls Kaminkehrer: Gehalt = y
falls Industriekaufmann: Gehalt = z
Falls Konzernchef: Gehalt = u
falls Bäcker: Gehalt = v
50. Prof. Dr. Fritz Jobst 50 Fallunterscheidung mit if
if (Ausdruck)?
Anweisung1 // Entweder Anweisung1 (falls Ausdruck wahr)?
else
Anweisung2 // oder Anweisung2, aber niemals beide
// Hier wird die Ausführung nach if fortgesetzt
Ausdruck: vom Typ boolean und sonst nichts.
51. Prof. Dr. Fritz Jobst 51 if-Anweisung: Bedeutung (Semantik) Die Verzweigung mit if dient zum Programmieren von Fallunterscheidungen.
Man kann eine Entweder-oder-Entscheidung treffen oder eine Anweisung nur unter einer bestimmten Bedingung ausführen lassen.
Auswahl einer Anweisung:
entweder Fall 1
oder Fall 2
Oder: Bedingte Ausführung einer Anweisung
if (Ausdruck)?
Anweisung // Nur falls Ausdruck wahr: ausführen
// Hier wird die Ausführung nach if fortgesetzt
52. Prof. Dr. Fritz Jobst 52 Vergleiche Bedeutung Java
Falls a kleiner ist als b if (a < b)?
Falls a kleiner ist als b oder gleich b if (a <= b)?
Falls a gleich b ist if (a == b)?
Falls a ungleich b ist if (a != b)?
Falls a größer ist als b if (a > b)?
Falls a größer ist als b oder gleich b if (a >= b)?
Vergleiche liefern boolesche Werte. Sie können daher bei der if-Anweisung als Ausdruck benutzt werden.
53. Prof. Dr. Fritz Jobst 53 Logische Verknüpfungen von Ausdrücken
54. Prof. Dr. Fritz Jobst 54 Schachtelung von if 01 if (a < 0)?
02 System.out.println ("Fall: a < 0");
03 else if (a == 0)?
04 System.out.println ("Fall: a = 0");
05 else
06 System.out.println ("Fall: a > 0");
07 // ...
55. Prof. Dr. Fritz Jobst 55 Vorsicht mit leeren Anweisungen
01 if (a < 0);
02 System.out.println ("Fall: a < 0");
Hier würde die leere Anweisung vor ; ausgeführt.
Die Anweisung 02 würde in jedem Fall ausgeführt.
56. Prof. Dr. Fritz Jobst 56 Fallunterscheidung: Quadratische Gleichung ax2 + bx + c = 0
Lösung:
Falls a ungleich 0: quadratische Gleichung
Dann mit Formel (nächste Seite) lösen.Aber: Fallunterscheidung für Diskriminante!
Sonst
lineare Gleichung bx + c = 0
Falls b = 0: konstante Gleichung
Falls c = 0: alle x sind Lösung
Sonst: kein x löst die Gleichung
Sonst: Lösung = -c/b
57. Prof. Dr. Fritz Jobst 57 Fallunterscheidungen: Lösung der quadratischen Gleichung ax2 + bx + c = 0
58. Prof. Dr. Fritz Jobst 58 Fallunterscheidung:quadratische Gleichung ax2 + bx + c = 0
59. Prof. Dr. Fritz Jobst 59 Auswahl von Anweisungen: Fallunterscheidung mit switch
60. Prof. Dr. Fritz Jobst 60 Schreibweise : switch Vorsicht: break schreiben! switch (Ausdruck) {
case konst1: Anweisungen1 break;
case konst2: Anweisungen2 break;
......... usw.
default : Anweisungen
}
Ausdruck : eine ganze Zahl
konst… : ganzzahlige Konstanten
Zur Beachtung: Auch Zeichen sind ganze Zahlen
Aber: Zeichenfolgen, Gleitkommazahlen sind keine ganzen Zahlen!
61. Prof. Dr. Fritz Jobst 61 switch: Beispiel public class DemoFuerSwitch {
public static void main (String args []) {
int i = Integer.parseInt (args[0]);
// i = Zahl als Wert des 1. Parameters
switch (i) {
case 1:
case 2: System.out.println (i + " Fall 1,2");
// Weiter bei Fall 3
case 3: System.out.println (i + " Fall 3");
// Weiter bei Fall 7
case 7: System.out.println (i + " Fall 7"); break;
default : System.out.println (i + " sonst");
}
}
}
62. Prof. Dr. Fritz Jobst 62 switch: Probelauf Beispiel >java DemoFuerSwitch 1
1 Fall 1,2
1 Fall 3
1 Fall 7
>java DemoFuerSwitch 2
2 Fall 1,2
2 Fall 3
2 Fall 7
>java DemoFuerSwitch 3
3 Fall 3
3 Fall 7
>java DemoFuerSwitch 5
5 sonst
>java DemoFuerSwitch 7
7 Fall 7
63. Prof. Dr. Fritz Jobst 63 Wiederholung von Anweisungen: while, for Prüfung am Anfang:
Solange wahr
tue Anweisung
while (Ausdruck)?
Anweisung
for (Initialisierer; Bedingung; Ausdruck)?
Anweisung
64. Prof. Dr. Fritz Jobst 64 while: Beispiel int i = 0;
while (i < 10) {
System.out.println (i); // Anweisung
i = i + 1;
}
Anweisung wird für die Werte
i = 0 i = 1 i = 2 ... i = 9
ausgeführt. Diese Werte werden der Reihe nach ausgegeben.
65. Prof. Dr. Fritz Jobst 65 for: Beispiel for (int i = 0; // Initialisierung
i < 10; // Bedingung
i++) // Ausdruck
{
System.out.println (i); // Anweisung
}
Anweisung wird für die Werte
i = 0 i = 1 i = 2 ... i = 9
ausgeführt
Funktioniert genauso (außer: Gültigkeit von i) wie while auf der vorigen Folie!
66. Prof. Dr. Fritz Jobst 66 for: Bedeutung for (Initialisierer; Bedingung; Ausdruck)?
Anweisung
... bedeutet:
{
Initialisierer;
while (Bedingung)
{
Anweisung
Ausdruck;
}
}
Beispiel: k02/src/DemoFuerFor.java
67. Prof. Dr. Fritz Jobst 67 Erweiterte for-Anweisung bei Java 5 Java 5 kennt eine erweiterte Form der for-Schleife: für-alle-Elemente
public static void main (String[] args) {
for (String s : args)?
System.out.println (s);
}
Die println-Anweisung wird der Reihe nach für alle Elemente von args durchlaufen.
68. Prof. Dr. Fritz Jobst 68 Wiederholung von Anweisungen: do-while Schleifen mit Prüfung am Ende
tue Anweisung, solange wahr
do
Anweisung
while (Ausdruck);
69. Prof. Dr. Fritz Jobst 69 do-while: Beispiel
int i = 0;
do {
System.out.println (i); // Anweisung
i = i + 1;
} while (i < 10)
Anweisung wird für die Werte
i = 0 i = 1 i = 2 ... i = 9
ausgeführt
Beispiel: k02/src/QuadratWurzel.java
70. Prof. Dr. Fritz Jobst 70 Verlassen von Schleifen: break Mit break wird die do-while-for-Schleife bzw. die switch-Anweisung verlassen, in der die Anweisung steht.
Bei geschachtelten Anweisungen wird dabei nur eine Anweisung verlassen:
Die Schachtelungstiefe der Anweisungen verringert sich um eins.
break mit Name:
In diesem Fall muss bei break ein Name angegeben sein, der eine die Schleife umfassende Anweisung bezeichnet.
Damit kann man auch geschachtelte Schleifen mit einer einzigen break-Anweisung verlassen.
Eine mögliche Anwendung sind geschachtelte Suchschleifen.
71. Prof. Dr. Fritz Jobst 71 Fortsetzen mit continue Mit continue wird die Schleifenausführung fortgesetzt.
Dies erfolgt bei while- und do-Schleifen beim Bewerten des Ausdrucks.
Bei for(A1; A2; A3) wird A3 durchlaufen und danach A2 bewertet.
Beispiel: k02/src/DemofuerContinue.java
72. Prof. Dr. Fritz Jobst 72 Programmausnahmen Wenn Programme nicht auf Ausnahme-situationen reagieren können, führt das zu den von den Anwendern gefürchteten Abstürzen.
Bei komplexen Programmsystemen und verteilten Anwendungen sind Programme ohne jede Reaktion auf Ausnahmesituationen nicht akzeptabel.
Sind solche Programme je zumutbar???
73. Prof. Dr. Fritz Jobst 73 Programmausnahmen Die Behandlung von Ausnahmen mit den Sprachkonstrukten für den Normalfall hat sich nicht bewährt.
So könnte man sich eine Behandlung von Ausnahmen im Rahmen von Abfragen mit if vorstellen. Jede Routine müsste dann entsprechende Fehlerschalter bzw. entsprechende Ergebnisse liefern.
Bei dieser Vorgehensweise hat man eine völlig unübersichtliche Programmstruktur erhalten: Eine tiefe Schachtelung nach Aufrufen von Routinen, eine Verquickung von Programmcode für den Ablauf sowie für den Ausnahmefall.
74. Prof. Dr. Fritz Jobst 74 Ausnahmen in Java: Schreibweisen try {
// Probieren wir eine Folge von Anweisungen...
….
….
} catch (xException e) {
// und wenn es schief geht: Reaktion oder aber
} catch (yException e) {
// Reaktion auf oben nicht aufgefangene
// Programmausnahme
} finally {
// Abschließende Maßnahmen
// Nach try-catch: wird in jedem Fall durchlaufen
}
75. Prof. Dr. Fritz Jobst 75 Programmausnahmen catch macht keine Aktionen des Programms rückgängig
Keine Bestellung stornieren, …
catch: nur eine Art Fortsetzung des Programms an einer bestimmten Auffangstelle.
Je nach Art der Programmausnahme kann eine geeignete Behandlung erfolgen
Dadurch wird eine „weiche Landung“ des Programms möglich, Abstürze werden vermieden.
76. Prof. Dr. Fritz Jobst 76 Beispiel public class DemoFuerException {
public static void main (String args []) {
for (int i = -3; i <= 3; i++)?
try {
// Schauen wir mal...klappt das wirklich?
// Wohl eher weniger: Division durch 0?
System.out.println (1 / i);
} catch (ArithmeticException e) {
// Hoppla:
System.out.println ("Exception: " + e);
}
}
}
Beispiel: k02/src/DemoFuerException.java
77. Prof. Dr. Fritz Jobst 77 Kontrollfluss: Zusammenfassung Ein Programm besteht als elementaren Anweisungen wie Wertzuweisung und Methodenaufrufen.
Mit if und switch können Fallunterscheidungen getroffen werden.
while, for und do dienen der wiederholten Ausführung von Anweisungen.
Ausnahmesituationen lassen sich mit try-catch strukturiert behandeln.
78. Prof. Dr. Fritz Jobst 78 Syntax für Anweisungen Die Syntax einer Programmiersprache kann mit Syntaxdiagrammen beschrieben werden.
Symbole in Rechtecken: werden durch andere Diagramme erklärt
Symbole in Ovalen müssen in genau so angegeben werden, nachfolgend im Text mit "…" bezeichnet.
Im o. a. Beispiel:
Die if-Anweisung besteht aus "if", gefolgt von "(", Expression, ")" sowie Statement. Optional kann ein Zweig aus "else" und einem Statement folgen.
Statement ist eine beliebige Anweisung, also z.B. eine Wertzuweisung, eine if-Anweisung …
Expression muss ein Ausdruck sein.
Die folgenden Folien stellen die Syntax für Anweisungen dar.
81. Prof. Dr. Fritz Jobst 81
82. Prof. Dr. Fritz Jobst 82 Methoden Bezeichnung in C, Pascal...: Funktionen, Prozeduren
Programme dienen der Lösung von Problemen.
Wenn man das Problem in Teilprobleme zerlegt, dann dienen die Methoden der Lösung dieser Teilprobleme.
Beispiel: (daten, y, j, k als definiert angenommen)?
System.out.println (daten);
double x = Math.sqrt (y); // Methode liefert Wert
int i = Math.min (j, k); // Methode liefert Wert
Methoden können über Aufrufe aktiviert werden. Danach wird das Programm mit der nächsten Anweisung fortgesetzt.
Methoden können auch als "erweiterte Befehle" an die Maschine verstanden werden.
83. Prof. Dr. Fritz Jobst 83 Aufruf von Methoden Methoden können aufgerufen werden.
System.out.println (daten);
Beim Aufruf werden Parameter übergeben.
Die Methode benutzt diese Parameter und arbeitet damit (aktuelle Parameter)?
System.out.println ("Hallo");
System.out.println ("Welt");
double x = Math.sqrt (9.0); // x ? 3.00...
double y = Math.sqrt (16.0); // y ? 4.00...
int i = Math.min (4, 9); // i ? 4
Methoden können Werte liefern
84. Prof. Dr. Fritz Jobst 84 Parameter Im Aufruf werden Parameter als Wert übergeben: aktuelle Parameter.
Der Wert des Ausdrucks wird berechnet und an die Methode übergeben.
Die aktuellen Parameter müssen mit der Definition der Parameter (formale Parameter) in der Methode hinsichtlich Anzahl und Typ übereinstimmen. Siehe nächste Folie.
Wenn z.B. ein Parameter vom Typ double verlangt war, so muss ein Wert übergeben werden, der im Sinne der Wertzuweisung hier passt: int, float, double.
85. Prof. Dr. Fritz Jobst 85 Definition von Methoden Methoden können in den Java-Klassen auf Klassenebene definiert werden.
Definition von Daten:
int zahl;
Definition einer Methode:
int methode1 (int parameter) { ...Befehle... ... return Ausdruck; // Ein Ergebnis liefern
}
Dann kann die Methode wie im Java-API definierte Methoden benutzt werden: ... = methode1 (2+3*4);
Die Parameter in der Definition heißen auch formale Parameter.
Hinweis: Bis zur OOP müssen wir static vor die Definitionen schreiben.
Vgl. hierzu Kapitel 3.
Beispiel zum Ueberladen von Funktionen: k02/src/Ueberladen.java
86. Prof. Dr. Fritz Jobst 86 Methoden: Beispiele // Ermittle das Maximum zweier ganzer Zahlen
// Parameter : i und j vom Typ int
// Ergebnis : vom Typ int
static int maximum (int i, int j) {
if (i > j)?
return i;
else
return j;
}
// Ausgabe eines Textes nach Standard-Ausgabe
// Parameter : Eine Zeichenfolge vom Typ String
// Ergebnis : keines (d.h. void)?
static void print (String text) {
System.out.println (text);
}
87. Prof. Dr. Fritz Jobst 87 Methoden: Beispiel // Stelle eine ganze Zahl n-stellig mit AnzahlZiffern dar.
// Verwende Leerzeichen für rechtsbündige Darstellung.
// Es werden mindestens n Zeichen ausgegeben.
// Parameter : Zahl und AnzahlZiffern
// Ergebnis : eine Zeichenfolge (String)?
static String zahl2Text (int Zahl, int AnzahlZiffern) {
// StringBuffer dient dem Aufbau von Zeichenfolgen
// Vgl. Kapitel 3.
StringBuffer b = new StringBuffer ();
// Wandle die Zahl in eine Zeichenfolge um
b.append (Zahl); // append (...): ... anhängen
// Fülle mit Leerzeichen von Links her auf
while (b.length() < AnzahlZiffern)?
b.insert (0, ' '); // insert (...) ... bei 0 einsetzen
return b.toString ();
}
88. Prof. Dr. Fritz Jobst 88 Beispiel für Ablauf eines Aufrufs
89. Prof. Dr. Fritz Jobst 89 Ablauf des Aufrufs: Hintergrundinformation Die JVM (Java Virtual Machine) ist für den Ablauf von Java-Programmen zuständig.
Für jeden Aufruf Methode wird ein Aktivierungsblock, ein sog. Frame angelegt. Dieser lebt genau so lange, bis der Aufruf beendet wird.
Dieser „Frame“ enthält alle Parameter, lokalen Daten der Methode sowie Platz für die Rücksprungadresse und das Ergebnis einer Methode, sofern vorhanden.
Beim Aufruf einer Methode wird ein „Frame“ angelegt. Die Werte der Parameter werden vom Aufrufer in die dafür vorgesehenen Plätze im „Frame“ übertragen.
Die Rücksprungadresse muss notiert werden, damit nach Ablauf der Methode eine Programmfortsetzung möglich wird.
Der „Frame“ des Aufrufers mit all seinen Daten bleibt während des Aufrufs von minimum erhalten, da sein eigener Aufruf noch nicht beendet ist.
Er wird nach dem Rücksprung aus der gerufenen Methode minimum wieder benützt.
90. Prof. Dr. Fritz Jobst 90 Ablauf des Aufrufs: Skizze
91. Prof. Dr. Fritz Jobst 91 Beispiel Einlesen zweier Zahlen
Ausgabe des Minimums
Hierzu:
Deklaration einer Methode min()?
main liest Daten ein
main ruft die Methode min auf
main gibt die Ergebnisse aus
92. Prof. Dr. Fritz Jobst 92 Beispiel für eine Methode import java.util.*;
public class BestimmeMinimum {
static int min (int i, int j) {
if (i < j)?
return i; // i < j
else
return j; // sonst i >= j, liefere j
}
public static void main (String args[]){
System.out.println ("Bitte zwei Zahlen eingeben");
Scanner eingabe = new Scanner (System.in);
int zahl1 = eingabe.nextInt ();
int zahl2 = eingabe.nextInt ();
System.out.printf ("Das Minimum aus %d und %d ist %d\n", zahl1, zahl2, min (zahl1, zahl2));
}
}
93. Prof. Dr. Fritz Jobst 93 Ablauf des Beispiels main ruft ...println (parameter) auf: Ausgabe
main ruft ...nextInt() auf: 1. Zahl einlesen
main ruft ...nextInt() auf: 2. Zahl einlesen
Aufruf von min (wert von zahl1, wert von zahl2);
min erhält die eingegebenen Werte
min setzt das Ergebnis: die kleinere Zahl
printf erhält dieses Ergebnis und gibt es aus.
94. Prof. Dr. Fritz Jobst 94 Rekursion Methoden in Java sind ohne Einschränkung auch rekursiv aufrufbar. Dies gilt in gleicher Weise für static-Methoden wie auch für andere.
Die Rekursion kann als Strategie zur Lösung eines Problems immer dann eingesetzt werden, wenn ein Teilproblem ähnlich zu lösen ist wie das gesamte Problem.
Zur Lösung eines Problems verwendet die Rekursion eine Routine zur Lösung eines Teilproblems, nämlich sich selbst, aber mit anderen Parametern als im „eigenen“ Aufruf.
Wenn der Aufruf stets mit gleichen Parametern erfolgen würde, würde man versuchen, das Problem durch sich selbst zu lösen.
Dieser Versuch ist natürlich zum Scheitern verurteilt.
95. Prof. Dr. Fritz Jobst 95 Rekursion: Fakultät Definition der Fakultät über eine Wertetabelle
n 0 1 2 3 4 5 6
n! 1 1 2 6 24 120 720
Das Problem der Berechnung von n! wird in Teilprobleme zerlegt:
Berechne (n-1)!
Multipliziere das Ergebnis mit n
96. Prof. Dr. Fritz Jobst 96 Fakultät programmieren Die Formel lässt sich 1:1 umsetzen
int fakultaet (int n) {
if (n == 0)?
return 1; // Ergebnis 1
else
return n* fakultaet (n-1);
}
97. Prof. Dr. Fritz Jobst 97 Probelauf für den Aufruf fakultaet (2)?
98. Prof. Dr. Fritz Jobst 98 Prinzip der Rekursion Probleme können gelöst werden, indem man sie in Teilproblem zerlegt.
Die Methode zur Lösung des Problems ruft dann die Methoden zur Lösung der Teilprobleme auf.
Wenn ein Teilproblem Ähnlichkeiten zum Problem aufweist, eignet es sich als Methode.
Die Aufgabenstellung wird über die Parameter definiert.
Diese müssen sich für das Teilproblem ändern ? einfacher werden.
Damit kann die Gesamtlösung aus den Teillösungen zusammengesetzt werden.
99. Prof. Dr. Fritz Jobst 99 Türme von Hanoi Die Scheiben auf dem Stapel „Quelle“ sollen auf den Stapel „Ziel“ transportiert werden.
Dabei darf jeweils nur eine Scheibe bewegt werden.
Es darf niemals eine größere auf eine kleinere Scheibe zu liegen kommen.
Alle drei Stapel dürfen benutzt werden.
100. Prof. Dr. Fritz Jobst 100 Türme von Hanoi: 1 Scheibe
101. Prof. Dr. Fritz Jobst 101 Türme von Hanoi: 2 Scheiben
102. Prof. Dr. Fritz Jobst 102 Türme von Hanoi: 3 Scheiben
103. Prof. Dr. Fritz Jobst 103 Türme von Hanoi: Vorgehen
104. Prof. Dr. Fritz Jobst 104 Türme von Hanoi: Lösungsansatz public class Hanoi {
// Bewege eine Scheibe
public static void bewege1 (int Quelle, int Ziel) {
System.out.println ("Bewege "+Quelle+" nach "+Ziel);
}
// Bewege zwei Scheiben. Benutze die Lösung für 1 Scheibe
public static void bewege2 (int Quelle,int Hilf,int Ziel) {
bewege1 (Quelle, Hilf); // (I)
bewege1 (Quelle, Ziel); // (II)?
bewege1 (Hilf, Ziel); // (III)?
}
105. Prof. Dr. Fritz Jobst 105 Türme von Hanoi: Lösungsansatz // Bewege drei Scheiben. Benutze die Lösung für 2 Scheiben
public static void bewege3 (int Quelle, int Hilf, int Ziel) {
bewege2 (Quelle, Ziel, Hilf); // (I)?
bewege1 (Quelle, Ziel); // (II)
bewege2 (Hilf, Quelle, Ziel); // (III)?
}
public static void main (String[] args) {
// Quelle = Stapel 0, Hilf = Stapel 1, Ziel = Stapel 2
bewege3 (0, 1, 2);
}
}
106. Prof. Dr. Fritz Jobst 106 Vereinfachung dieses Ansatzes Die bewege…-Routinen ähneln sich stark.
Der Unterschied liegt in der Anzahl der Türme.
Wenn man diese Anzahl als Parameter übergibt, dann hat man eine Routine für alle Fälle.
Diese Routine kann dann sogar mehr als nur 3 Türme bewegen: der Parameter kann beliebig groß sein.
107. Prof. Dr. Fritz Jobst 107 Türme von Hanoi: Lösung public class TowersOfHanoi {
static void bewege (int Quelle, int Hilf, int Ziel, int n) {
if (n == 1)?
System.out.println ("Bewege "+Quelle+" nach "+Ziel);
else {
bewege (Quelle, Ziel, Hilf, n-1); // (I)?
bewege (Quelle, 0, Ziel, 1); // (II)?
bewege (Hilf, Quelle, Ziel, n-1); // (III)?
}
}
public static void main (String[] args) {
bewege (0, 1, 2, 3);
}
}
Beispiele: k02/src/TowersOfHanoi.java, …/Hanoi.java
108. Prof. Dr. Fritz Jobst 108 Methoden: Zusammenfassung Der aktive Teil eines Programm besteht aus den Methoden.
Methoden enthalten Anweisungen.
Methoden können in der Definition formale Parameter enthalten.
Bei Aufruf führt das Laufzeitsystem Wertzuweisungen auf diese Parameter aus. Die Methode rechnet also mit den Parametern.
Für Parameter gibt es nur diese Übergabe als Wert.
109. Prof. Dr. Fritz Jobst 109 Methoden: Syntax der Definition
110. Prof. Dr. Fritz Jobst 110 Felder: Daten in variabler Anzahl public class ZugriffAufParameter {
public static void main (String[] args) {
// args.length = Anzahl der Parameter
// args[0] = 1. Parameter usw........
for (int i = 0; i < args.length; i++) {
System.out.println ("Par. " + i + " = " + args[i]);
}
int i = 0;
for (String s: args) {
System.out.printf ("Par. %d = %s\n", i, s);
}
}
}
Die Anzahl der Parameter im Aufruf ist variabel und bei der Programmierung nicht vorherzusehen.
Beispiel: k02/src/DemoFuerParameter.java
111. Prof. Dr. Fritz Jobst 111 Lösung: Felder Programmiersprachen lösen dieses Problem mit Feldern.
Bezeichnung: Array, Feld
Ein Feld ist eine Ansammlung von Daten gleichen Typs.
Der Zugriff auf die einzelnen Komponenten erfolgt mit einem Index zur Auswahl [].
Die Anzahl der Indices heißt auch Dimension des Feldes: 1 Index = 1-dimensionales Feld
Java kennt ein- und mehrdimensionale Felder
112. Prof. Dr. Fritz Jobst 112 Felder in Java
113. Prof. Dr. Fritz Jobst 113 Felder in Java Kurz:
int[] zahlen = {1, 2, 3, 4};
zahlen.length enthält die Feldlänge
Feldlängen sind unveränderlich, wenn sie einmal gesetzt sind
Die Variable zahlen enthält nicht den Inhalt des Feldes, sie entspricht einer „Hausnummer“.
Das eigentliche „Haus“ steht an anderer Stelle. Die einzelnen Komponenten können über die „Hausnummer“ zahlen erreicht werden:
zahlen[0] zahlen[1] zahlen[i] für eine int-Variable i.
Ein solches Feld ist ein eindimensionales Feld.
114. Prof. Dr. Fritz Jobst 114 Felder: Wertzuweisung Kopieren des Inhaltes der Feldvariablen, nicht des Inhalts des Feldes!
115. Prof. Dr. Fritz Jobst 115 Felder: Wertzuweisung Der Feldname wird häufig auch als Referenz auf das Feld bezeichnet.
Wenn statt der Kopie des Feldnamens (=„Hausnummer“) eine Kopie des Inhalts (=„Haus“) gewünscht wird, so müssen die Werte aller Komponenten kopiert werden.
Dies ist das sog. Clonen des Feldes.
Hierfür gibt es in Java eine clone-Anweisung.
Diese Kopie der Inhalte eines Feldes erfordert einen Aufwand, der proportional zur Größe des Feldes ist.
Da jede Referenz in der CPU gerade ein Maschinenwort belegt, ist die Kopie von Referenzen (=„Hausnummern“) effizient.
Damit ist auch die Übergabe von Feldern als Parameter an Methoden effizient.
Die Methode erhält die Referenz: eine Kopie der „Hausnummer“ und kann mit dieser auch auf die Feldinhalte lesend und schreibend zugreifen. Denn: die Kopie der Hausnummer ist identisch mit der Hausnummer.
116. Prof. Dr. Fritz Jobst Beispiele zu Feldern 1 k02/src/DemoFuerFelderClonen.java
k02/src/LineareSuche.java
117. Prof. Dr. Fritz Jobst 117 Einlesen eines Feldes import java.util.*;
public class Demofeld_1_Dim {
private static Scanner eingabe
= new Scanner (System.in);
static void lies(double[] feld) {
for (int i = 0; i < feld.length; i++) {
feld[i] = eingabe.nextDouble ();
}
}
118. Prof. Dr. Fritz Jobst 118 Maximum bestimmen static double maximum(double[] feld) {
double max = feld[0];
for (double f : feld) {
if (f > max)?
max = f;
}
/* Alternative: die "klassische" for-Schleife
double max = feld[0];
for (int i = 1; i < feld.length; i++) {
if (feld[i] > max) {
max = feld[i];
}
}
*/
return max;
}
119. Prof. Dr. Fritz Jobst 119 Summe bestimmen static double summe(double[] feld) {
double summe = 0;
for (double f : feld) {
summe += f;
}
/* Alternative: die "klassische" for-Schleife
double summe = feld[0];
for (int i = 1; i < feld.length; i++) {
summe += feld[i];
}
*/
return summe;
}
120. Prof. Dr. Fritz Jobst 120 Durchschnitt bestimmen static double durchschnitt(double[] feld) {
return summe (feld) / feld.length;
}
public static void main(String[] args) {
System.out.printf ("Bitte die Anzahl der Zahlen im feld eingeben:\n");
int anzahlKomponenten = eingabe.nextInt();
double feld[] = new double[anzahlKomponenten];
System.out.printf ("Bitte die %d Zahlen im feld eingeben:\n", anzahlKomponenten);
lies (feld);
System.out.printf ("Maximum %f\n", maximum (feld));
System.out.printf ("Minimum %f \n", summe (feld));
System.out.printf ("Durchschnitt %f\n", durchschnitt (feld));
}
}
121. Prof. Dr. Fritz Jobst Beispiele zu Feldern 2 k02/src/DemoFeld_1_Dim.java
k02/src/Lotto.java
k02/src/BinaereSuche.java
122. Prof. Dr. Fritz Jobst 122 Sortieren eines Feldes Eine der immer wiederkehrenden Aufgaben der Programmierung ist das Sortieren von Feldern.
Natürlich bietet die Java-Bibliothek Methoden zum Sortieren von Feldern:
Siehe die Klasse java.util.Arrays.
Zum Einstieg ist es sinnvoll, einige Verfahren zum Sortieren kennenzulernen.
Bubblesort ist eines der elementaren Verfahren zum Sortieren von Feldern.
123. Prof. Dr. Fritz Jobst 123 Bubblesort Bubblesort arbeitet in mehreren Durchgängen:
Zunächst wird das größte Element des ganzen Feldes an den Anfang gesetzt. (Schritt 1 nächste Folie)?
Dann wird das größte Element des restlichen Feldes an den Anfang des Restes gesetzt.
Usw… (Schritte 2, 3, 4) dadurch erhält man ein sortiertes Feld.
Das größte Element eines Feldes wird durch den Austausch benachbarter Elemente bewegt.
Dabei beginnt man am Ende des Feldes.
Man vergleicht zwei benachbarte Elemente.
Ist das weiter unten liegende Element „leichter“ als sein Vorgänger, so wandert es nach oben.
Diesem „Aufsteigen“ verdankt das Verfahren seinen Namen.
Dies wiederholt man, bis man am Anfang des Feldes ist.
124. Prof. Dr. Fritz Jobst 124 Sortieren von Feldern: Bubble-Sort
125. Prof. Dr. Fritz Jobst 125 Sortieren von Feldern: Bubble-Sort in Java void bubble (int[] feld) {
// Für alle Teilfelder ab Anfang tue
for (int i = 1; i < feld.length; i++)?
// Bringe das größte Element des jeweiligen Feldes nach oben
for (int j = feld.length-1; j >= i; j--)?
if (feld[j] < feld[j-1]) {
int temp = feld[j];
feld[j] = feld[j-1];
feld[j-1] = temp;
}
}
Beispiel: k02/src/SortDemo.java
126. Prof. Dr. Fritz Jobst 126 Mehrdimensionale Felder in Java Java realisiert mehrdimensionale Felder als Felder aus Feldern…
Ein zweidimensionales Feld (Matrix) ist damit ein Feld aus eindimensionalen Feldern.
D.h.: Jede Komponente (=Zeile) der Matrix ist ihrerseits wieder ein Feld.
Vorteil:
Das zweidimensionale Feld kann ungleich lange Komponenten haben.
Nachteil:
Der Zugriff erfordert eine relativ hohe Laufzeit.
127. Prof. Dr. Fritz Jobst 127 Mehrdimensionale Felder
128. Prof. Dr. Fritz Jobst 128 Arbeiten mit Matrizen in Java public class Feld_2_Dim {
// Hilfsprogramme
// Wandle eine Zahl in eine Darstellung mit
// AnzahlZiffern um
static String z2T (int zahl, int AnzahlZiffern) {
StringBuffer b = new StringBuffer ();
b.append (zahl);
while (b.length() < AnzahlZiffern)?
b.insert (0, ' ');
return b.toString ();
}
public static void main (String[] args) {
test2Dim (); // ? Nächste Folien
}
129. Prof. Dr. Fritz Jobst 129 Ausgabe einer Matrix // Ausgabe eines 2-dim-Feldes
static void print2Dim (int[][] feld) {
for (int i = 0; i < feld.length; i++) {
for (int j = 0;j < feld[i].length;j++)?
System.out.print ("feld[" +
z2T(i, 2) + "][" +
z2T(j, 2) + "] = " +
z2T(feld[i][j], 4) + ' ');
System.out.println ();
}
}
130. Prof. Dr. Fritz Jobst 130 Bearbeiten einer Matrix static void test2Dim() {
// a) Deklaration eines Feldes
int[][] feld;
// b) Speicher holen
feld = new int[2][2];
// c) Zuweisen der Inhalte der Werte der Komponenten
for (int i = 0; i < feld.length; i++)?
for (int j = 0; j < feld[i].length; j++)?
feld[i][j] = i*10 + j;
print2Dim (feld);
// Direktes Auflisten aller Elemente
print2Dim (new int[][] {{0, 1}, {10, 11}});
}
}
Beispiel: k02/src/DemoFeld_2_Dim.java
131. Prof. Dr. Fritz Jobst 131 Zusammenfassung Prozedurale Programmierung Daten und Typen
Ein-/Ausgabe
Kontrollstrukturen
Methoden und Rekursion
Felder, Bubblesort, Matrizen