450 likes | 627 Views
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
E N D
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
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
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
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
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
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
Felder und Zeiger 6 • dynamische Liste sortierte Felder Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
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
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
Felder und Zeiger 9 • 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 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
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
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 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
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 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
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 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
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 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
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
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
Mathematische Funktionen 18 • Integrationsprogramm integral2.c Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Anwendung Smartmeter 1 • Kennen Sie IhrenStromverbrauch? • Kennen Sie IhreStromkosten? • Kennen Sie IhrVerbrauchsprofil? Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
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
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
Anwendung Smartmeter 4 • Smartmeter: 1 Messung / Sekunde Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Anwendung Smartmeter 5 • Wir arbeitet Smartmeter-Monitoring? Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Anwendung Smartmeter 6 • Bessere Verbrauchsübersichten Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Anwendung Smartmeter 7 • Profil des Stromverbrauchs Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Anwendung Smartmeter 8 • Stromverbrauchsprofil von Einzelgeräten Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Anwendung Smartmeter 9 • Profil des Stromkunden möglich Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
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