37
Programmieren in C Felder, Zeiger und Listen Datum und Zeit, Mathematische Funktionen Hochschule Fulda – FB AI Sommersemester 2013/14 http://c.rz.hs-fulda.de Peter Klingebiel, HS Fulda, DVZ

Programmieren in C Felder, Zeiger und Listen Datum und Zeit, Mathematische Funktionen Hochschule Fulda – FB AI Sommersemester 2013/14

Embed Size (px)

Citation preview

Page 1: Programmieren in C Felder, Zeiger und Listen Datum und Zeit, Mathematische Funktionen Hochschule Fulda – FB AI Sommersemester 2013/14

Programmieren in C

Felder, Zeiger und ListenDatum und Zeit, Mathematische Funktionen

Hochschule Fulda – FB AI

Sommersemester 2013/14

http://c.rz.hs-fulda.de

Peter Klingebiel, HS Fulda, DVZ

Page 2: Programmieren in C Felder, Zeiger und Listen Datum und Zeit, Mathematische Funktionen Hochschule Fulda – FB AI Sommersemester 2013/14

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 2

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

Page 3: Programmieren in C Felder, Zeiger und Listen Datum und Zeit, Mathematische Funktionen Hochschule Fulda – FB AI Sommersemester 2013/14

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 3

Felder, Zeiger, Listen 2

• Beispiel char-Felder oder Strings

#define N 32

char buf[N] = {...}; /* N char-Feld */char *bp1; /* dangling Ptr */char *bp2; /* dangling Ptr */int i;

bp1 = buf; /* bp1 -> &buf[0] */bp2 = malloc(N); /* bp2 -> N char */

for(i=0; i<N; i++) /* Kopieren */ bp2[i] = bp1[i]; /* Zeiger ~ Feld */

Page 4: Programmieren in C Felder, Zeiger und Listen Datum und Zeit, Mathematische Funktionen Hochschule Fulda – FB AI Sommersemester 2013/14

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 4

Felder, Zeiger, Listen 3

• 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

Page 5: Programmieren in C Felder, Zeiger und Listen Datum und Zeit, Mathematische Funktionen Hochschule Fulda – FB AI Sommersemester 2013/14

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 5

Felder, Zeiger, Listen 4

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

Page 6: Programmieren in C Felder, Zeiger und Listen Datum und Zeit, Mathematische Funktionen Hochschule Fulda – FB AI Sommersemester 2013/14

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 6

Felder, Zeiger, Listen 5

• 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– sortiert, unsortiert, balaciert usw.

Page 7: Programmieren in C Felder, Zeiger und Listen Datum und Zeit, Mathematische Funktionen Hochschule Fulda – FB AI Sommersemester 2013/14

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 7

Felder, Zeiger, Listen 6

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

Page 8: Programmieren in C Felder, Zeiger und Listen Datum und Zeit, Mathematische Funktionen Hochschule Fulda – FB AI Sommersemester 2013/14

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 8

Felder, Zeiger, Listen 7

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

Page 9: Programmieren in C Felder, Zeiger und Listen Datum und Zeit, Mathematische Funktionen Hochschule Fulda – FB AI Sommersemester 2013/14

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 9

Felder, Zeiger, Listen 8

• Problem oft: schnelles Suchen in dynamischen Daten / Objekten

• Schnelle Suche in sortierte Feldern• Suche in Listen (sortiert oder unsortiert) sehr

langsam• Balanciert Bäume sehr aufwendig Kombination von Listen und Feldern Listen: Speicherung dynamischer Daten Felder: Sortierte Indizes der Daten

Page 10: Programmieren in C Felder, Zeiger und Listen Datum und Zeit, Mathematische Funktionen Hochschule Fulda – FB AI Sommersemester 2013/14

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 10

Felder, Zeiger, Listen 9

• Beispielanwendung: sortierte Tabellen für schnelle Ausgabe und Suche in Datenbank-Anwendungen Programm personal2.c

• Idee:– Personaldaten: dynamisch in Liste speichern beliebig Einträge einfügen und entfernen

