Einführung in die Programierung - ETH Zse.inf.ethz.ch/courses/2010b_fall/eprog/lectures/08... ·...

91
Chair of Software Engineering Einführung in die Programierung Prof. Dr. Bertrand Meyer Lektion 8: Kontrollstrukturen I

Transcript of Einführung in die Programierung - ETH Zse.inf.ethz.ch/courses/2010b_fall/eprog/lectures/08... ·...

Page 1: Einführung in die Programierung - ETH Zse.inf.ethz.ch/courses/2010b_fall/eprog/lectures/08... · 2011. 2. 25. · 2 In dieser (Doppel-) Lektion Der Begriff des Algorithmus Grundlegende

Chair of Software Engineering

Einführung in die Programierung

Prof. Dr. Bertrand Meyer

Lektion 8: Kontrollstrukturen I

Page 2: Einführung in die Programierung - ETH Zse.inf.ethz.ch/courses/2010b_fall/eprog/lectures/08... · 2011. 2. 25. · 2 In dieser (Doppel-) Lektion Der Begriff des Algorithmus Grundlegende

2

In dieser (Doppel-) Lektion

Der Begriff des Algorithmus

Grundlegende Kontrollstrukturen: Sequenz (sequence, compound), Konditional (conditional), Schleife (loop)

Bedingungsinstruktionen: Der Konditional und seine Variante

Operationen wiederholen: Die Schleife

Schleifen als Annäherungsstrategie: Die Schleifeninvariante

Was braucht es, um sicherzustellen, dass eine Schleife terminiert?

Ein Blick auf das allgemeine Problem der Programmterminierung

Kontrollstrukturen auf einer tieferen Ebene: “Goto” und Flowcharts; siehe Argument für die „Kontrollstrukturen der strukturierten Programmierung“

Das Entscheidungsproblem

Bitte lesen Sie Kapitel 8 von „Touch of Class“

Page 3: Einführung in die Programierung - ETH Zse.inf.ethz.ch/courses/2010b_fall/eprog/lectures/08... · 2011. 2. 25. · 2 In dieser (Doppel-) Lektion Der Begriff des Algorithmus Grundlegende

3

Der Begriff des Algorithmus

Allgemeine Definition:

Ein Algorithmus ist die Spezifikation eines Prozesses, der von einem Computer ausgeführt wird.

Page 4: Einführung in die Programierung - ETH Zse.inf.ethz.ch/courses/2010b_fall/eprog/lectures/08... · 2011. 2. 25. · 2 In dieser (Doppel-) Lektion Der Begriff des Algorithmus Grundlegende

4

Nicht wirklich ein Algorithmus

Page 5: Einführung in die Programierung - ETH Zse.inf.ethz.ch/courses/2010b_fall/eprog/lectures/08... · 2011. 2. 25. · 2 In dieser (Doppel-) Lektion Der Begriff des Algorithmus Grundlegende

5

5 Eigenschaften eines Algorithmus

1. Definiert die Daten, auf die der Prozess angewandt wird.

2. Jeder elementare Schritt wird aus einer Menge von genau definierten Aktionen ausgewählt.

3. Beschreibt die Reihenfolge der Ausführung dieser Schritte.

4. Eigenschaften 2 und 3 basieren auf genau festgelegten, für ein automatisches Gerät geeignete Konventionen

5. Er terminiert für alle Daten garantiert nach endlich vielen Schritten.

Page 6: Einführung in die Programierung - ETH Zse.inf.ethz.ch/courses/2010b_fall/eprog/lectures/08... · 2011. 2. 25. · 2 In dieser (Doppel-) Lektion Der Begriff des Algorithmus Grundlegende

6

Algorithmus vs Programm

“Algorithmus” bezeichnet allgemein einen abstrakteren Begriff, unabhängig von der Plattform, der Programmiersprache, etc.

In der Praxis ist der Unterschied jedoch eher geringer: Algorithmen brauchen eine präzise Notation Programmiersprachen werden immer abstrakter

Aber: In Programmen sind Daten (-objekte) genauso wichtig

wie Algorithmen Ein Programm beinhaltet typischerweise viele

Algorithmen und Objektstrukturen

Page 7: Einführung in die Programierung - ETH Zse.inf.ethz.ch/courses/2010b_fall/eprog/lectures/08... · 2011. 2. 25. · 2 In dieser (Doppel-) Lektion Der Begriff des Algorithmus Grundlegende

7

Aus was ein Algorithmus besteht

Grundlegende Schritte:

Featureaufruf x.f (a )

Zuweisung

...

Abfolge dieser grundlegenden Schritte:

KONTROLLSTRUKTUREN

(Eigentlich nichtviel mehr…)

Page 8: Einführung in die Programierung - ETH Zse.inf.ethz.ch/courses/2010b_fall/eprog/lectures/08... · 2011. 2. 25. · 2 In dieser (Doppel-) Lektion Der Begriff des Algorithmus Grundlegende

8

“Kontrollstrukturen des strukturierten Programmierens”

Kontrollstrukturen

Definition: Ein Programmkonstrukt, welches den Ablauf von Programmschritten beschreibt.

Drei fundamentale Kontrollstrukturen:

Sequenz

Schleife

Konditional

Diese sind die

Page 9: Einführung in die Programierung - ETH Zse.inf.ethz.ch/courses/2010b_fall/eprog/lectures/08... · 2011. 2. 25. · 2 In dieser (Doppel-) Lektion Der Begriff des Algorithmus Grundlegende

9

Kontrollstrukturen als Techniken für die Problemlösung

Sequenz: “Um von C aus A zu erreichen, erreiche zuerst das Zwischenziel B von A aus, und dann C von Bausgehend.“

Schleife: „Löse das Problem mithilfe von aufeinanderfolgenden Annäherungen der Input-Menge.“

Conditional: „Löse das Problem separat für zwei oder mehrere Teilmengen der Input-Menge.“

Page 10: Einführung in die Programierung - ETH Zse.inf.ethz.ch/courses/2010b_fall/eprog/lectures/08... · 2011. 2. 25. · 2 In dieser (Doppel-) Lektion Der Begriff des Algorithmus Grundlegende

10

Die Sequenz (auch: Verbund (Compound ) )

instruction 1

instruction 2

