Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

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

Ähnliche Präsentationen


Präsentation zum Thema: "Programmieren in C Felder, Zeiger und Listen Datum und Zeit, Mathematische Funktionen Hochschule Fulda – FB AI Sommersemester 2014"—  Präsentation transkript:

1 Programmieren in C Felder, Zeiger und Listen Datum und Zeit, Mathematische Funktionen Hochschule Fulda – FB AI Sommersemester Peter Klingebiel, HS Fulda, DVZ

2 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ2 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

3 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ3 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

4 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ4 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

5 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ5 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); }

6 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ6 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.

7 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ7 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;

8 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ8 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); }

9 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ9 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

10 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ10 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

11 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ11 Felder, Zeiger, Listen 10 dynamische Liste sortierte Felder

12 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ12 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);...

13 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ13 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); }

14 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ14 Felder, Zeiger, Listen 13 Personalprogramm personal2.c

15 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ15 Datum und Zeit 1 Funktionen zum Handling von Datum / Zeit und Zeitmessungen #include Grundtyp und -funktion (Systemcall) typedef long time_t; time_t time(time_t *t) liefert die aktuelle Systemzeit in Sekunden seit dem , 00:00:00 ist t != NULL t enthält Systemzeit

16 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ16 Datum und Zeit 2 Zeit als String char *ctime(time_t *t); liefert die Zeit in t als String Beispiel: #include time_t t; t = time(NULL); printf("%s", ctime(&t)); Ausgabe: Thu Jun 10 19:52:

17 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ17 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.: */ int tm_isdst; /* Sommerzeit: +1 */ };

18 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ18 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 */ 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 ; /* -> Jahr */ printf("%d.%d.%d\n", d, m, y);

19 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ19 Datum und Zeit 5 Beispielprogramm datum.c

20 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ20 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 */

21 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ21 Datum und Zeit 7 Beispielprogramm clock.c

22 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ22 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 Typen float, double, long double viele Konstanten, z.B. #define M_E #define M_PI

23 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ23 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 e x double log(double x) nat. Logarithmus ln(x) double log10(double x) Logarithmus log 10 (x)

24 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ24 Mathematische Funktionen 3 weitere wichtige Funktionen double pow(double x, double y) x y 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

25 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ25 Mathematische Funktionen 4 Beispiel: log2.c

26 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ26 Mathematische Funktionen 5 Beispiel: splot.c

27 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ27 Mathematische Funktionen 6 Was zeigt diese Grafik?

28 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ28 Mathematische Funktionen 7 Und diese?

29 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ29 Mathematische Funktionen 8 … und diese?

30 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ30 Mathematische Funktionen 9 Was zeigen Grafik und Fläche?

31 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ31 Mathematische Funktionen 10 Numerische Integration: Trapezregel

32 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ32 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 */

33 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ33 Mathematische Funktionen 12 Programm trapez.c

34 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ34 Mathematische Funktionen 13 Numerische Integration: Simpsonformel

35 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ35 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 * y; /* I += 4 * y */ else /* i ungerade: */ I = I * y; /* I += 2 * y */ } I = I * h / 3; /* I = I * h/3 */

36 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ36 Mathematische Funktionen 15 simpson.c

37 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ37 Mathematische Funktionen 16 Integrationsprogramm integral1.c


Herunterladen ppt "Programmieren in C Felder, Zeiger und Listen Datum und Zeit, Mathematische Funktionen Hochschule Fulda – FB AI Sommersemester 2014"

Ähnliche Präsentationen


Google-Anzeigen