Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

Informatik II Grundlagen der Programmierung Programmieren in C Funktionen, Adressen, Zeiger Hochschule Fulda – FB ET Sommersemester 2014

Ähnliche Präsentationen


Präsentation zum Thema: "Informatik II Grundlagen der Programmierung Programmieren in C Funktionen, Adressen, Zeiger Hochschule Fulda – FB ET Sommersemester 2014"—  Präsentation transkript:

1 Informatik II Grundlagen der Programmierung Programmieren in C Funktionen, Adressen, Zeiger Hochschule Fulda – FB ET Sommersemester 2014 http://c-et.rz.hs-fulda.de Peter Klingebiel, HS Fulda, DVZ

2 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ2 Was können wir jetzt? 1

3 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ3 Was können wir jetzt? 2

4 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ4 Was können wir jetzt? 3 einfache Programme bestehend aus main() –und einigen/mehreren/vielen Zeilen C-Code … –mit überschaubaren Aufgabenstellungen … –und überschaubarer Komplexität … –auch wenn schon komplexere Programme hier und dort schon einmal gezeigt wurden doch meist sind die Aufgabenstellungen und damit auch die erforderlichen Programme sehr viel größer und sehr viel komplexer

5 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ5 Was ist erforderlich? 1 hohe Komplexität Komplexität reduzieren große Programme / Aufgaben in kleinere Programmteile / Teilaufgaben zerlegen oft gleiche / ähnliche Aufgabenstellung Wiederverwendbarkeit von Programm- teilen ermöglichen Konzept von Unterprogrammen / Sub- routinen / Prozeduren / Funktionen

6 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ6 Was ist erforderlich? 2 Beispiel: Hausbau in Fertigbauweise

7 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ7 Was ist erforderlich? 3 C bietet das Konzept von Funktionen eine Funktion realisiert eine fest umrissene Aufgabe bzw. Teilaufgabe Das hat viele Vorteile: kleinere Teile –sind einfacher zu verstehen/zu programmieren –können einfacher verändert werden –können einfacher überprüft/getestet werden –sind parallel erstellbar –sind wiederverwendbar –erfüllen eine klar definierte Aufgabe (Funktion)

8 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ8 Was ist erforderlich? 4 größeres Problem in kleinere Teile zerlegt Erinnerung: Adam Ries 123 * 45 123 * 4 * 10 + 123 * 5 aus komplexer Multiplikation wird einfache Multiplikation und einfache Addition Wir kennen und verwenden Funktionen –main(), printf(), scanf(), sqrt(), … sind nicht Teil der Sprache, sondern definiert in der C-Standardbibliothek wir können eigene Funktionen schreiben

9 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ9 Funktionen 1 Funktionen sind Programmteile (Blöcke) mit einem Typ, einem Namen, ggfs. Parametern (Eingangsdaten) und ggfs. Rückgabewert (Ausgangsdaten) elementare Bausteine für Programme –gliedern umfangreiche Aufgaben in kleinere Komponenten –reduzieren Komplexität –Wiederverwendung von Komponenten –verbergen Details der Implementierung vor anderen Programmteilen (black box)

10 Funktionen 2

11 Funktionen 3

12 Funktionen 4 C-Programm Daten werden durch die Mühlen von Funktionen geschoben

13 Funktionen 5

14 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ14 Funktionen 6 dienen der Abstraktion Name und Parameter abstrahieren –vom tatsächlichen Programmstück –von Darstellung und Verwendung der Daten Wiederverwendung –mehrfach benötigte Programmstücke werden einmal erstellt und können durch Angabe des Funktionsnamens aufgerufen werden –schrittweise Abstraktion möglich Entwurf top-down oder bottom-up

15 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ15 Funktionen 7 Beispiel: Summenbildung summe(a:b) int summe(int a, int b) { int sum; int i; for(sum = 0, i = a; i <= b; i++) sum = sum + i; return(sum); } Beliebig immer wieder verwendbar: s1 = summe(20, 50); s2 = summe(2, 120);

