68
Funktionen

Funktionen. Beispiel: int main(){ int geld; geld = 10; verdopple(geld); } void verdopple(int g){ g = 2 * g; }

Embed Size (px)

Citation preview

Page 1: Funktionen. Beispiel: int main(){ int geld; geld = 10; verdopple(geld); } void verdopple(int g){ g = 2 * g; }

Funktionen

Page 2: Funktionen. Beispiel: int main(){ int geld; geld = 10; verdopple(geld); } void verdopple(int g){ g = 2 * g; }

Beispiel:

Page 3: Funktionen. Beispiel: int main(){ int geld; geld = 10; verdopple(geld); } void verdopple(int g){ g = 2 * g; }

int main(){ int geld; geld = 10; verdopple(geld);}

void verdopple(int g){ g = 2 * g;}

Page 4: Funktionen. Beispiel: int main(){ int geld; geld = 10; verdopple(geld); } void verdopple(int g){ g = 2 * g; }

Was passiert beim Aufruf ?

Page 5: Funktionen. Beispiel: int main(){ int geld; geld = 10; verdopple(geld); } void verdopple(int g){ g = 2 * g; }

int main(){ int geld; geld = 10; verdopple(geld);}

Inhalt wird automatisch kopiert in die Variable g

void verdopple(int g){ g = 2 * g;}

Page 6: Funktionen. Beispiel: int main(){ int geld; geld = 10; verdopple(geld); } void verdopple(int g){ g = 2 * g; }

konkret:

Page 7: Funktionen. Beispiel: int main(){ int geld; geld = 10; verdopple(geld); } void verdopple(int g){ g = 2 * g; }

void verdopple(int g){ g = 2 * g;}

int main(){ int geld; geld = 10; verdopple(geld);}

10

Page 8: Funktionen. Beispiel: int main(){ int geld; geld = 10; verdopple(geld); } void verdopple(int g){ g = 2 * g; }

int main(){ int geld; geld = 10; verdopple(geld);}

10

void verdopple(int g){ g = 2 * g;}

Page 9: Funktionen. Beispiel: int main(){ int geld; geld = 10; verdopple(geld); } void verdopple(int g){ g = 2 * g; }

int main(){ int geld; geld = 10; verdopple(geld);}

10

void verdopple(int g){ g = 2 * g;}

Page 10: Funktionen. Beispiel: int main(){ int geld; geld = 10; verdopple(geld); } void verdopple(int g){ g = 2 * g; }

int main(){ int geld; geld = 10; verdopple(geld);}

10

void verdopple(int g){ g = 2 * g;}

Page 11: Funktionen. Beispiel: int main(){ int geld; geld = 10; verdopple(geld); } void verdopple(int g){ g = 2 * g; }

int main(){ int geld; geld = 10; verdopple(geld);}

10

void verdopple(int g){ g = 2 * g;}

Page 12: Funktionen. Beispiel: int main(){ int geld; geld = 10; verdopple(geld); } void verdopple(int g){ g = 2 * g; }

int main(){ int geld; geld = 10; verdopple(geld);}

10

void verdopple(int g){ g = 2 * g;}

Page 13: Funktionen. Beispiel: int main(){ int geld; geld = 10; verdopple(geld); } void verdopple(int g){ g = 2 * g; }

void verdopple(int g){ g = 2 * g;}

int main(){ int geld; geld = 10; verdopple(geld);}

10

Page 14: Funktionen. Beispiel: int main(){ int geld; geld = 10; verdopple(geld); } void verdopple(int g){ g = 2 * g; }

Aber: geld = 10

int main(){ int geld; geld = 10; verdopple(geld);}

void verdopple(int g){ g = 2 * g;} 1020

10

Page 15: Funktionen. Beispiel: int main(){ int geld; geld = 10; verdopple(geld); } void verdopple(int g){ g = 2 * g; }

Mit der "Technik", die gerade in dem Beispiel vorgeführt wurde, kann man also keinen Output realisieren.

Page 16: Funktionen. Beispiel: int main(){ int geld; geld = 10; verdopple(geld); } void verdopple(int g){ g = 2 * g; }

Deshalb werden wir (neben der "Technik" mit return) im Folgenden eine weitere "Technik" kennen lernen, mit der man einen Output realisieren kann.

Page 17: Funktionen. Beispiel: int main(){ int geld; geld = 10; verdopple(geld); } void verdopple(int g){ g = 2 * g; }

Beispiel

Page 18: Funktionen. Beispiel: int main(){ int geld; geld = 10; verdopple(geld); } void verdopple(int g){ g = 2 * g; }

Ein Hacker weiß nur, dass Sie durch einen Gewinn insgesamt 100 000 Euro auf irgendeinem Konto haben.Kann er - nur mit diesem Wissen - Sie betrügen?

