programmieren in c Überblick c "was ist wichtig?" hochschule fulda – fb ai...

Post on 06-Apr-2015

104 Views

Category:

Documents

2 Downloads

Preview:

Click to see full reader

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 */

top related