Grundlegende Prinzipien der...

55
Proinformatik: Objektorientierte Programmierung Freie Universität Berlin Dr. Marco Block-Berlitz Sommersemester 2012 62 Grundlegende Prinzipien der Programmentwicklung

Transcript of Grundlegende Prinzipien der...

Proinformatik: Objektorientierte Programmierung

Freie Universität Berlin

Dr. Marco Block-BerlitzSommersemester 2012 62

Grundlegende Prinzipien der Programmentwicklung

Proinformatik: Objektorientierte Programmierung

Freie Universität Berlin

Dr. Marco Block-BerlitzSommersemester 2012

Grundlegende Prinzipien der Programmentwicklung

• Programm als Kochrezept• Aktivitätsdiagramm (UML)• Prinzipien der Programmerstellung• Pseudocode• Erstellen eines Javaprogramms• Einfaches Klassenkonzept• Kommentare, Syntaxhighlighting, Einrücken• Sequentielle Anweisungen• Verzweigungen• Schleifentypen• Sprunganweisungen• Wiederholende Programmabschnitte

63

Übersicht zum Vorlesungsinhalt zeitliche Abfolge und Inhalte können variieren

Proinformatik: Objektorientierte Programmierung

Freie Universität Berlin

Dr. Marco Block-BerlitzSommersemester 2012 64

Proinformatik: Objektorientierte Programmierung

Freie Universität Berlin

Dr. Marco Block-BerlitzSommersemester 2012 65

Proinformatik: Objektorientierte Programmierung

Freie Universität Berlin

Dr. Marco Block-BerlitzSommersemester 2012

Rezept für sechs Portionen von Omas Eierpfannkuchen

66

Die Reihenfolge der Anweisungen ist wichtig!

Proinformatik: Objektorientierte Programmierung

Freie Universität Berlin

Dr. Marco Block-BerlitzSommersemester 2012

Pseudocode vom Rezept

67

1 vier Eier in eine Schüssel schlagen und verrühren

2 Mehl in die Schüssel hinzugeben

3 -> wenn Teig noch nicht schwer zu rühren ist gehe zu 2

4 Milch in die Schüssel geben

5 -> wenn Teig nicht leicht zu rühren ist gehe zu 4

6 etwas Fett in einer Pfanne erhitzen

7 einen Teil in die Pfanne geben, bis Boden gut bedeckt

8 -> wenn süße Variante gewünscht gehe zu 9 ansonsten zu 10

9 Apfelscheiben hinzugeben, gehe zu 11

10 Wurst und Käse hinzugeben

11 die Eierpfannkuchen von beiden Seiten gut braun braten

12 -> wenn süße Variante gewünscht gehe zu 13 ansonsten zu 14

13 mit Marmelade, Apfelmus oder Zucker garnieren

14 FERTIG

Mit Pseudocode bezeichnen wir die lesbare Notation eines Programms in keinerspezifischen Programmiersprache, sondern in einer allgemeineren Form:

Alltägliche Prozesse können als Programme verstanden werden. Es gibt immerwiederkehrende Vorgehensweisen. Bei genauerer Betrachtung gibt es sogar nurdrei.

Alle anderen Methoden sind leicht als Spezialfall dieser drei zu interpretieren.

Proinformatik: Objektorientierte Programmierung

Freie Universität Berlin

Dr. Marco Block-BerlitzSommersemester 2012

Aktivitätsdiagramm

68

Eine Anweisung mit der gestartet wird, markieren wir zusätzlich mit einemausgefüllten Kreis. Eine finale Anweisung wird ebenfalls gesondert markiert.

Diese Abbildungsform wird auch als Aktivitätsdiagramm bezeichnet und gehört zumSprachumfang der grafischen Modellierungssprache UML (Unified ModelingLanguage) die aktuell in der Softwareentwicklung standardmäßig eingesetzt wird.

Ein weißes Kästchen steht für eine Anweisung, die das Programm auszuführen hat:

Start

Ende

eine Anweisung

+

zwei Anweisung verketten

AAAA BBBB

AAAA BBBB

Proinformatik: Objektorientierte Programmierung

Freie Universität Berlin

Dr. Marco Block-BerlitzSommersemester 2012

Sequentieller Programmablauf

69

Prinzipiell kann ein Programm Anweisung für Anweisung hintereinander weggeschrieben werden. Kein Abschnitt wird dabei wiederholt:

Das könnte beispielsweise eine maschinelle Qualitätsprüfung sein (Prüfen: Größe,Form, Farbe, ...)

Proinformatik: Objektorientierte Programmierung

Freie Universität Berlin

Dr. Marco Block-BerlitzSommersemester 2012

Verzweigungen

70

Oft kommt es vor, dass eine Entscheidung getroffen werden muss, die die Wahl dernachfolgenden Anweisungen beeinflusst:

Verzweigung

In unserem Rezeptbeispiel ist es beispielsweise die Wahl der Variante.

Es gibt auch die Möglichkeit, eine Verzweigung in beliebig vielen Wegenfortzufahren. Wir sprechen dann von einer Mehrfachverzweigung:

Proinformatik: Objektorientierte Programmierung

Freie Universität Berlin

Dr. Marco Block-BerlitzSommersemester 2012

Sprünge

71

Sprünge sind ein Spezialfall einer Verzweigung:

Anstatt einen unabhängigen Weg zu beschreiten, springen wir zu einen späterenProgrammabschnitt und machen dort weiter. Damit können wir Programmpassagenbei Bedarf überspringen.

