Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

Programmieren in C Überblick C "Was ist wichtig?"

Ähnliche Präsentationen


Präsentation zum Thema: "Programmieren in C Überblick C "Was ist wichtig?""—  Präsentation transkript:

1 Programmieren in C Überblick C "Was ist wichtig?"
Hochschule Fulda – FB AI Sommersemester 2013/14 Peter Klingebiel, HS Fulda, DVZ

2 Zeichensatz von C 1 Buchstaben (incl. Unterstrich) ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz _ Ziffern Semikolon (z.B. am Ende einer Anweisung) ; Punkt (Gleitpunktzahlen, Selektionsoperator) . Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

3 Zeichensatz von C 2 Sonderzeichen (Operatoren, Satzzeichen) ( ) [ ] < > + - * / % ^ ~ & | = ! ? , : Anführungszeichen (Einzelzeichen, Strings) ' " Blockklammern { } Fluchtzeichen (für Sonderzeichen) \ Doppelkreuz (Preprozessordirektiven) # Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

4 Reservierte Worte in C C kennt (nur) 32 reservierte Worte auto break case char const continue default do double else enum extern float for goto if int long register return short signed sizeof static struct switch typedef union unsigned void volatile while Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

5 Bezeichner 1 Bezeichner (Identifier) für Konstanten, Variablen, Funktionen, Typen usw. müssen mit einem Buchstaben oder Unterstrich beginnen danach können Buchstaben, Unterstriche und Ziffern folgen Groß- und Kleinschreibung wird streng unterschieden keine Sonderzeichen (z.B. $ oder #) keine reservierten Worte Vorsicht bei vordefinierten Funktionsnamen Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

6 Bezeichner 2 Syntaxdiagramm
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

7 Datentypen 1 Menge von Werten und Menge von Operationen auf diesen Werten Konstanten / Variablen Datentypen bestimmen Darstellung der Werte im Rechner benötigten Speicherplatz zulässige Operationen Festlegung des Datentyps implizit durch Schreibweise bei Konstanten explizit durch Deklaration bei Variablen Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

8 Datentypen 2 Vordefinierte Grunddatentypen char Zeichen (ASCII-Kode, 8 Bit) int Ganzzahl (maschinenabhängig, meist 16 oder 32 Bit) float Gleitkommazahl (32 Bit, IEEE, etwa auf 6 Stellen genau) double doppelt genaue Gleitkommazahl (64 Bit, IEEE, etwa auf Stellen genau) void ohne Wert (z.B. Zeiger) Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

9 Datentypen 3 Type-Modifier spezifizieren Grunddatentypen short int, long int - legen Länge der Ganzzahl fest - maschinenabhängig, 16 Bit, 32 Bit - int kann auch fehlen long double - Gleitkommazahl, erw. Genauigkeit - oft 128 Bit, IEEE signed, unsigned - char/int mit/ohne Vorzeichen Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

10 Konstanten Konstanten haben einen festgelegten, unveränderbaren Wert
explizite Deklaration, z.B. const float pi = 3.141; implizite Notation, z.B. u = 2 * r * 3.141; mittels CPP textuelle implizite Ersetzung #define PI u = 2 * PI * r; Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

11 Variablen 1 Variable sind Platzhalter für Daten
haben einen festgelegten Speicherort, an dem der aktuelle Wert gespeichert wird der aktuelle Wert (an seinem Speicherort) ist veränderbar Attribute von Variablen: Datentyp Namen (Bezeichner, Identifier) Lebensdauer / Speicherklasse evtl. initialer Wert Sichtbarkeit (Scope) Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

12 Variablen 2 Deklaration / Definition von Variablen
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

13 Variablen 3 Variablen-Definitionen, z.B. double u; short int i, tab = 5; char *hallo = "Hallo, Welt!"; Position im Programm: außerhalb von Funktionen in einem Block, also zwischen { } Wert ist veränderbar (Zuweisung, Operation) Programmstruktur  Lebensdauer / Scope Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

14 Wie speichert C? 1 Hauptspeicher
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

15 Wie speichert C? 2 Programmstart und Aufruf von main()
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

16 Zeiger 1 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; Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

17 Zeiger 2 Zuweisung ip = &i;
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

18 Zeiger 3 In anderes Programmiersprachen, z.B. Ada oder Pascal, werden Pointer meist nur für dynamische Datentypen verwendet In C werden Zeiger leider schon von Anfang an für einfache Grundoperationen benötigt! Pointer notwendig für Eingaben: scanf("%d", &i); Pointer notwendig als Funktionsparameter: doit(int *i) Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

19 Funktionsaufruf und Parameter
Parameterübergabe als Werte (call by value), z.B. bei printf() Variable werden als Werte in den Adressraum der Funktion kopiert Parameterübergabe als Adresse (call by reference), z.B. bei scanf() Adressen der Variablen werden in den Adressraum der Funktion kopiert In Funktion sind die Parameter Zeiger Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

20 Call by value Kopie des Parameters an Funktion
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

21 Call by reference Kopie der Adresse an Funktion
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

22 Anweisung / Ausdruck 1 Programm setzt sich aus vielen Anweisungen (Zuweisungen, Vergleichen, Operationen, Funktionsaufrufen, usw.) zusammen Anweisung (statement) im strengen Sinn in C unbekannt Anweisung hat kein verwertbares Ergebnis Beispiel: Zuweisung in Pascal, Ada, … integer i; i := 123; Variable i hat nach Zuweisung den Wert 123, die Zuweisung selbst ist allerdings nicht weiter auswertbar! Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

23 Anweisung / Ausdruck 2 C kennt keine Anweisungen (statements), sondern nur Ausdrücke (expressions) Ausdruck hat einen Wert (wie in Assembler!) Beispiel: Zuweisung in C int i; i = 4711; Zuweisung kann auch ausgewertet werden: int a, b, c, i, j; a = b = c = 3; if(i = 4711) while(j = 1) Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

24 Anweisung / Ausdruck 3 Ausdruck  Gültige Kombination von Konstanten, Variablen, Operatoren, Funktionen Reihenfolge der Auswertung Vorrangregeln der Operatoren legen Reihenfolge der Auswertung implizit fest Klammern ( ) legen Vorrangregeln explizit fest Sind Vorrangregeln nicht eindeutig  Reihenfolge der Auswertung nicht definiert Compiler kann Ausdrücke / Teilausdrücke in effizient auswerten / optimieren Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

25 Datentypen short, int, long 1
Ganze Zahlen Typen short, int, long, long long Speicherbedarf maschinenabhängig short <= int <= long <= long long Heute z.B: short 16 Bit, int 32 Bit, long 64 Bit Vorzeichen signed mit Vorzeichen unsigned vorzeichenlos Konstanten, Beispiele: int a = 4711, b = -18; dezimal short x = 0x sedezimal (Basis 16) int y = 020; oktal (Basis 8) Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

26 Datentypen short, int, long 2
Operatoren / Operationen: Zuweisung = Beispiel: int i; i = 4711; Vorzeichen + - Beispiel: int j = -4711; Arithm. Op * / % Beispiel: k = i + j * 3 % 8; Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

27 Datentypen short, int, long 3
Vergleichsoperatoren == != < > <= >= expr1 op expr2 Ergebnis: wahr  1, falsch  0 Ergebnistyp  int Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

28 Datentypen short, int, long 4
Logische Operatoren ! && || Ergebnis: wahr  1, falsch  0 (Typ int) expr1 op expr2 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

29 Datentypen short, int, long 5
Bitoperatoren ~ & | ^ expr1 op expr2 bzw. ~expr Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

30 Datentypen short, int, long 6
Bitshiftoperatoren << >> expr1 op expr2 Bits in expr1 um expr2 Bits verschoben Bsp. 1 << 2 1 um 2 Bits nach links Bsp: n >> 5 n um 5 Bits nach rechts Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

31 Datentypen short, int, long 7
Inkrement- / Dekrementoperatoren Linkseitiger Operator ++n --n Wert von n wird inkrementiert / dekrementiert das Resultat wird als Ergebnis geliefert Rechtsseitiger Operator n++ n-- Wert von n wird als Ergebnis geliefert Danach wird n inkrementiert / dekrementiert Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

32 Datentyp char Einzelzeichen oder Integer 8 Bit
Speicherbedarf 1 Byte (8 Bit) Konstanten, Zeichen durch ' ' geklammert char c1 = 'A', c2 = '1', c3 = '\n' Sonderzeichen mit \ beschrieben, Bsp: '\n' Zeilentrenner (NL) '\t' Tabulator (TAB) '\0' Stringende (NUL) '\"' Anführungszeichen '\\' Backslash, Fluchtzeichen Darstellung im ASCII-Code  char Untertyp von Ganzzahlen int Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

33 Datentypen float, double, long double 1
Fließkommazahlen Typen float, double, long double Speicherbedarf float < double < long double float 32 Bit, double 64 Bit, long double 128 Bit Repräsentation nach IEEE 754 Beispiel: float 32 Bit Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

34 Datentypen float, double, long double 2
Konstanten, Beispiele: float p = 3.141, a = , b = (Obacht: 1 oder 0  int) 7.0e-3 (0.007) e2(765.43) Operatoren / Operationen: = (Zuweisung) (Vorzeichen) * / (arithm. Op.) == != < > <= >= (Vergleich) Vorsicht bei Vergleichsoperationen wegen Ungenauigkeiten in Darstellung (z.B. bei 0.0) Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

35 Weitere Operatoren 1 Spezielle Zuweisungsoperatoren  verkürzte Schreibweise für Operationen auf Variablen a op= b  a = a op b Arithm. Operatoren: * / % Bitoperatoren: << >> & | ^ Beispiele: int n = 12 n -= 24 n /= 3 n <<= 3 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

36 Weitere Operatoren 2 Operator sizeof
Ermittelt Größe von Typ / Variablen in Bytes Beispiel: long l; sl = sizeof(l) sd = sizeof(double) Beispiel: Sun Sparc 32 Bit Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

37 Weitere Operatoren 3 Komma-Operator ,
Erlaubt die Aneinanderreihung mehrerer Ausdrücke Wert = Wert des letzen Teilausdrucks Beispiel (etwas sinnlos): Beispiel (sinnvoller): for(i = 0, j = 0, k = 1; … ) Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

38 Weitere Operatoren 4 Bedingte Bewertung ? : expr1 ? expr 2 : expr3
Verkürzte Formulierung von Bedingungen Auswertung Erst Auswertung von expr1 Wenn expr1 ≠ 0 dann gesamter Ausdruck expr2 Sonst gesamter Ausdruck expr3 Beispiel max(a, b) und min(a, b): Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

39 Vorrangregeln bei Operatoren
Operatorenklasse Operatoren Assoziativität Unär ! ~ Von rechts nach links Multiplikativ * / % Von links nach rechts Additiv + - Shift << >> Relational < <= > >= Gleichheit == != Bitweise & ^ | Logisch && || Bedingte Bewertung ?: Zuweisung = op= Reihung , Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

40 Typumwandlung in Ausdrücken
Implizite (automatische) Typumwandlung Explizite Typumwandlung durch Casting: double x; int i = 3, j = 10; x = (double) i / (double) j; Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

41 Felder 1 Ein Feld (array) ist die Zusammenfassung von Daten gleichen Typs in einer Variablen Felder haben eine oder auch mehrere Dimensionen (Vektoren, Matrizen, …) Definition von Feldern: char sbuf[128]; int arr[] = { 1, 8, 7, -1, 2 }; short mat[2][2] = { 11, 12, 21, 22}; Mit der Felddefinition wird der benötigte Speicherplatz für die Variable reserviert Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

42 Felder 2 Zugriff auf Feldelemente mit Index in []: char c; c = sbuf[32]; sbuf[0] = 'A'; Die Feldindizierung beginnt immer mit 0! short s, mat[3][3]; s = mat[0][0]; Felder werden elementweise und Zeile für Zeile hintereinander abgespeichert Es gibt beim Zugriff keinerlei Überprüfungen auf Bereichsgrenzen von Feldern! Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

43 Felder 3 Feldnamen sind eigentlich Pointer, zeigen auf das erste Element im Feld Felder werden mit Adresse an Funktionen übergeben (wie Pointer) Feldindizes sind eigentlich Offsets und geben den Abstand zum Feldanfang an Bsp: ia[3]  *(&ia[0] + 3 * sizeof(int)) Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

44 Felder und Zeiger Felder reservieren bei der Definition den benötigten Speicherplatz Zeiger erhalten den Speicherplatz erst bei der Zuweisung des Objekts, auf das sie zeigen, oder bei dynamischer Speicherallokation Ähnlichkeit von Feldern und Zeigern  mächtige Pointerarithmetik möglich Manchmal ein wenig unverständlich! Pointer essentiell bei Zeichenketten (strings) Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

45 Zeichenketten 1 Zeichenketten (strings) sind eine Folge von Einzelzeichen char String ist terminiert mit '\0' Speicherbedarf: Länge + 1 Byte Beispiel: char *s; char *hallo = "Hallo, Welt!"; String  Pointer auf Feld von Elementen vom Typ char Nullstring  NULL (definiert in stdio.h) Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

46 Zeichenketten 2 Beispiel: char buffer[128]; char *bp = buffer;
Stringpointer bp  erstes Zeichen im Feld buffer  Ähnlichkeit von Feldern und Pointern! Beispiel: String kopieren und ausgeben Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

47 Kommandozeilenparameter
Bekannt: jedes C-Programm startet mit einer main-Funktion main-Funktion ist vom Typ int und hat drei Parameter: int argc Anzahl von Kommandozeilenparametern char *argv[] Feld von Strings  Kommandozeilenparameter char *envv[] Feld von Strings  Umgebungsparameter Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

48 Aufzählungsdatentyp Aufzählungsdatentyp enum
Für Datentypen mit diskreten konstanten Werten Beispiel: enum color { rot, gruen, blau } c; enum boolean { FALSE, TRUE } b; b = FALSE; c = blau; Darstellung als int beginnend mit 0, wenn nicht explizit angegeben: enum boolean { TRUE=1, FALSE=0 } b; b = TRUE; Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

49 Zusammengesetzte Datentypen 1
Zusammenfassung von zusammengehörigen Daten in eigenen Datentyp struct Beispiel einfaches EA-Gerät mit 8-Bit Steuerregister cr und 16-Bit Datenregister dr: struct { char cr; int dr; } ea1; struct _ea { char cr; int dr; } ea2; Zugriff durch Selektor . if(ea1.cr & 0x01) ea2.dr = 4711; Bei Pointern durch Selektor -> if(ea1->cr & 0x01) ea2->dr = 4711; Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

50 Zusammengesetzte Datentypen 2
Beispiel: Datentyp struct circle für Objekt Kreis in einem Zeichenprogramm notwendig  Mittelpunkt (x,y) und Radius r /* Kreis: Typ */ struct circle { int x; /* Mittelpunktkoordinate x */ int y; /* Mittelpunktkoordinate y */ int r; /* Radius */ }; struct circle c; c.x = 100; c.y = 100; c.r = 50; Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

51 Typdefinitionen Oft sinnvoll, eigene Typen oder Untertypen zu definieren typedef Beispiel: typedef unsigned char byte; Beispiel: typedef struct _ea { byte cr; int dr; } ea; ea ea1, ea2; Problem: Typprüfung bei C eher ungenau!  besser lesbar, bessere Dokumentation! Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

52 Anweisungen Anweisung im allgemeinsten Sinn:
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

53 Ausdrücke Ausdrücke Definitionen, Zuweisungen, … arithmetische, logische, … Operationen, … Bei Zuweisungen zu beachten: gültiger l-value und r-value l-value (left, location) Variable mit Speicherplatz r-value (right, read) auswertbarer Ausdruck Beispiel: int i, j; i = 9 / 3; /* gültiger l-value */ 45 = j; /* ungültiger l-value */ Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

54 Blöcke 1 Zusammenfassung mehrerer Anweisungen Geklammert mit { }
v.a. bei Funktionen, Kontrollstrukturen, aber auch lokale Blöcke, Unterblöcke zur Definition z.B. von lokalen Variablen, insbesondere Hilfsvariablen legt Lebensdauer von Variablen fest legt Sichtbarkeit (Scope) von Variablen fest Bei Namensgleichheit ist Variable des innersten Blocks sichtbar Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

55 Blöcke 2 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

56 Kontrollstrukturen Kontrolle des Programmablaufs abhängig von Ergebnis von Ausdrücken Selektionen / bedingte Anweisungen Einfache Alternative if … else Mehrfache Alternative if … else if … else Fallunterscheidung switch Iterationen / Schleifen Abweisende Schleife while Laufanweisung for Annehmende Schleife do … while Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

57 Selektionen 1 Bedingte Anweisung if Syntax: if (ausdruck) anweisung
Bedingte Anweisung if … else Syntax: if (ausdruck) anweisung else anweisung Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

58 Selektionen 2 Mehrfache Alternative if…else if…else
if (ausdruck_1) anweisung_1 else if(ausdruck_2) anweisung_2 else if(ausdruck_3) anweisung_3 else if (ausdruck_n) anweisung_n else /* kann auch fehlen */ anweisung_else Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

59 Selektionen 3 Mehrfache Alternative / Fallunterscheidung switch switch(ausdruck){ case k1: anweisung_1; break; case k2: anweisung_2; break; default: anweisung_default; } Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

60 Iterationen 1 Abweisende Schleife while, manchmal auch kopfgesteuerte Schleife genannt Syntax while (ausdruck) anweisung Bedingung ausdruck wird vor Ausführung vom Schleifenkörper anweisung geprüft Schleifenkörper wird nur ausgeführt, wenn Bedingung ausdruck wahr ist Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

61 Iterationen 2 Laufanweisung oder abweisenden Schleife mit for
Syntax for(ausdruck1; ausdruck2; ausdruck3) anweisung Kann durch while-Schleife ersetzt werden: ausdruck1; while(ausdruck2) { anweisung; ausdruck3; } Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

62 Iterationen 3 Nicht-annehmende Schleife do while, machmal auch: fußgesteuerte Schleife Syntax do anweisung while (ausdruck) Bedingung ausdruck wird erst am Ende des Schleifenkörperts geprüft  Schleife wird mindestens einmal durchlaufen Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

63 Iterationen 4 Schleifensteuerung break continue
bricht die Ausführung der Schleife bzw. switch-Anweisung ab und verlässt diese continue bricht den aktuellen Schleifendurchlauf ab setzt mit Ausführung des Schleifenkopfes fort Endlosschleife while(1) ... for(;;) ... Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

64 Funktionen 1 Funktionen sind Programmteile (Blöcke) mit Namen, ggfs. Parametern und ggfs. einem Rückgabewert 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) Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