Page 19: Funktionen. Beispiel: int main(){ int geld; geld = 10; verdopple(geld); } void verdopple(int g){ g = 2 * g; }

Nein, da er dadurch noch keinen Zugriff auf das Bankkonto hat.

Page 20: Funktionen. Beispiel: int main(){ int geld; geld = 10; verdopple(geld); } void verdopple(int g){ g = 2 * g; }

Welche weitere Angabe benötigt er noch, um überhaupt einen Angriff (über Online-Banking)auf Ihr Bankkonto planen zu können?

Page 21: Funktionen. Beispiel: int main(){ int geld; geld = 10; verdopple(geld); } void verdopple(int g){ g = 2 * g; }

Die Kontonummer = Adresse des Bankkontos

Page 22: Funktionen. Beispiel: int main(){ int geld; geld = 10; verdopple(geld); } void verdopple(int g){ g = 2 * g; }

Bankkonto besteht also aus:

Kontonummer =Adresse

Kontostand =Inhalt (Wert)

Page 23: Funktionen. Beispiel: int main(){ int geld; geld = 10; verdopple(geld); } void verdopple(int g){ g = 2 * g; }

Wie erfolgt nun ein Angriff auf Ihr Bankkonto, der den Kontostand um z.B. 30000 Euro vermindert ?

Page 24: Funktionen. Beispiel: int main(){ int geld; geld = 10; verdopple(geld); } void verdopple(int g){ g = 2 * g; }

Kontostand (Euro) Herr Maier:

Kontonummer Kontostand

471108151 100 000

Befehl des Hackers:

Inhalt(471108151) = Inhalt(471108151) - 30000

Page 25: Funktionen. Beispiel: int main(){ int geld; geld = 10; verdopple(geld); } void verdopple(int g){ g = 2 * g; }

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.

Page 26: Funktionen. Beispiel: int main(){ int geld; geld = 10; verdopple(geld); } void verdopple(int g){ g = 2 * g; }

Beispiel:

Page 27: Funktionen. Beispiel: int main(){ int geld; geld = 10; verdopple(geld); } void verdopple(int g){ g = 2 * g; }

int main(){ int geld = 10; int erg; verdopple(geld, &erg);}

void verdopple(int g, int *gn){ *gn = 2 * g;}

Page 28: Funktionen. Beispiel: int main(){ int geld; geld = 10; verdopple(geld); } void verdopple(int g){ g = 2 * g; }

verdopple(geld, &erg);

verdopple(g, gn);

Wert wird automatisch kopiert in die Variable g

*gn = 2 * g;

Wert wird automatisch kopiert in die Variable gn

Page 29: Funktionen. Beispiel: int main(){ int geld; geld = 10; verdopple(geld); } void verdopple(int g){ g = 2 * g; }

konkret:

Page 30: Funktionen. Beispiel: int main(){ int geld; geld = 10; verdopple(geld); } void verdopple(int g){ g = 2 * g; }

int main(){ int geld = 10; int erg; verdopple(geld, &erg);}

081510

void verdopple(int g, int *gn){

*gn = 2 * g;}

0123 10

Adresse Wert

geld0815 ?erg

Name

Page 31: Funktionen. Beispiel: int main(){ int geld; geld = 10; verdopple(geld); } void verdopple(int g){ g = 2 * g; }

int main(){ int geld = 10; int erg; verdopple(geld, &erg);}

void verdopple(int g, int *gn){

*gn = 2 * g;}

0123 10

Adresse Wert

geld0815 ?erg

Name

081510

Page 32: Funktionen. Beispiel: int main(){ int geld; geld = 10; verdopple(geld); } void verdopple(int g){ g = 2 * g; }

int main(){ int geld = 10; int erg; verdopple(geld, &erg);}

void verdopple(int g, int *gn){

*gn = 2 * g;}

0123 10

Adresse Wert

geld0815 ?erg

Name

081510

Page 33: Funktionen. Beispiel: int main(){ int geld; geld = 10; verdopple(geld); } void verdopple(int g){ g = 2 * g; }

int main(){ int geld = 10; int erg; verdopple(geld, &erg);}

void verdopple(int g, int *gn){

*gn = 2 * g;}

0123 10

Adresse Wert

geld0815 ?erg

Name

081510

Page 34: Funktionen. Beispiel: int main(){ int geld; geld = 10; verdopple(geld); } void verdopple(int g){ g = 2 * g; }

int main(){ int geld = 10; int erg; verdopple(geld, &erg);}

void verdopple(int g, int *gn){

*gn = 2 * g;}

0123 10

Adresse Wert

geld0815 ?erg

Name

081510

Page 35: Funktionen. Beispiel: int main(){ int geld; geld = 10; verdopple(geld); } void verdopple(int g){ g = 2 * g; }