Proinformatik: Objektorientierte Programmierung

Freie Universität Berlin

Dr. Marco Block-BerlitzSommersemester 2012

Schleifen

72

Schleifen sind ebenfalls ein Spezialfall einer Verzweigung:

Wir können einen bestimmten Prozessabschnitt solange wiederholen lassen (z.B.Mehl in eine Schüssel geben) bis ein gewünschtes Ergebnis erreicht ist.

Schleifen kommen oft verschachtelt vor (Mehrfachschleifen):

Proinformatik: Objektorientierte Programmierung

Freie Universität Berlin

Dr. Marco Block-BerlitzSommersemester 2012

Parallelität

73

Das dritte wichtige Konzept, neben sequentieller Abfolge und dem Sprung ist dieParallelität:

Zwei Striche auf den Verzweigungspfeilen sollen bedeuten, dass die beiden Wegegleichzeitig bearbeitet werden sollen und sich später wieder treffen können.

beide Pfade werden parallel ausgeführt

wenn beide fertig sind, geht es weiter

Proinformatik: Objektorientierte Programmierung

Freie Universität Berlin

Dr. Marco Block-BerlitzSommersemester 2012

Kombination zu Programmen

74

1 vier Eier in eine Schüssel schlagen und verrühren

2 Mehl in die Schüssel hinzugeben

3 -> wenn Teig noch nicht schwer zu rühren ist gehe zu 2

4 Milch in die Schüssel geben

5 -> wenn Teig nicht leicht zu rühren ist gehe zu 4

6 etwas Fett in einer Pfanne erhitzen

7 einen Teil in die Pfanne geben, bis Boden gut bedeckt

8 -> wenn süße Variante gewünscht gehe zu 9 ansonsten zu 10

9 Apfelscheiben hinzugeben, gehe zu 11

10 Wurst und Käse hinzugeben

11 die Eierpfannkuchen von beiden Seiten gut braun braten

12 -> wenn süße Variante gewünscht gehe zu 13 ansonsten zu 14

13 mit Marmelade, Apfelmus oder Zucker garnieren

14 FERTIG

In der Kombination ergeben die vorgestellten Methoden: Programme! Schauen wiruns dazu nochmal das Kochrezeptbeispiel an:

Dargestellt als Aktivitätsdiagramm:

Wir erlauben mehrere nacheinanderfolgende Anweisungen in einem Kästchen zunotieren, wenn es der kompakten Übersicht dienlich ist.

Proinformatik: Objektorientierte Programmierung

Freie Universität Berlin

Dr. Marco Block-BerlitzSommersemester 2012

Erstellen eines Javaprogramms in Pseudocode

75

Wir können mal an dieser Stelle die Erstellung eines Javaprogramms mit Hilfe vonPseudocode ausdrücken:

1 öffne einen Texteditor

2 lege ein Dokument mit gewünschtem Programmnamen an

3 schreibe ein Javaprogramm

4 speichere es mit der Endung ".java" in Ordner <X>

5 gehe außerhalb des Editors in einer Konsole zu Ort <X>

6 schreibe "javac <Programmname>.java"

7 -> wenn der Javacompiler Fehler ausgibt gehe zu 8 sonst 11

8 gehe zurück zum Editor

9 korrigiere angezeigte Fehler

10 gehe zu 4

11 schreibe "java <Programmname>"

12 -> wenn das Programm noch nicht das Gewünschte tut gehe zu 8

13 FERTIG

Auch das können wir wieder als Aktivitätsdiagramm darstellen:

Proinformatik: Objektorientierte Programmierung

Freie Universität Berlin

Dr. Marco Block-BerlitzSommersemester 2012

Erstellen eines Javaprogramms

76

Wir können Javaprogramme mit folgender Syntax in der Konsole kompilieren:

javac <Programmname>.java

und anschließend so ausführen:

java <Programmname>

Versuchen wir an dieser Stelle einmal die folgenden Programmzeilen entsprechendden Anweisungen des Pseudocodes einzugeben und das Programm zu starten.

public class TestProgramm {

public static void main(String[] args) {

System.out.println("Das habe ich ganz allein geschafft!");

}

}

C:\Java>javac TestProgramm.java

C:\Java>java TestProgramm

Das habe ich ganz allein geschafft!

Wenn wir alles richtig gemacht haben, wird eine Textzeile in der Konsole ausge-geben:

Proinformatik: Objektorientierte Programmierung

Freie Universität Berlin

Dr. Marco Block-BerlitzSommersemester 2012

Editor und Konsole

77

Kompilieren und Ausführen von Programmen:

Java-Programmein der Konsoleausführen

Java-Programmein einem Editorerstellen

Proinformatik: Objektorientierte Programmierung

Freie Universität Berlin

Dr. Marco Block-BerlitzSommersemester 2012

Programmieren mit einem einfachen Klassenkonzept

78

public class MeinErstesProgramm {

public static void main(String[] args) {

// HIER KOMMEN DIE ANWEISUNGEN DES PROGRAMMS HIN

}

}

Das folgende Programm tut erstmal herzlich wenig, soll aber zeigen, welche Zeilenwir für alle folgenden Beispiele benötigen:

Das Einrücken der Zeilen innerhalb eines Blocks (so wird der Abschnitt zwischen{ und } genannt) dient der Lesbarkeit.

Proinformatik: Objektorientierte Programmierung

Freie Universität Berlin

Dr. Marco Block-BerlitzSommersemester 2012

