programmieren in c Überblick c "was ist wichtig?" hochschule fulda – fb ai...
TRANSCRIPT
Programmieren in C
Überblick C"Was ist wichtig?"
Hochschule Fulda – FB AI
Sommersemester 2013/14
http://c.rz.hs-fulda.de
Peter Klingebiel, HS Fulda, DVZ
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 2
Zeichensatz von C 1
• Buchstaben (incl. Unterstrich)ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_
• Ziffern0123456789
• 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 charconst continue default dodouble else enum externfloat for goto ifint long register returnshort signed sizeof staticstruct switch typedef unionunsigned 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 undMenge 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 12 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 fehlenlong double - Gleitkommazahl, erw. Genauigkeit- oft 128 Bit, IEEEsigned, 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 3.141...
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, oderexakter: 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 vonKonstanten, 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; dezimalshort x = 0x20 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 = 2010 - 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 = -21.56, b = 0.54671.0 0.0 (Obacht: 1 oder 0 int)7.0e-3 (0.007) 7.6543e2(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 + - Von links nach rechts
Shift << >> Von links nach rechts
Relational < <= > >= Von links nach rechts
Gleichheit == != Von links nach rechts
Bitweise & Von links nach rechts
Bitweise ^ Von links nach rechts
Bitweise | Von links nach rechts
Logisch && Von links nach rechts
Logisch || Von links nach rechts
Bedingte Bewertung ?: Von rechts nach links
Zuweisung = op= Von rechts nach links
Reihung , Von links nach rechts
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 anBsp: 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 argcAnzahl 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 Zeichenprogrammnotwendig 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) anweisungelse anweisung
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 58
Selektionen 2
• Mehrfache Alternative if…else if…else if (ausdruck_1) anweisung_1else if(ausdruck_2) anweisung_2else if(ausdruck_3) anweisung_3else if (ausdruck_n) anweisung_n... ...else /* kann auch fehlen */ anweisung_else
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 59
Selektionen 3
• Mehrfache Alternative / Fallunterscheidungswitchswitch(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
• Syntaxwhile (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
• Syntaxfor(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
• Syntaxdo anweisungwhile (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
– 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
• Endlosschleifewhile(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öglichEntwurf 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
• Beispielint 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 Headerdateityp 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– Sichtbarkeit global– static Sichtbarkeit im Quelldateikontext
• 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– 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)
– Quelltextint 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 existierenw, wb write - schreiben, Datei wird erzeugt, Dateilänge auf 0 gesetzta, ab append - schreiben, anhängenr+, 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 – alloziertslist *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 ausslist *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• http://de.wikipedia.org/wiki/Bubblesort• Problem: Bubblesort ziemlich langsam• Sehr viel schnellerer Algorithmus Quicksort• http://de.wikipedia.org/wiki/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: Personaldatentypedef 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 Felderndouble df[100]; /* Feld mit 100 Elementen */
• Variable Dimensionierung von Feldern nur für automatische Feldvariable zulässigvoid 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 1.1.1970, 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 Funktiontypedef long clock_t;clock_t clock(void);
• benötigte CPU-Zeit zwischen zwei Aufrufen von clock() in Mikrosekundenclock_t t1, t2, td;t1 = clock(); /* Erste Messung */machwas();t2 = clock(); /* Zweite Messung */td = t2 - t1; /* CPU-Zeit in s */