1 / 45

Informatik II Grundlagen der Programmierung Programmieren in C Module und Bibliotheken 4

Informatik II Grundlagen der Programmierung Programmieren in C Module und Bibliotheken 4. Hochschule Fulda – FB ET Sommersemester 2010 http://www.rz.hs-fulda.de/et Peter Klingebiel, HS Fulda, DVZ. Felder und Zeiger 1. Bekannt: Felder und Zeiger werden in C ganz ähnlich behandelt

iola
Download Presentation

Informatik II Grundlagen der Programmierung Programmieren in C Module und Bibliotheken 4

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Informatik IIGrundlagen der ProgrammierungProgrammieren in CModule und Bibliotheken 4 Hochschule Fulda – FB ET Sommersemester 2010 http://www.rz.hs-fulda.de/et Peter Klingebiel, HS Fulda, DVZ

  2. Felder und Zeiger 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

  3. Felder und Zeiger 2 • Beispiel char-Felder oder Strings#define N 32char buf[32] = {...}; /* 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

  4. Felder und Zeiger 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 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

  5. Felder und Zeiger 4 • variable Dimensionierung von statischen und globalen Feldern häufig benötigt • Lösung  dynamische Feldallozierung • Beispiel: double-Feld dynamisch duplizierendouble *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

  6. Felder und Zeiger 5 • 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 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

  7. Felder und Zeiger 6 • dynamische Liste  sortierte Felder Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

  8. Felder und Zeiger 7 /* 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

  9. Felder und Zeiger 8 /* 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

  10. Felder und Zeiger 9 • Personalprogramm personal2.c Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

  11. 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

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

  13. Datum und Zeit 3 • Datentyp struct tm für Zeit und Datumstruct 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

  14. 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

  15. Datum und Zeit 5 • Beispielprogramm datum.c Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

  16. 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 */ Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

  17. Datum und Zeit 7 • Beispielprogramm clock.c Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

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

  19. 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

  20. 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

  21. Mathematische Funktionen 4 • Beispiel: log2.c Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

  22. Mathematische Funktionen 5 • Beispiel: splot.c Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

  23. Mathematische Funktionen 6 • Was zeigt diese Grafik? Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

  24. Mathematische Funktionen 7 • Und diese? Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

  25. Mathematische Funktionen 8 • … und diese? Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

  26. Mathematische Funktionen 9 • Was zeigen Grafik und Fläche? Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

  27. Mathematische Funktionen 10 • Numerische Integration: Trapezregel Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

  28. Mathematische Funktionen 11 • Trapez-Algorithmus in Cdouble 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

  29. Mathematische Funktionen 12 • Programm trapez.c Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

  30. Mathematische Funktionen 13 • Numerische Integration: Simpsonformel Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

  31. Mathematische Funktionen 14 • Simpson-Algorithmus in Cfor(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

  32. Mathematische Funktionen 15 • simpson.c Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

  33. Mathematische Funktionen 16 • Integrationsprogramm integral1.c Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

  34. Mathematische Funktionen 17 • Wie ist integral1.c zu erweitern, um ... • korrekte Flächenintegrale zu berechnen? • Differenzen der Int-methoden zu berechnen? Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

  35. Mathematische Funktionen 18 • Integrationsprogramm integral2.c Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

  36. Anwendung Smartmeter 1 • Kennen Sie IhrenStromverbrauch? • Kennen Sie IhreStromkosten? • Kennen Sie IhrVerbrauchsprofil? Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

  37. Anwendung Smartmeter 2 • bisher: ein Meßwert / Jahr • Versorger sind spätestens zum 30.12.2010 lt. EnWG verpflichtet, "einen Tarif anzubieten, der einen Anreiz zu Energieeinsparung oder Steuerung des Energieverbrauchs setzt" •  monatliche Stromabrechnung •  intelligente Stromzähler (Smartmeter) •  1 Meßwert / Sekunde •  Stromverbrauchsprofil analysierbar Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

  38. Anwendung Smartmeter 3 • Versorger sind lt. EnWG seit 1.1.2010 zum Angebot von Smartmetern bei Neubauten oder Großrenovierungen verpflichtet • Smartmeter werden angeboten von Versorgern, z.B. YelloStromhttp://www.yellostrom.de/privatkunden/sparzaehler/index.html • oder von Drittanbietern z.B. in Kooperation mit Google PowerMeterhttp://www.google.com/powermeter/about/ • aber auch im Selbstbau und -einbau, z.B.http://volkszaehler.org/ Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

  39. Anwendung Smartmeter 4 • Smartmeter: 1 Messung / Sekunde Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

  40. Anwendung Smartmeter 5 • Wir arbeitet Smartmeter-Monitoring? Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

  41. Anwendung Smartmeter 6 • Bessere Verbrauchsübersichten Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

  42. Anwendung Smartmeter 7 • Profil des Stromverbrauchs Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

  43. Anwendung Smartmeter 8 • Stromverbrauchsprofil von Einzelgeräten Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

  44. Anwendung Smartmeter 9 • Profil des Stromkunden möglich Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

  45. Anwendung Smartmeter 10 • Entwicklung eines Programms zum Auslesen des "intelligenten Stromzählers" • 3 Stromkreise sind zu messen • 1 Meßwert / Sekunde • 15 Minuten messen, dann Übertragung der Meßwerte an Versorger / Drittanbieter Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

More Related