Programme kommentieren

79

Wir müssen immer darauf achten, unsere Programme nicht nur ausreichend,sondern verständlich zu kommentieren. Es ist nicht immer einfach, ein langesProgramm ohne hilfreiche Kommentare zu verstehen. Dies trifft sogar auf selbstgeschriebene Programme zu, erst recht auf die von anderen.

Daher sind gerade in Projekten, bei denen mehrere Programmiererzusammenarbeiten, Kommentare unverzichtbar.

Es gibt zwei Möglichkeiten in Java Kommentare zu schreiben:

// Ich bin ein hilfreicher Kommentar in einer Zeile

/* Falls ich einen Kommentar über mehrere Zeilen

hinweg schreiben möchte, so verwende ich ein

öffnendes und schließendes Kommentarsymbol

*/

public class Kommentierung { // ich kann auch hier stehen

public static void main(String[] args) {

/* An diese Stelle schreiben wir die

Programmanweisungen */

}

}

Proinformatik: Objektorientierte Programmierung

Freie Universität Berlin

Dr. Marco Block-BerlitzSommersemester 2012

Programme kommentieren – Variante I

80

Je besser das Programm geschrieben ist, desto weniger Kommentare sind

notwendig.

public static boolean funktion(String s) {

int i = s.toCharArray().length/2;

for (char c:s.toCharArray()) {

if (s.toCharArray()[i] != s.toCharArray()[s.toCharArray().length-i-1])

return false;

i--;

if (i==0) break;

}

return true;

}

System.out.println(args[0]+" ist "+(funktion(args[0])?"":"k")+"ein Palindrom");

Proinformatik: Objektorientierte Programmierung

Freie Universität Berlin

Dr. Marco Block-BerlitzSommersemester 2012

Programme kommentieren – Variante II

81

public static boolean istPalindrom(String text) {

char[] zeichen = text.toCharArray();

int textMitte = text.length()/2;

boolean istPalindrom = true;

for (int i=0; i<textMitte; i++) {

char zeichenVorn = zeichen[i];

char zeichenHinten = zeichen[zeichen.length-i-1];

if (zeichenVorn != zeichenHinten) {

istPalindrom = false;

break;

}

}

return istPalindrom;

}

String programmEingabe = args[0];

if (istPalindrom(programmEingabe))

System.out.println(programmEingabe+" ist ein Palindrom");

else

System.out.println(programmEingabe+" ist kein Palindrom");

Proinformatik: Objektorientierte Programmierung

Freie Universität Berlin

Dr. Marco Block-BerlitzSommersemester 2012

Einrücken von Anweisungsblöcken

82

public static int zaehleUmgebung(boolean[][] m, int x, int y){

int ret = 0;

for (int i=(x-1);i<(x+2);++i){

for (int j=(y-1);j<(y+2);++j){

try {if (m[i][j]) ret += 1;}catch (IndexOutOfBoundsException e){}

}

}// einen zuviel mitgezaehlt?

if (m[x][y])ret -= 1;

return ret;

}

public static int zaehleUmgebung(boolean[][] m, int x, int y) {

int ret = 0;

for (int i=(x-1); i<(x+2); ++i) {

for (int j=(y-1); j<(y+2); ++j) {

try {

if (m[i][j])

ret += 1;

} catch (IndexOutOfBoundsException e) {}

}

}

// einen zuviel mitgezaehlt?

if (m[x][y])

ret -= 1;

return ret;

}

Kommentare und Syntaxhighlighting reichen nicht!

Proinformatik: Objektorientierte Programmierung

Freie Universität Berlin

Dr. Marco Block-BerlitzSommersemester 2012

Sequentielle Anweisungen

83

public class Sequentiell {

public static void main(String[] args) {

int a=5; // Anweisung 1

a=a*2; // Anweisung 2

a=a+10; // Anweisung 3

a=a-5; // Anweisung 4

}

}

Wir haben bereits gesehen, dass Anweisungen mit ; abgeschlossen werden:

Welchen Wert hat a?

Wir können das überprüfen: Geben wir dazu am Ende noch folgende Zeile dazu:

System.out.println("a hat den Wert: "+a);

Proinformatik: Objektorientierte Programmierung

Freie Universität Berlin

Dr. Marco Block-BerlitzSommersemester 2012 84

Proinformatik: Objektorientierte Programmierung

Freie Universität Berlin

Dr. Marco Block-BerlitzSommersemester 2012

Verzweigungen mit if I

85

Die Syntax für eine Verzweigung kann auf verschiedene Weisen formuliert werden.

Wenn eine Bedingung erfüllt ist, führe eine einzelne Anweisung aus. Die Syntaxdafür sieht wie folgt aus:

if (<Bedingung>)

<Anweisung>;

Ein Beispiel:

if (a<b)

a=b;

Welchen Wert repräsentiert a?

Es können auch mehrere Anweisungen (ein Anweisungsblock) ausgeführt werden:

if (<Bedingung>) {

<Anweisung1>;

<Anweisung2>;

...

}

Proinformatik: Objektorientierte Programmierung

Freie Universität Berlin

Dr. Marco Block-BerlitzSommersemester 2012

Verzweigungen mit if II

86

Eine Erweiterung dazu ist die if-else-Verzweigung:

if (<Bedingung>)

<Anweisung1>;

else

<Anweisung2>;

Ein Beispiel:

if (a<b)

c=b;

else

c=a;

Wir können auch Bedingungen verknüpfen:

