• Keine Ergebnisse gefunden

Funktionen und Prozeduren

N/A
N/A
Protected

Academic year: 2022

Aktie "Funktionen und Prozeduren"

Copied!
31
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

Grundlagen der Programmierung (Vorlesung 14)

❚ Vorige Vorlesung

❙ Verifikation von Anweisungen und Anweisungsfolgen

❙ Schleifen

❚ Inhalt dieser Vorlesung

❙ Funktionen und Prozeduren

❚ Lernziele

❙ Grundlagen der systematischen Programmentwicklung

Ralf Möller, FH-Wedel

(2)

Schleifen

(3)

Schleifen (2)

(4)

Ganzzahlige Division mit Rest mittels While

z Spezifikation

y var x, y, q, r : N 0

y { y > 0 } S { q * y + r = x fi r < y}

y V P y P: q * y + r = x fi r < y y I fi – B

y Gut: Spezifikation schon in der richtigen Form

z { V } S 0 { I };

z { I } while B do { I fi B } S 1 { I } end while { P }

(5)

Ganzzahlige Division mit Rest mittels While

z var x, y, q, r : N 0

z { y > 0 } q, r := 0, x { q * y + r = x } V So I B

z while r ≥ y do

z {q * y + r = x fi r >= y} q, r := q+1, r-y {q * y + r = x}

z end while S1 z {q * y + r = x fi r < y}

P

I fi – B

(6)

Terminierungsbeweis

z Für die Variante t wähle: r z Zeige Fortschritt:

y {I fi B fi t > T} S1 {t = T} muß korrekt sein, d.h.

{I fi B fi r > T} q, r := q+1, r-y {r = T} muß korrekt sein

x Also r¨ r-y in Nachbedingung einsetzen x Damit ergibt sich r-y = T

x Es ergibt sich: r > T, wenn y > 0

y (I fi t £ 0) ¡ B muß gültig sein, d.h.

(I fi r £ 0) ¡ r < y muß gültig sein

x Unter der Voraussetzung, daß r £ 0 und y > 0 ist r < y immer erfüllt

(7)