65 Funktionen 2 dienen der Abstraktion Name und Parameter abstrahieren
vom tatsächlichen Programmstück von Darstellung und Verwendung der Daten Verwendung 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 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

66 Funktionen 3 Funktionsdefinition
Schnittstelle (Typ, Name, Parameterliste) Typ Datentyp, der von Funktion zurückgeliefert wird Kann beliebiger Typ sein void  kein Rückgabewert (Prozedur) Name Bezeichner kann beliebig gewählt sein keine Schlüsselworte Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

67 Funktionen 4 Syntaxdiagramm
Beispiel int add(int a, int b) { r = a + b; return(r); } Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

68 Funktionen 5 Formale Parameter beliebiger Typ, beliebiger Bezeichner
formale Parameter  Platzhalter für aktuelle an Funktion übergebene Parameter in Funktion wie vorbelegte lokale Variable Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

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

70 Funktionen 7 Aufruf einer Funktion
jeder Funktionsaufruf ist ein Ausdruck void-Funktionen können keine Teilausdrücke sein  wie Prozedur in anderen Sprachen Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

71 Funktionen 8 Die Ausdrücke in der Parameterliste werden vor dem 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 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

72 Funktionen 9 Funktionen werden global definiert  keine lokalen Funktionen möglich static beschränkt Funktion auf Modul main() ist normale Funktion, die aber beim Programmstart automatisch aufgerufen wird Rekursion ist möglich: int fak(int n) { if(n == 1) return(1); else return(n * fak(n-1)); } Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