if (<Bedingung1>)

<Anweisung1>;

else if (<Bedingung2>)

<Anweisung2>;

Proinformatik: Objektorientierte Programmierung

Freie Universität Berlin

Dr. Marco Block-BerlitzSommersemester 2012

Guter Programmierstil

87

Da bei einer Bedingung immer ein Ausdruck steht, der entweder true oder false ist,können wir den folgenden Abschnitt:

ersetzen durch:

if (a == true)

// tue etwas

if (a)

// ist a true, tue etwas

if (!a)

// ist a false, tue etwas

Der Grund ist einleuchtend, da bei jedem Wert von a der Ausdruck a==(a==true)erfüllt ist.

Wird a auf false getestet, machen wir das entsprechend so:

Proinformatik: Objektorientierte Programmierung

Freie Universität Berlin

Dr. Marco Block-BerlitzSommersemester 2012

Verzweigung mit switch I

88

Um nun Mehrfachverzweigungen zu realisieren und nicht zu einer unübersichtlichenFlut von if-Verzweigungen greifen zu müssen, steht uns switch zur Verfügung:

switch (<Ausdruck>) {

case <Konstante1>:

<Anweisung1>;

[break;]

case <Konstante2>:

<Anweisung2>;

[break;]

[default:]

<Anweisung3>;

}

Leider gibt es für die Verwendung ein paar Einschränkungen, so können wir nurBedingungen überprüfen in der Form: Hat int a den Inhalt 4?

Als Ausdruck lassen sich verschiedene primitive Datentypen auf Ihren Inhaltuntersuchen. Zu den erlaubten gehören:

char, byte, short, int und (seit Java 7 auch) String.

Proinformatik: Objektorientierte Programmierung

Freie Universität Berlin

Dr. Marco Block-BerlitzSommersemester 2012

Verzweigung mit switch II

89

Hier ein kleines Beispiel zu switch:

int i = 0; // hier mal unterschiedliche i probieren

switch(i){

case 0:

System.out.println("0");

break;

case 1:

System.out.println("1");

case 2:

System.out.println("1 oder 2");

break;

case 3:

System.out.println("3");

break;

default:

System.out.println("hier landen alle anderen...");

}

C:\Java>java Verzweigung

0

1

1 oder 2

1 oder 2

3

hier landen alle anderen...

Wenn wir die switch-Verzweigung beispielsweise mit den Zahlen i=0,1,2,3,4nacheinander durchlaufen würden, erhielten wir die folgende Ausgabe:

Proinformatik: Objektorientierte Programmierung

Freie Universität Berlin

Dr. Marco Block-BerlitzSommersemester 2012

Verzweigung mit switch III

90

Variante mit Zeichenketten:

String code = "007";

switch(code) {

case "006":

System.out.println("Nigel Boswell");

break;

case "007":

System.out.println("James Bond");

break;

default:

System.out.println("kein berühmter Spion");

}

Proinformatik: Objektorientierte Programmierung

Freie Universität Berlin

Dr. Marco Block-BerlitzSommersemester 2012

Motivation zu Schleifen

91

Folgendes Programm ist gegeben, das eine Zahl quadriert und das Ergebnisausgibt:

System.out.println("1 zum Quadrat ist "+(1*1));

System.out.println("2 zum Quadrat ist "+(2*2));

System.out.println("3 zum Quadrat ist "+(3*3));

System.out.println("4 zum Quadrat ist "+(4*4));

System.out.println("5 zum Quadrat ist "+(5*5));

System.out.println("6 zum Quadrat ist "+(6*6));

Es wäre sicherlich auch eine unangenehme Aufgabe, alle ganzen Zahlen zwischen 1und 1000 auf diese Weise quadrieren und ausgeben zu lassen. Daher ist dasSchleifen-Konzept ziemlich nützlich.

Beginne mit i=1

Gib den Wert i*i aus

Falls i<=1000

-> Erhöhe i um 1 und springe zu Zeile 2

Angenommen, wir möchten die Aufgabe lösen, alle Quadrate der Zahlen zwischen1 und 1000 auszugeben. Dann könnten wir das in Pseudocode in etwa soausdrücken:

Oder in Worten ausgedrückt: Starte mit i=1 und solange i<=1000 erfüllt ist,mache folgendes: gib das Quadrat von i aus und erhöhe anschließend i um 1.

Proinformatik: Objektorientierte Programmierung

Freie Universität Berlin

Dr. Marco Block-BerlitzSommersemester 2012

Schleife mit for

92

Wir benötigen zunächst eine Variable, die zu Beginn mit einem Startwertinitialisiert wird. Die Schleife führt den nachfolgenden Anweisungsblock solangeaus, erhöht oder verringert dabei die Variable um einen Wert, bis die angegebeneBedingung nicht mehr erfüllt ist:

for (<Initialisierungen>; <Bedingungen>; <Aktualisierungen>) {

<Anweisung>;

}

Im Programm könnten wir die zu Beginn geschilderte Aufgabe, alle Quadratzahlenfür die Werte 1 bis 1000 auszugeben, mit einer for-Schleife so lösen:

Mit int i=1 geben wir einen Startwert vor. Die Schleife führt die Anweisungeninnerhalb der geschweiften Klammern solange aus und erhöht jedes Mal i um 1 bisdie Bedingung i<=1000 nicht mehr erfüllt ist.

for (int i=1; i<=1000; i=i+1)

System.out.println(i+" zum Quadrat ist "+(i*i));

