20.01.2015 Aufrufe

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 ...

MEHR ANZEIGEN
WENIGER ANZEIGEN

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

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!