73 Funktionen 10 Funktionen müssen deklariert sein, bevor sie aufgerufen werden können Name, Rückgabetyp und Parametertypen müssen dem Compiler bekannt sein Funktionsdefinition  Funktion ist automatisch deklariert und bekannt sonst Prototype, z.B. in Headerdatei typ name ( liste der parametertypen ); Beispiele: double sin(double); double cos(double x); Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

74 Funktionen 11 Parameterübergabe an Funktionen call by value
aktuelle Parameter werden in Speicherbereich der Funktion kopiert in Funktion: Änderungen nur lokal in Funktion call by reference In C nur über Zeiger realisierbar Adresse der Parameter werden in Funktion kopiert Änderungen an Parametern  Änderungen an den originalen Variablen Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

75 Speichersegmentierung
Programmcode und Programmdaten eines Programms werden von Betriebssystem in unterschiedliche Speichersegmente geladen Programmcode  Textsegment globale / statische Daten  Datensegmente Konstanten initialisierte / nichtinitialisierte Daten automatische Daten  Stacksegment Daten werden erst bei Eintritt in Block erzeugt dynamische Daten  Heapsegment Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

76 Speicherklassen 1 Funktionen können nur global, d.h. ausserhalb von Blöcken definiert werden Sichtbarkeit global static  Sichtbarkeit im Quelldateikontext Variablen können ausserhalb von Blöcken, d.h. global definiert werden Variablen können innerhalb von Blöcken, d.h. lokal oder automatisch definiert werden Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