Proinformatik: Objektorientierte Programmierung

Freie Universität Berlin

Dr. Marco Block-BerlitzSommersemester 2012

Beispiele zur for-Schleife I

93

Wir können aber auch andere Konstruktionen mit einer for-Schleife realisieren.

Beispielsweise könnten wir bei 0 anfangen, in Fünferschritten weiterlaufen und alleWerte bis einschließlich 25 erzeugen:

for (int i=0; i<=25; i=i+5)

System.out.println("Aktueller Wert für i ist "+i);

Umsetzung in Java:

Proinformatik: Objektorientierte Programmierung

Freie Universität Berlin

Dr. Marco Block-BerlitzSommersemester 2012

Beispiele zur for-Schleife II

94

Eine Schleife muss Variablen nicht immer vergrößern, wir können auch bei 4beginnend immer 3 abziehen, bis wir bei -11 angelangt sind:

for (int i=4; i>=-11; i=i-3)

System.out.println("Aktueller Wert für i ist "+i);

Umsetzung in Java:

Proinformatik: Objektorientierte Programmierung

Freie Universität Berlin

Dr. Marco Block-BerlitzSommersemester 2012

Beispiele zur for-Schleife III

95

Im folgenden Beispiel wollen wir mit einer Schleife die Summe der Zahlen

berechnen:

int summe=0;

for (int i=1; i<=n; i++)

summe += i;

Da bei der Definition einer for-Schleife, die drei Teile <Initialisierung>,<Bedingung> und <Aktualisierung> nicht nur optional sind, sondern sogarmehrfach eingesetzt werden dürfen, können wir die Summe sogar ganz ohneAnweisungsteil berechnen:

Soviel an dieser Stelle: Neben der for-Schleife gibt es noch mehr Schleifen-varianten. Jede hat auf Grund der Programmästhetik ihre Existenzberechtigung,obwohl leicht zu zeigen ist, dass wir mit einer Variante immer auskommenkönnten.

int summe=0;

for (int i=1; i<=n; summe+=i, i++);

Proinformatik: Objektorientierte Programmierung

Freie Universität Berlin

Dr. Marco Block-BerlitzSommersemester 2012

Schleife mit while

96

Manchmal ist es nicht klar, wie viele Schleifendurchläufe benötigt werden, um einErgebnis zu erhalten. Da wäre es schön, eine Möglichkeit zu haben, wie diese:Wiederhole die Anweisungen solange, eine Bedingung erfüllt ist.

Genau diesen Schleifentyp repräsentiert die while-Schleife. Hier die zugehörigeSyntax:

while (<Bedingung>) {

<Anweisung>;

}

Wir werden das Beispiel aus der for-Schleife wieder aufnehmen und sehen, wie dasmit while gelöst werden kann:

int i=1;

while (i<=1000){

System.out.println(i+" zum Quadrat ist "+(i*i));

i=i+1;

}

Wie könnten wir die

Quadrate von 1 bis 1000

mit while lösen?

Proinformatik: Objektorientierte Programmierung

Freie Universität Berlin

Dr. Marco Block-BerlitzSommersemester 2012

Schleife mit while - Gefahr Endlosschleife

97

Die Schleife wird einfach solange ausgeführt, bis die Bedingung hinter while nichtmehr erfüllt ist.

Hier ist natürlich auch die Gefahr gegeben, dass die Schleife endlos laufen kann,wie in diesem Beispiel zu sehen ist:

int i=1;

while (i<=1000){

System.out.println(i+" zum Quadrat ist "+(i*i));

}

Warum ergibt daseine Endlosschleife?

Proinformatik: Objektorientierte Programmierung

Freie Universität Berlin

Dr. Marco Block-BerlitzSommersemester 2012

Schleife mit do-while I

98

Die do-while-Schleife führt im Gegensatz zur while-Schleife zuerst den Anwei-sungsblock einmal aus und prüft anschließend die Bedingung:

do {

<Anweisung>;

} while (<Bedingung>);

Damit haben wir im Gegensatz zur while-Schleife, die kopfgesteuert ist, einefußgesteuerte Schleife.

Schauen wir uns dazu mal folgendes Beispiel an:

Wir erhalten folgende Ausgabe:

int i=0;

do {

i++;

System.out.println("Wert von i: "+i);

} while (i<5);

C:\Java>java Schleifen

Wert von i: 1

Wert von i: 2

Wert von i: 3

Wert von i: 4

Wert von i: 5

Proinformatik: Objektorientierte Programmierung

Freie Universität Berlin

Dr. Marco Block-BerlitzSommersemester 2012

Schleife mit do-while II

99

Wenn wir die Bedingung so ändern, dass sie von vornherein nicht erfüllt ist:

geschieht trotzdem das Folgende:

Das war auch zu erwarten, da die Überprüfung der Bedingung erst nach der erstenAusführung stattfindet und deshalb der Schleifeninhalt mindestens einmalausgeführt wird.

int i=0;

do {

i++;

System.out.println("Wert von i: "+i);

} while (i<0);

C:\Java>java Schleifen

Wert von i: 1

Proinformatik: Objektorientierte Programmierung

Freie Universität Berlin

Dr. Marco Block-BerlitzSommersemester 2012

Sprunganweisungen

100

Es gibt Situationen in denen es notwendig ist, eine Schleife vorzeitig zu beenden.Dazu werden wir uns den Datentyp char noch einmal etwas genauer anschauen.

1) http://www.unicode.org/