...

instruction n

Page 11: Einführung in die Programierung - ETH Zse.inf.ethz.ch/courses/2010b_fall/eprog/lectures/08... · 2011. 2. 25. · 2 In dieser (Doppel-) Lektion Der Begriff des Algorithmus Grundlegende

11

Das Semikolon als optionale Trennung

instruction 1 ;

instruction 2 ;

... ;

instruction n

Page 12: Einführung in die Programierung - ETH Zse.inf.ethz.ch/courses/2010b_fall/eprog/lectures/08... · 2011. 2. 25. · 2 In dieser (Doppel-) Lektion Der Begriff des Algorithmus Grundlegende

12

Korrektheit eines Verbunds

Die Vorbedingung von instruction 1 muss zu Beginn erfüllt sein.

Die Nachbedingung von instruction i muss die Vorbedingung von instruction i + 1

implizieren.

Das Schlussresultat ist die Nachbedingung von instruction n

instruction 1

instruction 2

...

instruction i...

instruction n

{P1} {Q1}

{P2} {Q2}

{Pi } {Qi }

{Pn } {Qn }

Page 13: Einführung in die Programierung - ETH Zse.inf.ethz.ch/courses/2010b_fall/eprog/lectures/08... · 2011. 2. 25. · 2 In dieser (Doppel-) Lektion Der Begriff des Algorithmus Grundlegende

13

Konditional (Bedingte Aufweisung)

if

Bedingung

then

Instruktionen

else

Andere_instruktionen

end

-- Boole‟scher Ausdruck

-- Verbund

-- Verbund

Page 14: Einführung in die Programierung - ETH Zse.inf.ethz.ch/courses/2010b_fall/eprog/lectures/08... · 2011. 2. 25. · 2 In dieser (Doppel-) Lektion Der Begriff des Algorithmus Grundlegende

14

Das Maximum von zwei Zahlen ermitteln

if

a > b

then

max := a

else

max := b

end

Page 15: Einführung in die Programierung - ETH Zse.inf.ethz.ch/courses/2010b_fall/eprog/lectures/08... · 2011. 2. 25. · 2 In dieser (Doppel-) Lektion Der Begriff des Algorithmus Grundlegende

15

Als Feature (Abfrage)

greater (a, b : INTEGER): INTEGER

-- Das Maximum von a und b.do

end

ifa > b

thenResult := a

elseResult := b

end

Page 16: Einführung in die Programierung - ETH Zse.inf.ethz.ch/courses/2010b_fall/eprog/lectures/08... · 2011. 2. 25. · 2 In dieser (Doppel-) Lektion Der Begriff des Algorithmus Grundlegende

16

Typischer Aufrufe

i, j, k, m, n: INTEGER

m := max (25, 32)

n := max (i + j, k)

Page 17: Einführung in die Programierung - ETH Zse.inf.ethz.ch/courses/2010b_fall/eprog/lectures/08... · 2011. 2. 25. · 2 In dieser (Doppel-) Lektion Der Begriff des Algorithmus Grundlegende

17

Der Konditional als Technik zur Problemlösung

Region 1

Region 2

PROBLEMRAUM

Benutze Technik 1

Benutze Technik 2

Page 18: Einführung in die Programierung - ETH Zse.inf.ethz.ch/courses/2010b_fall/eprog/lectures/08... · 2011. 2. 25. · 2 In dieser (Doppel-) Lektion Der Begriff des Algorithmus Grundlegende

18

Grundform

if Bedingung then

Instruktionen

else

Other_instructions

end

Page 19: Einführung in die Programierung - ETH Zse.inf.ethz.ch/courses/2010b_fall/eprog/lectures/08... · 2011. 2. 25. · 2 In dieser (Doppel-) Lektion Der Begriff des Algorithmus Grundlegende

19

Eine Variante des Konditionals

if Bedingung thenInstruktionen

end

Page 20: Einführung in die Programierung - ETH Zse.inf.ethz.ch/courses/2010b_fall/eprog/lectures/08... · 2011. 2. 25. · 2 In dieser (Doppel-) Lektion Der Begriff des Algorithmus Grundlegende

20

Ist semantisch äquivalent zu

if Bedingung thenInstruktionen

else

end

Eine Variante des Konditionals

if Bedingung thenInstruktionen

end

Leere Klausel

Page 21: Einführung in die Programierung - ETH Zse.inf.ethz.ch/courses/2010b_fall/eprog/lectures/08... · 2011. 2. 25. · 2 In dieser (Doppel-) Lektion Der Begriff des Algorithmus Grundlegende

21

Verschachtelung von bedingten Instruktionen

if Condition1 thenInstruktionen 1

else

end

if Condition2 then

Instruktionen 2

else

end

if Condition3 then

Instruktionen 3

else

end

...

if Condition4 thenInstruktionen 4

else

end

Page 22: Einführung in die Programierung - ETH Zse.inf.ethz.ch/courses/2010b_fall/eprog/lectures/08... · 2011. 2. 25. · 2 In dieser (Doppel-) Lektion Der Begriff des Algorithmus Grundlegende

22

Eine verschachtelte Struktur

Page 23: Einführung in die Programierung - ETH Zse.inf.ethz.ch/courses/2010b_fall/eprog/lectures/08... · 2011. 2. 25. · 2 In dieser (Doppel-) Lektion Der Begriff des Algorithmus Grundlegende

23

Eine Kamm-ähnliche Struktur

Page 24: Einführung in die Programierung - ETH Zse.inf.ethz.ch/courses/2010b_fall/eprog/lectures/08... · 2011. 2. 25. · 2 In dieser (Doppel-) Lektion Der Begriff des Algorithmus Grundlegende

24

Kamm-ähnlicher Konditional

if Condition1 thenInstruktionen 1

elseif Bedingung 2 thenInstruktionen 2

elseif Condition3 thenInstruktionen 3

elseif

...else

Instruktionen 0

end

Page 25: Einführung in die Programierung - ETH Zse.inf.ethz.ch/courses/2010b_fall/eprog/lectures/08... · 2011. 2. 25. · 2 In dieser (Doppel-) Lektion Der Begriff des Algorithmus Grundlegende

25

Eine Kamm-ähnliche Struktur

