Inhalt I Einführung in die Programmierungstechnik II Abstrakte ...
Inhalt I Einführung in die Programmierungstechnik II Abstrakte ...
Inhalt I Einführung in die Programmierungstechnik II Abstrakte ...
Erfolgreiche ePaper selbst erstellen
Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.
P. Forbrig PT - E<strong>in</strong>führung und Überblick<br />
<strong>Inhalt</strong><br />
P. Forbrig PT - E<strong>in</strong>führung und Überblick<br />
<strong>Inhalt</strong><br />
I E<strong>in</strong>führung <strong>in</strong> <strong>die</strong> <strong>Programmierungstechnik</strong><br />
<strong>II</strong> <strong>Abstrakte</strong> Datentypen<br />
<strong>II</strong>I Suchen<br />
IV Sortieren<br />
V Verifikation<br />
1 E<strong>in</strong>führung<br />
2 Was ist e<strong>in</strong> Algorithmus <br />
3 Programmentwicklung<br />
1<br />
2<br />
P. Forbrig PT - E<strong>in</strong>führung und Überblick<br />
1 E<strong>in</strong>führung<br />
▲ Gegenstand der Informatik:<br />
• -Struktur, Wirkungsweise, Fähigkeiten und<br />
Konstruktionspr<strong>in</strong>zipien von Informationssystemen<br />
(Rechnerarchitekturen, Netze, ...) - HARDWARE<br />
• -Struktur, Eigenschaften,<br />
Beschreibungsmöglichkeiten von Informationen und<br />
von Informationsverarbeitungsprozessen<br />
(SOFTWARE, Technologien, gesellschaftl.<br />
Wirkungen)<br />
• -Strukturierung, Formalisierung von Anwendungen,<br />
Modellbildung, Simulation<br />
▲ Basis: Mathematische Modelle<br />
P. Forbrig PT - E<strong>in</strong>führung und Überblick<br />
1 E<strong>in</strong>führung<br />
Geschichte, Jura,<br />
Philosophie, ...<br />
Chemie, Physik,<br />
Biologie, ...<br />
Informatik<br />
Carl Friedrich von Weizsäcker:<br />
====<br />
Gesellschaftswissenschaft<br />
Naturwissenschaft<br />
Ingenieurwissenschaft<br />
Elektronik,<br />
Masch<strong>in</strong>enbau, ...<br />
Mathematik<br />
Strukturwissenschaft<br />
3<br />
4<br />
P. Forbrig PT - E<strong>in</strong>führung und Überblick<br />
1 E<strong>in</strong>führung<br />
Was ist Information <br />
• Oxford English Dictionary: "item of knowledge"<br />
• BAUER, GOOS:<br />
" "Nachricht" und "Information" s<strong>in</strong>d<br />
Grundbegriffe der Informatik. Wir führen deshalb<br />
Nachricht und Information als nicht weiter<br />
def<strong>in</strong>ierbare Grundbegriffe e<strong>in</strong> .... "<br />
Zum Verhältnis Information - Nachricht wird weiter<br />
gesagt:<br />
" Die (abstrakte) Information wird durch <strong>die</strong><br />
(konkrete) Nachricht mitgeteilt. "<br />
P. Forbrig PT - E<strong>in</strong>führung und Überblick<br />
1 E<strong>in</strong>führung<br />
Die Zuordnung Nachricht - Information<br />
Mehrere<br />
Nachrichten<br />
Tür<br />
door<br />
...<br />
=<br />
E<strong>in</strong>e<br />
Information<br />
ist mehrdeutig:<br />
Nachrichten werden<br />
¡<br />
<strong>in</strong>terpretiert<br />
Die Interpretationsvorschrift muß beim<br />
Nachrichtenaustausch<br />
(Informationsaustausch) dem Sender und Empfänger<br />
bekannt<br />
¢<br />
se<strong>in</strong>.<br />
Nachrichten s<strong>in</strong>d Symbole für Informationen, deren Bedeutung<br />
erlernt werden muߣ MEHLIS<br />
e<strong>in</strong>e<br />
Nachricht<br />
“ Tür “ war<br />
=<br />
verschiedene<br />
Informationen<br />
“ es war “<br />
“ Krieg “<br />
...<br />
5<br />
6
P. Forbrig PT - E<strong>in</strong>führung und Überblick<br />
1 E<strong>in</strong>führung<br />
▲<br />
Es gibt auch Versuche, den Begriff Information nicht als<br />
Grundbegriff zu sehen, sondern weiter zu def<strong>in</strong>ieren: Nach<br />
SHANNON 1948 ist<br />
Information <strong>die</strong> durch den Empfang e<strong>in</strong>er Nachricht beim<br />
¤¦¥<br />
Empfänger e<strong>in</strong>getretene Verr<strong>in</strong>gerung Unbestimmtheit§<br />
der<br />
▲ Nachrichten, <strong>die</strong> <strong>die</strong> Unbestimmtheit NICHT ändern, enthalten<br />
ke<strong>in</strong>e Information ! ! !<br />
(das ist Empfänger-abhängig)<br />
¨<br />
Redundanz:Enthält e<strong>in</strong>e Nachricht <strong>die</strong> Information nicht <strong>in</strong><br />
©<br />
der kürzest möglichen Form, so<br />
ist e<strong>in</strong> Teil der Nachricht redundant.<br />
z.B. : Donnerstag, der 20. September 1990<br />
▲ Informationsverarbeitung ist:<br />
• das Senden/Empfangen/Interpretieren von Nachrichten,<br />
• <strong>die</strong> Berechnung neuer Nachrichten<br />
P. Forbrig PT - E<strong>in</strong>führung und Überblick<br />
1.1 Was ist <strong>Programmierungstechnik</strong> <br />
Dieses Wort baut auf zwei Begriffen auf:<br />
Programm - Programmierung <strong>Programmierungstechnik</strong><br />
Programm:<br />
Arbeitsvorschrift für e<strong>in</strong>en Rechenautomaten.<br />
endliche Folge von Befehlen für e<strong>in</strong>en abstrakten oder realen<br />
Automaten, <strong>die</strong> zur Darstellung e<strong>in</strong>es von dem Automaten<br />
zu realisierenden Algorithmus <strong>die</strong>nt.<br />
Programmierung:<br />
Die Aufgabe, e<strong>in</strong>en Algorithmus für <strong>die</strong> Lösung e<strong>in</strong>es<br />
Problemes zu erstellen, nennt man Programmierung.<br />
Co<strong>die</strong>rung:<br />
Die Herstellung e<strong>in</strong>es Programmes nennt man Co<strong>die</strong>rung.<br />
Technik: siehe Lexikon<br />
7<br />
8<br />
P. Forbrig PT - E<strong>in</strong>führung und Überblick<br />
1.1 Was ist <strong>Programmierungstechnik</strong> <br />
P. Forbrig PT - E<strong>in</strong>führung und Überblick<br />
1.2 Was ist e<strong>in</strong>e (Programmier-) Sprache <br />
<strong>Programmierungstechnik</strong>:<br />
Gesamtheit der Methoden, Konzepte, Sprachen und<br />
Werkzeuge zur Programmierung<br />
Ziel: bestmögliche Erfüllung der<br />
Güteanforderungen an das Programm<br />
( Programmieren im Kle<strong>in</strong>en ! ! ! )<br />
• Lexik: bestimmt den Aufbau der<br />
Grundelemente der Sprache (Worte)<br />
• Syntax: gibt <strong>die</strong> Struktur der Sprache an (alle <strong>in</strong><br />
der Sprache zulässigen Ausdrücke)<br />
• Semantik: Zuordnung der Bedeutung zu den<br />
zulässigen Ausdrücken<br />
• Pragmatik: Beziehung der Sprache zum<br />
subjektiven Nutzer<br />
(Lesbarkeit, Erlernbarkeit, ...)<br />
9<br />
10<br />
P. Forbrig PT - E<strong>in</strong>führung und Überblick<br />
1.2 Was ist e<strong>in</strong>e (Programmier-) Sprache <br />
P. Forbrig PT - E<strong>in</strong>führung und Überblick<br />
1.2 Was ist e<strong>in</strong>e (Programmier-) Sprache <br />
Im S<strong>in</strong>ne der Mathematik und auch der Informatik<br />
ist e<strong>in</strong>e Sprache e<strong>in</strong>e Menge von Zeichenreihen.<br />
Die Sprache wird dabei auf Lexik und Syntax<br />
reduziert! Für <strong>die</strong> Lexik wird der Begriff Alphabet<br />
e<strong>in</strong>geführt.<br />
E<strong>in</strong> Alphabet A ist e<strong>in</strong>e nicht leere, endliche Menge A<br />
von Zeichen a ∈ A<br />
Die Menge aller Zeichenreihen A* über e<strong>in</strong>em<br />
Alphabet A ist def<strong>in</strong>iert durch:<br />
• ε ∈ A* (<strong>die</strong> leere Zeichenreihe ist e<strong>in</strong>e Zeichenreihe)<br />
• x ∈ A* , a ∈ A ⇒ x . a ∈ A* (= = xa)<br />
• andere Zeichenreihen gibt es nicht<br />
E<strong>in</strong>e Sprache L ist e<strong>in</strong>e Teilmenge der Menge aller<br />
Zeichenreihen über e<strong>in</strong>em Alphabet A: L ⊂ A*<br />
11<br />
12
P. Forbrig PT - E<strong>in</strong>führung und Überblick<br />
1.3 Syntaxdiagramme<br />
P. Forbrig PT - E<strong>in</strong>führung und Überblick<br />
Beispiel:<br />
satz<br />
subjekt<br />
prädikat<br />
objekt<br />
* *<br />
Nichtterm<strong>in</strong>al<br />
subjekt<br />
prädikat<br />
er<br />
* *<br />
wir<br />
lesen<br />
* *<br />
liest<br />
Term<strong>in</strong>al<br />
objekt<br />
text<br />
*<br />
*<br />
satz<br />
e<strong>in</strong> Buch<br />
text<br />
*<br />
ODER:<br />
text<br />
* *<br />
13<br />
14<br />
P. Forbrig PT - E<strong>in</strong>führung und Überblick<br />
1.4 Erweiterte-Backus-Naur-Form (EBNF)<br />
▲ E<strong>in</strong>e Grammatik G = (Σ, N, P, S) ist def<strong>in</strong>iert<br />
durch:<br />
<br />
E<strong>in</strong>e endliche Menge Σ von term<strong>in</strong>alen<br />
Symbolen, dem Alphabet der Sprache<br />
<br />
E<strong>in</strong>e endliche Menge N von nichtterm<strong>in</strong>alen<br />
Symbolen<br />
<br />
E<strong>in</strong>e endliche Menge P von Produktionsregeln,<br />
<strong>die</strong> def<strong>in</strong>iert, wie Nichtterm<strong>in</strong>ale durch<br />
Term<strong>in</strong>ale und Nichtterm<strong>in</strong>ale def<strong>in</strong>iert s<strong>in</strong>d<br />
<br />
E<strong>in</strong> ausgewähltes Nichtterm<strong>in</strong>al S, das<br />
Startsymbol<br />
P. Forbrig PT - E<strong>in</strong>führung und Überblick<br />
1.4 Erweiterte-Backus-Naur-Form (EBNF)<br />
▲ t t t : term<strong>in</strong>ales Symbol,<br />
<br />
▲ ist <strong>in</strong> <strong>die</strong>ser Form Bestandteil des Satzes e<strong>in</strong>er Sprache.<br />
▲ [ : optionales (null- oder e<strong>in</strong>maliges) Auftreten der<br />
▲ geklammerten Elemente<br />
▲ { } : null- oder beliebig oftmaliges Auftreten der<br />
▲ geklammerten Elemente<br />
▲ ( ) : Gruppierung von Elementen (e<strong>in</strong>maliges Auftreten)<br />
▲ | : Trennung von Alternativen<br />
▲ = : Trennung l<strong>in</strong>ker von rechter Regelseite.<br />
▲ . : Ende der Regel<br />
▲ Bezeichner : Nichtterm<strong>in</strong>al, wird durch weitere Regeln erklärt.<br />
15<br />
16<br />
P. Forbrig PT - E<strong>in</strong>führung und Überblick<br />
1.4 Erweiterte-Backus-Naur-Form (EBNF)<br />
P. Forbrig PT - E<strong>in</strong>führung und Überblick<br />
1.5 Geschichte der Programmiersprachen Erweit<br />
HOPE<br />
HASKELL<br />
▲ bezeichner = buchstabe { buchstabe ziffer .<br />
ML<br />
MIRANDA<br />
LISP<br />
FORTH<br />
ASSEMBLER<br />
C<br />
LOGO<br />
APL<br />
PASCAL<br />
▲ zahl = + - { ziffer } .<br />
BASIC<br />
FORTRAN<br />
COBOL<br />
ALGOL<br />
PEARL<br />
MODULA<br />
PL1<br />
ADA<br />
CHILL<br />
PROLOG<br />
SIMULA67<br />
SMALTALK<br />
OBERON<br />
Eiffel Sather C ++ JAVA<br />
17<br />
18
P. Forbrig PT - E<strong>in</strong>führung und Überblick<br />
1.5 Geschichte der Programmiersprachen<br />
C FORTRAN<br />
10 IF (A .EQ. B) GOTO 100<br />
IF (A .GT. B) GOTO 50<br />
B=B-A<br />
GOTO 10<br />
50 A=A-B<br />
GOTO 10<br />
100 CONTINUE<br />
’COMMENT’ALGOL 60;<br />
’for’ x: = a ’while’ a < > b ’do’<br />
’if ’ a > b ’then’ a: = a-b ’else’ b: = b - a;<br />
NOTE COBOL<br />
ANFANG .<br />
IF A EQUAL TO B THEN NEXT SENTENCE<br />
ELSE<br />
IF A GREATER B THEN SUBTRACT B FROM A GOTO ANFANG<br />
ELSE SUBTRACT A FROM B GOTO ANFANG .<br />
19<br />
P. Forbrig PT - E<strong>in</strong>führung und Überblick<br />
1.5 Geschichte der Programmiersprachen<br />
10 REM BASIC :<br />
20 IF A = B THEN 60<br />
30 IF A > B THEN LET A = A - B<br />
40 ELSE LET B = B - A<br />
50 GOTO 20<br />
60 ...<br />
PL/1<br />
DO WHILE (a ¬ = b);<br />
IF A > B THEN a = a - b ;<br />
ELSE b = b - a ;<br />
END ;<br />
’CO’ ALGOL-68 ’CO’<br />
’while’ a < > b ’do’<br />
’ if ’ a > b ’then’ a : = a - b ’else’ b : = b - a ,<br />
/ * C */<br />
while (a ! = b) ;<br />
{ if ( a > b) a - = b ;<br />
else b - = a ;<br />
}<br />
20<br />
P. Forbrig PT - E<strong>in</strong>führung und Überblick<br />
1.5 Geschichte der Programmiersprachen<br />
P. Forbrig PT - E<strong>in</strong>führung und Überblick<br />
1.5 Geschichte der Programmiersprachen<br />
LISP:<br />
(DE GGT (A B)<br />
(COND ( ( EQUAL A B) A)<br />
( ( LESSP A B) (GGT A (DIFFERENCE B A) ) )<br />
( (T (GGT (DIFFERENCE A B) B) )<br />
)<br />
)<br />
CDL <br />
’ACTION’ ggt +a + b :<br />
zyklus :<br />
(ungleich+a+b;<br />
(groesser+a+b, sub+a+b+a; sub+b+a+b, : zyklus).<br />
/* PROLOG */<br />
ggt(A, A, A).<br />
ggt(A, B, C): - A > B, A1 is A-B , ggt(A1, B, C).<br />
ggt(A, B, C): - B > A, B1 is B-A , ggt(A, B1, C).<br />
HOPE:<br />
dec ggT : num # num - - > num;<br />
- - ggT(a,b) b then ggT(a-b, b)<br />
else if ab THEN ggT: = ggT(a-b,b)<br />
ELSE IF b>a THEN ggT: = ggT(a,b -a);<br />
END;<br />
E<strong>in</strong> Algorithmus formt gegebene Größen<br />
(E<strong>in</strong>gabe<strong>in</strong>formation) aufgrund e<strong>in</strong>es Systems<br />
von Regeln (Umformungsregeln) <strong>in</strong><br />
Ausgabegrößen (Ausgabe<strong>in</strong>formation) um.<br />
23<br />
24
P. Forbrig PT - E<strong>in</strong>führung und Überblick<br />
2 Algorithmus<br />
▲ Das System G der Größen, <strong>die</strong> <strong>in</strong>e<strong>in</strong>ander umgearbeitet<br />
werden können, muß notwendigerweise se<strong>in</strong>: Nat, Real,<br />
Texte, ...<br />
▲ Das Umarbeiten von Größen geht <strong>in</strong> Arbeitstakten vor<br />
sich. E<strong>in</strong> Arbeitstakt ist e<strong>in</strong>e Regelanwendung.<br />
▲ Die Beschreibung muß vollständig se<strong>in</strong>.<br />
▲ Die Beschreibung muß endlich se<strong>in</strong>.<br />
▲ Das System der zulässigen Operationen muß gegeben<br />
se<strong>in</strong>.<br />
▲ Die Sprache, <strong>in</strong> der <strong>die</strong> Regeln angegeben s<strong>in</strong>d, muß<br />
bekannt se<strong>in</strong>.<br />
P. Forbrig PT - E<strong>in</strong>führung und Überblick<br />
2.1 Primitiv rekursive Funktionen<br />
▲ Die Menge der Natürlichen Zahlen N ist gegeben<br />
durch folgende Axiome:<br />
(1) 0 ist e<strong>in</strong>e Zahl<br />
<br />
(2) Jede Zahl hat genau e<strong>in</strong>en Nachfolger<br />
<br />
(3) 0 ist nicht Nachfolger e<strong>in</strong>er Zahl<br />
<br />
(4) Jede Zahl ist Nachfolger höchstens e<strong>in</strong>er Zahl<br />
<br />
(5) E<strong>in</strong>e Menge M von natürlichen Zahlen, <strong>die</strong> 0<br />
enthält und mit jeder Zahl auch ihren<br />
Nachfolger, ist mit N identisch.<br />
(PEANO - Axiome)<br />
25<br />
26<br />
P. Forbrig PT - E<strong>in</strong>führung und Überblick<br />
2.1 Primitiv rekursive Funktionen<br />
P. Forbrig PT - E<strong>in</strong>führung und Überblick<br />
2.1 Primitiv rekursive Funktionen<br />
▲ Es seien <strong>die</strong> Abbildungen f(n-stellig) und g(n+2-stellig)<br />
gegeben:<br />
!<br />
f : N n " N<br />
#<br />
g : N n + 2 $ N mit n ∈ N<br />
▲ E<strong>in</strong>e Funktion h heißt durch primitive Rekursion aus f und<br />
g def<strong>in</strong>iert, falls gilt:<br />
%<br />
h : N n+1 & N<br />
so daß ∀x 1 , ... , x n , y ∈ N gilt:<br />
h(x<br />
'<br />
1 , ... , x n ,0) = f(x 1 , ... , x n )<br />
h(x<br />
(<br />
1<br />
, ... , x n<br />
,y+1) = g(x 1<br />
, ... , x n<br />
, y, h(x 1<br />
, ..., x n<br />
,y) )<br />
(A) Die Ausgangsfunktionen gehören zu <strong>die</strong>ser Klasse:<br />
Das s<strong>in</strong>d:<br />
(1) Konstante Funktionen C S c ∈ Prim(N) (0 ≤ s, c ∈ N)<br />
C S c (x 1 , ... , x s ) = c<br />
(2) Nachfolgerfunktion: succ(n) = n+1 ∈ Prim(N) n ∈N<br />
(3) Argumentauswahlfunktionen I s δ ∈ Prim(N) (1 ≤ δ ≤ s)<br />
I s δ (x 1 , ... , x s ) = x δ<br />
(B) Die Erzeugungsfunktionen:<br />
(1) Verkettung: Gegeben: g m ,h n 1, ... ,h n m ∈ Prim(N)<br />
Dann ist auch f n ∈ Prim(N) mit :<br />
f(x 1 , ... , x n ) = g(h 1 (x 1 , ... , x n ) , ... , h m (x 1 , ... , x n ) )<br />
(2) Alle mittels Schema der primitiven Rekursion<br />
erzeugten Funktionen gehören zu <strong>die</strong>ser Klasse.<br />
27<br />
28<br />
P. Forbrig PT - E<strong>in</strong>führung und Überblick<br />
2.1 Primitiv rekursive Funktionen<br />
▲ ACKERMANN-Funktion e<strong>in</strong>e arithmetische Funktion,<br />
<strong>die</strong> total und berechenbar, aber nicht primitiv rekursiv<br />
ist.)<br />
ack(0, y) = y + 1<br />
*<br />
+<br />
ack(n+1, 0) = ack(n, 1)<br />
ack(n+1, y+1) = ack(n, ack(n+1,y) )<br />
P. Forbrig PT - E<strong>in</strong>führung und Überblick<br />
2.2 Terme<br />
E<strong>in</strong> Operationsalphabet (auch Signatur) ist e<strong>in</strong> Paar ( ∑; ar)<br />
mit :<br />
- ∑ ist e<strong>in</strong> Alphabet ∑ = { F 1<br />
, ... , F m<br />
}<br />
- ar ist e<strong>in</strong>e Abbildung ar: ∑ , N<br />
{ar(F) heißt Stelligkeit (Arität) von F}<br />
n / y 0 1 2 3 4 5<br />
0 1 2 3 4 5 6<br />
1 2 3 4 5 6 7<br />
2 3 5 7 9 11 13<br />
3 5 13 29 61 125 253<br />
4 13 ...<br />
29<br />
Die Menge der n-stelligen Operationssymbole ∑ (n)<br />
wird def<strong>in</strong>iert durch:<br />
∑ (n) = {F ∈∑ (n) | ar(F) = n }<br />
für n ∈ N<br />
statt F ∈ ∑ (n) wird auch F (n) ∈ ∑ geschrieben.<br />
30
P. Forbrig PT - E<strong>in</strong>führung und Überblick<br />
2.2 Terme<br />
Gegeben seien e<strong>in</strong> Operationsalphabet (∑ ; ar) und e<strong>in</strong>e Menge<br />
X, deren Elemente Variablen heißen. Dann ist <strong>die</strong> Menge<br />
T ∑<br />
(X) der ∑ - Terme über X <strong>die</strong> kle<strong>in</strong>ste Teilmenge von<br />
(∑ ∪ X) * mit :<br />
1. x ∈ X - - > x ∈ T ∑<br />
(X) , Variablen s<strong>in</strong>d Terme<br />
2. t 1 , ... , t n ∈ T ∑<br />
(X) & F ∈∑(n) - - > Ft 1 ... t n ∈ T ∑<br />
(X)<br />
Ft 1 ... t n wird auch notiert als F(t 1 , ... , t n )<br />
P. Forbrig PT - E<strong>in</strong>führung und Überblick<br />
2.2 Terme<br />
Jeder Term t ∈ T<br />
-<br />
∑<br />
(X) ist entweder atomar,<br />
d.h. t = x ∈X oder t ∈∑ (0)<br />
zusammengesetzt,<br />
t = Ft 1 ... t n mit n ≥ 1.<br />
Bei zusammengesetzten Termen s<strong>in</strong>d<br />
.<br />
F, n und t 1 , ... , t n e<strong>in</strong>deutig bestimmt.<br />
==> Klammerung nicht notwendig.<br />
oder<br />
d.h.<br />
31<br />
32<br />
P. Forbrig PT - E<strong>in</strong>führung und Überblick<br />
2.2 Terme<br />
▲ In üblicher Weise formulierter Term : (3*a-7)*(4+b)<br />
▲ In Polnischer Notation<br />
: * - * 3 a 7 + 4 b<br />
Das entspricht: *(-(*(3, a), 7), +(4, b))<br />
/<br />
▲ In Inverse Polnische Notation : 3 a * 7 - 4 b +<br />
0<br />
*<br />
Das entspricht: (((3, a)*, 7)-, (4, b)+)*<br />
▲ Terme lassen sich grafisch veranschaulichen:<br />
*<br />
P. Forbrig PT - E<strong>in</strong>führung und Überblick<br />
2.2 Terme<br />
(B) Erzeugungsfunktion<br />
(3):Sei F e<strong>in</strong>e n+1-stellige primitiv rekursive Funktion<br />
und es gelte<br />
∀ x 1 , ... , x n (∃y 1 F(x 1 , ... ,x n , y) = 0)<br />
Dann wird e<strong>in</strong>e neue partiell rekursive Funktion<br />
festgelegt:<br />
G(x 1 , ... , x n ) = µ y (F(x 1 , ... , x n , y) = 0)<br />
= Kle<strong>in</strong>stes y mit F(x 1 , ... , x n , y) = 0<br />
- +<br />
* 7 4 b<br />
3 a<br />
Klasse der partiell rekursiven Funktionen wird durch<br />
A (1) ... (3) und B (1) ... (3) gebildet<br />
33<br />
34<br />
P. Forbrig PT - E<strong>in</strong>führung und Überblick<br />
2.2 Terme<br />
1 Alles was berechenbar ist, läßt sich durch partiell rekursive<br />
Funktionen berechnen.<br />
2 <strong>in</strong>tuitiver Algorithmenbegriff beschreibt e<strong>in</strong>e Klasse von<br />
Algorithmen, <strong>die</strong> genau <strong>die</strong> Klasse der partiell rekursiven<br />
Funktionen realisieren kann.<br />
3 Die Klasse der Partiell rekursiven Funktionen stellt e<strong>in</strong>e<br />
Präzisierung des Algorithmenbegriffes dar.<br />
4 E<strong>in</strong>e weitere Präzisierung des Algorithmenbegriffes ist <strong>die</strong><br />
TURING-Masch<strong>in</strong>e.<br />
P. Forbrig PT - E<strong>in</strong>führung und Überblick<br />
3 Programmentwicklung<br />
Anforderung<br />
meist verbale<br />
Beschreibung<br />
Sezifikation<br />
oft verbal,<br />
sollte formal se<strong>in</strong><br />
Entwurf<br />
Struktogramme,<br />
oder ähnliches<br />
Implementation<br />
Programm<br />
Test<br />
Festlegen der<br />
Eigenschaften<br />
des Programms<br />
Formale Beschreibung<br />
der Programmeigenschaften<br />
Erstellung e<strong>in</strong>es<br />
Algorithmus,<br />
Datenstrukturierung<br />
Co<strong>die</strong>rung des<br />
Algorithmus <strong>in</strong> e<strong>in</strong>er<br />
Programmiersprache<br />
Soll - Ist -Vergleich<br />
Fehlerbehebung<br />
Nutzung/Wartung<br />
Fehlerbeseitigung,<br />
Anpassung<br />
35<br />
36
P. Forbrig PT - E<strong>in</strong>führung und Überblick<br />
P. Forbrig PT - E<strong>in</strong>führung und Überblick<br />
3 Programmentwicklung<br />
Ziel: E<strong>in</strong> Programm mit folgenden Eigenschaften:<br />
korrekt Übere<strong>in</strong>stimmung zwischen Spezifikation,<br />
Programm und Dokumentation<br />
flexibel wartungsfreundlich, nachnutzbar <strong>in</strong><br />
ähnlichen Umgeben, anpaßbar an andere<br />
ähnliche Aufgaben<br />
verständlichnutzerverständlich, entwicklerverständlich<br />
stabil stabil gegenüber E<strong>in</strong>gabe-, Be<strong>die</strong>nungs-,<br />
Hardwarefehlern<br />
effizient rechentechnisch effizient, nutzereffizient<br />
robust gegen Fehlbe<strong>die</strong>nung geschützt<br />
3 Programmentwicklung<br />
Beispiel:<br />
Für mehrere ISB-Nummern-Fragmente ist <strong>die</strong> jeweilige Prüfziffer zu<br />
berechnen und <strong>die</strong> komplette ISB-Nummer auszugeben. Die<br />
Prüfziffer berechnet sich aus dem Rest, den <strong>die</strong> Summe aller ISB-<br />
Ziffern multipliziert mit ihrer Position bei der Division durch 11<br />
läßt.<br />
Abstraktion:<br />
Was ist e<strong>in</strong>e ISB-Nummer <br />
Folge von 10 Ziffern <strong>in</strong> vier Gruppen: 1-234-56789-p<br />
Was ist <strong>die</strong> Prüfziffer <br />
Die letzte Ziffer p: p ∈ { 0 ... 9, X }<br />
Was ist e<strong>in</strong> ISB-Nummern-Fragment <br />
ISB-Nummer ohne Prüfziffer - wird vorgegeben.<br />
Was heißt "mehrere" <br />
Folge von ISB-Nummern-Fragmenten<br />
37<br />
38<br />
P. Forbrig PT - E<strong>in</strong>führung und Überblick<br />
P. Forbrig PT - E<strong>in</strong>führung und Überblick<br />
3 Programmentwicklung<br />
3 Programmentwicklung<br />
Spezifikation:<br />
A1<br />
Programm: (ISB-Fragmente) * - - - > ISBN*<br />
A2<br />
exakter: Sei s = z 1 - z 2 z 3 z 4 - z 5 z 6 z 7 z 8 z 9 mit 0 = z i = 9<br />
Programm: s* - - -> (s . p) * mit Summe(z<br />
2<br />
i * i ) = p mod 11, i = 1<br />
... 9<br />
ja<br />
A1<br />
B<br />
A2<br />
ne<strong>in</strong><br />
B<br />
A<br />
Wie wird Ende der Folge erkannt<br />
E<strong>in</strong>gabe der Zeichenkette 3 ende 4<br />
5<br />
Programm: s* . 6 ende 7 8 (s . p ) *<br />
C1<br />
A1<br />
C2<br />
B<br />
A2<br />
...<br />
sonst<br />
A<br />
B<br />
A<br />
39<br />
40<br />
P. Forbrig PT - E<strong>in</strong>führung und Überblick<br />
P. Forbrig PT - E<strong>in</strong>führung und Überblick<br />
3 Programmentwicklung<br />
3 Programmentwicklung<br />
E<strong>in</strong>gabe_ISB_Fragment(ISBF,ende)<br />
NOT ende<br />
Berechne_Summe(ISBF,Summe)<br />
Berechne_Pruefziffer(Summe, Pruefz)<br />
Verknuepfe (ISBF,Pfuefz, ISBF)<br />
Ausgabe_ISBN(ISBN)<br />
E<strong>in</strong>gabe_ISB_Fragment(ISBF,ende)<br />
TYPE<br />
Str<strong>in</strong>g13 = PACKED ARRAY [1. . 13]<br />
OF CHAR; (*STRING[13]*)<br />
VAR<br />
ISBF, ISBN: Str<strong>in</strong>g13;<br />
Summe: INTEGER;<br />
Pruefz: CHAR;<br />
ende: BOLEAN;<br />
41<br />
42
P. Forbrig PT - E<strong>in</strong>führung und Überblick<br />
3 Programmentwicklung<br />
e<strong>in</strong>gabe_ISB_Fragment(VAR ISBF:Str<strong>in</strong>g13; VAR ende: BOOLEAN)<br />
‘ISBN - Fragment [z - zzz - zzzzz] :‘ ><br />
> ISBF<br />
P. Forbrig PT - E<strong>in</strong>führung und Überblick<br />
3 Programmentwicklung<br />
get_<strong>in</strong>t(c:CHAR) : INTEGER<br />
get_<strong>in</strong>t := ORD(c)–ORD(‘0‘)<br />
Berechne_Pruefziffer(Summe: INTEGER; VAR; Pruefz: CHAR)<br />
ende := ISBF = ‘ende‘<br />
result := Summe MOD 11<br />
ja<br />
result = 10<br />
ne<strong>in</strong><br />
▲<br />
Berechne_Summe(ISBF:Str<strong>in</strong>g13; VAR Summe: INTEGER)<br />
Pruefz := ‘X‘<br />
Pruefz := CHR (result + ORD (‘0‘))<br />
<strong>in</strong>dex := 0; Summe := 0<br />
i = 1 . . 9<br />
Verknuepfe(ISBF: Str<strong>in</strong>g13; Pruefz:CHAR;VAR ISBN:Str<strong>in</strong>g13)<br />
ISBN := CONTACT(ISBF,‘-‘,Pruefz)<br />
ja<br />
i = 2 v i = 5<br />
ne<strong>in</strong><br />
oder (implementationsabhäng<strong>in</strong>g):<br />
SBN := ISBF; ISBN[12] := ‘-‘;ISBN[13] := Pruefz<br />
<strong>in</strong>dex := <strong>in</strong>dex + 2<br />
<strong>in</strong>dex := <strong>in</strong>dex + 1<br />
Summe := Summe + get_<strong>in</strong>t (ISBF[<strong>in</strong>dex])<br />
43<br />
Ausgabe_ISBN(ISBN:Str<strong>in</strong>g13)<br />
ISBN<br />
44<br />
P. Forbrig PT - E<strong>in</strong>führung und Überblick<br />
3 Programmentwicklung<br />
PROGRAM ISBN_Berechnung;<br />
(* Berechnung der Pruefziffer fuer e<strong>in</strong>zugebende<br />
ISBN Fragmente und<br />
Ausgabe der vollständigen ISB-Nummer<br />
Bearbeiter: Uwe Laemmel Stand: 17.7.1990<br />
Sektion Informatik<br />
Universität Rostock<br />
Nach Aufforderung koennen ISBN - Fragmente: z-zzz-zzzzz<br />
e<strong>in</strong>gegeben werden. Es wird <strong>die</strong> Pruefziffer berechnet:<br />
Pruefz = (z1*1+z2*2+ ...+z9*9) MOD 11<br />
Wenn Pruefz = 10, dann wird X e<strong>in</strong>gesetzt.<br />
Beendigung der Arbeit mit 'ende '*)<br />
USES CRT;<br />
TYPE Str<strong>in</strong>g13 = STRING [13] ;<br />
VAR ISBF, ISBN: Str<strong>in</strong>g13;<br />
Pruefz: CHAR;<br />
Summe: INTEGER;<br />
ende: BOOLEAN;<br />
45<br />
P. Forbrig PT - E<strong>in</strong>führung und Überblick<br />
3 Programmentwicklung<br />
PROCEDURE e<strong>in</strong>gabe_ISB_Fragment( VAR ISBF:<br />
Str<strong>in</strong>g13;<br />
VAR ende: BOOLEAN);<br />
BEGIN<br />
WRITE(’ISB-Fragment [z-zzz-zzzzz] : ’) ;<br />
READLN(ISBF);<br />
ende: = ISBF = ’;<br />
END (* e<strong>in</strong>gabe_ISB_Fragment *) ;<br />
FUNCTION get_<strong>in</strong>t(c:CHAR): INTEGER;<br />
BEGIN<br />
get_<strong>in</strong>t:= ORD(c) - ORD(’0’) ;<br />
END (* get_<strong>in</strong>t*) ;<br />
46<br />
P. Forbrig PT - E<strong>in</strong>führung und Überblick<br />
3 Programmentwicklung<br />
PROCEDURE Berechne_Summe( ISBF:Str<strong>in</strong>g13;<br />
VAR Summe:<br />
INTEGER);<br />
VAR <strong>in</strong>dex, i: 0..13;<br />
BEGIN<br />
<strong>in</strong>dex:=0; Summe:=0;<br />
FOR i:=1 TO 9 DO<br />
BEGIN<br />
IF (i=2) OR (i=5) THEN <strong>in</strong>dex:=<strong>in</strong>dex+2 ELSE<br />
INC(<strong>in</strong>dex) ;<br />
Summe:=Summe+get_<strong>in</strong>t(ISBF[<strong>in</strong>dex] )* i ;<br />
END;<br />
END (*Berechne_Summe*);<br />
47<br />
P. Forbrig PT - E<strong>in</strong>führung und Überblick<br />
3 Programmentwicklung<br />
PROCEDURE Berechne_Pruefziffer(Summe:INTEGER; VAR<br />
c:CHAR);<br />
VAR rest: 0..10;<br />
BEGIN<br />
rest:= Summe MOD 11;<br />
IF rest=10 THEN c: = ’X ’ ELSE c:<br />
CHR(rest+ORD(’0’)) ;<br />
END (* Berechne_Pruefziffer *);<br />
PROCEDURE Verknuepfe(ISBF:Str<strong>in</strong>g13;c: CHAR; VAR<br />
ISBN:Str<strong>in</strong>g13);<br />
BEGIN<br />
ISBN:= CONCAT(ISBF, ’-’, c) ;<br />
END (* Verknuepfe *);<br />
PROCEDURE Ausgabe_ISBN(ISBN:Str<strong>in</strong>g13) ;<br />
BEGIN<br />
WRITELN(ISBN: 20) ;<br />
48
P. Forbrig PT - E<strong>in</strong>führung und Überblick<br />
P. Forbrig PT - E<strong>in</strong>führung und Überblick<br />
BEGIN (*MAIN*)<br />
ClrScr;<br />
WRITELN('Berechnung von Prüfziffern für ISB-<br />
Nummern': 60) ;<br />
WRITELN(' ENDE der Arbeit : ende ' : 50 ) ;<br />
WRITELN('= = = = = = = = = = = = = = = = = =<br />
= = = =': 61);<br />
WRITELN;<br />
E<strong>in</strong>gabe_ISB_Fragment(ISBF, ende);<br />
WHILE NOT ende DO<br />
BEGIN<br />
Berechne_Summe(ISBF, Summe);<br />
Berechne_Pruefziffer(Summe, Pruefz);<br />
Verknuepfe(ISBF, Pruefz, ISBN);<br />
Ausgabe_ISBN(ISBN);<br />
E<strong>in</strong>gabe_ISB_Fragment(ISBF, ende);<br />
END;<br />
WRITELN('* * * * Ende der Berechnungen * * *<br />
49<br />
3 Programmentwicklung<br />
Testen<br />
E<strong>in</strong>gabe:<br />
Ausgabe:<br />
0-000-00000 0-000-00000-0<br />
1-111-11111 1-111-11111-1<br />
8-211-11111 8-211-11111-X<br />
9-999-99999 9-999-99999-9<br />
ende<br />
Ende der Berechnung<br />
H<strong>in</strong>weis<br />
Für korrekte E<strong>in</strong>gabedaten sche<strong>in</strong>t das Programm korrekt zu arbeiten.<br />
Was passiert bei fehlerhaften E<strong>in</strong>gabedaten (z.B. 1-1aa-bbbbbb) <br />
Dafür ist nichts spezifiziert worden !!<br />
Im konkreten Fall wird Uns<strong>in</strong>n berechnet. Es erfolgt ke<strong>in</strong>e Fehlermeldung !<br />
Das Programm ist stabil aber nicht nutzerfreundlich !<br />
Der Quelltext enthält zu wenig Kommentare !<br />
50