Programmieren in C Felder, Zeiger und Listen Datum und Zeit, Mathematische Funktionen Hochschule Fulda – FB AI Sommersemester 2014 http://c-ai.rz.hs-fulda.de Peter Klingebiel, HS Fulda, DVZ
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
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 */ Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Felder, Zeiger, Listen 3 Konstante Dimensionierung von Feldern double df[100]; /* Feld mit 100 Elementen */ Variable Dimensionierung von Feldern nur für automatische Feldvariable zulässig void fun(int n) { double df[n]; /* Feld mit n Elementen */ ... } Grund: Feldgröße muss beim Anlegen / bei Speicherzuweisung des Felds bekannt sein statisch / global Compilezeit automatisch / lokal Eintritt in Funktion / Block Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
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); } Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
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. Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
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; Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Felder, Zeiger, Listen 7 Objekte der Listentypen werden zur Laufzeit alloziert slist *insert(slist *llp, int value){ slist *nlp; nlp = (slist *) malloc(sizeof(slist)); besetzt bzw. initialisiert nlp-> value = value; nlp->next = NULL; und in die Liste eingehängt if(llp) llp->next = nlp; return(nlp); } Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
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 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
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.) werden in dynamisch erzeugten Feldern als Zeiger gespeichert und sortiert Aktualisierung bei jeder Änderung in der Liste Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Felder, Zeiger, Listen 10 dynamische Liste sortierte Felder Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
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); ... Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
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); } Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Felder, Zeiger, Listen 13 Personalprogramm personal2.c Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
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 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Datum und Zeit 2 Zeit als String char *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 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
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 */ }; Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
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); Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Datum und Zeit 5 Beispielprogramm datum.c Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Datum und Zeit 6 einfache Messungen der CPU-Zeit Typ und Funktion typedef long clock_t; clock_t clock(void); verbrauchte CPU-Zeit zwischen zwei Aufrufen von clock() in Mikrosekunden clock_t t1, t2, tu; t1 = clock(); /* Erste Messung */ system("bsort1 S S.bs"); t2 = clock(); /* Neue Messung */ tu = t2 - t1; /* CPU-Zeit in us */ Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Datum und Zeit 7 Beispielprogramm clock.c Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Mathematische Funktionen 1 Funktionen für numerische Berechnungen in der Mathebibliothek libm.a muss ggfs. beim Binden explizit angegeben werden, z.B. bei UNIX cc 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 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
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) Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
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 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Mathematische Funktionen 4 Beispiel: log2.c Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Mathematische Funktionen 5 Beispiel: splot.c Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Mathematische Funktionen 6 Was zeigt diese Grafik? Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Mathematische Funktionen 7 Und diese? Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Mathematische Funktionen 8 … und diese? Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Mathematische Funktionen 9 Was zeigen Grafik und Fläche? Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Mathematische Funktionen 10 Numerische Integration: Trapezregel Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
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 */ Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Mathematische Funktionen 12 Programm trapez.c Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Mathematische Funktionen 13 Numerische Integration: Simpsonformel Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
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 */ Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Mathematische Funktionen 15 simpson.c Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Mathematische Funktionen 16 Integrationsprogramm integral1.c Programmieren in C - Peter Klingebiel - HS Fulda - DVZ