Funktionen Flashcards
Funktionsdefinitionen- und Aufrufe; Auswertung von Funktionsaufrufen; Der Typ ππππ
WofΓΌr braucht man Funktionen?
Sie kapseln hΓ€ufig gebrauchte FunktionalitΓ€ten (z.B. Potenzberechnung) und machen sie einfach verfΓΌgbar. Ausserdem strukturieren sie das Programm und unterteilen es in kleine Teilaufgaben.
Betrachte folgenden Codeausschnitt:
ππππππ π;
πππ π;
πππ::πππ»_space; π;
πππ::πππ»_space; π;
ππππππ ππππππ = π·.0; ππ (π < 0) { π = π·.0/π; π = -π; } πππ (πππ π = 0; π < π; ++π) ππππππ *= π;
πππ::ππππ «_space;π «_space;β^β «_space;π «_space;β = β «_space;ππππππ «_space;β.\πβ;
Wie kΓΆnnte man ihn mithilfe einer Funktion vereinfachen? Um was fΓΌr eine Funktion geht es?
Der Codeausschnitt umschreibt die Potenzfunktion (βpowβ). Wir kΓΆnnen den mittleren Teil zu einer Funktion umformen,β¦
ππππππ πππ (ππππππ π, πππ π) { ππππππ ππππππ = π·.0; ππ (π < 0) { π = π·.0/π; π = -π; } πππ (πππ π = 0; π < π; ++π) ππππππ *= π; ππππππ ππππππ; }
β¦und brauchen danach nur noch
ππππππ πππ (ππππππ π, πππ π) {β¦}.
Wie sieht die Anatomie einer Funktion aus, d.h. aus welchen Elementen besteht sie?
π πππππ (πβ πππππβ, πβ πππππβ, . . . ,πβ πππππβ)
{πππππ}
Die Namen der Funktion πππππ und der Argumente πππππ werden jeweils von einer Typendeklaration π initiiert. Im Funktionsrumpf {πππππ} wird die Funktion an sich definiert, d.h., was die Funktion βmachtβ.
Wie wΓΌrde eine Funktion aussehen, die das Minimum zweier ganzen Zahlen π und π ausrechnet?
πππ πππ(πππ π, πππ π)
{
ππ (π
Was gilt fΓΌr die in einer Funktion deklarierten Typen, wenn die Funktion aufgerufen wird?
(1) Alle Aufrufargumente mΓΌssen konvertierbar sein in die entsprechenden Argumenttypen.
(2) Der Funktionsaufruf selbst ist ein Ausdruck vom RΓΌckgabetyp (bei πππ (π, π) z.B. vom Typ ππππππ).
Was gilt fΓΌr die in einer Funktion vorhandenen Werte, wenn die Funktion aufgerufen wird?
Aufrufargumente sind R-Werte (fΓΌr die bereits bekannten Typen). Der Funktionsaufruf selbst ist somit auch ein R-Wert.
Etwas informell: R-Wert Γ R-Wert Γ β¦ Γ R-Wert β R-Wert.
In welcher Reihenfolge wird ein Funktionsaufruf ausgewertet? Was sind die Schritte?
- Auswertung der Aufrufargumente
- Initialisierung der formalen Argumente mit den resultierenden Werten
- AusfΓΌhrung des Rumpfes: formale Argumente verhalten sich dabei wie lokale Variablen.
- AusfΓΌhrung endet mit ππππππ βexprβ.
Was sind formale Funktionsargumente?
Sind innerhalb einer Funktionsdefinition deklariert und werden bei jedem Aufruf der Funktion neu angelegt. Die Γnderung ihrer Werte haben keinen Einfluss auf die Werte der Aufrufargumente.
Sind also in etwa wie Parameter einer Funktion.
Was ist der Typ ππππ und was macht eine Funktion mit diesem Typ?
ππππ ist ein Typ mit leerem Wertebereich. Er wird verwendet fΓΌr Funktionen, die nur einen Effekt haben, also nur eine Eingabe zurΓΌckgeben.
Sie benΓΆtigen somit auch keine ππππππ-Anweisung.
Betrachte folgende Funktion zum Vergleich zweier Zahlen:
ππππ πππππππ(πππππ π‘, πππππ π’) {
πππππ πππππ = π‘ - π’;
ππ (πππππ*πππππ < 0.00π·π) ππππππ ππππ;
}
Weswegen wird diese Funktion in den meisten FΓ€llen nicht funktionieren?
Das Verhalten einer Funktion mit RΓΌckgabetyp ungleich ππππ ist nicht definiert, wenn das Ende des Funktionsrumpfes ohne ππππππ-Anweisung erreicht wird.
In diesem Beispiel ist ππππππ nur fΓΌr den βwahrenβ Fall definiert. FΓΌr eine Eingabe πππππππ(π·0, πΈ0), z.B., wΓΌrde die Funktion nicht funktionieren.
Was sind Vor- und Nachbedingungen (pre and post conditions)? Was muss man allgemein beachten?
Sie beschreiben und dokumentieren, was die Funktion macht. Wie auch Kommentare werden sie vom Compiler ignoriert und machen Programme lesbarer. Sie machen daher auch Aussagen ΓΌber die Korrektheit eines Programmes mΓΆglich, weshalb sie mΓΆglichst korrekt sein sollten.
Wenn eine Vorbedingung beim Funktionsaufruf gilt, muss auch die Nachbedingung nach Funktionsaufruf gelten.
Was genau beschreibt eine Vorbedingung und was muss man beim Schreiben einer Vorbedingung beachten?
Sie beschreiben, was bei Funktionsaufruf gelten muss und spezifizieren den Definitionsbereich der Funktion.
Sie sollte so schwach wie mΓΆglich gehalten sein (mΓΆglichst grosser Definitionsbereich).
Was genau beschreibt eine Nachbedingung und was muss man beim Schreiben einer Nachbedingung beachten?
Sie beschreiben, was nach Funktionsaufruf gelten muss und spezifizieren Wert und Effekt des Funktionsaufrufes.
Sie sollten so stark wie mΓΆglich gehalten sein (mΓΆglichst detaillierte Aussage).
Betrachte die Funktion πππ (π, π), wobei π die Basis ist und π der Exponent.
Wie sehen gute Pre- und Postconditions dieser Funktion aus?
//πΏππ΄: π >= 0 || π != 0.0 //πΏπΎππ: ππππππ πππππ ππ π^π
Weshalb kann man ΓΌber gute Pre- und Postconditions sagen, sie seien ein βKompromiss zwischen formaler Korrektheit und lascher Praxisβ?
Da exakte Pre- und Postconditions plattformabhΓ€ngig und sehr kompliziert sind, abstrahiert man und gibt die mathematischen Bedingungen an, die fΓΌr alle FΓ€lle gelten.