Page 26: Einführung in die Programierung - ETH Zse.inf.ethz.ch/courses/2010b_fall/eprog/lectures/08... · 2011. 2. 25. · 2 In dieser (Doppel-) Lektion Der Begriff des Algorithmus Grundlegende

26

Weitere Themen zu Kontrollstrukturen

Schleifen und ihre Invarianten

Was braucht es, um sicherzustellen, dass eine Schleife terminiert?

Ein Blick auf das allgemeine Problem der Schleifen- und Programmterminierung

Kontrollstrukturen auf einer tieferen Ebene: “Goto” und Flowcharts; siehe Argument für die „Kontrollstrukturen der strukturierten Programmierung“

Die Unentscheidbarkeit des Entscheidungsproblems beweisen

Page 27: Einführung in die Programierung - ETH Zse.inf.ethz.ch/courses/2010b_fall/eprog/lectures/08... · 2011. 2. 25. · 2 In dieser (Doppel-) Lektion Der Begriff des Algorithmus Grundlegende

27

Die Schleife

from

Initialization -- Verbund

variant

Variant_expression -- Integer expression

invariant

Invariant_expression -- Bedingung

until

Exit_condition -- Boole„scher Ausdruck

loop

Body -- Verbund

end

Page 28: Einführung in die Programierung - ETH Zse.inf.ethz.ch/courses/2010b_fall/eprog/lectures/08... · 2011. 2. 25. · 2 In dieser (Doppel-) Lektion Der Begriff des Algorithmus Grundlegende

28

Die volle Form der Schleife

from

Initialization -- Verbund

invariant

Invariant_expression -- Boole„scher Ausdruck

variant

Variant_expression -- Integer-Ausdruck

until

Exit_condition -- Boole„scher Ausdruck

loop

Body -- Verbund (Schleifenrumpf)

end

Page 29: Einführung in die Programierung - ETH Zse.inf.ethz.ch/courses/2010b_fall/eprog/lectures/08... · 2011. 2. 25. · 2 In dieser (Doppel-) Lektion Der Begriff des Algorithmus Grundlegende

29

Eine andere Schleifensyntax

Page 30: Einführung in die Programierung - ETH Zse.inf.ethz.ch/courses/2010b_fall/eprog/lectures/08... · 2011. 2. 25. · 2 In dieser (Doppel-) Lektion Der Begriff des Algorithmus Grundlegende

30

Die volle Form der Schleife

from

Initialization -- Verbund

invariant

Invariant_expression -- Boole„scher Ausdruck

variant

Variant_expression -- Integer-Ausdruck

until

Exit_condition -- Boole„scher Ausdruck

loop

Body -- Verbund

end

Page 31: Einführung in die Programierung - ETH Zse.inf.ethz.ch/courses/2010b_fall/eprog/lectures/08... · 2011. 2. 25. · 2 In dieser (Doppel-) Lektion Der Begriff des Algorithmus Grundlegende

31

Über Stationen einer Linie iterieren („loopen“)

fromfancy start

untilfancy after

loop

-- “Tu was mit fancyitem”fancy forth

end

Bis jetzt: fancy_lineIm Buch: Line8

Page 32: Einführung in die Programierung - ETH Zse.inf.ethz.ch/courses/2010b_fall/eprog/lectures/08... · 2011. 2. 25. · 2 In dieser (Doppel-) Lektion Der Begriff des Algorithmus Grundlegende

32

Auf eine Liste anwendbare Operationen

item

before after

count

forthback

index

start

Befehle

(boole‟sche) Abfragen

1

Der Zeiger(cursor)

Page 33: Einführung in die Programierung - ETH Zse.inf.ethz.ch/courses/2010b_fall/eprog/lectures/08... · 2011. 2. 25. · 2 In dieser (Doppel-) Lektion Der Begriff des Algorithmus Grundlegende

33

Auf eine Liste anwendbare Operationen

item

before after

count

forth

index

start

(Der Zeiger)

1

Page 34: Einführung in die Programierung - ETH Zse.inf.ethz.ch/courses/2010b_fall/eprog/lectures/08... · 2011. 2. 25. · 2 In dieser (Doppel-) Lektion Der Begriff des Algorithmus Grundlegende

34

Über Stationen einer Linie iterieren („loopen“)

fromfancy start

untilfancy after

loop

-- “Tu was mit fancy.item”

fancy forthend

Page 35: Einführung in die Programierung - ETH Zse.inf.ethz.ch/courses/2010b_fall/eprog/lectures/08... · 2011. 2. 25. · 2 In dieser (Doppel-) Lektion Der Begriff des Algorithmus Grundlegende

35

fromfancy start

untilfancy after

loop

-- Den Namen der aktuellen Station anzeigen:

Console.show (fancy.item)

fancy.forth

end

Die Stationsnamen anzeigen

Page 36: Einführung in die Programierung - ETH Zse.inf.ethz.ch/courses/2010b_fall/eprog/lectures/08... · 2011. 2. 25. · 2 In dieser (Doppel-) Lektion Der Begriff des Algorithmus Grundlegende

36

Ein anderes Beispiel (von „Example 7“)

from

Line8 start

invariant … variant … until Line8.after loop

if Line8 itemis_railway_connection then

show_big_red_spot (Line8 item location)

elseif Line8 item is_exchange then

show_blinking_spot (Line8 item location)

else

show_spot (Line8 item location)

end

Line8.forth

end

Page 37: Einführung in die Programierung - ETH Zse.inf.ethz.ch/courses/2010b_fall/eprog/lectures/08... · 2011. 2. 25. · 2 In dieser (Doppel-) Lektion Der Begriff des Algorithmus Grundlegende

37

Das „Maximum“ der Stationsnamen berechnen

fromfancy start ; Result := ""

until

fancy.after

loopResult := greater (Result, fancy item name)

fancy forthend

Page 38: Einführung in die Programierung - ETH Zse.inf.ethz.ch/courses/2010b_fall/eprog/lectures/08... · 2011. 2. 25. · 2 In dieser (Doppel-) Lektion Der Begriff des Algorithmus Grundlegende

38

Das „Maximum“ der Stationsnamen berechnen

fromfancy start ; Result := " "

untilfancy after

loopResult := greater (Result, fancy item name)

fancy.forth

end

