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

Preview:

Citation preview

Funktionen

Beispiel:

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

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

Was passiert beim Aufruf ?

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

Inhalt wird automatisch kopiert in die Variable g

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

konkret:

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

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

10

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

10

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

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

10

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

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

10

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

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

10

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

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

10

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

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

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

10

Aber: geld = 10

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

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

10

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

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

Beispiel

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?

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

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

Die Kontonummer = Adresse des Bankkontos

Bankkonto besteht also aus:

Kontonummer =Adresse

Kontostand =Inhalt (Wert)

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

Kontostand (Euro) Herr Maier:

Kontonummer Kontostand

471108151 100 000

Befehl des Hackers:

Inhalt(471108151) = Inhalt(471108151) - 30000

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.

Beispiel:

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

void verdopple(int g, int *gn){ *gn = 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

konkret:

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

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

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

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

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

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

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

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

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

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

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

Weitere Möglichkeit:

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

Äpfel

Most

Beispiel:

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

0815

void verdopple(int *m){

*m = 2 * *m;}

0815 10

Adresse Wert

geld

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

void verdopple(int *m){

*m = 2 * *m;}

0815 10

Adresse Wert

geld

0815

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

void verdopple(int *m){

*m = 2 * *m;}

0815 10

Adresse Wert

geld

0815

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

void verdopple(int *m){

*m = 2 * *m;}

0815 10

Adresse Wert

geld

0815

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

void verdopple(int *m){

*m = 2 * *m;}

0815 10

Adresse Wert

geld

0815

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

void verdopple(int *m){

*m = 2 * *m;}

0815 10

Adresse Wert

geld

0815

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

void verdopple(int *m){

*m = 2 * *m;}

0815 10

Adresse Wert

geld

0815

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

void verdopple(int *m){

*m = 2 * *m;}

0815 10

Adresse Wert

geld

0815

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

void verdopple(int *m){

*m = 2 * *m;}

0815 10

Adresse Wert

geld

0815

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

void verdopple(int *m){

*m = 2 * *m;}

0815 10

Adresse Wert

geld

0815

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

0815

void verdopple(int *m){

*m = 2 * *m;}

0815

1020

0815

0815 10

Adresse Wert

geld

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

Welche weitere, schon bekannte Möglichkeit, gibt

es noch ?

mit return

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

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

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.

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

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

Eine wichtige Bemerkung:

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

Beispiel:

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.

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.

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

Recommended