Begriffsklärung: (Effizienz) (2) Begriffsklärung: (deterministisch

Werbung
4. Prozedurales Programmieren
4.1 Der Begriff des Algorithmus
4. Prozedurales Programmieren
Begriffsklärung: (Effizienz) (2)
4.1 Der Begriff des Algorithmus
Begriffsklärung: (deterministisch)
Mit den gemachten Präzisierungen lässt sich der Aufwand einer
Ausführung quantifizieren:
Ein Algorithmus heißt deterministisch, wenn für alle Eingabedaten
der Ablauf des Algorithmus eindeutig bestimmt ist.
• Zeitkomplexität: Wie viele Schritte braucht der Algorithmus in
Abhängigkeit von den Eingabewerten?
Andernfalls heißt er nicht-deterministisch.
• Raumkomplexität: Wie viel Speicherplatz braucht der Algorithmus
in Abhängigkeit von den Eingabewerten?
©Arnd Poetzsch-Heffter
TU Kaiserslautern
4. Prozedurales Programmieren
565
©Arnd Poetzsch-Heffter
4.1 Der Begriff des Algorithmus
TU Kaiserslautern
4. Prozedurales Programmieren
Beispiel: (nicht-deterministischer Algorithmus)
4.1 Der Begriff des Algorithmus
Beispiel: (nicht-deterministischer Algorithmus) (2)
Aufgabe:
Erkenne, ob eine Eingabezeichenreihe über Kleinbuchstaben eines
der Worte " otto" , "toto", "total" enthält.
• Solange pflän, ∅ tue Folgendes:
I
wähle ein x aus pflän aus;
Eingabe: Eingabezeichenreihe über Kleinbuchstaben
I
pflän = pflän\{x};
Ausgabe:
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.
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
566
• Terminiere mit "nein".
567
©Arnd Poetzsch-Heffter
TU Kaiserslautern
568
4. Prozedurales Programmieren
4.1 Der Begriff des Algorithmus
4. Prozedurales Programmieren
Begriffsklärung: (determiniert)
Beispiele: (Determiniertheit)
Ein Algorithmus heißt determiniert, wenn er bei gleichen zulässigen
Eingabewerten stets das gleiche Ergebnis liefert.
• Jeder Algorithmus, der eine Funktion berechnet, ist determiniert.
• Der Algorithmus von der letzten Folie ist determiniert.
Andernfalls heißt er nicht-determiniert.
©Arnd Poetzsch-Heffter
TU Kaiserslautern
4. Prozedurales Programmieren
4.1 Der Begriff des Algorithmus
569
©Arnd Poetzsch-Heffter
4.2 Grundkonzepte prozeduraler Programmierung
TU Kaiserslautern
4. Prozedurales Programmieren
Abschnitt 4.2
570
4.2 Grundkonzepte prozeduraler Programmierung
Grundkonzepte prozeduraler Programmierung
Algorithmen lassen sich mit unterschiedlichen Sprachmitteln
beschreiben:
• umgangssprachlich
Grundkonzepte prozeduraler Programmierung
• mit graphischen Notationen
• mit mathematischer Sprache
• mit programmiersprachlichen Mitteln.
©Arnd Poetzsch-Heffter
TU Kaiserslautern
571
©Arnd Poetzsch-Heffter
TU Kaiserslautern
572
4. Prozedurales Programmieren
4.2 Grundkonzepte prozeduraler Programmierung
4. Prozedurales Programmieren
Begriffsklärung: (prozedurales Paradigma)
4.2 Grundkonzepte prozeduraler Programmierung
Beispiel: (Prozedurale Systemsicht)
Ein Rechensystem (z.B. PC) kann man prozedural wie folgt
beschreiben:
Gemäß des prozeduralen Paradigmas (vgl. Folie 155) wird
• Jede Datei ist eine Variable für Listen von Bytes.
• der Zustand eines Systems mit Variablen beschrieben
• Nach dem Starten des Rechners wird ein nicht-terminierender
• werden die möglichen Systemabläufe algorithmisch formuliert und
• bilden Prozeduren das zentrale Strukturierungs- und
Abstraktionsmittel.
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
4. Prozedurales Programmieren
573
©Arnd Poetzsch-Heffter
4.2 Grundkonzepte prozeduraler Programmierung
TU Kaiserslautern
4. Prozedurales Programmieren
Unterabschnitt 4.2.1
574
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:
Sprachliche Basis: Teilsprache von Java
• Deklaration und Verwendung von Variablen
• Anweisungen
• Deklaration und Verwendung von Prozeduren
©Arnd Poetzsch-Heffter
TU Kaiserslautern
575
©Arnd Poetzsch-Heffter
TU Kaiserslautern
576
4. Prozedurales Programmieren
4.2 Grundkonzepte prozeduraler Programmierung
4. Prozedurales Programmieren
Sprachliche Basis: Teilsprache von Java (2)
4.2 Grundkonzepte prozeduraler Programmierung
Sprachliche Basis: Teilsprache von Java (3)
Nachteile:
• Da klassenlose, rein prozedurale Programmierung von Java nicht
Zur Programmierung verwenden wir eine Teilsprache von Java.
unterstützt wird, entsteht ein notationeller Mehraufwand.
• Bestimmte Sprachelemente bleiben zunächst unerklärt.
Vorteile:
• Der Übergang zur objektorientierten Programmierung wird
Vorgehen:
einfacher.
• Der Zusammenhang zwischen prozeduraler und objektorientierter
Programmierung wird klarer.
• Basisdatentypen
• Ausdrücke
• Variablendeklarationen
• Programmstruktur und vereinfachte Notation
©Arnd Poetzsch-Heffter
TU Kaiserslautern
4. Prozedurales Programmieren
577
©Arnd Poetzsch-Heffter
4.2 Grundkonzepte prozeduraler Programmierung
TU Kaiserslautern
4. Prozedurales Programmieren
Basisdatenstrukturen in Java:
578
4.2 Grundkonzepte prozeduraler Programmierung
Ausdrücke in Java:
Java bietet insbesondere Basisdatenstrukturen mit den Typen
boolean
char
int , long , short ,
float , double
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.)
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
©Arnd Poetzsch-Heffter
TU Kaiserslautern
580
4. Prozedurales Programmieren
4.2 Grundkonzepte prozeduraler Programmierung
4. Prozedurales Programmieren
Beispiel: (Ausdrücke in Java)
4.2 Grundkonzepte prozeduraler Programmierung
Variablendeklarationen in Java:
Eine Variablendeklaration hat die Form:
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
<Typbezeichner >
für geeignetes a
<Variablenbezeichner > ;
und definiert eine neue Variable vom angegebenen Typ mit dem
angegebenem Bezeichner. Beispiele:
für geeignete d, e
int a;
boolean b;
float meineGleitkommavariable ;
char cvar;
für geeignete a, d, abs
für geeignete Variable sein
für geeignete Prozedur tuEs
// liefert max(a, b)
Eine Variablendeklarationsliste entsteht durch Aneinanderreihen von
einzelnen Deklarationen.
©Arnd Poetzsch-Heffter
TU Kaiserslautern
4. Prozedurales Programmieren
581
©Arnd Poetzsch-Heffter
4.2 Grundkonzepte prozeduraler Programmierung
TU Kaiserslautern
4. Prozedurales Programmieren
Programmstruktur und -syntax:
582
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 >
}
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:
wobei k ≥ 0, m ≥ 0, n ≥ 0.
©Arnd Poetzsch-Heffter
TU Kaiserslautern
583
©Arnd Poetzsch-Heffter
TU Kaiserslautern
584
4. Prozedurales Programmieren
4.2 Grundkonzepte prozeduraler Programmierung
4. Prozedurales Programmieren
Bemerkung:
4.2 Grundkonzepte prozeduraler Programmierung
Konventionen:
• Wir gehen davon aus, dass die Datei InputOutput.java im
aktuellen Dateiverzeichnis liegt. Sie stellt bereit:
• Die Reihenfolge der Deklarationen kann vertauscht werden.
public class IO
public static
public static
public static
public static
public static
}
• Die hier nicht erklärten Sprachkonstrukte werden in Kapitel 5
behandelt.
©Arnd Poetzsch-Heffter
TU Kaiserslautern
4. Prozedurales Programmieren
585
©Arnd Poetzsch-Heffter
4.2 Grundkonzepte prozeduraler Programmierung
TU Kaiserslautern
4. Prozedurales Programmieren
Konventionen: (2)
586
4.2 Grundkonzepte prozeduraler Programmierung
Beispiel: (Notation prozeduraler Programme)
Foo.java
• 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
TU Kaiserslautern
public class Foo {
static int a;
static boolean bvar;
static int abs( int n ) {
if( n >= 0 ){
return n;
} else {
return -n;
}
}
des Programmschemas der letzten Folie sowie die
Schlüsselwörter static und public auf Folien der
Übersichtlichkeit halber weglassen.
©Arnd Poetzsch-Heffter
{
int readInt (){.. .}
String readString (){...}
char readChar (){...}
void print( Object o){...}
void println ( Object o){...}
587
©Arnd Poetzsch-Heffter
TU Kaiserslautern
588
4. Prozedurales Programmieren
4.2 Grundkonzepte prozeduraler Programmierung
4. Prozedurales Programmieren
Beispiel: (Notation prozeduraler Programme) (2)
Beispiel: (Notation prozeduraler Programme) (3)
Abkürzend schreiben wir hier:
static void setA () {
a = abs(a);
}
int a;
boolean bvar;
public static void main( String [] args ){
IO. println (" Eingabe von a:");
a = IO. readInt ();
setA ();
IO. println ( a );
}
int abs( int n ) {
if( n≥0 ){
return n;
} else {
return -n;
}
}
}
©Arnd Poetzsch-Heffter
4.2 Grundkonzepte prozeduraler Programmierung
TU Kaiserslautern
4. Prozedurales Programmieren
589
©Arnd Poetzsch-Heffter
4.2 Grundkonzepte prozeduraler Programmierung
TU Kaiserslautern
4. Prozedurales Programmieren
Beispiel: (Notation prozeduraler Programme) (4)
590
4.2 Grundkonzepte prozeduraler Programmierung
Überblick übers weitere Vorgehen:
• Anweisungen
void setA () {
a = abs(a);
}
• Prozeduren
• Variablen in Programm und Speicher
void main( String [] args ){
println (" Eingabe von a:");
a = readInt ();
setA ();
println ( a );
}
• Felder
• Benutzerdefinierte Typen
• Sichtbarkeit von Bindungen
• Iteration und Rekursion
• Weitere prozedurale Sprachkonzepte
©Arnd Poetzsch-Heffter
TU Kaiserslautern
591
©Arnd Poetzsch-Heffter
TU Kaiserslautern
592
4. Prozedurales Programmieren
4.2 Grundkonzepte prozeduraler Programmierung
4. Prozedurales Programmieren
Bemerkung:
4.2 Grundkonzepte prozeduraler Programmierung
Unterabschnitt 4.2.2
• 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.
Anweisungen
• 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
4. Prozedurales Programmieren
593
©Arnd Poetzsch-Heffter
4.2 Grundkonzepte prozeduraler Programmierung
TU Kaiserslautern
4. Prozedurales Programmieren
Begriffsklärung: (Anweisung)
594
4.2 Grundkonzepte prozeduraler Programmierung
Beispiel: (Anweisungen)
1. Zuweisung eines Werts an eine Variable:
Anweisungen sind programmiersprachliche Beschreibungsmittel:
<Variable > = <Wert > ;
• Einfache Anweisungen beschreiben Aktionen.
2. Schleifenanweisung:
• Zusammengesetzte Anweisungen beschreiben, wie mehrere
Aktionen auszuführen sind, also Teile von Algorithmen.
©Arnd Poetzsch-Heffter
TU Kaiserslautern
while( <Bedingung > ) {
<Anweisungen >
}
595
©Arnd Poetzsch-Heffter
TU Kaiserslautern
596
4. Prozedurales Programmieren
4.2 Grundkonzepte prozeduraler Programmierung
4. Prozedurales Programmieren
Bemerkung:
4.2 Grundkonzepte prozeduraler Programmierung
Bemerkung: (2)
Wir betrachten die folgenden Anweisungen und ihre Realisierung in
Java:
Unterschied: Anweisung / Ausdruck
• Einfache Anweisungen:
• Die Auswertung von Ausdrücken liefert ein Ergebnis.
• Die Ausführung von Anweisungen verändert den Zustand. Im Allg.
liefert sie kein Ergebnis.
I
Zuweisung
I
Prozeduraufruf
• Anweisungsblöcke
• Schleifenanweisungen:
I
©Arnd Poetzsch-Heffter
TU Kaiserslautern
4. Prozedurales Programmieren
597
while-, do-, for-Anweisung
©Arnd Poetzsch-Heffter
4.2 Grundkonzepte prozeduraler Programmierung
TU Kaiserslautern
4. Prozedurales Programmieren
Bemerkung: (3)
598
4.2 Grundkonzepte prozeduraler Programmierung
Einfache Anweisungen
• Verzweigungsanweisungen:
Zuweisung: (engl. assignment)
I
bedingte Anweisung
I
Fallunterscheidung
I
Auswahlanweisung
Syntax in Java:
<Variable >
Abbruchanweisung
I
Rückgabeanweisung
©Arnd Poetzsch-Heffter
<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.)
• Sprunganweisungen:
I
=
TU Kaiserslautern
599
©Arnd Poetzsch-Heffter
TU Kaiserslautern
600
4. Prozedurales Programmieren
4.2 Grundkonzepte prozeduraler Programmierung
4. Prozedurales Programmieren
4.2 Grundkonzepte prozeduraler Programmierung
Einfache Anweisungen (2)
Bemerkung:
Beispiele:
In einer Zuweisung (und anderen Sprachkon- strukten) kann eine
Variable v mit zwei Bedeutungen vorkommen:
a = 27 % 23;
b = true;
meineGleitkommavariable = 3.14;
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 .
Sprechweise:
"Variable b ergibt sich zu true" oder
"Variable b wird true zugewiesen".
Die Unterscheidung wird wichtiger, wenn auch links des
Zuweisungszeichens komplexere Ausdrücke stehen.
©Arnd Poetzsch-Heffter
TU Kaiserslautern
4. Prozedurales Programmieren
601
©Arnd Poetzsch-Heffter
4.2 Grundkonzepte prozeduraler Programmierung
TU Kaiserslautern
4. Prozedurales Programmieren
Beispiel: (L-Wert, R-Wert)
602
4.2 Grundkonzepte prozeduraler Programmierung
Prozeduraufruf: (engl. procedure call)
Syntax:
%
L-Wert
a = 7 + a;
<Prozedurbezeichner > ( <AktuelleParameterliste > ) ;
<AktuelleParameterliste > → ε | <Ausdrucksliste >
<Ausdrucksliste > → <Ausdruck >
| <Ausdruck > , <Ausdrucksliste >
R-Wert
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
603
©Arnd Poetzsch-Heffter
TU Kaiserslautern
604
4. Prozedurales Programmieren
4.2 Grundkonzepte prozeduraler Programmierung
4. Prozedurales Programmieren
4.2 Grundkonzepte prozeduraler Programmierung
Prozeduraufruf: (engl. procedure call) (2)
Anweisungsblöcke
Beispiele:
Ein Anweisungsblock (engl. block statement) ist eine Liste bestehend
aus Deklarationen und Anweisungen.
Syntax in Java:
1. Prozeduraufruf mit Ergebnis:
{ <DeklAnweisListe > }
<DeklAnweisListe > → ε
| <Deklaration >
| <Anweisung >
| <Deklaration > <DeklAnweisListe >
| <Anweisung > <DeklAnweisListe >
a = ggt(a,abs (45 -87));
// Zuweisung
2. Prozeduraufruf mit Seiteneffekt:
print ( ggt (24 ,248));
Semantik:
// Anweisung
Stelle den Speicherplatz für die Variablen bereit und führe die
Anweisungen der Reihe nach aus.
©Arnd Poetzsch-Heffter
TU Kaiserslautern
4. Prozedurales Programmieren
605
©Arnd Poetzsch-Heffter
4.2 Grundkonzepte prozeduraler Programmierung
TU Kaiserslautern
4. Prozedurales Programmieren
606
4.2 Grundkonzepte prozeduraler Programmierung
Beispiel:
Schleifenanweisungen
{ int i; i = 7; int a; a = 27 % i; }
Schleifenanweisungen (engl. loop statements) steuern die iterative,
d.h. wiederholte Ausführung von Anweisungen/Anweisungsblöcken.
while-Anweisung:
Üblicherweise schreibt man Deklarationen und Anweisungen
untereinander, so dass ein Textblock entsteht.
{
}
int
int
i =
x =
Syntax in Java:
while ( <boolescherAusdruck > )
i;
x;
readInt ();
abs(i);
©Arnd Poetzsch-Heffter
<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.
TU Kaiserslautern
607
©Arnd Poetzsch-Heffter
TU Kaiserslautern
608
4. Prozedurales Programmieren
4.2 Grundkonzepte prozeduraler Programmierung
4. Prozedurales Programmieren
Beispiel:
4.2 Grundkonzepte prozeduraler Programmierung
do-Anweisung:
Aus der Prozedur ggt:
while(
{
v =
n =
m =
}
m >0 )
n % m;
m;
v;
while (
v =
n =
m =
}
Syntax in Java:
m >0 ) {
n % m;
m;
v;
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.
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
4. Prozedurales Programmieren
609
©Arnd Poetzsch-Heffter
4.2 Grundkonzepte prozeduraler Programmierung
TU Kaiserslautern
4. Prozedurales Programmieren
Bemerkung:
610
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:
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
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
4. Prozedurales Programmieren
Beispiel: (2)
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 ;
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:
v1 [0] = 1;
v1 [1] = 3;
v1 [2] = 8;
©Arnd Poetzsch-Heffter
TU Kaiserslautern
4. Prozedurales Programmieren
613
4.2 Grundkonzepte prozeduraler Programmierung
4.2 Grundkonzepte prozeduraler Programmierung
for(< Ausdrucksanweisung1 > ;
<boolescherAusdruck > ;
<Ausdrucksanweisung2 > )
skalprod = 0;
for( i = 0; i <3; i++ ) {
skalprod = skalprod + v1[i]* v2[i] ;
}
println ( skalprod );
TU Kaiserslautern
614
Syntax in Java:
v2 [0] = 2;
v2 [1] = 3;
v2 [2] = 4;
©Arnd Poetzsch-Heffter
TU Kaiserslautern
4. Prozedurales Programmieren
Beispiel: (Zählanweisung) (2)
}
©Arnd Poetzsch-Heffter
<Anweisung >
<Ausdrucksanweisung > → <Variable > = <Ausdruck >
|
<Variable > ++
|
<Variable > --
615
©Arnd Poetzsch-Heffter
TU Kaiserslautern
616
4. Prozedurales Programmieren
4.2 Grundkonzepte prozeduraler Programmierung
4. Prozedurales Programmieren
4.2 Grundkonzepte prozeduraler Programmierung
Semantik:
Verzweigungsanweisungen
Ausdrucksanweisung:
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:
1. Produktion: wie bei Zuweisung.
Syntax in Java:
2./3. Produktion: Lese den Wert der Variablen.
Erhöhe/erniedrige den Wert der Variablen um 1.
Liefere den gelesenen Wert zurück.
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
4. Prozedurales Programmieren
617
©Arnd Poetzsch-Heffter
4.2 Grundkonzepte prozeduraler Programmierung
TU Kaiserslautern
4. Prozedurales Programmieren
Beispiel: (Bedingte Anweisung)
Fallunterscheidung:
if( i != 0 ) { n = k/i; }
Syntax in Java:
if(
{
}
if( <boolescherAusdruck > )
else
gute_Idee_vorhanden
&& genug_Zeit_zur_Vorbereitung )
halte_anregende_Weihnachtsvorlesung ();
mache_schneller_damit_frueher_fertig ();
©Arnd Poetzsch-Heffter
TU Kaiserslautern
618
4.2 Grundkonzepte prozeduraler Programmierung
<Anweisung1 >
<Anweisung2 >
Semantik:
Werte den Ausdruck aus. Ist das Ergebnis true, führe Anweisung1,
andernfalls Anweisung2 aus.
619
©Arnd Poetzsch-Heffter
TU Kaiserslautern
620
4. Prozedurales Programmieren
4.2 Grundkonzepte prozeduraler Programmierung
4. Prozedurales Programmieren
4.2 Grundkonzepte prozeduraler Programmierung
Beispiel: (Fallunterscheidung)
Auswahlanweisung:
if( i!=0 ) {
n = k/i;
n++;
} else {
fehlerbehandlung (" Division durch Null");
}
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
4. Prozedurales Programmieren
621
4.2 Grundkonzepte prozeduraler Programmierung
622
4.2 Grundkonzepte prozeduraler Programmierung
Beispiel: (Auswahlanweisung) (2)
wobei proza, prozb, prozc beliebige Prozeduren sind, zum Beispiel:
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 );
}
TU Kaiserslautern
TU Kaiserslautern
4. Prozedurales Programmieren
Beispiel: (Auswahlanweisung)
©Arnd Poetzsch-Heffter
©Arnd Poetzsch-Heffter
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");
}
623
©Arnd Poetzsch-Heffter
TU Kaiserslautern
624
4. Prozedurales Programmieren
4.2 Grundkonzepte prozeduraler Programmierung
4. Prozedurales Programmieren
Sprunganweisungen
4.2 Grundkonzepte prozeduraler Programmierung
Abbruchanweisung:
Syntax in Java:
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
4. Prozedurales Programmieren
break;
Semantik:
Die Ausführung wird am Ende der umfassenden zusammengesetzen
Anweisung fortgesetzt.
625
©Arnd Poetzsch-Heffter
4.2 Grundkonzepte prozeduraler Programmierung
TU Kaiserslautern
4. Prozedurales Programmieren
Beispiel: (Auswahlanweisung)
626
4.2 Grundkonzepte prozeduraler Programmierung
Rückgabeanweisung:
Syntax in Java:
return ;
return <Ausdruck > ;
1. In Auswahlanweisung: siehe oben.
Semantik:
2. In Schleifenanweisungen:
1. Fall/Produktion:
Nur in Prozeduren ohne Rückgabewert erlaubt. Beende die
Ausführung der Prozedur. Setze die Ausführung an der
Aufrufstelle fort.
while ( true ) {
...
if( <Abbruchbedingung > ) break ;
...
}
©Arnd Poetzsch-Heffter
TU Kaiserslautern
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.
627
©Arnd Poetzsch-Heffter
TU Kaiserslautern
628
4. Prozedurales Programmieren
4.2 Grundkonzepte prozeduraler Programmierung
4. Prozedurales Programmieren
Beispiel: (Rückgabeanweisung)
Unterabschnitt 4.2.3
int abs( int n ) {
if( n ≥ 0 ) {
return n;
} else {
return -n;
}
}
©Arnd Poetzsch-Heffter
4.2 Grundkonzepte prozeduraler Programmierung
Prozeduren
TU Kaiserslautern
4. Prozedurales Programmieren
629
©Arnd Poetzsch-Heffter
4.2 Grundkonzepte prozeduraler Programmierung
TU Kaiserslautern
4. Prozedurales Programmieren
Prozeduren
630
4.2 Grundkonzepte prozeduraler Programmierung
Begriffsklärung: (Prozedur)
Prozeduren erlauben es, von konkreten Anweisungen bzw.
Anweisungssequenzen zu abstrahieren.
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.
D.h. Prozeduren legen die Parameter einer zusammengesetzten
Anweisung fest und geben ihr einen Namen.
Dies ermöglicht:
Bemerkung
• Wiederverwendung,
Prozeduren abstrahieren Anweisungen genauso, wie Funktionen
Ausdrücke abstrahieren.
• Schnittstellenbildung und Information Hiding.
Darüber hinaus ermöglichen Prozeduren die rekursive Ausführung von
Anweisungen.
©Arnd Poetzsch-Heffter
TU Kaiserslautern
631
©Arnd Poetzsch-Heffter
TU Kaiserslautern
632
4. Prozedurales Programmieren
4.2 Grundkonzepte prozeduraler Programmierung
4. Prozedurales Programmieren
Beispiel: (Prozedur als Abstraktion
Beispiel: (Prozedur als Abstraktion (2)
Aufgabe:
Berechne den Absolutbetrag einer ganzen Zahl gespeichert in Variable
i und schreibe ihn in die Variable x.
void
int
int
i =
}
TU Kaiserslautern
4. Prozedurales Programmieren
633











 Abstraktion bzgl. i,



result wird zum Ergebnis.








x = result ;
©Arnd Poetzsch-Heffter
4.2 Grundkonzepte prozeduraler Programmierung
TU Kaiserslautern
4. Prozedurales Programmieren
Beispiel: (Prozedur als Abstraktion (3)
634
4.2 Grundkonzepte prozeduraler Programmierung
Deklaration von Prozeduren/Methoden:
int abs( int n ) {
if( n ≥ 0 ) {
return n;
} else {
return -n;
}
}
Syntax in Java:
<Typ > <Prozedurbezeichner > ( <formaleParameter > )
<Anweisungsblock >
Semantik:
Die Semantik ist durch den Aufrufmechanismus und den
Anweisungsblock, den sogenannten Prozedurrumpf bestimmt
(Genaueres siehe unten).
void main(...){
int i;
int x;
i = readInt ();
}
main(.. .){
i;
x;
readInt ();
int result ;
if( i>=0 ) {
result = i;
} else {
result = -i;
}
Algorithmus:
Wenn i größer oder gleich 0, liefere i als Ergebnis; andernfalls −i.
Weise das Ergebnis an x zu.
©Arnd Poetzsch-Heffter
4.2 Grundkonzepte prozeduraler Programmierung
x = abs(i);
©Arnd Poetzsch-Heffter
TU Kaiserslautern
635
©Arnd Poetzsch-Heffter
TU Kaiserslautern
636
Herunterladen