Funktionen.

Slides:



Advertisements
Ähnliche Präsentationen
Objektorientierte Programmierung
Advertisements

der Universität Oldenburg
Funktionen, Felder und Parameter-übergabe
Kapselung , toString , equals , Java API
Klicke Dich mit der linken Maustaste durch das Übungsprogramm!
Abstrakte Klassen.
Datentyp- umwandlung. Literale sind: Bezeichner mit einem festen Wert wie z.B:
Klassenvariable (auch Klassendaten bzw. statische Attribute genannt) und statische Methoden.
REKURSION + ITERATION. Bemerkung: Die in den folgenden Folien angegebenen "Herleitungen" sind keine exakten Beweise, sondern Plausibilitätsbetrachtungen.
Strukturen. In einer Struktur kann eine beliebige Anzahl von Komponenten (Daten) mit unterschiedlichen Datentypen (im Gegensatz zu Feldern) zusammengefaßt.
ARRAY oder FELD oder VEKTOR
Dynamischer Speicher. Ein Vergleich aus dem täglichen Leben...
Dynamischer Speicher und Struktur
Klassenvariable. Da man für jede Kuh bzw. jede Henne auf dem Markt den gleichen Preis für ein Liter Milch, bzw. den gleichen Preis für ein Ei bekommt,
Konstruktoren.
WHILE - Anweisung.
Objekte werden als Adressen (Referenzen) übergeben. Dies führt manchmal zu unerwarteten Ergebnissen...
Parameterübergabe von zweidimensionalen Feldern in Funktionen.
Polymorphie (Vielgestaltigkeit)
Assoziationen (Beziehungen). Zwischen Objekten kann es eine Beziehung geben.
Polymorphie (Vielgestaltigkeit)
Objekte und Arbeitsspeicher
FOR Anweisung.
Der Präprozessor. Bevor der Compiler das Programm in Maschinencode übersetzt (nur dieser kann von der CPU, dem Herz des Computers, bearbeitet werden)
DO...WHILE Anweisung.
Dynamischer Speicher. In einer Funktion wird z.B. mit der Deklaration int i; Speicher auf dem sogenannten Stack reserviert. Wenn die Funktion verlassen.
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 7 Claudio Moraga, Gisbert Dittrich FBI Unido
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 5 Claudio Moraga; Gisbert Dittrich FBI Unido
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Vorlesung 2 SWS WS 99/00 Gisbert Dittrich FBI Unido
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Vorlesung 2 SWS WS 99/00 Gisbert Dittrich FBI Unido
Imperative Programmierung Funktionen und Parameter
PKJ 2005/1 Stefan Dissmann Methoden (Motivation) Idee: Identische Programmabschnitte zusammenfassen und mit einem Namen versehen Vorteile: Übersichtlichkeit.
PRJ 2007/1 Stefan Dissmann Motivation Problem: gleiche Datenstrukturen werden für verschiedene Objekte gebraucht: z.B. Listen von Studierenden, Kunden,
PKJ 2005/1 Stefan Dissmann Zusammenfassung Vorwoche Programm besteht aus mehreren Bestandteilen: Schlüsselwörter Sonderzeichen Bezeichner Kommentare Texte.
Zusammenfassung Vorwoche
PKJ 2005/1 Stefan Dissmann Zusammenfassung Vorwoche Methoden sind mit einem Namen versehene Programmabschnitte besitzen Rückgabetyp, Namen, Parameterliste.
Arrays,Strings&Pointer in C/C++
Struktogramme IF-ELSE FOR – Schleife
Grundkonzepte Java - Klassendefinition
Informatik Grundlagen, WS04, Seminar 11
Einführung in die Programmierung Wintersemester 2008/09 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Einführung in die Programmiersprache C 3.Tag Institut für Mathematische Optimierung - Technische Universität Braunschweig.
Javakurs FSS 2012 Lehrstuhl Stuckenschmidt
Grundlagen der Informatik 4 Lehrstuhl für Betriebssysteme 1 Wie werden Funktionen realisiert? Beispiel: int maximum(int x, int y) { int j = x; if (y >
Einführung in die Programmiersprache C 4
Vom Umgang mit Daten. public void myProgram() { int[] saeulenWerte = new int[world.getSizeX()]; for (int i = 0; i < saeulenWerte.length; i++) { saeulenWerte[i]
Prozeduren und Funktionen
Objektorientiertes Konstruieren
Die Grundidee Funktionsaufruf Funktionsname (Kopf) Code der Funktion
Aufruf einer Methode eines Objektes vom Typ „Bruch“
Programmiervorkurs WS 2014/15 Instanzmethoden
Polymorphie (Vielgestaltigkeit). Wenn eine Methode, wie z.B. print für verschiedene Programmteile steht (und z.B. einmal Objekte verschiedener Klassen.
early binding (frühe Bindung) late binding (späte Bindung)
A) Erklären Sie den Datentyp char. b) Erklären Sie den Datentyp Struct c) Erklären Sie die Wirkungsweise des Operators & bei Anwendung im Zusammenhang.
Erweiterte Zuweisungskompatibilität. Wie kann man Objekte verschiedener Klassen einer Klassenhierarchie einander zuweisen ?
Unterprogramme / Methoden
Funktionen. Aufgabe : Eingabe zweier Zahlen ---> Minimum bestimmen Dann nochmals Eingabe zweier Zahlen ---> Minimum bestimmen.
Dynamisches Array als "verkettete Liste". Ein Vergleich.
Pointer. Grundsätzliches: Im Arbeitsspeicher werden Daten gespeichert. Um auf die Daten eindeutig zugreifen zu können, werden diesen Daten Adressen zugeordnet.
Funktionen, Felder und Parameter- übergabe. Funktionsaufruf mit Feld als Parameter: Parameter = Name des Feldes.
Tutorium Software-Engineering SS14 Florian Manghofer.
Java Programme nur ein bisschen objektorientiert.
Tutorium Software-Engineering SS14 Florian Manghofer.
Tutorium Software-Engineering SS14 Florian Manghofer.
Funktionen (Zweck und Eigenschaften) Funktionen sind Unterprogramme, die einen bestimmten Zweck erfüllen Sie zerlegen Probleme in kleine, abgeschlossene.
Konstruktoren.
Programmieren in C Wie speichert C
Referenzen In c kennen wir gewöhnliche Variablen und Pointer.
REKURSION + ITERATION.
Zufallszahlen in C erzeugen
 Präsentation transkript:

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:

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

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

10 int main(){ int geld; geld = 10; verdopple(geld); } Aber: geld = 10 void verdopple(int g){ g = 2 * g; } 20 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 = Bankkonto besteht also aus: Kontonummer = Adresse Kontostand = Inhalt (Wert)

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. 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); Wert wird automatisch kopiert in die Variable g Wert wird automatisch kopiert in die Variable gn verdopple(g, gn); *gn = 2 * g;

konkret:

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

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

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

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

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

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

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

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

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

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

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

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:

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

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

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

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

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

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

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

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

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

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

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

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

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 IMMER nach 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 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.