77 Speicherklassen 2 auto static extern register
nur innerhalb eines Blocks, Standardklasse Variable existiert / ist sichtbar nur im Block static in Block: Variable erhält ihren Wert sonst: Variable/Funktion nur in C-Quelle sichtbar extern Variable ist in anderer C-Quelle definiert register Variable  CPU-Register, hat keine Adresse! Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

78 Lebensdauer Lebensdauer einer Variablen ist die Zeit, in der diese Variable Speicherplatz belegt lokale / automatische Variable „lebt“, d.h. hat einen Speicherort vom Anfang bis zum Ende des Blocks, in dem sie definiert ist Speicherplatz wird bei Verlassen des Blocks wieder freigegeben  Variable ist ungültig! Zugriff darauf ist dann undefiniert Globale oder statische Variable „lebt“ vom Anfang bis zum Ende des Programms Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

79 Sichtbarkeit 1 Der Sichtbarkeitsbereich (Scope) einer Variablen  Programmabschnitt, in dem die Variable sichtbar / nutzbar / gültig ist Der Scope wird durch den Ort der Definition bzw. Deklaration der Variablen festgelegt innerhalb eines Blocks  sichtbar von der Stelle der Definition bis zum Blockende ausserhalb  sichtbar von Stelle der Definition bzw. Deklaration bis zum Ende der Quelldatei mit static definierte Variablen sind nur im Modul (= C-Quelldatei) sichtbar Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

