Funktionen Flashcards

Funktionsdefinitionen- und Aufrufe; Auswertung von Funktionsaufrufen; Der Typ πšŸπš˜πš’πš

1
Q

WofΓΌr braucht man Funktionen?

A

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.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q

Betrachte folgenden Codeausschnitt:

πšπš˜πšžπš‹πš•πšŽ 𝚊;
πš’πš—πš πš—;
𝚜𝚝𝚍::πšŒπš’πš—&raquo_space; 𝚊;
𝚜𝚝𝚍::πšŒπš’πš—&raquo_space; πš—;

πšπš˜πšžπš‹πš•πšŽ πš›πšŽπšœπšžπš•πš = 𝟷.0;
πš’πš (πš— < 0) {
  𝚊 = 𝟷.0/𝚊;
  πš— = -πš—;
}
πšπš˜πš› (πš’πš—πš πš’ = 0; πš’ < πš—; ++πš’)
  πš›πšŽπšœπšžπš•πš *= 𝚊;

𝚜𝚝𝚍::𝚌𝚘𝚞𝚝 &laquo_space;𝚊 &laquo_space;”^” &laquo_space;πš— &laquo_space;” = β€œ &laquo_space;πš›πšŽπšœπšžπš•πš &laquo_space;”.\πš—β€;

Wie kΓΆnnte man ihn mithilfe einer Funktion vereinfachen? Um was fΓΌr eine Funktion geht es?

A

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

πšπš˜πšžπš‹πš•πšŽ πš™πš˜πš (πšπš˜πšžπš‹πš•πšŽ πš‹, πš’πš—πš 𝚎) {…}.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q

Wie sieht die Anatomie einer Funktion aus, d.h. aus welchen Elementen besteht sie?

A

πšƒ πšπš—πšŠπš–πšŽ (πšƒβ‚ πš™πš—πšŠπš–πšŽβ‚, πšƒβ‚‚ πš™πš—πšŠπš–πšŽβ‚‚, . . . ,πšƒβ‚™ πš™πš—πšŠπš–πšŽβ‚™)
{πš‹πš•πš˜πšŒπš”}

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

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
4
Q

Wie wΓΌrde eine Funktion aussehen, die das Minimum zweier ganzen Zahlen 𝚊 und πš‹ ausrechnet?

A