Y é ï[ðRñò'óõô„ð“öw÷wò'ö/Z\[zò^],_lñò'óŒ÷ ð“öw÷wò'ö|ð“ö/`ba4ced4fò'óhgmò'ö

¾ÀîQÀ Á ½ ¹

r³ÛQÚo…Hš•ŽH 0E!/5+Œº»˜:!/:Å!TŒ"bß75!/:XžQ0E

¾íÀÉîEÀ Á ½

™aЩAŸFDSR0E!DS:—0E!ß 8

rstu

¾íÀÉîEÀ Á ½

Øç æOâeÚOÙUç4¡

¿4Ƚ

¶ìÂÆ æ`ÛWâeç@¡kÙ0ç4¡

rH‚ <šƒ p3F$OŸFDSW

ê Ç

¶ìÂ

À

™aЩAŸFDS

Øç/ æOâeڄÙUç@¡%

ê Ç

¶ìÂ

À

×2Æ æ`ÛWâeç@¡kÙ0ç4¡

Ê ß

Øç æOâeÚOÙUç4¡

ÀÈ<Ê

ê Ç

¶ëÂ

À

rH‚ <šƒ DS1$p3ŸŸ

ª#«¬

Ë"bß75!/: þq*Щ/ŸFD/,!p3‰DOÿZßO8

0E!/5:D„Î!/P

ª,’9¬

ðº»l/:!:~ß+0E!5:Eß P6

ª ´ ¬

5,+/0E5*û-58!/ŸF#0<

½6¾e¿À

.51ßO8W"!/5AD„Î!/,!/:

5‘ȼ$1:80Ep3p35€/@Œ*ЩŸFDËDS1PA:56

ª

´/µ

¬

5,+/0E5*û-58!/ŸF#0<

·UÁ4ÂÄÃ

À

.51ýßO8Ë"!5,D„Î!/,!/:

ЩAŸFDS‡ßOl,1ŸF

Ð©AŸFDS,!/p3‰DußO8 Ò w Ø wxlxlxp)0EŸ90E!5:6D !/PlGÎ

/>©@-D„Î!Щ/ŸFD !:—80E!9©/.è, û-!/p3‰D

p Î1:Ÿ>©A'ß 5">©4+0E!5:D„Î!/PßO8èG

ê Ç

¶ìÂ

À

™aЩ/ŸFD 0EŸŸ:p3

¾íÀÉîEÀ Á ½

™aЩ/ŸFDRošUÛQÚB'& @+0EŸ5

Ç

¶ìÂ

À

™aЩ/ŸFD

(8)

Y é ï[ðRñò'óõô„ð“öw÷wò'ö/Z\[zò^],_lñò'óŒ÷ ð“öw÷wò'ö|ð“ö/`ba4ced4fò'óhgmò'ö

¾ÀîQÀ Á ½ ¹

r³ÛQÚo…Hš•ŽH 0E!/5+Œº»˜:!/:Å!TŒ"bß75!/:XžQ0E

¾íÀÉîEÀ Á ½

™aЩAŸFDSR0E!DS:—0E!ß 8

rstu

¾íÀÉîEÀ Á ½

Øç æOâeÚOÙUç4¡

¿4Ƚ

¶ìÂÆ æ`ÛWâeç@¡kÙ0ç4¡

rH‚ <šƒ p3F$OŸFDSW

ê Ç

¶ìÂ

À

™aЩAŸFDS

Øç/ æOâeڄÙUç@¡%

ê Ç

¶ìÂ

À

×2Æ æ`ÛWâeç@¡kÙ0ç4¡

Ê ß

Øç æOâeÚOÙUç4¡

ÀÈ<Ê

ê Ç

¶ëÂ

À

rH‚ <šƒ DS1$p3ŸŸ

ª#«¬

Ë"bß75!/: þq*Щ/ŸFD/,!p3‰DOÿZßO8

0E!/5:D„Î!/P

ª,’9¬

ðº»l/:!:~ß+0E!5:Eß P6

ª ´ ¬

5,+/0E5*û-58!/ŸF#0<

½6¾e¿À

.51ßO8W"!/5AD„Î!/,!/:

5‘ȼ$1:80Ep3p35€/@Œ*ЩŸFDËDS1PA:56

ª

´/µ

¬

5,+/0E5*û-58!/ŸF#0<

·UÁ4ÂÄÃ

À

.51ýßO8Ë"!5,D„Î!/,!/:

ЩAŸFDS‡ßOl,1ŸF

Ð©AŸFDS,!/p3‰DußO8 Ò w Ø wxlxlxp)0EŸ90E!5:6D !/PlGÎ

/>©@-D„Î!Щ/ŸFD !:—80E!9©/.è, û-!/p3‰D

p Î1:Ÿ>©A'ß 5">©4+0E!5:D„Î!/PßO8èG

ê Ç

¶ìÂ

À

™aЩ/ŸFD 0EŸŸ:p3

¾íÀÉîEÀ Á ½

™aЩ/ŸFDRošUÛQÚB'& @+0EŸ5

Ç

¶ìÂ

À

™aЩ/ŸFD

(9)

éëêíìwê é a@ced4fò'óhgmò'ö/çEö%ñò>ó_ô„ðAöb÷wò'ö 

· ß ¾ ¹

r³ÛQÚo…Hš•ŽH Í#Î0E/Ÿ5{©AŸFDS

rstu

· ß ¾

àFáWÜEâãábä•å æ âUå ØÙ0ÚVÛYÜEÙz݄Þv

½

ßPØÙUÚVÛYÜEÙz݄Þ

¤ Ê ß

Øç æOâeÚOÙUç4¡

ÀÈ<Ê

· ß ¾

àFáYÜEâ ábäVåTæ 5,+Ëö÷0E!DXÊ0E,>0E—/Ÿ

ØÙ0ÚVÛYÜEÙz݄Þv 5,+Ð@#0E^­ß P

ØÙ0ÚVÛYÜEÙzÝ„Þ ¤ 5,+-ú2xß7^

Øç æOâ1ÚOÙUç@¡ 5,+ЩAŸFDS,!/p3‰D

rH‚ <šƒ º»l!A!:%ɋ$ž„Ÿ­Î0EPOp3F

ê Ç

¶ìÂ

À

™aЩAŸFDS

àzáYÜEâãáwäVåTæ âUå ØÙUÚÛWÜEÙzÝ„Þ v %