int main(){ int geld = 10; int erg; verdopple(geld, &erg);}

void verdopple(int g, int *gn){

*gn = 2 * g;}

081510

0123 10

Adresse Wert

geld0815 ?erg

Name

Page 36: Funktionen. Beispiel: int main(){ int geld; geld = 10; verdopple(geld); } void verdopple(int g){ g = 2 * g; }

int main(){ int geld = 10; int erg; verdopple(geld, &erg);}

void verdopple(int g, int *gn){

*gn = 2 * g;}

081510

0123 10

Adresse Wert

geld0815 ?erg

Name

Page 37: Funktionen. Beispiel: int main(){ int geld; geld = 10; verdopple(geld); } void verdopple(int g){ g = 2 * g; }

int main(){ int geld = 10; int erg; verdopple(geld, &erg);}

void verdopple(int g, int *gn){

*gn = 2 * g;}

081510

0123 10

Adresse Wert

geld0815 ?erg

Name

Page 38: Funktionen. Beispiel: int main(){ int geld; geld = 10; verdopple(geld); } void verdopple(int g){ g = 2 * g; }

int main(){ int geld = 10; int erg; verdopple(geld, &erg);}

void verdopple(int g, int *gn){

*gn = 2 * g;}

081510

100815

20

0123 10

Adresse Wert

geld0815 ?erg

Name

Page 39: Funktionen. Beispiel: int main(){ int geld; geld = 10; verdopple(geld); } void verdopple(int g){ g = 2 * g; }

int main(){ int geld = 10; int erg; verdopple(geld, &erg);}

void verdopple(int g, int *gn){

*gn = 2 * g;}

100815

20

0123 10

Adresse Wert

geld0815erg

Name

081510

Page 40: Funktionen. Beispiel: int main(){ int geld; geld = 10; verdopple(geld); } void verdopple(int g){ g = 2 * g; }

int main(){ int geld = 10; int erg; verdopple(geld, &erg);}

void verdopple(int g, int *gn){

*gn = 2 * g;}

100815

2020

0123 10

Adresse Wert

geld0815 20erg

Name

erg =

081510

Page 41: Funktionen. Beispiel: int main(){ int geld; geld = 10; verdopple(geld); } void verdopple(int g){ g = 2 * g; }

Weitere Möglichkeit:

Page 42: Funktionen. Beispiel: int main(){ int geld; geld = 10; verdopple(geld); } void verdopple(int g){ g = 2 * g; }

Beim Mosten:Man gibt 100 Kg Mostäpfel im Zuber ab und bekommt sie im gleichen Zuber zurück:

Page 43: Funktionen. Beispiel: int main(){ int geld; geld = 10; verdopple(geld); } void verdopple(int g){ g = 2 * g; }

Äpfel

Page 44: Funktionen. Beispiel: int main(){ int geld; geld = 10; verdopple(geld); } void verdopple(int g){ g = 2 * g; }

Most

Page 45: Funktionen. Beispiel: int main(){ int geld; geld = 10; verdopple(geld); } void verdopple(int g){ g = 2 * g; }

Beispiel:

Page 46: Funktionen. Beispiel: int main(){ int geld; geld = 10; verdopple(geld); } void verdopple(int g){ g = 2 * g; }

int main(){ int geld = 10; verdopple(&geld);}

0815

void verdopple(int *m){

*m = 2 * *m;}

0815 10

Adresse Wert

geld

Page 47: Funktionen. Beispiel: int main(){ int geld; geld = 10; verdopple(geld); } void verdopple(int g){ g = 2 * g; }

int main(){ int geld = 10; verdopple(&geld);}

void verdopple(int *m){

*m = 2 * *m;}

0815 10

Adresse Wert

geld

0815

Page 48: Funktionen. Beispiel: int main(){ int geld; geld = 10; verdopple(geld); } void verdopple(int g){ g = 2 * g; }

int main(){ int geld = 10; verdopple(&geld);}

void verdopple(int *m){

*m = 2 * *m;}

0815 10

Adresse Wert

geld

0815

Page 49: Funktionen. Beispiel: int main(){ int geld; geld = 10; verdopple(geld); } void verdopple(int g){ g = 2 * g; }

int main(){ int geld = 10; verdopple(&geld);}

void verdopple(int *m){

*m = 2 * *m;}

0815 10

Adresse Wert

geld

0815

Page 50: Funktionen. Beispiel: int main(){ int geld; geld = 10; verdopple(geld); } void verdopple(int g){ g = 2 * g; }

int main(){ int geld = 10; verdopple(&geld);}

void verdopple(int *m){

*m = 2 * *m;}

0815 10

Adresse Wert

geld

0815