Das (alphabetische) Maximum zweierZeichenketten berechnen, z.B.

greater ("ABC ", "AD ") = "AD"

Page 39: Einführung in die Programierung - ETH Zse.inf.ethz.ch/courses/2010b_fall/eprog/lectures/08... · 2011. 2. 25. · 2 In dieser (Doppel-) Lektion Der Begriff des Algorithmus Grundlegende

39

„Maximum“ zweier Zeichenketten

greater (a, b : STRING ): STRING

-- Das Maximum von a und b.do

end

ifa > b

thenResult := a

elseResult := b

end

Page 40: Einführung in die Programierung - ETH Zse.inf.ethz.ch/courses/2010b_fall/eprog/lectures/08... · 2011. 2. 25. · 2 In dieser (Doppel-) Lektion Der Begriff des Algorithmus Grundlegende

40

highest_name: STRING -- Alphabetisch grösste Stationsname der Linie

do

from

fancy.start ; Result := ""

until

fancy.after

loopResult := greater (Result, fancy.item.name)

fancy.forthend

end

In einer Feature

Page 41: Einführung in die Programierung - ETH Zse.inf.ethz.ch/courses/2010b_fall/eprog/lectures/08... · 2011. 2. 25. · 2 In dieser (Doppel-) Lektion Der Begriff des Algorithmus Grundlegende

41

Schleifenformen (in verschiedenen Sprachen)

from -- EiffelInstruktionen

untilBedingung

loopInstruktionen

end

while Bedingung do

Instruktionenend

repeat

Instruktionenuntil

Bedingungend

for i : a..b do

Instruktionenend

for (Instruktion; Bedingung; Instruktion) do

Instruktionenend

Page 42: Einführung in die Programierung - ETH Zse.inf.ethz.ch/courses/2010b_fall/eprog/lectures/08... · 2011. 2. 25. · 2 In dieser (Doppel-) Lektion Der Begriff des Algorithmus Grundlegende

42

Listen mit internem Zeiger

item

before after

countindex

start

1

Der Zeiger (Nur ein abstraktes Konzept!)

Page 43: Einführung in die Programierung - ETH Zse.inf.ethz.ch/courses/2010b_fall/eprog/lectures/08... · 2011. 2. 25. · 2 In dieser (Doppel-) Lektion Der Begriff des Algorithmus Grundlegende

43

Externe Zeiger sind auch möglich

“AA”

before after

countindex

start

1

Der Zeiger

(Ein aktuelles Objekt)“AA”

3

3

count6

item

“FF”

5

“FF”

5

6

Ein anderen Zeiger (auf dieselbe Liste)

Page 44: Einführung in die Programierung - ETH Zse.inf.ethz.ch/courses/2010b_fall/eprog/lectures/08... · 2011. 2. 25. · 2 In dieser (Doppel-) Lektion Der Begriff des Algorithmus Grundlegende

44

Mit einem externem Zeiger programmieren

c : LINKED_LIST_CURSOR

create c.make (fancy)

from

c.start ; Result := ""

until

c.after

loopResult := greater (Result, c.item.name)c.forth

end

Wie vorher, mit cstatt fancy

Page 45: Einführung in die Programierung - ETH Zse.inf.ethz.ch/courses/2010b_fall/eprog/lectures/08... · 2011. 2. 25. · 2 In dieser (Doppel-) Lektion Der Begriff des Algorithmus Grundlegende

45

Eine andere Eiffel Schleifenform

Diese Notation is eine Abkürzung für

across meine_liste as c loop

“Operation auf citem”

end

from cstart until cafter loop

“Operation auf c.item”

cforth

end

Page 46: Einführung in die Programierung - ETH Zse.inf.ethz.ch/courses/2010b_fall/eprog/lectures/08... · 2011. 2. 25. · 2 In dieser (Doppel-) Lektion Der Begriff des Algorithmus Grundlegende

46

Schleifen als Annäherungsstrategie

name 1 name 2 name i name n

Result = name 1

Result = Max (names 1 2)

Result = Max (names 1 i )

Result = Max (names 1 n )

= Max (names 1 1) i := i + 1Result := greater

(Result , fancy.item.name)

Schleifenrumpf:

....

..

..

Teil

Page 47: Einführung in die Programierung - ETH Zse.inf.ethz.ch/courses/2010b_fall/eprog/lectures/08... · 2011. 2. 25. · 2 In dieser (Doppel-) Lektion Der Begriff des Algorithmus Grundlegende

47

highest_name : STRING-- Alphabetisch grösste Stationsname der Linie

dofrom

fancy.start ; Result := ""until

fancy.afterloop

Result := greater (Result, fancy.item.name)

fancy.forthend

ensureResult /= Void and then not Result.empty

-- Result ist der Alphabetisch grösste Stationsname

-- der Linie

end

Nachbedingung?

Page 48: Einführung in die Programierung - ETH Zse.inf.ethz.ch/courses/2010b_fall/eprog/lectures/08... · 2011. 2. 25. · 2 In dieser (Doppel-) Lektion Der Begriff des Algorithmus Grundlegende

48

Das „Maximum“ der Stationsnamen berechnen

from

fancy.start ; Result := ""

until

fancy.afterloop

Result := greater (Result, fancy.item.name)

fancy.forthensure

-- Result ist der Alphabetisch grösste Stationsname der Linie

end

Page 49: Einführung in die Programierung - ETH Zse.inf.ethz.ch/courses/2010b_fall/eprog/lectures/08... · 2011. 2. 25. · 2 In dieser (Doppel-) Lektion Der Begriff des Algorithmus Grundlegende

49

from

fancy.start ; Result := ""invariant

fancy.index >= 1

fancy.index <= fancy.count-- Result ist der alphabetisch grösste Name aller-- bisherigen Stationen

until

fancy.afterloop

Result := greater (Result, fancy.item.name)

fancy.forthensure

-- Result ist der alphabetisch grösste Stationsnameend

Die Schleifeninvariante

+ 1

Fehlt etwas?

Page 50: Einführung in die Programierung - ETH Zse.inf.ethz.ch/courses/2010b_fall/eprog/lectures/08... · 2011. 2. 25. · 2 In dieser (Doppel-) Lektion Der Begriff des Algorithmus Grundlegende