16 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ16 Funktionsdefinition 1 Schnittstelle (Typ, Name, Parameterliste) Typ –Datentyp, der von Funktion zurückgeliefert wird –kann ein beliebiger Datentyp sein –void kein Rückgabewert ( Prozedur) Name –Bezeichner kann nach den Regeln für Identifier beliebig gewählt sein, insb. keine Schlüsselworte Parameterliste –Typ und Name der Parameter –kann leer sein, dann () oder (void)

17 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ17 Funktionsdefinition 2 Syntaxdiagramm Beispiel int summe(int a, int b) { int sum;... return(sum); }

18 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ18 Funktionsdefinition 3 Formale Parameter beliebiger Typ, beliebiger Bezeichner formale Parameter Platzhalter für aktuelle an Funktion übergebene Parameter in Funktion wie vorbelegte lokale Variable

19 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ19 Funktionsdefinition 4 Beliebiger Block mit {} geklammert Zusätzliche Anweisung return(ausdruck) Rückkehr aus der Funktion Klammern bei return können entfallen Bei void -Funktion: nur return Nach Rückkehr aus Funktion Programm wird direkt nach Funktionsaufruf fortgesetzt Typ von Ausdruck und Funktion müssen übereinstimmen

20 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ20 Funktionsdefinition 5 Beispiel: Funktion summe() Funktionskopf: Typ, Name, Parameter int summe(int a, int b) Funktionskörper (body), Block { int sum; // lokale Variable int i; // lokale Variable for(sum = 0, i = a; i <= b; i++) sum = sum + i; return(sum); } Rückgabe int sum return(sum);

21 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ21 Funktionsaufruf 1 Funktionen werden aufgerufen im Programm steht –Name der Funktion –Parameter (Variable/Ausdrücke) in Klammern –ggfs. eine Zuweisung des Funktionswerts von aufrufender Stelle: Sprung in Funktion Beispiel: int s1, s2;... s1 = summe(20, 50); s2 = summe(2, 120);

22 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ22 Funktionsaufruf 2 Syntaxdiagramm: –jeder Funktionsaufruf ist ein Ausdruck –void -Funktionen können keine Teilausdrücke sein wie Prozedur in anderen Sprachen

23 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ23 Funktionsaufruf 3 die Ausdrücke in der Parameterliste werden vor dem Eintritt / Sprung in die Funktion ausgewertet aktuelle Parameter Anzahl und Typen der Ausdrücke der aktuellen Parameter müssen mit denen der formalen Parameter in der Definition der Funktion übereinstimmen die Auswertungsreihenfolge der Parameter- ausdrücke ist nicht festgelegt

24 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ24 Funktionsaufruf 4 Beispiel

25 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ25 Funktionsaufruf 5 vor Programmstart

26 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ26 Funktionsaufruf 6 Programmstart: Speicherreservierung

27 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ27 Funktionsaufruf 7 Kopieren des aktuellen Parameters a

28 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ28 Funktionsaufruf 8 Aufruf der Funktion quadrat()

29 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ29 Funktionsaufruf 9 In Funktion quadrat() : berechnen

30 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ30 Funktionsaufruf 10 Returnwert liefern in a kopieren

31 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ31 Funktionsaufruf 11 Rückkehr aus quadrat() nach main()

32 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ32 Funktionsaufruf 12 Nach Rückkehr

33 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ33 Funktionsaufruf 13

34 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ34 Funktionsaufruf 14

35 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ35 Funktionsaufruf 15

36 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ36 Funktionsaufruf 16

37 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ37 Exkurs: Adressen / Pointer 1 Noch einmal: a = quadrat(a); Wert des aktuellen Parameters a wird vor Aufruf von quadrat(a) in den Speicherraum der Funktion quadrat kopiert In der Funktion quadrat(int b) erhält der formale Parameter b den Wert von a und kann damit rechnen und ihn verändern der Wert von a bzw. a bleibt unverändert erst die Zuweisung a = quadrat(a); verändert im Beispiel den Wert von a

38 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ38 Exkurs: Adressen / Pointer 2 Frage: Wie kann der Wert eines Funktions- parameters verändert werden? Beispiel: void swap(int i, int j) { int t; // temporaere Variable t = i; // i zwischenspeichern i = j; // j auf i zuweisen j = t; // t auf j zuweisen } verändert der Aufruf swap(a, b) tatsächlich den Wert der aktuellen Parameter a und b ?

39 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ39 Exkurs: Adressen / Pointer 3 NEIN, da die aktuellen Parameter a und b mit ihrem Wert in die Funktion kopiert werden Veränderungen des Werts innerhalb einer Funktion haben keine Auswirkungen auf den Wert von aktuellen Parametern!

40 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ40 Exkurs: Adressen / Pointer 4 Die Lösung: Pointer oder Zeiger void swap(int *i, int *j) { int t; // temporaere Variable t = *i; // *i zwischenspeichern *i = *j; // *j auf *i zuweisen *j = t; // t auf *j zuweisen } Aufruf: swap(&a, &b);

41 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ41 Exkurs: Adressen / Pointer 5 Das kennen wir schon! Beispiel: Einlesen von Werten mit scanf() scanf( %d, &zahl); Parameter werden mit dem Adressoperator & versehen übergeben: &zahl in der Funktion: Pointer *z enthält Adresse / Speicherort des Parameters und kann so den Wert des Parameters zahl verändern Call by value oder Call by reference

42 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ42 Exkurs: Adressen / Pointer 6 Kennen wir auch schon: Wie C speichert

43 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ43 Exkurs: Adressen / Pointer 7 Speicherplatz von a, b, c Orte im Speicher

44 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ44 Exkurs: Adressen / Pointer 8 Zuweisung a=4; Wert an Speicherstelle

45 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ45 Exkurs: Adressen / Pointer 9 Wdh: Jede Variable hat einen Speicherort, d.h. eine Adresse im Hauptspeicher Zeiger (Pointer) sind Variable, die auf eine andere Variable verweisen, oder exakter: den Speicherort bzw. die Adresse dieser Variablen als Wert haben Pointerdefinition: int *ip; int i = 5; Adresszuweisung: ip = &i; Zugriff auf Wert: *ip = *ip + *ip;

46 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ46 Exkurs: Adressen / Pointer 10 Zugriff auf Variable mit Pointer

47 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ47 Exkurs: Adressen / Pointer 11 Vor Programmstart

48 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ48 Exkurs: Adressen / Pointer 12 Programmstart und Aufruf von main()

49 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ49 Exkurs: Adressen / Pointer 13 Zuweisung i = 5;

50 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ50 Exkurs: Adressen / Pointer 14 Zuweisung ip = &i;

51 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ51 Exkurs: Adressen / Pointer 15 Berechnung *ip + *ip;

52 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ52 Exkurs: Adressen / Pointer 16 Zuweisung *ip = *ip + *ip;

53 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ53 Exkurs: Adressen / Pointer 17 Danach

54 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ54 Funktionsaufruf und Parameter Parameterübergabe als Werte (call by value), z.B. bei printf() Variable werden als Werte in den Adress- raum der Funktion auf lokale Variable kopiert Parameterübergabe als Adresse (call by reference), z.B. bei scanf() Adressen der Variablen werden in den Adressraum der Funktion kopiert in der Funktion: Parameter sind Pointer!

55 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ55 Call by value 1 Beispiel: Funktionsaufruf cbv

56 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ56 Call by value 2 Vor Programmstart

57 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ57 Call by value 3 Zuweisung a = 4;

58 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ58 Call by value 4 Kopie des Parameters a in Funktion

59 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ59 Call by value 5 Aufruf der Funktion

60 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ60 Call by value 6 Zuweisung b = b * 2;

61 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ61 Call by value 7 Rückkehr aus Funktion

62 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ62 Call by value 8 Variable a unverändert!!!

63 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ63 Call by reference 1 Beispiel: Funktionsaufruf cbr

64 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ64 Call by reference 2 Vor Programmstart

65 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ65 Call by reference 3 Wo ist der Unterschied cbv – cbr?cbvcbr

66 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ66 Call by reference 4 Aufruf: Adresse der Variablen: doit(&a) !!!

67 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ67 Call by reference 5 In Funktion: *b Zeiger auf Variable!!!

68 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ68 Call by reference 6 Zuweisung a = 4;

69 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ69 Call by reference 7 Kopie der Adresse in die Funktion

70 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ70 Call by reference 8 Aufruf der Funktion

71 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ71 Call by reference 9 Zuweisung *b = *b * 2;

72 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ72 Call by reference 10 Rückkehr aus Funktion

73 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ73 Call by reference 11 So soll es sein: Variable a verändert!!!

74 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ74 Funktionsdeklaration 1 vor dem Aufruf einer Funktion muss diese dem C-Compiler bekannt sein –Name der Funktion –Typ der Funktion / des Rückgabewerts –Anzahl und Typen der Parameter ist die Funktion vor ihrem Aufruf definiert, ist sie dem Compiler bekannt andernfalls muss sie bekannt gemacht oder deklariert werden Prototype

75 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ75 Funktionsdeklaration 2 Beispiel: int power(int, int); oder int power(int b, int e); Deklaration erzeugt keinen Code! Nach der Deklaration kann die Funktion verwendet dann werden Compiler kann Name, Typ und Parameter prüfen erhöht Programmiersicherheit

76 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ76 Funktionsdeklaration 3 Funktionsdefinition (analog zu Variablen!) –erzeugt Code –macht Funktion (Typ, Name, Parameter) bekannt Funktionsdeklaration (analog zu Variablen) –macht Funktion (Typ, Name, Parameter) bekannt –vor Verwendung der Funktion Oft in Standard- (oder eigenen) Headerfiles –Konvention: Dateiname endet auf.h –#include fügt Headerdatei textuell in Quelltext ein deklarierte Funktionen bekannt

77 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ77 Funktionsdeklaration 4

78 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ78 Sichtbarkeit von Funktionen Eine C-Quelldatei stellt ein Modul dar (= Übersetzungseinheit) in einem Modul definierte Funktionen können in anderen Modulen verwendet werden sie sind damit extern sichtbar und werden durch Prototypes bekannt gemacht Soll Sichtbarkeit auf das Modul (= Quelldatei) beschränkt werden: static verwenden Beispiel: static int localfunc() {…}

79 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ79 Gedächtnis von Funktionen lokale Variable werden beim Eintritt in die Funktion im Speicher angelegt und nach Verlassen der Funktion ungültig ihre Werte verschwinden! Abhilfe: –globale Variable –ungünstig, Nebeneffekte! Vermeiden! –statische Variable in Funktion –Wert bleibt erhalten, sichtbar nur in Funktion –Bsp: static int wert = 1;

80 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ80 Optimierungen Rückgabewerte oft direkt als Parameter für Funktionsaufrufe verwendbar –ohne Zwischenspeicherung in Variablen –Beispiel: funa(funb(), func()); Funktionsaufruf kostet Zeit und Speicherplatz Funktion kann als inline definiert werden –Bsp: inline void swap(int i, int j){…} –statt Funktionsaufruf wird Funktionscode eingefügt –nur Empfehlung an den Compiler –gcc setzt Inlining bei Optimierung um (gcc –O)

81 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ81 Rekursion bei einem Funktionsaufruf wird ein eigener Speicherbereicht für lokale Variable (und damit auch für Parameter) angelegt damit ist möglich, dass eine Funktion sich selbst aufruft Rekursion Beispiel: Fakultätsfunktion n! = 1*2*…*n int fakultaet(int n) { if(n == 1) return(1); // Endebedingung else return(n * fakultaet(n – 1)); } elegante Lösungen möglich

82 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ82 Hinweise 1 zerteilen Sie eine größere Aufgabe in kleinere Teilaufgaben führen Sie Funktionen mit lokalen Variablen (einschl. Parametern) ein –vermeiden Sie globale Variable –wählen Sie aufschlussreiche Namen –klarer Zweck! –nicht zu groß! Besser aufteilen in Teilfunktionen! –nutzen Sie static -Funktionen –Deklaration von Prototypen

83 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ83 Hinweise 2 Definition, Deklaration und Aufruf von Funktionen müssen übereinstimmen –Typ des Funktionswertes –Anzahl, Typ und Reihenfolge der Parameter Eine Funktion hat nur einen Rückgabewert Bei Funktionen mit Rückgabewert immer return als letztes Statement Funktionsdefinition ohne Semikolon ; Funktionsdeklaration/Prototyp mit ;


Herunterladen ppt "Informatik II Grundlagen der Programmierung Programmieren in C Funktionen, Adressen, Zeiger Hochschule Fulda – FB ET Sommersemester 2014"

Ähnliche Präsentationen


Google-Anzeigen