Foliensatz 13 (1 auf 1)

Werbung
4. Prozedurales Programmieren
4.1 Der Begriff des Algorithmus
Begriffsklärung: (Effizienz) (2)
Mit den gemachten Präzisierungen lässt sich der Aufwand einer
Ausführung quantifizieren:
• Zeitkomplexität: Wie viele Schritte braucht der Algorithmus in
Abhängigkeit von den Eingabewerten?
• Raumkomplexität: Wie viel Speicherplatz braucht der Algorithmus
in Abhängigkeit von den Eingabewerten?
©Arnd Poetzsch-Heffter
TU Kaiserslautern
565
4. Prozedurales Programmieren
4.1 Der Begriff des Algorithmus
Begriffsklärung: (deterministisch)
Ein Algorithmus heißt deterministisch, wenn für alle Eingabedaten
der Ablauf des Algorithmus eindeutig bestimmt ist.
Andernfalls heißt er nicht-deterministisch.
©Arnd Poetzsch-Heffter
TU Kaiserslautern
566
4. Prozedurales Programmieren
4.1 Der Begriff des Algorithmus
Beispiel: (nicht-deterministischer Algorithmus)
Aufgabe:
Erkenne, ob eine Eingabezeichenreihe über Kleinbuchstaben eines
der Worte " otto" , "toto", "total" enthält.
Eingabe: Eingabezeichenreihe über Kleinbuchstaben
Ausgabe:
ja/nein
Nicht-deterministischer Algorithmus:
• Seien
I
z die Eingabe und
I
pflän(z) = { 0, . . . , länge(z) − 4 }
©Arnd Poetzsch-Heffter
TU Kaiserslautern
567
4. Prozedurales Programmieren
4.1 Der Begriff des Algorithmus
Beispiel: (nicht-deterministischer Algorithmus) (2)
• Solange pflän, ∅ tue Folgendes:
I
wähle ein x aus pflän aus;
I
pflän = pflän\{x};
I
w = "z ohne die ersten x Buchstaben";
I
prüfe, ob w mit " otto" , " toto" , " total" beginnt ;
I
wenn ja, terminiert der Algorithmus mit "ja"; andernfalls setze die
Schleife fort.
• Terminiere mit "nein".
©Arnd Poetzsch-Heffter
TU Kaiserslautern
568
4. Prozedurales Programmieren
4.1 Der Begriff des Algorithmus
Begriffsklärung: (determiniert)
Ein Algorithmus heißt determiniert, wenn er bei gleichen zulässigen
Eingabewerten stets das gleiche Ergebnis liefert.
Andernfalls heißt er nicht-determiniert.
©Arnd Poetzsch-Heffter
TU Kaiserslautern
569
4. Prozedurales Programmieren
4.1 Der Begriff des Algorithmus
Beispiele: (Determiniertheit)
• Jeder Algorithmus, der eine Funktion berechnet, ist determiniert.
• Der Algorithmus von der letzten Folie ist determiniert.
©Arnd Poetzsch-Heffter
TU Kaiserslautern
570
4. Prozedurales Programmieren
4.2 Grundkonzepte prozeduraler Programmierung
Abschnitt 4.2
Grundkonzepte prozeduraler Programmierung
©Arnd Poetzsch-Heffter
TU Kaiserslautern
571
4. Prozedurales Programmieren
4.2 Grundkonzepte prozeduraler Programmierung
Grundkonzepte prozeduraler Programmierung
Algorithmen lassen sich mit unterschiedlichen Sprachmitteln
beschreiben:
• umgangssprachlich
• mit graphischen Notationen
• mit mathematischer Sprache
• mit programmiersprachlichen Mitteln.
©Arnd Poetzsch-Heffter
TU Kaiserslautern
572
4. Prozedurales Programmieren
4.2 Grundkonzepte prozeduraler Programmierung
Begriffsklärung: (prozedurales Paradigma)
Gemäß des prozeduralen Paradigmas (vgl. Folie 155) wird
• der Zustand eines Systems mit Variablen beschrieben
• werden die möglichen Systemabläufe algorithmisch formuliert und
• bilden Prozeduren das zentrale Strukturierungs- und
Abstraktionsmittel.
©Arnd Poetzsch-Heffter
TU Kaiserslautern
573
4. Prozedurales Programmieren
4.2 Grundkonzepte prozeduraler Programmierung
Beispiel: (Prozedurale Systemsicht)
Ein Rechensystem (z.B. PC) kann man prozedural wie folgt
beschreiben:
• Jede Datei ist eine Variable für Listen von Bytes.
• Nach dem Starten des Rechners wird ein nicht-terminierender
Algorithmus ausgeführt:
while( true ) {
warte auf Eingabe eines Programmnamens;
starte Programm mit eingegebenem Namen
als parallelen Algorithmus;
}
• Jedes Programm entspricht dabei einer Prozedur.
©Arnd Poetzsch-Heffter
TU Kaiserslautern
574
4. Prozedurales Programmieren
4.2 Grundkonzepte prozeduraler Programmierung
Unterabschnitt 4.2.1
Sprachliche Basis: Teilsprache von Java
©Arnd Poetzsch-Heffter
TU Kaiserslautern
575
4. Prozedurales Programmieren
4.2 Grundkonzepte prozeduraler Programmierung
Sprachliche Basis: Teilsprache von Java
Der Abschnitt 4.2 stellt diejenigen Grundkonzepte der prozeduralen
Programmierung vor, die als Voraussetzung für die objektorientierte
Programmierung benötigt werden:
• Deklaration und Verwendung von Variablen
• Anweisungen
• Deklaration und Verwendung von Prozeduren
©Arnd Poetzsch-Heffter
TU Kaiserslautern
576
4. Prozedurales Programmieren
4.2 Grundkonzepte prozeduraler Programmierung
Sprachliche Basis: Teilsprache von Java (2)
Zur Programmierung verwenden wir eine Teilsprache von Java.
Vorteile:
• Der Übergang zur objektorientierten Programmierung wird
einfacher.
• Der Zusammenhang zwischen prozeduraler und objektorientierter
Programmierung wird klarer.
©Arnd Poetzsch-Heffter
TU Kaiserslautern
577
4. Prozedurales Programmieren
4.2 Grundkonzepte prozeduraler Programmierung
Sprachliche Basis: Teilsprache von Java (3)
Nachteile:
• Da klassenlose, rein prozedurale Programmierung von Java nicht
unterstützt wird, entsteht ein notationeller Mehraufwand.
• Bestimmte Sprachelemente bleiben zunächst unerklärt.
Vorgehen:
• Basisdatentypen
• Ausdrücke
• Variablendeklarationen
• Programmstruktur und vereinfachte Notation
©Arnd Poetzsch-Heffter
TU Kaiserslautern
578
4. Prozedurales Programmieren
4.2 Grundkonzepte prozeduraler Programmierung
Basisdatenstrukturen in Java:
Java bietet insbesondere Basisdatenstrukturen mit den Typen
boolean
char
int , long , short ,
float , double
sowie entsprechende Funktionen und Konstanten.
Die nichtstrikten Operationen sind:
_?_ : _
_ && _
_ || _
©Arnd Poetzsch-Heffter
statt
wie
wie
if _ then _ else _
in Haskell
in Haskell
TU Kaiserslautern
in Haskell
579
4. Prozedurales Programmieren
4.2 Grundkonzepte prozeduraler Programmierung
Ausdrücke in Java:
Mittels der Konstanten und Funktionen der elementaren
Datenstrukturen lassen sich analog zu Haskell Ausdrücke bilden.
(Darüber hinaus kann man deklarierte Prozeduren in Ausdrücken
aufrufen. Dadurch können bei der Auswertung von Ausdrücken
Seiteneffekte entstehen.)
©Arnd Poetzsch-Heffter
TU Kaiserslautern
580
4. Prozedurales Programmieren
4.2 Grundkonzepte prozeduraler Programmierung
Beispiel: (Ausdrücke in Java)
5 + 89
45 / 6
47474747 L * a
23+3
d == 78 + e
7 >= 45 == true
abs(a) + abs(d)
sein | !sein
true || tuEs ()
a > b ? a : b
©Arnd Poetzsch-Heffter
für geeignetes a
für geeignete d, e
für geeignete a, d, abs
für geeignete Variable sein
für geeignete Prozedur tuEs
// liefert max(a, b)
TU Kaiserslautern
581
4. Prozedurales Programmieren
4.2 Grundkonzepte prozeduraler Programmierung
Variablendeklarationen in Java:
Eine Variablendeklaration hat die Form:
<Typbezeichner >
<Variablenbezeichner > ;
und definiert eine neue Variable vom angegebenen Typ mit dem
angegebenem Bezeichner. Beispiele:
int a;
boolean b;
float meineGleitkommavariable ;
char cvar;
Eine Variablendeklarationsliste entsteht durch Aneinanderreihen von
einzelnen Deklarationen.
©Arnd Poetzsch-Heffter
TU Kaiserslautern
582
4. Prozedurales Programmieren
4.2 Grundkonzepte prozeduraler Programmierung
Programmstruktur und -syntax:
Ein prozedurales Programm besteht aus:
• einer Liste von Typdeklaration
• einer Liste von globalen Variablendeklarationen
• einer Liste von Prozedurdeklarationen
• einer Hauptprozedur
In Java lassen sich prozedurale Programme mit folgendem
Programmrahmen formulieren:
©Arnd Poetzsch-Heffter
TU Kaiserslautern
583
4. Prozedurales Programmieren
4.2 Grundkonzepte prozeduraler Programmierung
Programmstruktur und -syntax: (2)
<Programmname>.java
public class <Programmname > {
static <Typdeklaration 1 >
...
static <Typdeklaration k >
static <Variablendeklaration 1 >
...
static <Variablendeklaration m >
static <Prozedurdeklaration 1 >
...
static <Prozedurdeklaration n >
public static void main( String [] args)
<Prozedurrumpf >
}
wobei k ≥ 0, m ≥ 0, n ≥ 0.
©Arnd Poetzsch-Heffter
TU Kaiserslautern
584
4. Prozedurales Programmieren
4.2 Grundkonzepte prozeduraler Programmierung
Bemerkung:
• Die Reihenfolge der Deklarationen kann vertauscht werden.
• Die hier nicht erklärten Sprachkonstrukte werden in Kapitel 5
behandelt.
©Arnd Poetzsch-Heffter
TU Kaiserslautern
585
4. Prozedurales Programmieren
4.2 Grundkonzepte prozeduraler Programmierung
Konventionen:
• Wir gehen davon aus, dass die Datei InputOutput.java im
aktuellen Dateiverzeichnis liegt. Sie stellt bereit:
public class IO
public static
public static
public static
public static
public static
}
©Arnd Poetzsch-Heffter
{
int readInt (){.. .}
String readString (){.. .}
char readChar (){.. .}
void print ( Object o){.. .}
void println ( Object o){.. .}
TU Kaiserslautern
586
4. Prozedurales Programmieren
4.2 Grundkonzepte prozeduraler Programmierung
Konventionen: (2)
• Mit den Prozeduren print und println können insbesondere
Werte und Objekte der Typen int, char und String ausgegeben
werden.
• Im Folgenden werden wir die ersten beiden und die letzte Zeile
des Programmschemas der letzten Folie sowie die
Schlüsselwörter static und public auf Folien der
Übersichtlichkeit halber weglassen.
©Arnd Poetzsch-Heffter
TU Kaiserslautern
587
4. Prozedurales Programmieren
4.2 Grundkonzepte prozeduraler Programmierung
Beispiel: (Notation prozeduraler Programme)
Foo.java
public class Foo {
static int a;
static boolean bvar;
static int abs( int n ) {
if( n >= 0 ){
return n;
} else {
return -n;
}
}
©Arnd Poetzsch-Heffter
TU Kaiserslautern
588
4. Prozedurales Programmieren
4.2 Grundkonzepte prozeduraler Programmierung
Beispiel: (Notation prozeduraler Programme) (2)
static void setA () {
a = abs(a);
}
public static void main( String [] args ){
IO. println (" Eingabe von a:");
a = IO. readInt ();
setA ();
IO. println ( a );
}
}
©Arnd Poetzsch-Heffter
TU Kaiserslautern
589
4. Prozedurales Programmieren
4.2 Grundkonzepte prozeduraler Programmierung
Beispiel: (Notation prozeduraler Programme) (3)
Abkürzend schreiben wir hier:
int a;
boolean bvar;
int abs( int n ) {
if( n≥0 ){
return n;
} else {
return -n;
}
}
©Arnd Poetzsch-Heffter
TU Kaiserslautern
590
4. Prozedurales Programmieren
4.2 Grundkonzepte prozeduraler Programmierung
Beispiel: (Notation prozeduraler Programme) (4)
void setA () {
a = abs(a);
}
void main( String [] args ){
println (" Eingabe von a:");
a = readInt ();
setA ();
println ( a );
}
©Arnd Poetzsch-Heffter
TU Kaiserslautern
591
4. Prozedurales Programmieren
4.2 Grundkonzepte prozeduraler Programmierung
Überblick übers weitere Vorgehen:
• Anweisungen
• Prozeduren
• Variablen in Programm und Speicher
• Felder
• Benutzerdefinierte Typen
• Sichtbarkeit von Bindungen
• Iteration und Rekursion
• Weitere prozedurale Sprachkonzepte
©Arnd Poetzsch-Heffter
TU Kaiserslautern
592
4. Prozedurales Programmieren
4.2 Grundkonzepte prozeduraler Programmierung
Bemerkung:
• Die Konzepte sind rekursiv von einander abhängig:
I
Anweisungen benutzen Variablen und Ausdrücke
I
Prozeduren basieren auf Anweisungen
I
Verwendung von Variablen kann nur im Kontext von Anweisungen
und Prozeduren erklärt werden.
I
Ausdrücke erlauben die Verwendung von Prozeduren.
• In der programmiersprachlichen Realisierung der Konzepte
verwischen ihre Grenzen; z.B.:
I
Parameter lassen sich wie Variable verwenden.
I
Einfache Anweisungen lassen sich in Ausdrücken verwenden.
©Arnd Poetzsch-Heffter
TU Kaiserslautern
593
4. Prozedurales Programmieren
4.2 Grundkonzepte prozeduraler Programmierung
Unterabschnitt 4.2.2
Anweisungen
©Arnd Poetzsch-Heffter
TU Kaiserslautern
594
4. Prozedurales Programmieren
4.2 Grundkonzepte prozeduraler Programmierung
Begriffsklärung: (Anweisung)
Anweisungen sind programmiersprachliche Beschreibungsmittel:
• Einfache Anweisungen beschreiben Aktionen.
• Zusammengesetzte Anweisungen beschreiben, wie mehrere
Aktionen auszuführen sind, also Teile von Algorithmen.
©Arnd Poetzsch-Heffter
TU Kaiserslautern
595
4. Prozedurales Programmieren
4.2 Grundkonzepte prozeduraler Programmierung
Beispiel: (Anweisungen)
1. Zuweisung eines Werts an eine Variable:
<Variable > = <Wert > ;
2. Schleifenanweisung:
while ( <Bedingung > ) {
<Anweisungen >
}
©Arnd Poetzsch-Heffter
TU Kaiserslautern
596
4. Prozedurales Programmieren
4.2 Grundkonzepte prozeduraler Programmierung
Bemerkung:
Unterschied: Anweisung / Ausdruck
• Die Auswertung von Ausdrücken liefert ein Ergebnis.
• Die Ausführung von Anweisungen verändert den Zustand. Im Allg.
liefert sie kein Ergebnis.
©Arnd Poetzsch-Heffter
TU Kaiserslautern
597
4. Prozedurales Programmieren
4.2 Grundkonzepte prozeduraler Programmierung
Bemerkung: (2)
Wir betrachten die folgenden Anweisungen und ihre Realisierung in
Java:
• Einfache Anweisungen:
I
Zuweisung
I
Prozeduraufruf
• Anweisungsblöcke
• Schleifenanweisungen:
I
while-, do-, for-Anweisung
©Arnd Poetzsch-Heffter
TU Kaiserslautern
598
4. Prozedurales Programmieren
4.2 Grundkonzepte prozeduraler Programmierung
Bemerkung: (3)
• Verzweigungsanweisungen:
I
bedingte Anweisung
I
Fallunterscheidung
I
Auswahlanweisung
• Sprunganweisungen:
I
Abbruchanweisung
I
Rückgabeanweisung
©Arnd Poetzsch-Heffter
TU Kaiserslautern
599
4. Prozedurales Programmieren
4.2 Grundkonzepte prozeduraler Programmierung
Einfache Anweisungen
Zuweisung: (engl. assignment)
Syntax in Java:
<Variable >
=
<Ausdruck > ;
Semantik:
Werte den Ausdruck aus und weise das Ergebnis der Variablen zu. (In
Java ist eine Zuweisung syntaktisch ein Ausdruck, liefert also einen
Wert und zwar das Ergebnis der Auswertung von der rechten Seite der
Zuweisung.)
©Arnd Poetzsch-Heffter
TU Kaiserslautern
600
4. Prozedurales Programmieren
4.2 Grundkonzepte prozeduraler Programmierung
Einfache Anweisungen (2)
Beispiele:
a = 27 % 23;
b = true;
meineGleitkommavariable = 3.14;
Sprechweise:
"Variable b ergibt sich zu true" oder
"Variable b wird true zugewiesen".
©Arnd Poetzsch-Heffter
TU Kaiserslautern
601
4. Prozedurales Programmieren
4.2 Grundkonzepte prozeduraler Programmierung
Bemerkung:
In einer Zuweisung (und anderen Sprachkon- strukten) kann eine
Variable v mit zwei Bedeutungen vorkommen:
1. Das Vorkommen links vom Zuweisungszeichen meint die Variable.
Man spricht vom L-Wert (engl. l-value) des Ausdrucks v .
2. Das Vorkommen rechts vom Zuweisungszeichen meint den in v
gespeicherten Wert. Man spricht
vom R-Wert (engl. r -value) des Ausdrucks v .
Die Unterscheidung wird wichtiger, wenn auch links des
Zuweisungszeichens komplexere Ausdrücke stehen.
©Arnd Poetzsch-Heffter
TU Kaiserslautern
602
4. Prozedurales Programmieren
4.2 Grundkonzepte prozeduraler Programmierung
Beispiel: (L-Wert, R-Wert)
%
L-Wert
a = 7 + a;
©Arnd Poetzsch-Heffter
R-Wert
TU Kaiserslautern
603
4. Prozedurales Programmieren
4.2 Grundkonzepte prozeduraler Programmierung
Prozeduraufruf: (engl. procedure call)
Syntax:
<Prozedurbezeichner > ( <AktuelleParameterliste > ) ;
<AktuelleParameterliste > → ε | <Ausdrucksliste >
<Ausdrucksliste > → <Ausdruck >
| <Ausdruck > , <Ausdrucksliste >
Semantik:
Werte die Ausdrücke der aktuellen Parameter aus. übergebe die
Ergebnisse an die formalen Parameter. Führe die Anweisungen der
Prozedur aus. Liefere den Rückgabewert, wenn vorhanden.
©Arnd Poetzsch-Heffter
TU Kaiserslautern
604
4. Prozedurales Programmieren
4.2 Grundkonzepte prozeduraler Programmierung
Prozeduraufruf: (engl. procedure call) (2)
Beispiele:
1. Prozeduraufruf mit Ergebnis:
a = ggt(a,abs (45 -87));
// Zuweisung
2. Prozeduraufruf mit Seiteneffekt:
print ( ggt (24 ,248));
// Anweisung
©Arnd Poetzsch-Heffter
TU Kaiserslautern
605
4. Prozedurales Programmieren
4.2 Grundkonzepte prozeduraler Programmierung
Anweisungsblöcke
Ein Anweisungsblock (engl. block statement) ist eine Liste bestehend
aus Deklarationen und Anweisungen.
Syntax in Java:
{ <DeklAnweisListe > }
<DeklAnweisListe > → ε
| <Deklaration >
| <Anweisung >
| <Deklaration > <DeklAnweisListe >
| <Anweisung > <DeklAnweisListe >
Semantik:
Stelle den Speicherplatz für die Variablen bereit und führe die
Anweisungen der Reihe nach aus.
©Arnd Poetzsch-Heffter
TU Kaiserslautern
606
4. Prozedurales Programmieren
4.2 Grundkonzepte prozeduraler Programmierung
Beispiel:
{ int i; i = 7; int a; a = 27 % i; }
Üblicherweise schreibt man Deklarationen und Anweisungen
untereinander, so dass ein Textblock entsteht.
{
}
int
int
i =
x =
i;
x;
readInt ();
abs(i);
©Arnd Poetzsch-Heffter
TU Kaiserslautern
607
4. Prozedurales Programmieren
4.2 Grundkonzepte prozeduraler Programmierung
Schleifenanweisungen
Schleifenanweisungen (engl. loop statements) steuern die iterative,
d.h. wiederholte Ausführung von Anweisungen/Anweisungsblöcken.
while-Anweisung:
Syntax in Java:
while ( <boolescherAusdruck > )
<Anweisung >
Semantik:
Werte den Ausdruck aus, die sogenannte Schleifenbedingung. Ist
die Bedingung erfüllt, führe die Anweisung aus, den sogenannten
Schleifenrumpf , und wiederhole den Vorgang. Andernfalls beende
die Ausführung der Schleifenanweisung.
©Arnd Poetzsch-Heffter
TU Kaiserslautern
608
4. Prozedurales Programmieren
4.2 Grundkonzepte prozeduraler Programmierung
Beispiel:
Aus der Prozedur ggt:
while (
{
v =
n =
m =
}
m >0 )
n % m;
m;
v;
while (
v =
n =
m =
}
m >0 ) {
n % m;
m;
v;
Bemerkung:
Der Schleifenrumpf ist in den meisten Fällen ein Anweisungsblock.
Syntaktisch korrekt ist aber auch z.B.:
while( true ) print (i);
©Arnd Poetzsch-Heffter
TU Kaiserslautern
609
4. Prozedurales Programmieren
4.2 Grundkonzepte prozeduraler Programmierung
do-Anweisung:
Syntax in Java:
do
<Anweisung >
while ( <boolescherAusdruck > ) ;
Semantik:
Führe die Anweisung aus. Werte danach den booleschen Ausdruck
aus. Ist die Bedingung erfüllt ist, wiederhole den Vorgang. Andernfalls
beende die Ausführung der Schleifenanweisung.
©Arnd Poetzsch-Heffter
TU Kaiserslautern
610
4. Prozedurales Programmieren
4.2 Grundkonzepte prozeduraler Programmierung
Bemerkung:
Die do-Anweisung ist immer dann sinnvoll, wenn man einen Vorgang
mindestens einmal ausführen muss.
In solchen Situationen spart man sich gegenüber der Verwendung der
while-Schleife die anfänglich unnötige Auswertung der Bedingung.
©Arnd Poetzsch-Heffter
TU Kaiserslautern
611
4. Prozedurales Programmieren
4.2 Grundkonzepte prozeduraler Programmierung
Beispiel:
Wir betrachten die Ausgabe der Elemente einer nicht-leeren Liste. Wir
gehen davon aus, dass es einen Typ IntList mit Prozeduren head, tail
und isempty gibt:
IntList grades ;
int g;
...
// Zuweisung an die Variable noten
// Ausgabe der nicht - leeren Notenliste
do {
g = head( grades );
println (g);
grades = tail( grades );
} while ( ! isempty ( grades ) );
©Arnd Poetzsch-Heffter
TU Kaiserslautern
612
4. Prozedurales Programmieren
4.2 Grundkonzepte prozeduraler Programmierung
Beispiel: (2)
for-Anweisung (Zählanweisung):
Die for-Anweisung dient vorrangig zur Bearbeitung von Vektoren und
Matrizen, deren einzelne Komponenten über Indizes angesprochen
werden.
Wir betrachten zunächst ein Beispiel:
©Arnd Poetzsch-Heffter
TU Kaiserslautern
613
4. Prozedurales Programmieren
4.2 Grundkonzepte prozeduraler Programmierung
Beispiel: (Zählanweisung)
// Skalarprodukt
void main( String [] args ){
int i;
// zwei Vektoren mit jeweils 3 Elementen
int v1 [] = new int [3];
int v2 [] = new int [3];
int skalprod ;
v1 [0] = 1;
v1 [1] = 3;
v1 [2] = 8;
©Arnd Poetzsch-Heffter
TU Kaiserslautern
614
4. Prozedurales Programmieren
4.2 Grundkonzepte prozeduraler Programmierung
Beispiel: (Zählanweisung) (2)
v2 [0] = 2;
v2 [1] = 3;
v2 [2] = 4;
skalprod = 0;
}
for( i = 0; i <3; i++ ) {
skalprod = skalprod + v1[i]* v2[i] ;
}
println ( skalprod );
©Arnd Poetzsch-Heffter
TU Kaiserslautern
615
4. Prozedurales Programmieren
4.2 Grundkonzepte prozeduraler Programmierung
Syntax in Java:
for(< Ausdrucksanweisung1 > ;
<boolescherAusdruck > ;
<Ausdrucksanweisung2 > )
<Anweisung >
<Ausdrucksanweisung > → <Variable > = <Ausdruck >
|
<Variable > ++
|
<Variable > --
©Arnd Poetzsch-Heffter
TU Kaiserslautern
616
4. Prozedurales Programmieren
4.2 Grundkonzepte prozeduraler Programmierung
Semantik:
Ausdrucksanweisung:
1. Produktion: wie bei Zuweisung.
2./3. Produktion: Lese den Wert der Variablen.
Erhöhe/erniedrige den Wert der Variablen um 1.
Liefere den gelesenen Wert zurück.
©Arnd Poetzsch-Heffter
TU Kaiserslautern
617
4. Prozedurales Programmieren
4.2 Grundkonzepte prozeduraler Programmierung
Verzweigungsanweisungen
Verzweigungsanweisungen (engl. branch statements) stellen
Bedingungen an die Ausführung einer Anweisung oder wählen einen
von mehreren Zweigen zur Ausführung aus.
Bedingte Anweisung:
Syntax in Java:
if( <boolescherAusdruck > )
<Anweisung >
Semantik:
Werte den Ausdruck aus. Ist das Ergebnis true, führe die Anweisung
aus. Andernfalls ist die Ausführung sofort beendet.
©Arnd Poetzsch-Heffter
TU Kaiserslautern
618
4. Prozedurales Programmieren
4.2 Grundkonzepte prozeduraler Programmierung
Beispiel: (Bedingte Anweisung)
if( i != 0 ) { n = k/i; }
if(
{
}
gute_Idee_vorhanden
&& genug_Zeit_zur_Vorbereitung )
halte_anregende_Weihnachtsvorlesung ();
mache_schneller_damit_frueher_fertig ();
©Arnd Poetzsch-Heffter
TU Kaiserslautern
619
4. Prozedurales Programmieren
4.2 Grundkonzepte prozeduraler Programmierung
Fallunterscheidung:
Syntax in Java:
if( <boolescherAusdruck > )
else
<Anweisung1 >
<Anweisung2 >
Semantik:
Werte den Ausdruck aus. Ist das Ergebnis true, führe Anweisung1,
andernfalls Anweisung2 aus.
©Arnd Poetzsch-Heffter
TU Kaiserslautern
620
4. Prozedurales Programmieren
4.2 Grundkonzepte prozeduraler Programmierung
Beispiel: (Fallunterscheidung)
if( i!=0 ) {
n = k/i;
n++;
} else {
fehlerbehandlung (" Division durch Null");
}
©Arnd Poetzsch-Heffter
TU Kaiserslautern
621
4. Prozedurales Programmieren
4.2 Grundkonzepte prozeduraler Programmierung
Auswahlanweisung:
Auswahlanweisungen erlauben es, in Abhängigkeit von dem Wert
eines Ausdrucks direkt in einen von endlich vielen Fällen zu
verzweigen. In Java gibt es dafür die switch-Anweisung. Wir verzichten
hier auf eine genaue Beschreibung von Syntax und Semantik und
betrachten ein Beispiel:
©Arnd Poetzsch-Heffter
TU Kaiserslautern
622
4. Prozedurales Programmieren
4.2 Grundkonzepte prozeduraler Programmierung
Beispiel: (Auswahlanweisung)
void main( String [] args ){ // AuswahlanweisungsTest
char c;
boolean machWeiter = true;
do {
print ("Ein Zeichen aus {a,b,c,e}:");
c = readChar ();
switch ( c ) {
case ’a’: proza (); break ;
case ’b’: prozb (); break ;
case ’c’: prozc (); break ;
case ’e’:
machWeiter = false ; break ;
default :
print (" Falsches Eingabezeichen ");
}
} while ( machWeiter );
}
©Arnd Poetzsch-Heffter
TU Kaiserslautern
623
4. Prozedurales Programmieren
4.2 Grundkonzepte prozeduraler Programmierung
Beispiel: (Auswahlanweisung) (2)
wobei proza, prozb, prozc beliebige Prozeduren sind, zum Beispiel:
void proza () {
/* hier koennte ’was Interessantes stehen */
println (" Ich bin Prozedur A. Alles gut ?");
println (" Probleme mit dem Weina ’stress ?\n");
}
void prozb () {
/* hier natuerlich auch */
println ("Wer A sagt , muss auch B sagen .");
println (" Haben Sie schon A gesagt .\n");
}
void prozc () {
println ("C wie no comment . Cool ,oder ?\n");
}
©Arnd Poetzsch-Heffter
TU Kaiserslautern
624
4. Prozedurales Programmieren
4.2 Grundkonzepte prozeduraler Programmierung
Sprunganweisungen
Sprunganweisungen (engl. jump statements) legen eine
Fortsetzungsstelle der Ausführung fest, die möglicherweise weit von
der aktuellen Anweisung entfernt liegt. Wir betrachten hier nur
Sprünge, die der Programmstruktur folgen.
©Arnd Poetzsch-Heffter
TU Kaiserslautern
625
4. Prozedurales Programmieren
4.2 Grundkonzepte prozeduraler Programmierung
Abbruchanweisung:
Syntax in Java:
break;
Semantik:
Die Ausführung wird am Ende der umfassenden zusammengesetzen
Anweisung fortgesetzt.
©Arnd Poetzsch-Heffter
TU Kaiserslautern
626
4. Prozedurales Programmieren
4.2 Grundkonzepte prozeduraler Programmierung
Beispiel: (Auswahlanweisung)
1. In Auswahlanweisung: siehe oben.
2. In Schleifenanweisungen:
while ( true ) {
...
if( <Abbruchbedingung > ) break ;
...
}
©Arnd Poetzsch-Heffter
TU Kaiserslautern
627
4. Prozedurales Programmieren
4.2 Grundkonzepte prozeduraler Programmierung
Rückgabeanweisung:
Syntax in Java:
return ;
return <Ausdruck > ;
Semantik:
1. Fall/Produktion:
Nur in Prozeduren ohne Rückgabewert erlaubt. Beende die
Ausführung der Prozedur. Setze die Ausführung an der
Aufrufstelle fort.
2. Produktion:
Nur in Prozeduren mit Rückgabewert erlaubt. Werte den Ausdruck
aus. Beende die Ausführung der Prozedur. Liefere den Wert des
Ausdrucks als Ergebnis und setze die Ausführung an der
Aufrufstelle fort.
©Arnd Poetzsch-Heffter
TU Kaiserslautern
628
4. Prozedurales Programmieren
4.2 Grundkonzepte prozeduraler Programmierung
Beispiel: (Rückgabeanweisung)
int abs( int n ) {
if( n ≥ 0 ) {
return n;
} else {
return -n;
}
}
©Arnd Poetzsch-Heffter
TU Kaiserslautern
629
4. Prozedurales Programmieren
4.2 Grundkonzepte prozeduraler Programmierung
Unterabschnitt 4.2.3
Prozeduren
©Arnd Poetzsch-Heffter
TU Kaiserslautern
630
4. Prozedurales Programmieren
4.2 Grundkonzepte prozeduraler Programmierung
Prozeduren
Prozeduren erlauben es, von konkreten Anweisungen bzw.
Anweisungssequenzen zu abstrahieren.
D.h. Prozeduren legen die Parameter einer zusammengesetzten
Anweisung fest und geben ihr einen Namen.
Dies ermöglicht:
• Wiederverwendung,
• Schnittstellenbildung und Information Hiding.
Darüber hinaus ermöglichen Prozeduren die rekursive Ausführung von
Anweisungen.
©Arnd Poetzsch-Heffter
TU Kaiserslautern
631
4. Prozedurales Programmieren
4.2 Grundkonzepte prozeduraler Programmierung
Begriffsklärung: (Prozedur)
Eine Prozedur ist eine Abstraktion einer Anweisung. Sie gibt der
Anweisung einen Namen und legt fest, das die Parameter der
Anweisung sind. Prozeduren können Ergebnisse liefern.
Bemerkung
Prozeduren abstrahieren Anweisungen genauso, wie Funktionen
Ausdrücke abstrahieren.
©Arnd Poetzsch-Heffter
TU Kaiserslautern
632
4. Prozedurales Programmieren
4.2 Grundkonzepte prozeduraler Programmierung
Beispiel: (Prozedur als Abstraktion
Aufgabe:
Berechne den Absolutbetrag einer ganzen Zahl gespeichert in Variable
i und schreibe ihn in die Variable x.
Algorithmus:
Wenn i größer oder gleich 0, liefere i als Ergebnis; andernfalls −i.
Weise das Ergebnis an x zu.
©Arnd Poetzsch-Heffter
TU Kaiserslautern
633
4. Prozedurales Programmieren
4.2 Grundkonzepte prozeduraler Programmierung
Beispiel: (Prozedur als Abstraktion (2)
void
int
int
i =
main(.. .){
i;
x;
readInt ();
int result ;
if( i>=0 ) {
result = i;
} else {
result = -i;
}
}











 Abstraktion bzgl. i,



result wird zum Ergebnis.








x = result ;
©Arnd Poetzsch-Heffter
TU Kaiserslautern
634
4. Prozedurales Programmieren
4.2 Grundkonzepte prozeduraler Programmierung
Beispiel: (Prozedur als Abstraktion (3)
int abs( int n ) {
if( n ≥ 0 ) {
return n;
} else {
return -n;
}
}
void main(.. .){
int i;
int x;
i = readInt ();
}
x = abs(i);
©Arnd Poetzsch-Heffter
TU Kaiserslautern
635
4. Prozedurales Programmieren
4.2 Grundkonzepte prozeduraler Programmierung
Deklaration von Prozeduren/Methoden:
Syntax in Java:
<Typ > <Prozedurbezeichner > ( <formaleParameter > )
<Anweisungsblock >
Semantik:
Die Semantik ist durch den Aufrufmechanismus und den
Anweisungsblock, den sogenannten Prozedurrumpf bestimmt
(Genaueres siehe unten).
©Arnd Poetzsch-Heffter
TU Kaiserslautern
636
Herunterladen