Nehmen wir als Ausgangsbeispiel den folgenden Programmabschnitt:

Es werden die ersten sichtbaren Zeichen der ASCII-Tabelle ausgegeben. Mit \t wirdein Tabulatorschritt bei der Ausgabe eingefügt und alle acht Symbole einZeilenumbruch vorgenommen, um die Tabelle übersichtlich zu halten.

for (int i = 33; i < 127; i++) {

char symbol = (char)i;

System.out.print(i+": "+symbol+"\t");

if ((i%8) == 0)

System.out.println();

}

Java verwendet für den char den sogenannten Unicode-Zeichensatz1) der zweiBytes benötigt und damit umfangreicher ist, als der bekannte ASCII-Zeichensatz(American Standard Code for Information Interchange). Er soll einen universellenZeichensatz für die Darstellung unterschiedlicher Sprachen sein. Die ersten 128Zeichen entsprechen dabei dem ASCII-Zeichsatz.

Proinformatik: Objektorientierte Programmierung

Freie Universität Berlin

Dr. Marco Block-BerlitzSommersemester 2012

ASCII-Tabelle

101

33: ! 34: " 35: # 36: $ 37: % 38: & 39: ' 40: (

41: ) 42: * 43: + 44: , 45: - 46: . 47: / 48: 0

49: 1 50: 2 51: 3 52: 4 53: 5 54: 6 55: 7 56: 8

57: 9 58: : 59: ; 60: < 61: = 62: > 63: ? 64: @

65: A 66: B 67: C 68: D 69: E 70: F 71: G 72: H

73: I 74: J 75: K 76: L 77: M 78: N 79: O 80: P

81: Q 82: R 83: S 84: T 85: U 86: V 87: W 88: X

89: Y 90: Z 91: [ 92: \ 93: ] 94: ^ 95: _ 96: `

97: a 98: b 99: c 100: d 101: e 102: f 103: g 104: h

105: i 106: j 107: k 108: l 109: m 110: n 111: o 112: p

113: q 114: r 115: s 116: t 117: u 118: v 119: w 120: x

121: y 122: z 123: { 124: | 125: } 126: ~

Wir erhalten auf der Konsole die folgende Ausgabe:

33: ! 34: " 35: # 36: $ 37: % 38: & 39: ' 40: (

41: ) 42: * 43: + 44: , 45: - 46: . 47: / 48: 0

49: 1 50: 2 51: 3 52: 4 53: 5 54: 6 55: 7 56: 8

57: 9 58: : 59: ; 60: < 61: = 62: > 63: ? 64: @

65: A 66: B 67: C 68: D 69: E 70: F 71: G 72: H

73: I 74: J 75: K 76: L 77: M 78: N 79: O 80: P

81: Q 82: R 83: S 84: T 85: U 86: V 87: W 88: X

89: Y 90: Z 91: [ 92: \ 93: ] 94: ^ 95: _ 96: `

97: a 98: b 99: c 100: d 101: e 102: f 103: g 104: h

105: i 106: j 107: k 108: l 109: m 110: n 111: o 112: p

113: q 114: r 115: s 116: t 117: u 118: v 119: w 120: x

121: y 122: z 123: { 124: | 125: } 126: ~

33: ! 34: " 35: # 36: $ 37: % 38: & 39: ' 40: (

41: ) 42: * 43: + 44: , 45: - 46: . 47: / 48: 0

49: 1 50: 2 51: 3 52: 4 53: 5 54: 6 55: 7 56: 8

57: 9 58: : 59: ; 60: < 61: = 62: > 63: ? 64: @

65: A 66: B 67: C 68: D 69: E 70: F 71: G 72: H

73: I 74: J 75: K 76: L 77: M 78: N 79: O 80: P

81: Q 82: R 83: S 84: T 85: U 86: V 87: W 88: X