80 Sichtbarkeit 2 Globale Variable müssen ausserhalb von Blöcken definiert sein Variablen aus anderen Modulen (globale Variable) müssen explizit als extern deklariert werden Scope einer Funktion: Bereich auf Ebene des Programms, in der die Funktion nutzbar ist global sollte dann vor Nutzung bekannt sein (Prototype) lokal nur im Modul bei Definition als static Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

81 C-Preprozessor 1 C-Preprozessor bearbeitet C-Quelltexte vor dem eigentlichen Compilerlauf reiner textueller Eingriff in den Quelltext CPP hat eigene Syntax # leitet CPP-Anweisungen ein CPP-Anweisungen nicht mit ; terminiert! Wichtige Direktiven von CPP: #include – Dateien einfügen #define – Makros definieren #if / #ifdef – Bedingte Compilierung Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

82 C-Preprozessor 2 #include – fügt den Inhalt anderer Dateien (sog. Headerfiles) in den Quelltext ein Includedateien enthalten i.w. Deklarationen von Funktionen (prototypes) Deklarationen von Datentypen Deklarationen von externen/globalen Variablen Definitionen von Konstanten (const) Definitionen von Konstanten als CPP-Makro Definitionen von CPP-Makros Bedingte Compilierung Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

83 C-Preprozessor 3 #define – definiert ein Makro  Textersatz #define makroname #define makroname ersatztext #undef makroname Beispiele: #define UNIX - Makro UNIX definiert, z.B. zur Verwendung bei bedingter Compilierung #define EOF (-1) - Makro EOF wird durch Ersatztext (-1) ersetzt  wie Konstante #undef TEST - Makro TEST nicht definiert Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