50

Schleifen als Annäherungsstrategie

name 1 name 2 name i name n

Result = name 1

Result = Max (names 1 2)

Result = Max (names 1 i )

Result = Max (names 1 n )

= Max (names 1 1) i := i + 1Result := greater

(Result , fancy.item.name)

Schleifeninvariante

Schleifenrumpf:..

..

..

..

Page 51: Einführung in die Programierung - ETH Zse.inf.ethz.ch/courses/2010b_fall/eprog/lectures/08... · 2011. 2. 25. · 2 In dieser (Doppel-) Lektion Der Begriff des Algorithmus Grundlegende

51

Die Schleifeninvariante

(Nicht zu verwechseln mit der Klasseninvariante)

Eine Eigenschaft, die:

Nach jeder Initialisierung (from-Klausel) erfüllt ist

Von jedem Schleifendurchlauf (loop-Klausel), bei der die Ausstiegsbedingung (until-Klausel) nicht erfüllt ist, eingehalten wird

Wenn die Ausstiegsbedingung erfüllt ist, das gewünschte Ergebnis sicherstellt

Page 52: Einführung in die Programierung - ETH Zse.inf.ethz.ch/courses/2010b_fall/eprog/lectures/08... · 2011. 2. 25. · 2 In dieser (Doppel-) Lektion Der Begriff des Algorithmus Grundlegende

52

from

fancy.start ; Result := ""invariant

fancy.index >= 1

fancy.index <= fancy.count + 1-- Result ist der alphabetisch grösste Name-- aller bisherigen Stationen

until

fancy.afterloop

Result := greater (Result, fancy.item.name)

fancy.forthensure

-- Result ist der alphabetisch grösste Stationsnameend

Die Schleifeninvariante

Result = Max (names 1 i )..

Page 53: Einführung in die Programierung - ETH Zse.inf.ethz.ch/courses/2010b_fall/eprog/lectures/08... · 2011. 2. 25. · 2 In dieser (Doppel-) Lektion Der Begriff des Algorithmus Grundlegende

53

from

fancy.start ; Result := ""invariant

index >= 1index <= count + 1-- Falls es bisherige Stationen gibt, ist-- Result der alphabetisch Grösste ihrer Namen

until

fancy.afterloop

Result := greater (Result, fancy.item.name)

fancy.forthensure

-- Result ist der alphabetisch grösste Stationsname, falls es

-- eine Station gibt.end

Eine bessere Schleifeninvariante

Result = Max (names 1 i )..

Page 54: Einführung in die Programierung - ETH Zse.inf.ethz.ch/courses/2010b_fall/eprog/lectures/08... · 2011. 2. 25. · 2 In dieser (Doppel-) Lektion Der Begriff des Algorithmus Grundlegende

54

from

fancy.start ; Result := ""

invariant

index >= 1

index <= count + 1

-- Result ist der grösste der bisherigen Namen

until

fancy.after

loop

Result := greater (Result, fancy.item.name)

fancy.forth

end

Der Effekt einer Schleife

Am Schluss: Invariante and Ausstiegsbedingung

• Alle Stationen besucht (fancy.after )

• Result ist der “grösste” Stationsname

Ausstiegsbedingung am Ende erfüllt

Invariant nach jedem Durchlauf

erfüllt.

Invariante nach der Initialisierung erfüllt.

Page 55: Einführung in die Programierung - ETH Zse.inf.ethz.ch/courses/2010b_fall/eprog/lectures/08... · 2011. 2. 25. · 2 In dieser (Doppel-) Lektion Der Begriff des Algorithmus Grundlegende

55

Quiz: Finde die Invariante

xxxx (a, b : INTEGER): INTEGER-- ?????????????????????????????????

requirea > 0 ; b > 0

localm, n : INTEGER

dofrom

m := a ; n := binvariant

-- “ ????????”variant

????????until m = n loop

if m > n thenm := m − n

elsen := n − m

endendResult := m

end

Page 56: Einführung in die Programierung - ETH Zse.inf.ethz.ch/courses/2010b_fall/eprog/lectures/08... · 2011. 2. 25. · 2 In dieser (Doppel-) Lektion Der Begriff des Algorithmus Grundlegende

56

Quiz: Finde die Invariante

euclid (a, b: INTEGER): INTEGER-- Grösster gemeinsamer Teiler von a und b

requirea > 0 ; b > 0

localm, n : INTEGER

dofrom

m := a ; n := binvariant

-- “????????”variant

????????until

m = nloop

if m > n thenm := m − n

elsen := n − m

endendResult := m

end

Page 57: Einführung in die Programierung - ETH Zse.inf.ethz.ch/courses/2010b_fall/eprog/lectures/08... · 2011. 2. 25. · 2 In dieser (Doppel-) Lektion Der Begriff des Algorithmus Grundlegende

57Intro. to Programming, lecture 11 (complement): Levenshtein

Ein weiteres Beispiel

MI C H A E L J A C K S O N

E N D S H

Operation S D S S S D D D D I

Von “Michael Jackson” nach “Mendelssohn”

Distanz 1 2 3 4 5 6 7 8 9 100

I H A

Page 58: Einführung in die Programierung - ETH Zse.inf.ethz.ch/courses/2010b_fall/eprog/lectures/08... · 2011. 2. 25. · 2 In dieser (Doppel-) Lektion Der Begriff des Algorithmus Grundlegende

58

Levenshtein-Distanz

B

Operation

Von “Beethoven” nach “Beatles”

Distanz

E E

A

E T N

S

NH V EO

L

OB E T H V E

0 0 1

R

1 2

D

3

R

4

D

5

R

4

Page 59: Einführung in die Programierung - ETH Zse.inf.ethz.ch/courses/2010b_fall/eprog/lectures/08... · 2011. 2. 25. · 2 In dieser (Doppel-) Lektion Der Begriff des Algorithmus Grundlegende

59

Levenshtein-Distanz

Auch als „Editierdistanz“ bekannt Bekant

Zweck: Die kleinste Menge von Grundoperationen

Einfügung (insertion)

Löschung (deletion)

Ersetzung (replacement)

bestimmen, so dass aus einer Zeichenkette eine andere wird.

Intro. to Programming, lecture 11 (complement): Levenshtein

