Präsentation herunterladen
Die Präsentation wird geladen. Bitte warten
1
Funktionen
2
Beispiel:
3
int main(){ int geld; geld = 10; verdopple(geld); } void verdopple(int g){ g = 2 * g;
4
Was passiert beim Aufruf ?
5
int main(){ int geld; geld = 10; verdopple(geld); } Inhalt wird automatisch kopiert in die Variable g void verdopple(int g){ g = 2 * g; }
6
konkret:
7
int main(){ int geld; geld = 10; verdopple(geld); } 10 void verdopple(int g){ g = 2 * g; }
8
int main(){ int geld; geld = 10; verdopple(geld); } 10 void verdopple(int g){ g = 2 * g; }
9
int main(){ int geld; geld = 10; verdopple(geld); } 10 void verdopple(int g){ g = 2 * g; }
10
int main(){ int geld; geld = 10; verdopple(geld); } 10 void verdopple(int g){ g = 2 * g; }
11
int main(){ int geld; geld = 10; verdopple(geld); } 10 void verdopple(int g){ g = 2 * g; }
12
int main(){ int geld; geld = 10; verdopple(geld); } 10 void verdopple(int g){ g = 2 * g; }
13
int main(){ int geld; geld = 10; verdopple(geld); } 10 void verdopple(int g){ g = 2 * g; }
14
10 int main(){ int geld; geld = 10; verdopple(geld); } Aber: geld = 10
void verdopple(int g){ g = 2 * g; } 20 10
15
Mit der "Technik", die gerade in dem Beispiel vorgeführt wurde, kann man also keinen Output realisieren.
16
Deshalb werden wir (neben der "Technik" mit return) im Folgenden eine weitere "Technik" kennen lernen, mit der man einen Output realisieren kann.
17
Beispiel
18
Ein Hacker weiß nur, dass Sie durch einen Gewinn insgesamt Euro auf irgendeinem Konto haben. Kann er - nur mit diesem Wissen - Sie betrügen?
19
Nein, da er dadurch noch keinen Zugriff auf das Bankkonto hat.
20
Welche weitere Angabe benötigt er noch, um überhaupt einen Angriff (über Online-Banking)auf Ihr Bankkonto planen zu können?
21
Die Kontonummer = Adresse des Bankkontos
22
Bankkonto besteht also aus: Kontonummer =. Adresse Kontostand =
Bankkonto besteht also aus: Kontonummer = Adresse Kontostand = Inhalt (Wert)
23
Wie erfolgt nun ein Angriff auf Ihr Bankkonto, der den Kontostand um z
Wie erfolgt nun ein Angriff auf Ihr Bankkonto, der den Kontostand um z.B Euro vermindert ?
24
Kontostand (Euro) Herr Maier:
Kontonummer Kontostand Befehl des Hackers: Inhalt( ) = Inhalt( )
25
Das bedeutet für uns: Funktion erzeugt Output, indem ihr die Adresse einer Variablen übergeben wird. Die Funktion kann dann über die Adresse den Inhalt ändern.
26
Beispiel:
27
int main(){ int geld = 10; int erg; verdopple(geld, &erg); } void verdopple(int g, int *gn){ *gn = 2 * g;
28
verdopple(geld, &erg);
Wert wird automatisch kopiert in die Variable g Wert wird automatisch kopiert in die Variable gn verdopple(g, gn); *gn = 2 * g;
29
konkret:
30
verdopple(geld, &erg); } geld 0123 10 erg 0815 ?
int main(){ int geld = 10; int erg; verdopple(geld, &erg); } Name Adresse Wert geld 0123 10 erg 0815 ? 10 0815 void verdopple(int g, int *gn){ *gn = 2 * g; }
31
verdopple(geld, &erg); } geld 0123 10 erg 0815 ?
int main(){ int geld = 10; int erg; verdopple(geld, &erg); } Name Adresse Wert geld 0123 10 erg 0815 ? 10 0815 void verdopple(int g, int *gn){ *gn = 2 * g; }
32
verdopple(geld, &erg); } geld 0123 10 erg 0815 ?
int main(){ int geld = 10; int erg; verdopple(geld, &erg); } Name Adresse Wert geld 0123 10 erg 0815 ? 10 0815 void verdopple(int g, int *gn){ *gn = 2 * g; }
33
verdopple(geld, &erg); } geld 0123 10 erg 0815 ?
int main(){ int geld = 10; int erg; verdopple(geld, &erg); } Name Adresse Wert geld 0123 10 erg 0815 ? 10 0815 void verdopple(int g, int *gn){ *gn = 2 * g; }
34
verdopple(geld, &erg); } geld 0123 10 erg 0815 ?
int main(){ int geld = 10; int erg; verdopple(geld, &erg); } Name Adresse Wert geld 0123 10 erg 0815 ? 10 0815 void verdopple(int g, int *gn){ *gn = 2 * g; }
35
verdopple(geld, &erg); } geld 0123 10 erg 0815 ?
int main(){ int geld = 10; int erg; verdopple(geld, &erg); } Name Adresse Wert geld 0123 10 erg 0815 ? 10 0815 void verdopple(int g, int *gn){ *gn = 2 * g; }
36
verdopple(geld, &erg); } geld 0123 10 erg 0815 ?
int main(){ int geld = 10; int erg; verdopple(geld, &erg); } Name Adresse Wert geld 0123 10 erg 0815 ? 10 0815 void verdopple(int g, int *gn){ *gn = 2 * g; }
37
verdopple(geld, &erg); } geld 0123 10 erg 0815 ?
int main(){ int geld = 10; int erg; verdopple(geld, &erg); } Name Adresse Wert geld 0123 10 erg 0815 ? 10 0815 void verdopple(int g, int *gn){ *gn = 2 * g; }
38
verdopple(geld, &erg); } geld 0123 10 erg 0815 ?
int main(){ int geld = 10; int erg; verdopple(geld, &erg); } Name Adresse Wert geld 0123 10 erg 0815 ? 10 0815 void verdopple(int g, int *gn){ *gn = 2 * g; } 0815 10 20
39
verdopple(geld, &erg); } geld 0123 10 erg 0815
int main(){ int geld = 10; int erg; verdopple(geld, &erg); } Name Adresse Wert geld 0123 10 erg 0815 10 0815 void verdopple(int g, int *gn){ *gn = 2 * g; } 0815 10 20
40
20 int main(){ int geld = 10; int erg; verdopple(geld, &erg); } geld
Name Adresse Wert geld 0123 10 erg 0815 20 10 0815 void verdopple(int g, int *gn){ *gn = 2 * g; } 0815 10 20 erg = 20
41
Weitere Möglichkeit:
42
Beim Mosten: Man gibt 100 Kg Mostäpfel im Zuber ab und bekommt sie im gleichen Zuber zurück:
43
Äpfel
44
Most
45
Beispiel:
46
void verdopple(int *m){ *m = 2 * *m; }
int main(){ int geld = 10; verdopple(&geld); } Adresse Wert geld 0815 10 0815 void verdopple(int *m){ *m = 2 * *m; }
47
void verdopple(int *m){ *m = 2 * *m; }
int main(){ int geld = 10; verdopple(&geld); } Adresse Wert geld 0815 10 0815 void verdopple(int *m){ *m = 2 * *m; }
48
void verdopple(int *m){ *m = 2 * *m; }
int main(){ int geld = 10; verdopple(&geld); } Adresse Wert geld 0815 10 0815 void verdopple(int *m){ *m = 2 * *m; }
49
void verdopple(int *m){ *m = 2 * *m; }
int main(){ int geld = 10; verdopple(&geld); } Adresse Wert geld 0815 10 0815 void verdopple(int *m){ *m = 2 * *m; }
50
void verdopple(int *m){ *m = 2 * *m; }
int main(){ int geld = 10; verdopple(&geld); } Adresse Wert geld 0815 10 0815 void verdopple(int *m){ *m = 2 * *m; }
51
void verdopple(int *m){ *m = 2 * *m; }
int main(){ int geld = 10; verdopple(&geld); } Adresse Wert geld 0815 10 0815 void verdopple(int *m){ *m = 2 * *m; }
52
void verdopple(int *m){ *m = 2 * *m; }
int main(){ int geld = 10; verdopple(&geld); } Adresse Wert geld 0815 10 0815 void verdopple(int *m){ *m = 2 * *m; }
53
void verdopple(int *m){ *m = 2 * *m; }
int main(){ int geld = 10; verdopple(&geld); } Adresse Wert geld 0815 10 0815 void verdopple(int *m){ *m = 2 * *m; }
54
void verdopple(int *m){ *m = 2 * *m; }
int main(){ int geld = 10; verdopple(&geld); } Adresse Wert geld 0815 10 0815 void verdopple(int *m){ *m = 2 * *m; }
55
void verdopple(int *m){ *m = 2 * *m; }
int main(){ int geld = 10; verdopple(&geld); } Adresse Wert geld 0815 10 0815 void verdopple(int *m){ *m = 2 * *m; }
56
void verdopple(int *m){ *m = 2 * *m; } 0815 0815
int main(){ int geld = 10; verdopple(&geld); } Adresse Wert geld 0815 10 0815 void verdopple(int *m){ *m = 2 * *m; } 0815 0815 20 10
57
20 int main(){ int geld = 10; verdopple(&geld); } geld 0815 20 0815
Adresse Wert geld 0815 20 0815 void verdopple(int *m){ *m = 2 * *m; } 0815 0815 20 // geld: 20 10
58
Welche weitere, schon bekannte Möglichkeit, gibt es noch ?
mit return
59
int main(){ int kohle; int erg; kohle = 10; erg = verdopple(kohle); } int verdopple(int knete){ int viel; viel = 2 * knete; return(viel); }
60
Wird bei einem Funktionsaufruf die Adresse einer Variablen übergeben, so nennt man dies: call by reference Wird dagegen der Wert einer Variablen (und nicht die Adresse) übergeben, nennt man dies: call by value.
61
Wir werden Funktionen IMMER nach dem folgenden Schema in einem Programm kommentieren: (siehe Arbeitsblatt)
62
#include "stdafx.h" #include <stdio.h> int berechne(double a, double b, double *u, double *f); int main(){ double s1; double s2; int erg; double flaeche; double umfang; s1=10; s2=20; erg = berechne(s1, s2, &umfang, &flaeche); if (erg==1) printf("Das Rechteck ist ein Quadrat"); printf("Umfang=%f Fläche=%f erg=%d", umfang, flaeche, erg); } /**************************************************************/ /** **/ /** int berechne(double a, double b, double *u, double *f) **/ /*#************************************************************/ /* Parameter: (i) double a>=0 : eine Seitenlänge des Rechtecks (i) double b>=0 : andere Seitenlänge des Rechtecks (o) double *u: Umfang des Rechtecks (o) double *f: Fläche des Rechtecks Return: (o) 1: Quadrat 2: Rechteck Beschreibung: Berechnet aus den beiden Seitenlängen a und b des Rechtecks den Umfang *u und die Fläche *f und bestimmt außerdem, ob es ein Quadrat oder ein Rechteck ist. */ int berechne(double a, double b, double *u, double *f){ int r; *u=2*(a+b); *f=a*b; if(a==b) r=1; else r=2; return(r);
63
Eine wichtige Bemerkung:
64
Eine Funktion ist eine Black Box, die im allgemeinen einen Input benötigt und daraus einen Output erstellt. Aus Sicht eines Kunden soll der Input nicht redundant (überflüssig) sein (wie z.B. runder Kreis, weisser Schnee).
65
Beispiel:
66
Es soll die Quersumme einer positiven, ganzen Zahl berechnet werden (z
Es soll die Quersumme einer positiven, ganzen Zahl berechnet werden (z.B. von 123: =6). Als Input genügt die Zahl. Die Angabe der Anzahl der Ziffern von 123 wäre redundant.
67
Dies soll gefälligst von der Funktion berechnet werden!!
D.h. möglichst viel Arbeit an die Funktion abdrücken!! Wenn man einen Urlaub im Hotel bucht, will man ja vorher das Hotel nicht auch noch selbst bauen.
68
Wenn man in einem Restaurant essen geht, will man ja auch kein Salz und Pfeffer mitnehmen, sondern dies soll geliefert werden.
Ähnliche Präsentationen
© 2024 SlidePlayer.org Inc.
All rights reserved.