Page 51: Funktionen. Beispiel: int main(){ int geld; geld = 10; verdopple(geld); } void verdopple(int g){ g = 2 * g; }

int main(){ int geld = 10; verdopple(&geld);}

void verdopple(int *m){

*m = 2 * *m;}

0815 10

Adresse Wert

geld

0815

Page 52: Funktionen. Beispiel: int main(){ int geld; geld = 10; verdopple(geld); } void verdopple(int g){ g = 2 * g; }

int main(){ int geld = 10; verdopple(&geld);}

void verdopple(int *m){

*m = 2 * *m;}

0815 10

Adresse Wert

geld

0815

Page 53: Funktionen. Beispiel: int main(){ int geld; geld = 10; verdopple(geld); } void verdopple(int g){ g = 2 * g; }

int main(){ int geld = 10; verdopple(&geld);}

void verdopple(int *m){

*m = 2 * *m;}

0815 10

Adresse Wert

geld

0815

Page 54: Funktionen. Beispiel: int main(){ int geld; geld = 10; verdopple(geld); } void verdopple(int g){ g = 2 * g; }

int main(){ int geld = 10; verdopple(&geld);}

void verdopple(int *m){

*m = 2 * *m;}

0815 10

Adresse Wert

geld

0815

Page 55: Funktionen. Beispiel: int main(){ int geld; geld = 10; verdopple(geld); } void verdopple(int g){ g = 2 * g; }

int main(){ int geld = 10; verdopple(&geld);}

void verdopple(int *m){

*m = 2 * *m;}

0815 10

Adresse Wert

geld

0815

Page 56: Funktionen. Beispiel: int main(){ int geld; geld = 10; verdopple(geld); } void verdopple(int g){ g = 2 * g; }

int main(){ int geld = 10; verdopple(&geld);}

0815

void verdopple(int *m){

*m = 2 * *m;}

0815

1020

0815

0815 10

Adresse Wert

geld

Page 57: Funktionen. Beispiel: int main(){ int geld; geld = 10; verdopple(geld); } void verdopple(int g){ g = 2 * g; }

int main(){ int geld = 10; verdopple(&geld);}

0815

void verdopple(int *m){

*m = 2 * *m;}

0815

1020

0815

// geld: 20

0815 20

Adresse Wert

geld

Page 58: Funktionen. Beispiel: int main(){ int geld; geld = 10; verdopple(geld); } void verdopple(int g){ g = 2 * g; }

Welche weitere, schon bekannte Möglichkeit, gibt

es noch ?

mit return

Page 59: Funktionen. Beispiel: int main(){ int geld; geld = 10; verdopple(geld); } void verdopple(int g){ g = 2 * g; }

int main(){ int kohle; int erg; kohle = 10; erg = verdopple(kohle);}

int verdopple(int knete){ int viel; viel = 2 * knete; return(viel);}

Page 60: Funktionen. Beispiel: int main(){ int geld; geld = 10; verdopple(geld); } void verdopple(int g){ g = 2 * g; }

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.

Page 61: Funktionen. Beispiel: int main(){ int geld; geld = 10; verdopple(geld); } void verdopple(int g){ g = 2 * g; }

Wir werden Funktionen IMMERnach dem folgenden Schema in einem Programm kommentieren: (siehe Arbeitsblatt)

Page 62: Funktionen. Beispiel: int main(){ int geld; geld = 10; verdopple(geld); } void verdopple(int g){ g = 2 * g; }

#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);}

Page 63: Funktionen. Beispiel: int main(){ int geld; geld = 10; verdopple(geld); } void verdopple(int g){ g = 2 * g; }

Eine wichtige Bemerkung:

Page 64: Funktionen. Beispiel: int main(){ int geld; geld = 10; verdopple(geld); } void verdopple(int g){ g = 2 * g; }

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

Page 65: Funktionen. Beispiel: int main(){ int geld; geld = 10; verdopple(geld); } void verdopple(int g){ g = 2 * g; }

Beispiel:

Page 66: Funktionen. Beispiel: int main(){ int geld; geld = 10; verdopple(geld); } void verdopple(int g){ g = 2 * g; }

Es soll die Quersumme einer positiven, ganzen Zahl berechnet werden (z.B. von 123: 1+2+3 =6).Als Input genügt die Zahl. Die Angabe der Anzahl der Ziffern von 123 wäre redundant.

Page 67: Funktionen. Beispiel: int main(){ int geld; geld = 10; verdopple(geld); } void verdopple(int g){ g = 2 * g; }

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.

Page 68: Funktionen. Beispiel: int main(){ int geld; geld = 10; verdopple(geld); } void verdopple(int g){ g = 2 * g; }

Wenn man in einem Restaurant essen geht, will man ja auch kein Salz und Pfeffer mitnehmen, sondern dies soll geliefert werden.