Page 60: Einführung in die Programierung - ETH Zse.inf.ethz.ch/courses/2010b_fall/eprog/lectures/08... · 2011. 2. 25. · 2 In dieser (Doppel-) Lektion Der Begriff des Algorithmus Grundlegende

60

B E A T L E S

B

E

E

T

H

30 1 2 5 6 74

0

1

2

3

5

4

30 1 2 5 6 74

1

2

3

5

4

0 2 3 4 5 6

1

1

1

0 1 2 3 4 5

2 1 2 3 3 4

3 2 2 1 2 3 4

4 3 3 2 2 3 44

Page 61: Einführung in die Programierung - ETH Zse.inf.ethz.ch/courses/2010b_fall/eprog/lectures/08... · 2011. 2. 25. · 2 In dieser (Doppel-) Lektion Der Begriff des Algorithmus Grundlegende

61

Der Levenshtein-Distanz-Algorithmus

distance (source, target: STRING): INTEGER-- Minimale Anzahl Operationen, um source in target-- umzuwandeln

localdist : ARRAY_2 [INTEGER]i, j, del, ins, subst : INTEGER

do

create dist.make (source.count, target.count)

from i := 0 until i > source.count loopdist [i, 0] := i ; i := i + 1

end

from j := 0 until j > target.count loop

dist [0, j ] := j ; j := j + 1end-- (Weitergeführt)

Page 62: Einführung in die Programierung - ETH Zse.inf.ethz.ch/courses/2010b_fall/eprog/lectures/08... · 2011. 2. 25. · 2 In dieser (Doppel-) Lektion Der Begriff des Algorithmus Grundlegende

62

Der Levenshtein-Distanz-Algorithmusfrom i := 1 until i > source.count loop

from j := 1 until j > target.count invariant

loop

if source [i ] = target [ j ] thendist [i, j ] := dist [ i -1, j -1]

else

deletion := dist [i -1, j ]insertion := dist [i , j - 1]substitution := dist [i - 1, j - 1]dist [i, j ] := minimum (deletion, insertion, substitution) + 1

endj := j + 1

endi := i + 1

end

Result := dist (source.count, target.count)end

???

Page 63: Einführung in die Programierung - ETH Zse.inf.ethz.ch/courses/2010b_fall/eprog/lectures/08... · 2011. 2. 25. · 2 In dieser (Doppel-) Lektion Der Begriff des Algorithmus Grundlegende

63

Wie wissen wir, ob eine Schleife terminiert?

from

fancy.start ; Result := ""invariant

index >= 1index <= count + 1-- Falls es bisherige Stationen gibt, ist-- Result der alphabetisch Grösste ihrer Namen

untilfancy.after

loop

Result := greater (Result, fancy.item.name)

fancy.forthend

Page 64: Einführung in die Programierung - ETH Zse.inf.ethz.ch/courses/2010b_fall/eprog/lectures/08... · 2011. 2. 25. · 2 In dieser (Doppel-) Lektion Der Begriff des Algorithmus Grundlegende

64

fromfancy.start ; Result := ""

invariantindex >= 1index <= count + 1-- Falls es bisherige Stationen gibt, ist-- Result der alphabetisch Grösste ihrer Namen

until

fancy.afterloop

Result := greater (Result, fancy.item.name)

fancy.forthend

Wie wissen wir, ob eine Schleife terminiert?

Page 65: Einführung in die Programierung - ETH Zse.inf.ethz.ch/courses/2010b_fall/eprog/lectures/08... · 2011. 2. 25. · 2 In dieser (Doppel-) Lektion Der Begriff des Algorithmus Grundlegende

65

Die Schleifenvariante

Ein Integer-Ausdruck, der

Nach der Initialisierung (from) nicht-negativ sein darf

Sich bei jeder Ausführung des Schleifenrumpfs (loop), bei der die Ausstiegsbedingung nicht erfüllt ist, um mindestens eins verringern, aber trotzdem nicht-negativ bleiben muss.

Page 66: Einführung in die Programierung - ETH Zse.inf.ethz.ch/courses/2010b_fall/eprog/lectures/08... · 2011. 2. 25. · 2 In dieser (Doppel-) Lektion Der Begriff des Algorithmus Grundlegende

66

fancy.count − fancy.index + 1

fromfancy.start ; Result := ""

invariantindex >= 1index <= count + 1-- Falls es bisherige Stationen gibt, ist-- Result der alphabetisch Grösste ihrer Namen

variant

until

fancy.afterloop

Result := greater (Result, fancy.item.name)

fancy.forthend

Die Variante in unserem Beispiel

Page 67: Einführung in die Programierung - ETH Zse.inf.ethz.ch/courses/2010b_fall/eprog/lectures/08... · 2011. 2. 25. · 2 In dieser (Doppel-) Lektion Der Begriff des Algorithmus Grundlegende

67

Das allgemeine Entscheidungsproblem

Kann EiffelStudio herausfinden, ob Ihr Programm terminieren wird?

Leider nein

Auch kein anderes Programm kann dies für irgendeine

realistische Programmiersprache herausfinden!

Page 68: Einführung in die Programierung - ETH Zse.inf.ethz.ch/courses/2010b_fall/eprog/lectures/08... · 2011. 2. 25. · 2 In dieser (Doppel-) Lektion Der Begriff des Algorithmus Grundlegende

68

Das Entscheidungsproblem und Unentscheidbarkeit

(“Halting Problem”, Alan Turing, 1936.)

Es ist nicht möglich, eine effektive Prozedur zu schreiben, die herausfindet, ob ein beliebiges Programm mit beliebigem Input terminieren wird.

(Oder, im Speziellen, ob ein beliebiges Programm ohne Input terminiert.)

Page 69: Einführung in die Programierung - ETH Zse.inf.ethz.ch/courses/2010b_fall/eprog/lectures/08... · 2011. 2. 25. · 2 In dieser (Doppel-) Lektion Der Begriff des Algorithmus Grundlegende

69

Das Entscheidungsproblem in Eiffel

Nehmen Sie an, wir haben ein Feature

terminates (my_program: STRING ): BOOLEAN

-- Terminiert my_program ?

do

... Your algorithm here ...

end