84 C-Preprozessor 4 Parametrisierte Makros
Makroparameter werden in Ersatztext ersetzt Beispiel: #define min(a, b) (a < b ? a : b) Quelltext int i = 2, j = 3, m; m = min(i, j); Nach CPP-Lauf: int i = 2, j = 3, m; m = (i < j ? i : j); Achtung: Nebeneffekte!!! Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

85 C-Preprozessor 5 Bedingte Compilierung  Verändern des Quelltextes abhängig von CPP-Makros Syntax #if (expr1) #elif (expr2) #else #endif und #ifdef (symbol) #ifndef (symbol) Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

86 Module 1 Um größere Programmprojekte überschaubar und sicherer zu machen, wird die Aufgabe in kleinere Teilaufgaben (= Module) zerlegt  Reduktion der Komplexität  separates Entwickeln und Testen  Wiederverwendbarkeit von Programmteilen  Erstellen von Programmbibliotheken Abstraktion von Daten und Funktionen Kapselung von Daten Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

87 Module 2  Black Box Ein Modul in C ist eine Quelldatei, in der eine oder mehrere Funktionen zusammengefasst werden Interne Funktionen möglich, die nur innerhalb des Moduls sichtbar sind Interne Variable möglich, die nur innerhalb des Moduls zugreifbar sind  Definition als static Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

88 Module 3 Projekt: Module und Bibliotheken
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

89 Module 4 Schnittstellen eines Moduls, Funktionen und ggfs. Variablen in Headerdatei beschrieben Getrennte Übersetzung der Quelldateien und Erzeugen von Objektkode Erstellen von Programmbibliotheken zur leichten Wiederverwendbarkeit Zusammenmontieren des ausführbaren Programms aus Objektkode der Quellen und der Module sowie aus Bibliotheken Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

90 Bibliotheken 1 in der Programmiersprache C sind nur die notwendigsten Grundfunktionalitäten definiert es fehlen z.B. Funktionen für Ein-/Ausgabe, Funktionen für Dateihandling, Funktionen für Stringhandling, höhere mathematische Funktionen und vieles andere mehr erleichtert die Entwicklung eines C-Compilers leichtere Anpassung / Übertragung auf andere Hardware oder Betriebssysteme Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

91 Bibliotheken 2 Sehr viele der in der Sprachdefinition nicht enthaltenen Funktionen werden in sog. Funktionsbibliotheken, wie z.B. der C-Standardbibliothek, mitgeliefert In der Standardbibliothek sind u.a. enthalten Ein- und Ausgabefunktionen, Dateihandling, Stringfunktionen u.v.m.  libc Mathematische Funktionen  libm und viele, viele weitere Funktionen Die C-Standardbibliothek ist „genormt“ Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

92 Bibliotheken 3 Funktionen sind zu funktionalen Gruppen zusammengefasst  jeweils eine eigene Headerdatei In den Headerdateien sind Prototypen der Funktionen, Typen, Konstanten, Makros usw. definiert oder deklariert Beispiele: Ein- und Ausgabe  stdio.h Stringfunktionen  strings.h Mathematische Funktionen  math.h Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

93 Dateien / Dateihandling 1
Grundlegender Datentyp FILE zugrundeliegendes Modell: stream Daten- oder Bytestrom: Bytes werden sequentiell gepuffert gelesen / geschrieben Bsp: printf("HALLO, WELT"); Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

94 Dateien / Dateihandling 2
FILE *fopen(char *pn, char *mode) öffnet Datei mit dem Pfadname pn und verbindet einen stream mit der Datei liefert einen Zeiger vom Typ FILE * auf den geöffneten stream mode gibt den Modus an: r, rb read - lesen, Datei muss existieren w, wb write - schreiben, Datei wird erzeugt, Dateilänge auf 0 gesetzt a, ab append - schreiben, anhängen r+, rb+ update - lesen+schreiben Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

95 Dateien / Dateihandling 3
fopen() liefert NULL bei Fehler, Bsp: FILE *fp; fp = fopen("datei", "r"); if(fp == NULL) { perror("datei"); return(1); } void perror(char *msg) Gibt Systemfehlermeldung auf stderr aus int fclose(FILE *fp) schließt Verbindung zum stream fp Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

96 Dateien / Dateihandling 4
int fprintf(FILE *fp, char *fmt, /* args */ ...) formatiertes Schreiben auf stream fp liefert die Anzahl geschriebener Bytes printf()  fprintf(stdout, ...) int fscanf(FILE *fp, char *fmt, /* args */ ...) formatiertes Lesen von stream fp liefert Anzahl gelesener Elemente scanf()  fscanf(stdin, ...) Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

97 Dateien / Dateihandling 5
Viele weitere Ein-/Ausgabefunktionen für Zeichen, Beispiele: int fgetc(FILE *fp), int getc(FILE *fp) Zeichen von stream fp lesen liefert gelesenes Zeichen, EOF bei Dateiende getchar() fgetc(stdin) int fputc(int c, FILE *fp) int putc(int c, FILE *fp) Zeichen c auf stream fp ausgeben putchar(c)  fputc(c, stdout) Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