πš’πš—πš πš–πš’πš—(πš’πš—πš 𝚊, πš’πš—πš πš‹)
{
πš’πš (𝚊

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q

Was gilt fΓΌr die in einer Funktion deklarierten Typen, wenn die Funktion aufgerufen wird?

A

(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 πšπš˜πšžπš‹πš•πšŽ).

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q

Was gilt fΓΌr die in einer Funktion vorhandenen Werte, wenn die Funktion aufgerufen wird?

A

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.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
7
Q

In welcher Reihenfolge wird ein Funktionsaufruf ausgewertet? Was sind die Schritte?

A
  1. Auswertung der Aufrufargumente
  2. Initialisierung der formalen Argumente mit den resultierenden Werten
  3. AusfΓΌhrung des Rumpfes: formale Argumente verhalten sich dabei wie lokale Variablen.
  4. AusfΓΌhrung endet mit πš›πšŽπšπšžπš›πš— β€œexpr”.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
8
Q

Was sind formale Funktionsargumente?

A

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.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
9
Q

Was ist der Typ πšŸπš˜πš’πš und was macht eine Funktion mit diesem Typ?

A

πšŸπš˜πš’πš 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.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
10
Q

Betrachte folgende Funktion zum Vergleich zweier Zahlen:

πš‹πš˜πš˜πš• πšŒπš˜πš–πš™πšŠπš›πšŽ(πšπš•πš˜πšŠπš 𝚑, πšπš•πš˜πšŠπš 𝚒) {
πšπš•πš˜πšŠπš πšπšŽπš•πšπšŠ = 𝚑 - 𝚒;
πš’πš (πšπšŽπš•πšπšŠ*πšπšŽπš•πšπšŠ < 0.00𝟷𝚏) πš›πšŽπšπšžπš›πš— πšπš›πšžπšŽ;
}

Weswegen wird diese Funktion in den meisten FΓ€llen nicht funktionieren?

A

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.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
11
Q

Was sind Vor- und Nachbedingungen (pre and post conditions)? Was muss man allgemein beachten?

A

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.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
12
Q

Was genau beschreibt eine Vorbedingung und was muss man beim Schreiben einer Vorbedingung beachten?

A

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

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
13
Q

Was genau beschreibt eine Nachbedingung und was muss man beim Schreiben einer Nachbedingung beachten?

A

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

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
14
Q

Betrachte die Funktion πš™πš˜πš (πš‹, 𝚎), wobei πš‹ die Basis ist und 𝚎 der Exponent.
Wie sehen gute Pre- und Postconditions dieser Funktion aus?

A
//π™Ώπšπ™΄: 𝚎 >= 0 || πš‹ != 0.0
//π™Ώπ™Ύπš‚πšƒ: πš›πšŽπšπšžπš›πš— πšŸπšŠπš•πšžπšŽ πš’πšœ πš‹^𝚎
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
15
Q

Weshalb kann man ΓΌber gute Pre- und Postconditions sagen, sie seien ein β€œKompromiss zwischen formaler Korrektheit und lascher Praxis”?

A

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.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
16
Q

Wie kann man sicherstellen, das Vor- und Nachbedingungen beim Funktionsaufruf bzw. nach Funktionsaufruf auch gelten?

A

Mit Assertions, z.B. in der πš™πš˜πš (πš‹, 𝚎)-Funktion mit der Vorbedingung //π™Ώπšπ™΄: 𝚎 >= 0 || πš‹ != 0.0 fΓΌgt man eine Assert-Zeile hinzu:
πšŠπšœπšœπšŽπš›πš (𝚎 >= 0 || πš‹ != 0);

17
Q

Was ist das Problem mit Assertions, bzw. was kΓΆnnten allmΓ€hliche Schwachstellen sein? Was wΓ€ren Alternativen?

A

Falls die Assertion fehlschlΓ€gt, wird das Programm hart abgebrochen. DafΓΌr bilden die sogenannten Exceptions ein eleganteres Mittel, da es auf solche FehlschlΓ€ge situationsabhΓ€ngig reagiert und das Programm nicht gleich zum Teufel jagt.

(Anmerkung: Exceptions jedoch kein Teil dieser Vorlesung)

18
Q

Was bedeutet Stepwise Refinement? Wie sieht der Prozess aus und was fΓΌr Vorteile bringt er?

A

Ein grΓΆsseres Problem wird schrittweise gelΓΆst. Zu erst wird ganz grob abstrahiert, also nur mit Kommentaren und fiktiven Funktionen gearbeitet. Danach werden Schritt fΓΌr Schritt Kommentare durch Programmtest ersetzt und Funktionen implementiert.
Dies hat zum Vorteil, das das strukturelle VerstΓ€ndnis des Problems gefΓΆrdert wird und - falls die Verfeinerung grΓΆsstmΓΆglich durch Funktionen realisiert wird - TeillΓΆsungen auch bei anderen Problemen eingesetzt werden kΓΆnnen.
(FΓΌr Beispiel siehe Slides zur VL6: Rechteckproblem)

19
Q

Wie ist der GΓΌltigkeitsbereich einer Funktion definiert?

A

Der GΓΌltigkeitsbereich einer Funktion ist der Teil des Programmes, in dem die Funktion aufgerufen werden kann. Er ist definiert als die Vereinigung der GΓΌltigkeitsbereiche aller ihrer Deklarationen.

20
Q

Was sind Forward Declarations?

A

Forward Declarations sind Funktionen, die sich gegenseitig aufrufen (also eine Funktion in einer Funktion). Betrachte als Beispiel folgenden kommentierten Programmtext:

πš’πš—πš 𝚐(...);    //πšπš˜πš›πš πšŠπš›πš πšπšŽπšŒπš•πšŠπš›πšŠπšπš’πš˜πš—
πš’πš—πš 𝚏(...)    //𝚏 πšŠπš‹ πš‘πš’πšŽπš› πšπšžΜˆπš•πšπš’πš 
{ 
  𝚐(...)    //πš˜πš” 
}
πš’πš—πš 𝚐(...) 
{ 
  𝚏(...)    //πš˜πš” 
}
21
Q

Betrachte die Funktion πš™πš˜πš . Auch wenn man sie gerade in einem Programm braucht, welches genau dazu da ist, Potenzen zu berechnen, braucht man sie sicher noch in anderen Programmen. Wie kΓΆnnte man dieses Problem lΓΆsen, ohne jedes mal die Funktion neu zu schreiben? Wie macht man das? Was ist ein wesentlicher Nachteil dieser Methode?

A
Man inkludiert (kopiert) die Funktion ins Hauptprogramm, wenn man sie braucht. Dazu lagert man die Funktion erst als separates Programm ins Arbeitsverzeichnis aus, und inkludiert sie dann mittels der Anweisung #πš’πš—πšŒπš•πšžπšπšŽ im Hauptprogramm.
Der Nachteil ist jedoch, dass der Compiler die Funktionsdefinition fΓΌr jedes Programm neu ΓΌbersetzen muss, was bei sehr vielen und grossen Funktionen sehr lange dauern kann.
22
Q

Was ist die getrennte Übersetzung eines Programms? Betrachte die Funktion πšπš˜πšžπš‹πš•πšŽ πš™πš˜πš (πšπš˜πšžπš‹πš•πšŽ πš‹, πš’πš—πš 𝚎) innerhalb eines Programms mymath.cpp und das Programm callpow3.cpp, in dem die Funktion πš™πš˜πš  mindestens einmal aufgerufen wird: Gebe alle Schritte an, in denen das Programm getrennt ΓΌbersetzt werden wΓΌrde.

A

Bei der getrennten Übersetzung wird ein Programm unabhÀngig vom Hauptprogramm übersetzt.

  1. mymath.cpp wird in mymath.o (Objektcode, fΓΌr Menschen nicht / schwer lesbar; Zwischenschritt des Compilens) ΓΌbersetzt.
  2. Alle benΓΆtigten Symbole werden vom Programmierer in einer Header-Datei deklariert. Im Beispiel wΓΌrde diese Datei mymath.h (fΓΌr Header) so aussehen:
    //π™Ώπšπ™΄: 𝚎 >= 0 || πš‹ != 0.0
    //π™Ώπ™Ύπš‚πšƒ: πš›πšŽπšπšžπš›πš— πšŸπšŠπš•πšžπšŽ πš’πšœ πš‹^𝚎
    πšπš˜πšžπš‹πš•πšŽ πš™πš˜πš (πšπš˜πšžπš‹πš•πšŽ πš‹, πš’πš—πš 𝚎);
  3. Jedes mal, wenn eine Deklaration aus mymath im Programm (hier callpow3.cpp) inkludiert wird, wird das Hauptprogramm unabhΓ€ngig von mymath.cpp ΓΌbersetzt (hier wieder in Objekt-Code: callpow3.o)
  4. Der sogenannte Linker vereint nun den β€œUrsprung” der Funktion mymath.o mit dem Hauptprogramm callpow3.o zu einer wieder ausfΓΌhrbaren Datei callpow3.

Bemerke, dass mymath.cpp nach dem Erzeugen von mymath.o nicht mehr gebraucht wird.

(FΓΌr Bilder siehe Slides zur VL6)

23
Q

Was sind Bibliotheken?

A

Bibliotheken sind logische Gruppierungen Γ€hnlicher Funktionen, z.B. die Funktionen πš™πš˜πš , πšŽπš‘πš™, πš•πš˜πš, πšœπš’πš—, usw. werden zur Bibliothek πšŒπš–πšŠπšπš‘ gruppiert.

24
Q

Was ist der Vorteil, Funktionen aus einer Standartbibliothek zu verwenden gegenΓΌber dem Verwenden selbst erstellter Funktionen / Bibliotheken?

A
  • Vermeiden die Neuerfindung des Rades (wie z.B. bei πš™πš˜πš )
  • FΓΌhren auf einfache Weise zu interessanten und effizienten Programmen.
  • Garantieren einen QualitΓ€tsstandart.