Funktionen Aufgabe Eingabe zweier Zahlen Minimum bestimmen Dann
Funktionen
Aufgabe: Eingabe zweier Zahlen ---> Minimum bestimmen Dann nochmals Eingabe zweier Zahlen ---> Minimum bestimmen
Schreibaufwendige Lösung:
int main(){ int min 1, min 2; int z 1, z 2, z 3, z 4; printf("4 Zahlen eingebenn"); scanf("%d", &z 1); scanf("%d", &z 2); scanf("%d", &z 3); scanf("%d", &z 4); //. . .
. . . if (z 1<z 2) min 1 = z 1; else min 1 = z 2; if (z 3<z 4) min 2 = z 3; else min 2 = z 4; }
Die Nachteile sind: Schreibarbeit Unstrukturiertes Programm
Elegantere Lösung: Funktionen (Black Box)
Systemisch: Black-Box-Methode
Input Output Black Box
Input - Schnittstellenkanal zahl 1 Funktion: zahl 2 mini Output - Schnittstellenkanal
WICHTIG: Die Schnittstellenkanäle bzw. Input und Output werden hier durch Variablen realisiert.
int main(){ Wie heisst der Aufruf der int min 1, min 2; Funktion? int z 1, z 2, z 3, z 4; printf("4 Zahlen eingebenn"); scanf("%d", &z 1); scanf("%d", &z 2); scanf("%d", &z 3); scanf("%d", &z 4); min 1 = mini(z 1, z 2); // Aufruf min 2 = mini(z 3, z 4); // Aufruf printf("Min 1=%d, Min 2=%d", min 1, min 2); }
Der Funktionsaufruf: min 1 mini(z 1, z 2); kann man sich als einen Kanal vorstellen, der den Output von rechts nach links transportiert.
Der Funktionsaufruf: min 1 = mini(z 1, z 2); Zur besseren Vorstellung kann man sich diesen Funktionsaufruf auch wie folgt anschaulich vorstellen:
mini(z 1, z 2); Ein Zapfhahn wird in den Aufruf angebracht. Die Anzahl der Tropfen (bzw. der Flüssigkeit), d. h. min(z 1, z 2) wird. . min 1 in einem Behälter (einer Variablen) mit dem Namen min 1 aufgefangen (abgespeichert).
Weitere Möglichkeit eines Funktionsaufrufs: z 1 = 4; z 2 = 8; 6 min 1 = mini(6, 17); 8 min 2 = mini(z 2, 19); 4 min 1 = mini(13, z 1); 1 min 1 = mini(4, mini(2, 1));
Aber wie wird die Funktion definiert (programmiert) ?
Datentyp der Funktion lokale Variable int mini(int zahl 1, int zahl 2){ int erg; if(zahl 1 <= zahl 2) erg = zahl 1; return erzeugt output. Funktion wird dann sofort else verlassen. D. h. es kann nur genau erg = zahl 2; ein output realisiert werden return(erg); } Der sogenannte formale Parameter ist ein Input. Parameter, weil er einen reinen Input darstellt. Dies nennt man auch call by value
z. B. ersetzen beim vorigen Aufruf von mini(z 2, 19) die aktuellen Parameter z 2 und 19 die formalen Parameter (Platzhalter) zahl 1 und zahl 2 int mini(int zahl 1, int zahl 2){ int erg; if(zahl 1 <= zahl 2) erg = zahl 1; else erg = zahl 2; return(erg); } An den formalen Parameter wird beim Aufruf der Funktion ein tatsächlicher Übergabewert, der so genannte aktuelle Parameter übergeben.
Welche Variablen der Funktion mini sind vom Hauptprogramm aus sichtbar und umgekehrt ?
int mini(int zahl 1, int zahl 2) { int erg; if(zahl 1 <= zahl 2) erg = zahl 1; else erg = zahl 2; return(erg); }
Was geschieht ganz genau beim Aufruf (vom Hauptprogramm aus) der Funktion min 1 = mini(z 1 , z 2); im Gegensatz zum formalen Parameter heißen diese Parameter lokale Variable
min 1 = mini(z 1 , z 2); zahl 1=z 1 (Kopie) zahl 2=z 2 (Kopie) int erg; if(zahl 1 <= zahl 2) erg = zahl 1; else erg = zahl 2; return(erg);
Beispiel:
z 1 = 7; z 2 = 3; 3 min 1 = mini(z 1 , z 2); 3 7 int erg; 7 3 if(zahl 1 <= zahl 2) 7 erg = zahl 1; else 3 3 erg = zahl 2; 3 return(erg);
#include "stdafx. h" #include <stdio. h> int mini(int zahl 1, int zahl 2); int main(){ int min 1, min 2; int z 1, z 2, z 3, z 4; printf("1. Zahl eingebenn"); scanf("%d", &z 1); printf("2. Zahl eingebenn"); scanf("%d", &z 2); printf("3. Zahl eingebenn"); scanf("%d", &z 3); printf("4. Zahl eingebenn"); scanf("%d", &z 4); min 1 = mini(z 1, z 2); min 2 = mini(z 3, z 4); printf("1. Minimum=%dn", min 1); printf("2. Minimum=%dn", min 2); return 0; } int mini(int zahl 1, int zahl 2){ int erg; if(zahl 1 <= zahl 2) erg = zahl 1; else erg = zahl 2; return(erg); } // Deklaration Dies ist die Funktion main. Sie besitzt keine Parameter und wird im Gegensatz zu allen anderen Funktionen automatisch (ohne Zutun des Programmierers) beim Programmstart aufgerufen! D. h. die in ihr enthaltenen Anweisungen werden ausgeführt. // Definition Dies ist die Funktion mini
Bemerkung:
Funktion mini wird in der Funktion main (Hauptprogramm) benutzt, bevor sie erst später weiter unten definiert wurde. Deshalb muß sie dem Hauptprogramm bekannt gemacht werden, deshalb Deklaration der Funktion vor main:
#include "stdafx. h" #include <stdio. h> int mini(int zahl 1, int zahl 2); int main(){. . . min 1 = mini(z 1, z 2); . . .
Aufgaben Realisieren Sie die folgenden Funktionen und rufen diese in main je einmal auf: 1) Maximum zweier Zahlen 2) Mittelwert dreier Zahlen 3) Taschenrechner
#include "stdafx. h" #include <stdlib. h> double maximum(double zahl 1, double zahl 2); double taschenrechner(double z 1, double z 2, char modus); double mittelwert(double z 1, double z 2, double z 3); int main(){ double max, durchschnitt, erg; max = maximum(5 , 3. 6); durchschnitt = mittelwert(2, 6, 4); erg = taschenrechner(7, 9, '+'); printf("Maximum=%fn", max); printf("Mittelwert=%fn", durchschnitt); printf("TR-Ergebnis=%fn", erg); return 0; }
double maximum(double zahl 1, double int erg; if(zahl 1 < zahl 2) erg = zahl 2; else erg = zahl 1; return erg; } zahl 2){ double mittelwert(double z 1, double z 2, double z 3){ return (z 1+z 2+z 3)/3; }
double taschenrechner(double z 1, double z 2, char modus){ double erg; if(modus == '+'){ erg = z 1+z 2; } else if(modus == '-'){ erg = z 1 -z 2; } else if(modus == '*'){ erg = z 1*z 2; } else{ erg = z 1/z 2; } return erg; }
Bemerkung: Soll eine Funktion über ihren Namen keinen Wert zurückgeben, dann hat sie den Datentyp void.
void nichts(int note){ if(note <= 4) printf("gutn"); else printf("weniger gutn"); //auch möglich: //return; }
Bemerkung: Hat eine Funktion keinen Parameter, so wird dies in der Parameterliste mit void dargestellt. (void kann auch weggelassen werden).
void ausgabe (void){ printf("Hallo MESKn"); } // auch möglich: /* void ausgabe (){ printf("Hallo MESKn"); } */
Wo macht eine Funktion Sinn, die keinen Parameter hat und auch nichts zurückgibt ? Am Anfang eines Programms sollte der Anwender sogenannte Programminfos auf den Bildschirm bekommen, die ihn darüber aufklären, wie (z. B. welche Tasten er wann drücken soll) er das Programm bedienen soll.
Struktogramm einer Funktion:
Hier kommt Funktionsaufruf rein. Geben Sie ein Beispiel dazu an!
erg = mini(3, 5)
Die Funktion selbst (der Funktionenkörper) wird wieder in ein Struktogramm gepackt, vor das der Name, der Parameter und die Beschreibung der Funktion geschrieben wird.
Beispiel: Darstellen der Funktion mini (siehe oben) durch ein Struktogramm
i bedeutet Input-Parameter Name: mini o bedeutet Output-Parameter: (i) double z 1 : eine Zahl Wer will, kann statt return (i) double z 2 : eine Zahl auch Rückgabe schreiben (o): das Minimum dieser 2 Zahlen Beschreibung: Berechnet von den 2 Zahlen z 1 und z 2 das Minimum. z 1 < z 2 F W erg = z 1 erg = z 2 return erg
TIPP:
Der besseren übersichtlicheren Darstellung wegen, kann man die Funktion (Funktionen) in eine Header-Datei schreiben und dann mit #include. . . wieder einfügen.
Welche Funktionen kennen Sie schon, bevor Sie diese Präsentation angeschaut haben?
main() scanf(. . . ) printf(. . . )
- Slides: 48