98 Dateien / Dateihandling 6
String-Ein-/Ausgabe, Beispiele: char *fgets(char *s, int n, FILE *fp) Zeile von fp in Puffer s lesen, maximal n Bytes liefert NULL bei Dateiende char *gets(char *s) Zeile von stdin in Puffer s einlesen int fputs(char *s, FILE *fp) String s auf stream fp ausgeben, EOF bei Fehler int puts(char *s) String s auf stdout ausgeben, EOF bei Fehler Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

99 Zeichen / Zeichenfunktionen
Klassifizierungsfunktionen für Zeichen #include <ctype.h> alle Funktionen liefern Rückgabewert ≠ 0, wenn Test ok, 0 sonst Funktionen zum Test von Zeichen, z.B. isalnum() zur Konvertierung von Zeichen, z.B. toupper() Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

100 Strings / Stringfunktionen 1
Kein eigener Datentyp für Strings in C! Strings sind Arrays vom Typ char oder Pointer auf char: char b[LEN]; bietet Platz für LEN-1 Zeichen char *s; Pointer s gültig erst nach Zuweisung auf char-Array, Konstante oder dyn. Speicherallozierung Strings werden mit ASCII-NUL '\0' terminiert dafür: ein weiteres Zeichen Speicherplatz nötig Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

101 Strings / Stringfunktionen 2
C-Standardbibliothek bietet eine große Menge an Stringfunktionen an Konvertierungsfunktionen #include <stdlib.h> z.B. int atoi(char *s) wandelt String s in int #include <stdio.h> int sscanf(char *s, char *fmt,...) formatierte Konvertierung aus dem String s int sprintf(char *s, char *fmt, …) formatierte Ausgabe auf String s Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

102 Strings / Stringfunktionen 3
Stringfunktionen, Beispiele #include <string.h> int strlen(char *s) liefert Länge des String s char *strcpy(char *s1, char *s2) kopiert String s2 nach String s1, bis zum s2 terminierenden NUL, liefert Ptr auf s1 int strcmp(char *s1, char *s2) vergleicht zeichenweise s1 und s2 liefert 0 bei Gleichheit sonst Differenz *s1-*s2 bei erstem Unterschied Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

103 Dynamischer Speicher Handling von dynamischem Speicher (Heap)
#include <stdlib.h> Anforderung von Speicher: void *malloc(size_t s) s Bytes allozieren void *calloc(size_t n, size_t s) s * n Bytes allozieren und mit 0 initialisieren return NULL bei Fehler, sonst Pointer auf Speicherbereich Freigabe von alloziertem Speicher void free(void *ptr) Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

104 Dynamische Listen 1 Häufig ist die Anzahl der zu speichernden und zu bearbeitenden Daten erst zur Laufzeit des Programms bekannt Felder ungeeignet: müssen zur Compilezeit oder in Blöcken dimensioniert werden  dynamische Datenstrukturen einfach verkettete Listen doppelt verkettete Listen Bäume usw. Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

105 Dynamische Listen 2 Beispiel: einfach verkettete Liste /* Datentyp f. einfach verkettete Liste */ typedef struct _slist { int value; /* Daten */ struct slist *next; /* Nachfolger */ } slist; Beispiel: doppelt verkette Liste /* Datentyp f. doppelt verkettete Liste */ typedef struct _dlist { int value; /* Daten */ struct dlist *prev; /* Vorgaenger */ struct dlist *next; /* Nachfolger */ } dlist; Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

106 Dynamische Listen 3 Objekte der Listentypen werden zur Laufzeit
alloziert slist *insert(slist *llp, int value){ slist *nlp; nlp = (slist *) malloc(sizeof(slist)); besetzt bzw. initialisiert nlp-> value = value; nlp->next = NULL; und in die Liste eingehängt if(llp) llp->next = nlp; return(nlp); } Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

107 Dynamische Listen 4 Einfache Liste: Erzeugung 1. Element
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

108 Dynamische Listen 5 Einfache Liste: n. Element und Verkettung
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

109 Dynamische Listen 6 Erstes Element wird oft Wurzel, Anker oder Kopf der Liste genannt Durchlaufen der Liste i.d.R. von der Wurzel der Liste aus slist *root, *slp; for(slp = root; slp; slp = slp->next) printf("%d\n", slp->value); Wird das letzte Listenobjekt mit der Wurzel verlinkt  Ringpuffer Sortieren bei Erzeugen der Liste möglich Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

110 Dynamische Listen 7 Doppelte Liste: Erzeugung 1. Element
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

111 Dynamische Listen 8 Doppelte Liste: n. Element und Verkettung
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

112 Dynamische Listen 9 Binäre Bäume
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

113 Sortieren 1 Sortieren von Zahlen, Strings, allgemein von Daten, ist oft auftretende Aufgabenstellung Meist: Daten sind in Feldern vorhanden  Sortieren von Feldelementen Intuitiver Algorithmus:  Bubblesort-Algorithmus Problem: Bubblesort ziemlich langsam Sehr viel schnellerer Algorithmus  Quicksort Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