– schnelle Suche / Ausgabe interessierende Listenelemente (Pers-Nr, Name, usw.) werdenin dynamisch erzeugten Feldern als Zeiger gespeichert und sortiert

– Aktualisierung bei jeder Änderung in der Liste

Page 11: Programmieren in C Felder, Zeiger und Listen Datum und Zeit, Mathematische Funktionen Hochschule Fulda – FB AI Sommersemester 2013/14

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 11

Felder, Zeiger, Listen 10

• dynamische Liste sortierte Felder

Page 12: Programmieren in C Felder, Zeiger und Listen Datum und Zeit, Mathematische Funktionen Hochschule Fulda – FB AI Sommersemester 2013/14

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 12

Felder, Zeiger, Listen 11

/* aus Personalliste p -> sortierte Felder */ void makelists(person_p p, int n){ if(pno) /* Feld existiert bereits */ free(pno); /* -> Speicher freigeben */ /* Feld pno neu erzeugen und initial. */ pno = makepers(p, n); /* Feld mit Ptrn nach Pers.-Nr. sortieren */ bsortv((void **)pno, n, (int (*)(void *, void *))compno); if(pnn) free(pnn); pnn = makepers(p, n); bsortv((void **)pnn, n, (int (*)(void *, void *))compnn); ...

Page 13: Programmieren in C Felder, Zeiger und Listen Datum und Zeit, Mathematische Funktionen Hochschule Fulda – FB AI Sommersemester 2013/14

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 13

Felder, Zeiger, Listen 12

/* aus Liste p Feld mit n Zeigern erzeugen */person_p *makepers(person_p p, int np) { person_p *n; int i; /* Speicher fuer npers Zeiger allozieren */ n = (person_p *)calloc(np+1,sizeof(person_p)); if(p == NULL) { /* Fehler bei Allozierung */ perror("makepers"); exit(1); } /* Zeiger aus Liste in Feld kopieren */ for(i = 0; p; i++, p = p->np) n[i] = p; return(n);}

Page 14: Programmieren in C Felder, Zeiger und Listen Datum und Zeit, Mathematische Funktionen Hochschule Fulda – FB AI Sommersemester 2013/14

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 14

Felder, Zeiger, Listen 13

• Personalprogramm personal2.c

Page 15: Programmieren in C Felder, Zeiger und Listen Datum und Zeit, Mathematische Funktionen Hochschule Fulda – FB AI Sommersemester 2013/14

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 15

Datum und Zeit 1

• Funktionen zum Handling von Datum / Zeit und 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

• ist t != NULL t enthält Systemzeit

Page 16: Programmieren in C Felder, Zeiger und Listen Datum und Zeit, Mathematische Funktionen Hochschule Fulda – FB AI Sommersemester 2013/14

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 16

Datum und Zeit 2

• Zeit als Stringchar *ctime(time_t *t);

• liefert die Zeit in t als String• Beispiel:#include <time.h>

time_t t;

t = time(NULL);printf("%s", ctime(&t));

• Ausgabe:Thu Jun 10 19:52:59 2010

Page 17: Programmieren in C Felder, Zeiger und Listen Datum und Zeit, Mathematische Funktionen Hochschule Fulda – FB AI Sommersemester 2013/14

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 17

Datum und Zeit 3

• Datentyp struct tm für Zeit und Datum

struct tm { int tm_sec; /* Sekunden: 0-59 */ int tm_min; /* Minuten: 0-59 */ int tm_hour; /* Stunden: 0-23 */ int tm_mday; /* Tag des Monats: 1-31 */ int tm_mon; /* Monate seit Jan: 0-11 */ int tm_year; /* Jahre seit 1900 */ int tm_wday; /* Tage seit Sonnt.: 0-6 */ int tm_yday; /* Tage seit 1.1.: 0-365 */ int tm_isdst; /* Sommerzeit: +1 */};

Page 18: Programmieren in C Felder, Zeiger und Listen Datum und Zeit, Mathematische Funktionen Hochschule Fulda – FB AI Sommersemester 2013/14

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 18

Datum und Zeit 4

• struct tm *localtime(time_t *t)• besetzt aus der Systemzeit in t die Elemente im struct tm und liefert einen Zeiger darauf

• Beispiel:time_t tt; /* Zeit seit 1.1.1970 */struct tm *tl; /* Datum-/Zeit-Struct */int d, m, y; /* Tag, Monat, Jahr */tt = time(NULL); /* akt. Zeit holen */tl = localtime(&tt); /* Struct besetzen */d = tl->tm_mday; /* -> Tag */m = tl->tm_mon + 1; /* -> Monat */ y = tl->tm_year + 1970; /* -> Jahr */printf("%d.%d.%d\n", d, m, y);

Page 19: Programmieren in C Felder, Zeiger und Listen Datum und Zeit, Mathematische Funktionen Hochschule Fulda – FB AI Sommersemester 2013/14

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 19

Datum und Zeit 5

• Beispielprogramm datum.c

Page 20: Programmieren in C Felder, Zeiger und Listen Datum und Zeit, Mathematische Funktionen Hochschule Fulda – FB AI Sommersemester 2013/14

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 20

Datum und Zeit 6

• einfache Messungen der CPU-Zeit• Typ und Funktiontypedef long clock_t;clock_t clock(void);

• verbrauchte CPU-Zeit zwischen zwei Aufrufen von clock() in Mikrosekundenclock_t t1, t2, tu;t1 = clock(); /* Erste Messung */system("bsort1 S S.bs");t2 = clock(); /* Neue Messung */tu = t2 - t1; /* CPU-Zeit in us */

Page 21: Programmieren in C Felder, Zeiger und Listen Datum und Zeit, Mathematische Funktionen Hochschule Fulda – FB AI Sommersemester 2013/14

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 21

Datum und Zeit 7

• Beispielprogramm clock.c

Page 22: Programmieren in C Felder, Zeiger und Listen Datum und Zeit, Mathematische Funktionen Hochschule Fulda – FB AI Sommersemester 2013/14

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 22

Mathematische Funktionen 1

• Funktionen für numerische Berechnungen in der Mathebibliothek libm.a

• muss ggfs. beim Binden explizit angegeben werden, z.B. bei UNIXcc num.c -o num -lm

• #include <math.h>• Typen float, double, long double• viele Konstanten, z.B.

#define M_E 2.7182818284590452354

#define M_PI 3.14159265358979323846

Page 23: Programmieren in C Felder, Zeiger und Listen Datum und Zeit, Mathematische Funktionen Hochschule Fulda – FB AI Sommersemester 2013/14

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 23

Mathematische Funktionen 2

• einige wichtige Funktionen• double sin(double x) Sinus von x• double cos(double x) Cosinus von x• double tan(double x) Tangens von x• double sinh(double x) Sinus Hyperbolicus• double cosh(double x) Cosinus Hyperbolicus • double tanh(double x) Tangens Hyperbolicus• double exp(double x) Exponentialfunktion ex • double log(double x) nat. Logarithmus ln(x)

• double log10(double x) Logarithmus log10(x)

Page 24: Programmieren in C Felder, Zeiger und Listen Datum und Zeit, Mathematische Funktionen Hochschule Fulda – FB AI Sommersemester 2013/14

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 24

Mathematische Funktionen 3

• weitere wichtige Funktionen• double pow(double x, double y) xy

Argumentfehler bei x = 0 und y < 0 oder bei x < 0 und y nicht ganzzahlig

• double sqrt(double x) Wurzel von x, x >= 0 • double ceil(double x) kleinster ganzzahliger

Wert, der nicht kleiner als x ist • double floor(double x) größter ganzzahliger

Wert, der nicht größer als x ist • double fabs(double x) Absolutwert | x |• double fmod(double x, double y) Rest x/y

Page 25: Programmieren in C Felder, Zeiger und Listen Datum und Zeit, Mathematische Funktionen Hochschule Fulda – FB AI Sommersemester 2013/14

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 25

Mathematische Funktionen 4

• Beispiel: log2.c

Page 26: Programmieren in C Felder, Zeiger und Listen Datum und Zeit, Mathematische Funktionen Hochschule Fulda – FB AI Sommersemester 2013/14

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 26

Mathematische Funktionen 5

• Beispiel: splot.c

Page 27: Programmieren in C Felder, Zeiger und Listen Datum und Zeit, Mathematische Funktionen Hochschule Fulda – FB AI Sommersemester 2013/14

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 27

Mathematische Funktionen 6

• Was zeigt diese Grafik?

Page 28: Programmieren in C Felder, Zeiger und Listen Datum und Zeit, Mathematische Funktionen Hochschule Fulda – FB AI Sommersemester 2013/14

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 28

Mathematische Funktionen 7

• Und diese?

Page 29: Programmieren in C Felder, Zeiger und Listen Datum und Zeit, Mathematische Funktionen Hochschule Fulda – FB AI Sommersemester 2013/14

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 29

Mathematische Funktionen 8

• … und diese?

Page 30: Programmieren in C Felder, Zeiger und Listen Datum und Zeit, Mathematische Funktionen Hochschule Fulda – FB AI Sommersemester 2013/14

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 30

Mathematische Funktionen 9

• Was zeigen Grafik und Fläche?

Page 31: Programmieren in C Felder, Zeiger und Listen Datum und Zeit, Mathematische Funktionen Hochschule Fulda – FB AI Sommersemester 2013/14

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 31

Mathematische Funktionen 10

• Numerische Integration: Trapezregel

Page 32: Programmieren in C Felder, Zeiger und Listen Datum und Zeit, Mathematische Funktionen Hochschule Fulda – FB AI Sommersemester 2013/14

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 32

Mathematische Funktionen 11

• Trapez-Algorithmus in C

double a, b, h, I;double x, y;int i, n;

h = (b – a) / n;I = 0.0;for(i = 0; i <= n; i++) { x = a + i * h; /* xi berechnen */ y = func(x); /* yi berechnen */ if(i == 0 || i == n) /* bei y0, yn: */ I = I + y / 2.0; /* I += y/2 */ else /* sonst: */ I = I + y; /* I += y */ }I = I * h; /* I = I * h */

Page 33: Programmieren in C Felder, Zeiger und Listen Datum und Zeit, Mathematische Funktionen Hochschule Fulda – FB AI Sommersemester 2013/14

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 33

Mathematische Funktionen 12

• Programm trapez.c

Page 34: Programmieren in C Felder, Zeiger und Listen Datum und Zeit, Mathematische Funktionen Hochschule Fulda – FB AI Sommersemester 2013/14

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 34

Mathematische Funktionen 13

• Numerische Integration: Simpsonformel

Page 35: Programmieren in C Felder, Zeiger und Listen Datum und Zeit, Mathematische Funktionen Hochschule Fulda – FB AI Sommersemester 2013/14

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 35

Mathematische Funktionen 14

• Simpson-Algorithmus in C

for(i = 0; i <= n; i++) { x = a + i * h; /* xi berechnen */ y = func(x); /* yi berechnen */ if(i == 0 || i == n) /* bei y0, yn: */ I = I + y; /* I += y */ else if(i % 2) /* i gerade: */ I = I + 4.0 * y; /* I += 4 * y */ else /* i ungerade: */ I = I + 2.0 * y; /* I += 2 * y */}I = I * h / 3; /* I = I * h/3 */

Page 36: Programmieren in C Felder, Zeiger und Listen Datum und Zeit, Mathematische Funktionen Hochschule Fulda – FB AI Sommersemester 2013/14

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 36

Mathematische Funktionen 15

• simpson.c

Page 37: Programmieren in C Felder, Zeiger und Listen Datum und Zeit, Mathematische Funktionen Hochschule Fulda – FB AI Sommersemester 2013/14

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 37

Mathematische Funktionen 16

• Integrationsprogramm integral1.c