89: Y 90: Z 91: [ 92: \ 93: ] 94: ^ 95: _ 96: `

97: a 98: b 99: c 100: d 101: e 102: f 103: g 104: h

105: i 106: j 107: k 108: l 109: m 110: n 111: o 112: p

113: q 114: r 115: s 116: t 117: u 118: v 119: w 120: x

121: y 122: z 123: { 124: | 125: } 126: ~

boolean a = 'a' < 'b';

boolean b = 'a' < 'A';

Demzufolge sollten die folgenden Relationen zu welchem Ergebnis führen?

Proinformatik: Objektorientierte Programmierung

Freie Universität Berlin

Dr. Marco Block-BerlitzSommersemester 2012

Sprunganweisungen

102

Angenommen, wir suchen ein bestimmtes Symbol in der Tabelle und wollen diePosition ausgeben. Anschließend soll die Schleife beendet werden.

Das Beenden kann beispielsweise dadurch erzwungen werden, indem dieZählvariable einer for-Schleife innerhalb der Schleife auf einen Wert gesetzt wird,der die Bedingung zum Weiterlaufen nicht mehr erfüllt.

for (int i = 33; i < 127; i++) {

char symbol = (char)i;

if (symbol == 'A'){

System.out.println("Symbol "+symbol+" an Position "+i+" gefunden.");

i=127; // schlechter Programmierstil

} else

System.out.println("bisher nichts passendes gefunden ...");

}

Schauen wir uns das Beispiel dazu an:

Das ist allerdings sehr unschön und bei komplizierteren Ausdrücken für Leserschlecht nachzuvollziehen, wann die Schleife verlassen wird.

Aus diesem Grund gibt es Sprunganweisungen!

Proinformatik: Objektorientierte Programmierung

Freie Universität Berlin

Dr. Marco Block-BerlitzSommersemester 2012

Sprung mit break

103

Der Sprungbefehl break schließt nicht nur die case-Fälle bei switch, sondernbeendet auch unmittelbar while-, do-while- und for-Schleifen:

Die for-Schleife wird abgebrochen, wenn das Symbol 'A' identifziert worden ist.Anschließend wird mit den Anweisungen, die nach der Schleife kommen fortge-fahren.

for (int i = 33; i < 127; i++) {

char symbol = (char)i;

if (symbol == 'A'){

System.out.println("Symbol "+symbol+" an Position "+i+" gefunden.");

break;

}

System.out.println("bisher nichts passendes gefunden ...");

}

Proinformatik: Objektorientierte Programmierung

Freie Universität Berlin

Dr. Marco Block-BerlitzSommersemester 2012

Ergänzung zur for-Schleife I

104

An dieser Stelle wollen wir nochmal kurz auf die Konstruktion einer for-Schleifeeingehen. Wir hatten ja angedeutet, dass es auch möglich ist, eine Schleife mitleerem Definitions- und Manipulationsbereich zu definieren:

for (;;) {

// Endlosschleife

}

for (;;) {

// tue etwas

bedingung = prüfen();

if (bedingung)

break;

}

Es gibt keine Bedingung, die unsere Schleife zum Abbruch führen kann. DieseSchleife könnte beispielsweise in den Stellen Anwendung finden, in denen solangeetwas auszuführen ist, bis ein bestimmtes Ereignis auftritt.

Dann kann die Schleife mit break beendet werden:

Wenn die Funktion prüfen ein true liefert, wird die Schleife durch break beendet.

Proinformatik: Objektorientierte Programmierung

Freie Universität Berlin

Dr. Marco Block-BerlitzSommersemester 2012

Ergänzung zur for-Schleife II

105

Besser ist es, in diesem Fall eine while-Schleife zu verwenden und die Schleifeabzubrechen, wenn die Bedingung zum Abbrechen erfüllt ist:

Dazu müssen wir die Bedingung zu Beginn auf false setzen und bei while negiertüberprüfen.

bedingung = false;

while (!bedingung) {

// tue etwas

bedingung = prüfen();

}

Proinformatik: Objektorientierte Programmierung

Freie Universität Berlin

Dr. Marco Block-BerlitzSommersemester 2012

Sprung mit continue

106

Kommen wir zu unserem Ursprungsbeispiel mit der Suche in der ASCII-Tabelle ausdem vorhergehenden Abschnitt zurück.

Jetzt wollen wir alle Großbuchstaben identifizieren und deren Positionen ausgeben:

for (int i = 33; i < 127; i++) {

char symbol = (char)i;

if ((symbol>='A') && (symbol<='Z'))

System.out.println("Symbol "+symbol+" an Position "+i+" gefunden.");

else

System.out.println("nichts passendes gefunden...");

}

for (int i = 33; i < 127; i++) {

char symbol = (char)i;

if ((symbol>='A') && (symbol<='Z')){

System.out.println("Symbol "+symbol+" an Position "+i+" gefunden.");

continue;

}

System.out.println("nichts passendes gefunden...");

}

Für solche Fälle, in denen wir bei erfolgreicher Suche mit der Schleifeweitermachen wollen, können wir das Schlüsselwort continue statt dem if-else-Konstrukt verwenden:

Proinformatik: Objektorientierte Programmierung

Freie Universität Berlin

Dr. Marco Block-BerlitzSommersemester 2012

Sprungmarken I

107

Bei verschachtelten Schleifen wird immer die aktuelle innere Schleife beendet. Umaber explizit anzugeben, zu welcher Schleife gesprungen werden soll, lassen sichMarken unterbringen (markierte Anweisungen).

Diese Marken werden mit folgender Syntax angegeben:

<Marke>:

Wenn hinter break oder continue eine Marke steht, dann springt das Programm zu der Marke und beendet die Schleife:

continue <Marke>;

Proinformatik: Objektorientierte Programmierung

Freie Universität Berlin

Dr. Marco Block-BerlitzSommersemester 2012

Sprungmarken II

108

Die Idee besteht darin, Schleifen gezielt beenden zu können oder entsprechendweiterlaufen zu lassen.

Angenommen, wir haben zwei verschachtelte for-Schleifen, die uns die Paare vonGroß- und Kleinbuchstaben finden sollen:

Aussen:

for (int i = 33; i < 127; i++) {

for (int j = 33; j < 127; j++) {

char symbol1 = (char)i;

char symbol2 = (char)j;

if (Character.isUpperCase(symbol1) &&

(symbol2 == Character.toLowerCase(symbol1))){

System.out.println("Symbol "+symbol1+" ["+

i+"] und Symbol "+symbol2+" ["+

j+"] sind ein Paar.");

continue Aussen;

}

}

}

Symbol A [65] und Symbol a [97] sind ein Paar.

Symbol B [66] und Symbol b [98] sind ein Paar.

...

Symbol Z [90] und Symbol z [122] sind ein Paar.

Wir erhalten:

Proinformatik: Objektorientierte Programmierung

Freie Universität Berlin

Dr. Marco Block-BerlitzSommersemester 2012

Ausgelagerte Programmabschnitte in Java

109

Programme bestehen aus Ketten von Anweisungen, das wissen wir bereits. Oftkommt es dabei vor, dass sich Folgen von Anweisungen wiederholen.

Eine Sequenz von Anweisungen, bei der sich B und C wiederholen.

Wir erstellen eine neue Anweisung mit dem Namen BC, die B und C nacheinanderausführt. Die neue Anweisung BC wird entsprechend eingesetzt:

In diesen Fällen können wir das Programm übersichtlicher gestalten, indem wirdiese Anweisungsblöcke zu einer neuen Anweisung, deren Bezeichnung wir fast freiwählen können, zusammenfassen.

Der große Vorteil besteht darin, dass wir den Anweisungsblock nur noch einmalschreiben müssen. Das vermindert die Fehleranfälligkeit.

Proinformatik: Objektorientierte Programmierung

Freie Universität Berlin

Dr. Marco Block-BerlitzSommersemester 2012

Motivation zu Funktionen

110

public class Ausgabe{

public static void main(String[] args){

int a=4;

System.out.println();

System.out.println("*******************************************");

System.out.println("*** Wert der Variable ist "+a);

System.out.println("*******************************************");

System.out.println();

a=(a*13)%12;

System.out.println();

System.out.println("*******************************************");

System.out.println("*** Wert der Variable ist "+a);

System.out.println("*******************************************");

System.out.println();

a+=1000;

System.out.println();

System.out.println("*******************************************");

System.out.println("*** Wert der Variable ist "+a);

System.out.println("*******************************************");

System.out.println();

}

}

Proinformatik: Objektorientierte Programmierung

Freie Universität Berlin

Dr. Marco Block-BerlitzSommersemester 2012

Funktionen in Java

111

Funktionen repräsentieren einen Programmabschnitt, der einmal formuliert beliebigoft aufgerufen und verwendet werden kann. Eine Funktion erhält dabei eineneindeutigen Namen (beginnend mit einem Kleinbuchstaben).

Parameterinhalte können an eine Funktion übergeben werden. Diese geltenzunächst nur innerhalb der Methode (daher werden sie auch lokale Variablengenannt) auch wenn in der main-Methode eine Variable mit dem gleichen Namenexistiert, haben diese beiden nichts miteinander zu tun.

Die Syntax unserer Funktionen sieht zunächst erstmal so aus:

public static <Datentyp> <Funktionsname>(

<Datentyp> Parameter1,

<Datentyp> Parameter2,

...) {

// Funktionskörper

}

Aus der Mathematik wissen wir, dass Funktionen auch ein Ergebnis liefern - genauein Ergebnis. Auch für unsere Funktionen gilt das. Falls, wie in unserem Fall, keinRückgabewert existiert, schreiben wir als Rückgabewert das Schlüsselwort void.

Proinformatik: Objektorientierte Programmierung

Freie Universität Berlin

Dr. Marco Block-BerlitzSommersemester 2012

Ausgabe in Funktion auslagern

112

Jetzt wollen wir versuchen, mit Hilfe einer Funktion, die Ausgabe ein wenig zuerleichtern. In unserem Ausgabebeispiel ist a ein Eingabeparameter für die neueFunktion.

Die Funktion schreiben wir laut Konvention oberhalb der main-Funktion. Für dieLesbarkeit des Programms sind sprechende Namen, in unserem Beispiel gibAus,unerlässlich:

public class AusgabeFunktion{

public static void gibAus(int a){ // neue Funktion

System.out.println();

System.out.println("*******************************************");

System.out.println("*** Wert der Variable ist "+a);

System.out.println("*******************************************");

System.out.println();

}

// main-Funktion

public static void main(String[] args){

int a=4;

gibAus(a);

a=(a*13)%12;

gibAus(a);

a+=1000;

gibAus(a);

}

}

Proinformatik: Objektorientierte Programmierung

Freie Universität Berlin

Dr. Marco Block-BerlitzSommersemester 2012

Funktionen mit Rückgabewert

113

Schauen wir uns noch ein weiteres Beispiel an. Dazu berechnen wir in einerFunktion für die Eingabe x den Wert f(x)=x*13-1024%(34+12):

In diesem Beispiel gibt die Funktion einen int-Wert mit der Anweisung returnzurück und wird beendet. Sollten noch Zeilen nach einem return stehen, so gibtJava einen Fehler aus, denn diese Zeilen können nie ausgeführt werden.

public class Funktion{

public static int funktion(int x){

int wert=(x*13)-1024%(34+12);

return wert;

}

public static void main(String[] args){

for (int i=0; i<10; i++)

System.out.println("x="+i+" und f(x)="+funktion(i));

}

}

C:\Java>java Funktion

x=0 und f(x)=-12

x=1 und f(x)=1

x=2 und f(x)=14

x=3 und f(x)=27

...

x=9 und f(x)=105

Als Ausgabe erhalten wir:

Proinformatik: Objektorientierte Programmierung

Freie Universität Berlin

Dr. Marco Block-BerlitzSommersemester 2012

Wichtiges Konzept

114

Die Auslagerung von Programmabschnitten in Funktionen ist eines der wichtigstenProgrammierkonzepte.

Aus Gründen der Übersichtlichkeit und besseren Fehlersuche werden wir diesesKonzept so oft es geht einsetzen ...

Proinformatik: Objektorientierte Programmierung

Freie Universität Berlin

Dr. Marco Block-BerlitzSommersemester 2012 115

Proinformatik: Objektorientierte Programmierung

Freie Universität Berlin

Dr. Marco Block-BerlitzSommersemester 2012

Was war da gestern eigentlich los?

116