114 Sortieren 2 Oft sind unterschiedliche Typen zu sortieren, z.B. Integer-, Double-, String-, Struct-Typen usw.  Generischer Sortieralgorithmus für Felder Sortieralgorithmen identisch bis auf Vergleichsfunktion compare() und eventuell Austauschfunktion swap()  Generische Funktionsparameter  Funktionen als Parameter Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

115 Sortieren 3 Generische Funktionsparameter  Nutzung des Typs void
Beispiel: generische swap-Funktion void swapv(void *s[], int i, int j) { void *t; t = s[i]; s[i] = s[j]; s[j] = t; } Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

116 Sortieren 4 Funktionen als Parameter
C erlaubt, Funktionen als Parameter an Funktionen zu übergeben und aufzurufen Übergabe der Funktion comp() void bsortv(void *v[], int n, int (*comp)(void *, void *)) { ... Aufruf der Funktion comp() if((* comp)(v[j], v[j+1]) > 0) ... Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

117 Sortieren 5 Mit generischen Funktionen und Funktionen als Parametern  Sortieren von komplexen Datenstrukturen möglich Beispiel: Personaldaten typedef struct _person { /* Personaleintrag: */ int no; /* Personalnummer */ char *nn; /* Nachname */ char *vn; /* Vorname */ int gj; /* Geburtsjahr */ int gm; /* Geburtsmonat */ int gt; /* Geburtstag */ } person_t, *person_p; Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

118 Sortieren 6 Personalliste nach verschiedenen Kriterien (Name, P-Nr., Geburtsdatum) sortierbar  Implementierung einer Vergleichsfunktion Beispiel: Nachnamen vergleichen int compnn(person_p p1, person_p p2) { int n; if(n = strcmp(p1->nn, p2->nn)) return(n); else return(strcmp(p1->vn, p2->vn)); } Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

119 Suchen 1 Häufige Aufgabe: in größeren Datenmengen nach Einzelelementen suchen Oft: Daten in Feldern gespeichert Intuitives Verfahren: Feld mit Daten von Anfang bis Ende durchlaufen und nach gesuchtem Element fahnden ist bei großen Datenmengen sehr langsam notwendig bei unsortierten Daten / Feldern  Felder sortieren und in sortierten Feldern mit binärer Suche suchen Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

120 Suchen 2 Binärsuche: teilen und finden
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

121 Felder, Zeiger, Listen 1 Bekannt: Felder und Zeiger werden in C ganz ähnlich behandelt Wesentlichster Unterschied: Felder sind dimensioniert  ihnen ist ein fester Speicherort zugeordnet  für die zu speichernden Objekte / Feldelemente ist Platz vorhanden Zeiger weisen erst nach Zuweisung oder dyn. Allozierung auf den Speicherort ihrer Objekte Feldvariable  Adresse des 1. Elements Feldindizes  Offset im Feld Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

122 Felder, Zeiger, Listen 2 Konstante Dimensionierung von Feldern double df[100]; /* Feld mit 100 Elementen */ Variable Dimensionierung von Feldern nur für automatische Feldvariable zulässig void fun(int n) { double df[n]; /* Feld mit n Elementen */ } Grund: Feldgröße muss beim Anlegen / bei Speicherzuweisung des Felds bekannt sein statisch / global  Compilezeit automatisch / lokal  Eintritt in Funktion / Block Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

123 Felder, Zeiger, Listen 3 variable Dimensionierung von statischen und globalen Feldern häufig benötigt Lösung  dynamische Feldallozierung Beispiel: double-Feld dynamisch duplizieren double *dbldup(double d[], int n) { double *df; int i; df = calloc(n, sizeof(double)); for(i = 0; i < n; i++) df[i] = d[i]; return(df); } Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

124 Felder, Zeiger, Listen 4 Problem oft: schnelles Suchen in dynamischen Daten / Objekten Suche in sortierten Feldern sehr schnell Suche in Listen (sortiert oder unsortiert) meist ziemlich langsam Balancierte Bäume sehr aufwendig  Kombination von Listen und Feldern  Listen: Speicherung dynamischer Daten  Felder: Sortierte Indizes der Daten Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

125 Datum und Zeit 1 Handling von Datum, Zeit, Zeitmessungen
#include <time.h> Grundtyp und -funktion (Systemcall) typedef long time_t; time_t time(time_t *t) liefert die aktuelle Systemzeit in Sekunden seit dem , 00:00:00 viele Funktionen für Datum und Zeit basierend auf time_t und time() Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

126 Datum und Zeit 2 Messung der benötigten CPU-Zeit
Typ und Funktion typedef long clock_t; clock_t clock(void); benötigte CPU-Zeit zwischen zwei Aufrufen von clock() in Mikrosekunden clock_t t1, t2, td; t1 = clock(); /* Erste Messung */ machwas(); t2 = clock(); /* Zweite Messung */ td = t2 - t1; /* CPU-Zeit in s */ Programmieren in C - Peter Klingebiel - HS Fulda - DVZ


Herunterladen ppt "Programmieren in C Überblick C "Was ist wichtig?""

Ähnliche Präsentationen


Google-Anzeigen