(oç[Ûxæ# æOÜá âUå ØÙUÚÛWÜEÙz݄Þ

¤ %

ê Ç

¶ìÂ

À

àFáWÜEâãábä•å æ

(ç[Ûxæy æOÜá

Ê ß

Øç æOâeÚOÙUç4¡%

àFáWÜEâãáwäVåTæ âUå àFáWÜEâãáwäVåTæ)+*

ÀÈ<Ê

ê Ç

¶ëÂ

À

ê Ç

¶ìÂ

À

™aЩ/ŸFD 0EŸŸ:p3

(10)
(11)
(12)
(13)

Urbildbereich (Parameter) und Bildbereich (Ergebnistyp)

❚ Beispiel:

❙ Funktion sin

❙ Urbildbereich: R (-> Parameter)

❙ Bildbereich R, genauer: Intervall [-1, 1] (-> Typ)

❚ Mehr als ein Parameter möglich

❚ Stelligkeit einer Funktion

❙ Anzahl der Parameter

(14)

Funktionen: Schreibweise

❚ Erklärung anhand von Beispielen

❚ quadrat(x : N 0 ) : N 0 x * x

❚ quadratsumme(a : N 0 ; b : N 0 ) : N 0 quadrat(a) + quadrat(b)

Ausdruck

(formaler) Parameter Parametertyp

Ergebnistyp

Parametertrenner

Funktionsaufruf

mit Aktualparameter

(15)

Vereinbarung: abkürzende Schreibweise

❚ quadratsumme(a, b : N 0 ) : N 0 quadrat(a) + quadrat(b)

❚ steht für

❚ quadratsumme(a : N 0 ; b : N 0 ) : N 0

quadrat(a) + quadrat(b)

(16)

Vorbedingungen und Nachbedingungen

❚ Zum Teil Vorbedingungen als Typen der Parameter formulierbar

❚ Parametertypen legen die Vorbedingungen meist nur partiell fest

❚ Problembeispiel: Division durch 0

❚ div(x : N 0 ; y : N 0 ): N 0

❚ Gleiches gilt für die Ergebnistypen

(17)

Funktionsrumpf

❚ Folge von Anweisungen

❚ mit "abschließendem" Ausdruck

❚ min(x : N 0 ; y : N 0 ) : N 0 if x > y

then y

else x

end if

(18)

Funktionen: Motivation

(19)

Information Hiding (Kapselung) (1)

(20)

Information Hiding (Kapselung) (2)

❚ Noch zu klären: Semantik des Funktionsaufrufs

(21)

Zuweisung und Arrays: Ergänzung

❚ Arraydenotation über Tupel

❙ var f : array [0..2] of N 0 ; f := (42, 17, 9)

❚ Zuweisung von Arrays: Kopiersemantik

❙ var f, g : array [0..2] of N 0 ;

❙ f := (42, 17, 9);

❙ g := f; ...

❚ Arrays als Werte von Funktionen (am Beispiel)

❙ f(i : N0) : array [0..1] of N 0 (i+1, i-1)

❚ Erweiterung der Zuweisung für Arrays

❙ var a : array [0..1] of N0; a := f(3)

❙ var x, y : N 0 ; (x, y) := f(3)

(22)

Auswertestrategien

(23)

Lokale Variablen, Blöcke

❚ Bisher: Variablen "global" am Anfang eines Algorithmus vereinbart

❚ Nun: Variablen "lokal" nur für den Teilalgorithmus einer deklarierten Prozedur

❚ Notation:

❙ begin

var .... ; ....

end

❚ Blöcke können Anweisung oder Ausdruck sein

Kopf des Blockes mit lokalen Variablen

Rumpf des Blockes (Sequenz von Anweisungen)

(24)

Blöcke: Freie und gebundene Variablen

❚ Variablen, die im Kopf eines Blockes aufgeführt sind, heißen gebunden (bzgl. eines Blockes)

❚ Variablen, die im Rumpf vorkommen, aber nicht

gebunden sind, heißen frei (bzgl. eines Blockes)

(25)

Auswertestrategie für Blöcke

❚ Vor der Auswertung wird ein Block transformiert

❚ Für die lokalen Variablen werden neue, in der

Auswertereihenfolge bisher nicht benutzte Namen vergeben

❚ Anschließend werden die in den Anweisungen im Rumpf des Blockes verwendeten lokalen Variablen durch die entsprechenden neuen Variablen ersetzt

❚ Ist die bei dieser Ersetzung betrachtete Anweisung

wieder ein Block, so werden nur die freien Variablen

dieses Blockes ersetzt

(26)

Funktionen: Auswertestrategie (1)

❚ Sei f definiert als f(x 1 : T 1 , ..., x n : T n ) : T result

❚ <Rumpf von f>

❚ Ein Funktionsaufruf f(a 1 , ..., a n ) einer n-stelligen Funktion f mit Aktualparametern a 1 , ..., a n wird ausgewertet, indem

aus den (formalen) Parametern und dem Rumpf der Funktion f folgender Block gebildet wird

❙ begin

var x 1 : T 1 ; x 2 : T 2 ; ...; x n : T n ; <Rumpf von f>

end

❚ Anschließend wird der Block wie oben beschrieben zur

Auswertung transformiert

(27)

Funktionen: Auswertestrategie (2)

❚ Es entsteht ein Block

❙ begin

var x 1 ': T 1 ; x 2 ': T 2 ; ...; x n ' : T n ; <Rumpf von f mit Ersetzungen>

end

❚ Der Block wird wie folgt umgeformt und ausgewertet

❙ begin

var x 1 ': T 1 ; x 2 ': T 2 ; ...; x n ' : T n ; x 1 ', x 2 ', ..., x n ' := a 1 ', ..., a n ' ; <Rumpf von f mit Ersetzungen>

end

❚ wobei a 1 ', ..., a n ' die Ergebnisse der entsprechenden

Auswertung von a 1 , ..., a n sind

(28)

Parameter, Sichtbarkeit, Lebensdauer

❚ Der oben skizzierte Übergabemechanismus heißt Call-by-value

❚ Wertezuweisungen an Parameter sind möglich, da Parameter wie Blockvariablen mit Initialisierung zu behandeln sind

❚ Transformation garantiert Sichtbarkeitsregeln (Variablenskopus)

❚ Was passiert bei "Neueintritt" in den Block?

❙ "Alte" Namen werden nicht neu vergeben

❙ "Alte" Werte gehen also verloren

(29)

Ausdrücke vs. Anweisungen (Beispiel 2)

❚ amit tel( g : array [0..n-1] of N 0 ) : N 0 begin

var j, am : N 0 ; j, am := 0, 0;

while j < n do

j, am := j + 1, ((j * am) + g[j]) / (j+1) end while;

am

end

(30)

Zusammenfassung, Kernpunkte

❚ Blöcke

❙ Auswertungsstrategie,

❙ Sichtbarkeit (Skopus)

❙ Lebensdauer

❚ Funktionen

❙ Aktual- vs. Formalparameter

❙ Auswertungsstrategie

(31)

Was kommt beim nächsten Mal?

❚ Prozeduren

❚ Rekursion

Referenzen

ÄHNLICHE DOKUMENTE

I return ohne Argument darf nur bei einer Nachbedingung Q auftreten, die kein \result enthält. I Bei return mit Argument ersetzt der Rückgabewert den \result in

I return ohne Argument darf nur bei einer Nachbedingung Q auftreten, die kein \result enthält. I Bei return mit Argument ersetzt der Rückgabewert den \result in

I Funktionen sind zentrales Modularisierungskonzept I Wir müssen Funktionen modular verifizieren können I Semantik von Deklarationen und Parameter — straightforward I Semantik

Korrekte Software: Grundlagen und Methoden Vorlesung 11 vom 06.06.16: Funktionen und Prozeduren?. Serge Autexier, Christoph Lüth Universität Bremen

In diesem Kapitel wird der Begriff des bestimmten Integrals auf Doppel-, Dreifach- und Kurvenintegrale sowie auf Oberfl¨ achenintegrale erweitert.. Bei jedem dieser Be- griffe wird

Wie auch im Fall der Funktion einer Variablen, können einzelne Punkte keinen Eindruck vom Verhalten der Funktion vermitteln. Um die Funk- tion visuell zu

Partielle Ableitungen werden im Gegensatz zu den gewöhnlichen Ableitungen nicht durch Striche (oder Punkte), sondern durch die als Index

Linearisierung einer Funktion, Gleichung der Tangentialebene: L ¨osungen.1. Linearisierung einer Funktion, Gleichung