Page 70: Einführung in die Programierung - ETH Zse.inf.ethz.ch/courses/2010b_fall/eprog/lectures/08... · 2011. 2. 25. · 2 In dieser (Doppel-) Lektion Der Begriff des Algorithmus Grundlegende

70

terminates_if_not

Page 71: Einführung in die Programierung - ETH Zse.inf.ethz.ch/courses/2010b_fall/eprog/lectures/08... · 2011. 2. 25. · 2 In dieser (Doppel-) Lektion Der Begriff des Algorithmus Grundlegende

71

Das Entscheidungsproblem in der Praxis

Manche Programme terminieren in gewissen Fällen nicht.

Das ist ein Bug!

Ihre Programme sollten in allen Fällen terminieren!

Benutzen Sie Varianten!

Page 72: Einführung in die Programierung - ETH Zse.inf.ethz.ch/courses/2010b_fall/eprog/lectures/08... · 2011. 2. 25. · 2 In dieser (Doppel-) Lektion Der Begriff des Algorithmus Grundlegende

72

Kontrollstrukturen auf Maschinenebene

Nicht-konditionaler Zweig:

BR label

Konditionaler Zweig, z.B.:

BEQ loc_a loc_b l abel

Page 73: Einführung in die Programierung - ETH Zse.inf.ethz.ch/courses/2010b_fall/eprog/lectures/08... · 2011. 2. 25. · 2 In dieser (Doppel-) Lektion Der Begriff des Algorithmus Grundlegende

73

Das Äquivalent zu if-then-else

BEQ loc_a loc_b 111

101 ... Code für Compound_2 ...

BR 125

111 ... Code für Compound_1 ...

125 ... Code für Rest des Programms ...

if a = b then Compound_1 else Compound_2 end

Page 74: Einführung in die Programierung - ETH Zse.inf.ethz.ch/courses/2010b_fall/eprog/lectures/08... · 2011. 2. 25. · 2 In dieser (Doppel-) Lektion Der Begriff des Algorithmus Grundlegende

74

Flowcharts

a = b

Compound_2Compound_1

True False

Page 75: Einführung in die Programierung - ETH Zse.inf.ethz.ch/courses/2010b_fall/eprog/lectures/08... · 2011. 2. 25. · 2 In dieser (Doppel-) Lektion Der Begriff des Algorithmus Grundlegende

75

In Programmiersprachen: Goto

test condition goto else_part

Compound_1

goto continue

else_part : Compound_2

continue : ... Continuation of program ...

a = b

Compound_2Compound_1

True False

Page 76: Einführung in die Programierung - ETH Zse.inf.ethz.ch/courses/2010b_fall/eprog/lectures/08... · 2011. 2. 25. · 2 In dieser (Doppel-) Lektion Der Begriff des Algorithmus Grundlegende

76

“Goto considered harmful”

Dijkstra, 1968

Willkürliche Goto-Instruktionen führen zu unübersichtlichen, schwer zu wartenden Programmen (“spaghetti code”)

Böhm-Jacopini-Theorem: Jedes Programm,

Das mit goto-Instruktionen und

Konditionalen geschrieben werden kann,

kann auch ohne goto„s geschrieben

werden, in dem man Sequenzen und

Schleifen benutzt.

Beispiel zur Transformation

inTouch of Class

Page 77: Einführung in die Programierung - ETH Zse.inf.ethz.ch/courses/2010b_fall/eprog/lectures/08... · 2011. 2. 25. · 2 In dieser (Doppel-) Lektion Der Begriff des Algorithmus Grundlegende

77

Goto heute

Fast allgemein verschrien.

Immer noch in einigen Programmiersprachen vorhanden.

Es versteckt sich auch unter anderen Namen, z.B. break

loop

...

if c then break end

...

end

Page 78: Einführung in die Programierung - ETH Zse.inf.ethz.ch/courses/2010b_fall/eprog/lectures/08... · 2011. 2. 25. · 2 In dieser (Doppel-) Lektion Der Begriff des Algorithmus Grundlegende

78

Ein Eingang, ein Ausgang

(Verbund) (Schleife) (Konditional)

Page 79: Einführung in die Programierung - ETH Zse.inf.ethz.ch/courses/2010b_fall/eprog/lectures/08... · 2011. 2. 25. · 2 In dieser (Doppel-) Lektion Der Begriff des Algorithmus Grundlegende

79

Quiz: Finde die Invariante!

xxx (a, b: INTEGER): INTEGER is-- ?????????????????????????????????

requirea > 0 ; b > 0

localm, n : INTEGER

dofrom

m := a ; n := binvariant

-- “????????”variant

????????until

m = nloop

if m > n thenm := m − n

elsen := n − m

endendResult := m

end

Page 80: Einführung in die Programierung - ETH Zse.inf.ethz.ch/courses/2010b_fall/eprog/lectures/08... · 2011. 2. 25. · 2 In dieser (Doppel-) Lektion Der Begriff des Algorithmus Grundlegende

80

Quiz: Finde die Invariante!

euclid (a, b: INTEGER): INTEGER is-- Grösster gemeinsamer Teiler von a und b

requirea > 0 ; b > 0

localm, n : INTEGER

dofrom

m := a ; n := binvariant

-- “????????”variant

????????until

m = nloop

if m > n thenm := m − n

elsen := n − m

endendResult := m

end

Page 81: Einführung in die Programierung - ETH Zse.inf.ethz.ch/courses/2010b_fall/eprog/lectures/08... · 2011. 2. 25. · 2 In dieser (Doppel-) Lektion Der Begriff des Algorithmus Grundlegende

81

Levenshtein, fortgesetzt

from i := 1 until i > source.count loop

from j := 1 until j > target.count invariant

loop

if source [i ] = target [ j ] thennew := dist [ i -1, j -1]

elsedeletion := dist [i -1, j ]insertion := dist [i , j - 1]substitution := dist [i - 1, j - 1]

new := deletion.min (insertion.min (substitution)) + 1enddist [i, j ] := newj := j + 1

endi := i + 1

end

Result := dist (source.count, target.count)

-- Für alle p : 1 .. i, q : 1 .. j –1, können wir source [1 .. p ]-- in target [1 .. q ] umwandeln mit dist [p, q ] Operationen

Page 82: Einführung in die Programierung - ETH Zse.inf.ethz.ch/courses/2010b_fall/eprog/lectures/08... · 2011. 2. 25. · 2 In dieser (Doppel-) Lektion Der Begriff des Algorithmus Grundlegende

82

Der Levenshtein-Distanz-Algorithmus

distance (source, target: STRING): INTEGER--- Minimale Anzahl Operationen, um source in target-- umzuwandeln

localdist: ARRAY_2 [INTEGER]i, j, new, deletion, insertion, substitution : INTEGER

do

create dist.make (source.count, target.count)

from i := 0 until i > source.count loopdist [i, 0] := i ; i := i + 1

end

from j := 0 until j > target.count loop

dist [0, j ] := j ; j := j + 1end

-- (Weitergeführt)

Page 83: Einführung in die Programierung - ETH Zse.inf.ethz.ch/courses/2010b_fall/eprog/lectures/08... · 2011. 2. 25. · 2 In dieser (Doppel-) Lektion Der Begriff des Algorithmus Grundlegende

83

Levenshtein , fortgesetzt

from i := 1 until i > source.count loop

from j := 1 until j > target.count invariant

loop

if source [i ] = target [ j ] thennew := dist [ i -1, j -1]

elsedeletion := dist [i -1, j ]insertion := dist [i , j - 1]substitution := dist [i - 1, j - 1]

new := deletion.min (insertion.min (substitution)) + 1enddist [i, j ] := newj := j + 1

endi := i + 1

end

Result := dist (source.count, target.count)

-- Für alle p : 1 .. i, q : 1 .. j –1, können wir source [1 .. p ]-- in target [1 .. q ] umwandeln mit dist [p, q ] Operationen

Page 84: Einführung in die Programierung - ETH Zse.inf.ethz.ch/courses/2010b_fall/eprog/lectures/08... · 2011. 2. 25. · 2 In dieser (Doppel-) Lektion Der Begriff des Algorithmus Grundlegende

84

Paradoxa in der Logik

Das Paradox von Russel:

Manche Mengen sind Element von sich selber; die Menge aller unendlichen Mengen ist z.B. selbst unendlich.

Manche Mengen sind nicht Element von sich selbst; die Menge aller endlichen Mengen ist z.B. nicht endlich.

Betrachten Sie die Menge aller Mengen, die sich nicht selbst enthalten.

Das Barbier-Paradox (Russel, leicht abgeändert)

In Zürich gibt es einen Barbier, der alle Männer rasiert, die sich nicht selbst rasieren.

Wer rasiert den Barbier?

Page 85: Einführung in die Programierung - ETH Zse.inf.ethz.ch/courses/2010b_fall/eprog/lectures/08... · 2011. 2. 25. · 2 In dieser (Doppel-) Lektion Der Begriff des Algorithmus Grundlegende

85

Das Paradox von Grelling

In der deutschen Sprache ist ein Adjektiv

“autologisch”, falls es sich selbst beschreibt (z.B. “deutsch” oder „mehrsilbig“)

“heterologisch” sonst

Was ist nun mit “heterologisch”?

Eine andere Form:

Die erste Aussage auf dieser Folie, die in rot erscheint, ist falsch

Page 86: Einführung in die Programierung - ETH Zse.inf.ethz.ch/courses/2010b_fall/eprog/lectures/08... · 2011. 2. 25. · 2 In dieser (Doppel-) Lektion Der Begriff des Algorithmus Grundlegende

86

Das Lügner-Paradox

(Sehr Alt!)

Epaminondas sagt, dass alle Kreter Lügner sind

Epaminondas ist ein Kreter.

Page 87: Einführung in die Programierung - ETH Zse.inf.ethz.ch/courses/2010b_fall/eprog/lectures/08... · 2011. 2. 25. · 2 In dieser (Doppel-) Lektion Der Begriff des Algorithmus Grundlegende

87

Das Entscheidungsproblem und Unentscheidbarkeit

(“Halting Problem”, Alan Turing, 1936.)

Es ist nicht möglich, eine effektive Prozedur zu schreiben, die herausfindet, ob ein beliebiges Programm mit beliebigem Input terminieren wird.

(Oder, im Speziellen, ob ein beliebiges Programm ohne Input terminiert.)

Page 88: Einführung in die Programierung - ETH Zse.inf.ethz.ch/courses/2010b_fall/eprog/lectures/08... · 2011. 2. 25. · 2 In dieser (Doppel-) Lektion Der Begriff des Algorithmus Grundlegende

88

Das Entscheidungsproblem in Eiffel

Nehmen Sie an, wir haben ein Feature

terminates (my_program: STRING ): BOOLEAN

-- Terminiert my_program ?

do

... Your algorithm here ...

end

Page 89: Einführung in die Programierung - ETH Zse.inf.ethz.ch/courses/2010b_fall/eprog/lectures/08... · 2011. 2. 25. · 2 In dieser (Doppel-) Lektion Der Begriff des Algorithmus Grundlegende

89

Dann…

Wurzelprozedur des Systems:

what_do_you_think

-- Terminate nur, falls nein.

do

from

until

not terminates (“/usr/home/turing.e”)

loop

end

end

Speichern Sie diesen Programmtext in /usr/home/turing.e

Page 90: Einführung in die Programierung - ETH Zse.inf.ethz.ch/courses/2010b_fall/eprog/lectures/08... · 2011. 2. 25. · 2 In dieser (Doppel-) Lektion Der Begriff des Algorithmus Grundlegende

90

Das Entscheidungsproblem in der Praxis

Manche Programme terminieren in gewissen Fällen nicht.

Das ist ein Bug!

Ihre Programme sollten in jedem Fall terminieren!

Benutzen Sie Varianten!

Page 91: Einführung in die Programierung - ETH Zse.inf.ethz.ch/courses/2010b_fall/eprog/lectures/08... · 2011. 2. 25. · 2 In dieser (Doppel-) Lektion Der Begriff des Algorithmus Grundlegende

91

Was wir gesehen haben

Der Begriff des Algorithmus Grundlegende Eigenschaften Unterschied zu Programm

Der Begriff der KontrollstrukturKorrektheit einer InstruktionKontrollstruktur: SequenzKontrollstruktur: KonditionalVerschachtelung, und wie sich diese vermeiden lässt