390 likes | 544 Views
Informatik II Grundlagen der Programmierung Programmieren in C Module und Bibliotheken 2. Hochschule Fulda – FB ET Sommersemester 2010 http://www.rz.hs-fulda.de/et Peter Klingebiel, HS Fulda, DVZ. Wdh: Files 1. #include <stdio.h> Grundlegender Datentyp FILE Gepufferte Ein- / Ausgabe
E N D
Informatik IIGrundlagen der ProgrammierungProgrammieren in CModule und Bibliotheken 2 Hochschule Fulda – FB ET Sommersemester 2010 http://www.rz.hs-fulda.de/et Peter Klingebiel, HS Fulda, DVZ
Wdh: Files 1 • #include <stdio.h> • Grundlegender Datentyp FILE • Gepufferte Ein- / Ausgabe • Dateien / Geräte / Netzwerk (sockets) / ... • konstante Files, bei Programmstart bereits geöffnet: • stdin - Standardeingabe (TTY) • stdout - Standardausgabe (TTY) • stderr - Standardfehlerausgabe (TTY) Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Wdh: Files 2 • Öffnen von Files • fopen() • fdopen(), freopen() • Schließen von Files • fclose() • allgemeines Gerüst#include <stdio.h>FILE *fp;fp = fopen(...);/* Lesen / Schreiben */ fclose(fp); Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Wdh: Files 3 • Eingabefunktionen • getchar(), getc(), fgetc() • getw(), fgetw() • gets(), fgets() • scanf(), fscanf() • fread() • ungetc(); • Ausgabefunktionen • putchar(), putc(), fputc() • putw(), fputw() • puts(), fputs() • printf(), fprintf() • fwrite() Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Wdh: Files 4 • High-Level- und Low-Level-Funktionen Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Wdh: Files 5 • Low-Level-Funktionen Systemcalls • Datentyp int Filedeskriptor / Filehandle • Index in der Filetabelle des Prozesses • Pufferung von Gerätetreiber abhängig • Dateien / Geräte / Netzwerk (sockets) / ... • konstante Filedeskriptoren • 0 - Standardeingabe (TTY) • 1 - Standardausgabe (TTY) • 2 - Standardfehlerausgabe (TTY) Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Wdh: Files 6 • Öffnen von Dateien • open(), creat() • Für andere Files / Geräte ggfs. eigene Funktionen zum Erstellen / Öffnen • pipe(), socket(), ... • Lesen / Schreiben • read(), write() • evtl. weitere gerätetyp. Funktionen • Schließen • close() Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Wdh: Files 7 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Wdh: Files 8 • Beispiel: Netzwerkserver Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Wdh: Files 9 • Beispiel: Netzwerkclient Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Wdh: Files 10 • Beispiel: Pipe Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Dynamischer Speicher 1 • Funktionen zur Anforderung und Freigabe von dynamischem Speicher (Heap) • #include <stdlib.h> • Anforderung von Speicher: • void *malloc(size_t s) • s Bytes allozieren • return NULL bei Fehler, sonst Pointer auf Speicherbereich • void *calloc(size_t n, size_t s) • s *n Bytes allozieren und mit 0 initialisieren • return NULL bei Fehler, sonst Pointer auf Speicherbereich Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Dynamischer Speicher 2 • Freigabe von alloziertem Speicher • void free(void *ptr) • Speicher von ptr wieder freigeben • Beispiel:char buf[BUFLEN], *sptr;size_t slen;if(fgets(buf, sizeof(buf) - 1, stdin)) { slen = strlen(buf); sptr = (char *) malloc(slen + 1); if(sptr == NULL) /* Fehler ... */ (void) strcpy(sptr, buf);} Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
ctype-Funktionen 1 • Klassifizierungsfunktionen für Zeichen • #include <ctype.h> • alle Funktionen liefern Rückgabewert ≠ 0, wenn Test ok, 0 sonst • die wichtigsten Funktionen • int isalpha(int c)Test, ob c Buchstabe ist • int isdigit(int c)Test, ob c Ziffer ist Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
ctype-Funktionen 2 • int isalnum(int c)Test, ob c Buchstabe oder Ziffer ist • int isupper(int c)Test, ob c Großbuchstabe ist • int islower(int c)Test, ob c Kleinbuchstabe ist • int isprint(int c)Test, ob c druckbares Zeichen (+ Leerzeichen) ist • int tolower(int c)wandelt c von Groß- in Kleinbuchstaben um • int toupper(int c)wandelt c von Klein- in Großbuchstaben um Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
ctype-Funktionen 3 • Implementierung isalnum() für ASCII Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
ctype-Funktionen 4 • Implementierung tolower() für ASCII Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Stringfunktionen 1 • String als eigener Datentyp existiert in C genau genommen nicht! • Strings sind Arrays vom Typ char oder Pointer auf char: • char b[LEN];bietet Platz für LEN-1 Zeichen • char *s;Pointer s gültig erst nach Zuweisung auf char-Array, Konstante oder dyn. Speicherallozierung • Strings werden mit ASCII-NUL terminiert Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Stringfunktionen 2 • C-Standardbibliothek bietet eine große Menge an Stringfunktionen an • wichtige Konvertierungsfunktionen • #include <stdlib.h> • int atoi(char *s)wandelt String s in int • long atol(char *s) wandelt String s in long • double atof(char *s) wandelt String s in double Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Stringfunktionen 3 • Weitere Konvertierungsfunktionen • #include <stdio.h> • int sscanf(char *s, char *fmt,...) • formatierte Konvertierung aus dem String s • wie scanf() und fscanf() • Beispiel:char *s = "123 98.76"; int l; double d;sscanf(s, "%ld %lf", &l, &d); • int sprintf(char *s, char *fmt, …) • formatierte Ausgabe auf String s • wie printf() und fprintf() Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Stringfunktionen 4 • die wichtigsten Grundfunktionen • #include <string.h> • int strlen(char *s) • liefert Länge des String s • char *strcpy(char *s1, char *s2) • kopiert String s2 nach String s1, bis zum s2 terminierenden NUL, liefert Ptr auf s1 • Achtung: Pufferüberlauf! • char *strncpy(char *s1, char *s2, int n) • kopiert String s2 nach String s1, max n Zeichen Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Stringfunktionen 5 • char *strcat(char *s1, char *s2) • Hängt Kopie von s2 an s1, liefert Ptr auf s1 • Achtung: Pufferüberlauf! • char *strncat(char *s1, char *s2, int n) • Hängt Kopie von s2 an s1, max. n Zeichen • int strcmp(char *s1, char *s2) • vergleicht zeichenweise s1 und s2 • liefert 0 bei Gleichheit • sonst Differenz *s1-*s2 bei erstem Unterschied Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Stringfunktionen 6 • int strncmp(char *s2, char *s2, int n) • Stringvergleich bis max. n Zeichen • sonst wie strcmp() • char *strchr(char *s, int c) • liefert Pointer auf Position des ersten Auftretens von Zeichen c im String s, sonst NULL • char *strrchr(char *s, int c) • liefert Pointer auf Position des letzten Auftretens von Zeichen c im String s, sonst NULL • also wie strchr() vom Stringende her Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Stringfunktionen 7 • char *strstr(char *s1, char *s2) • liefert Pointer auf Position des ersten Auftretens von String s2 im String s1, sonst NULL • char *strdup(char *s) • alloziert Speicher für eine Kopie des String s und kopiert diesen dorthin • liefert Pointer auf Kopie oder NULL bei Fehler • Implementierungchar *ns;if(ns = malloc(strlen(s) + 1)) return(strcpy(ns, s)); Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Stringfunktionen 8 • Implementierung von strlen() Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Stringfunktionen 9 • Implementierung von strcmp() Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Stringfunktionen 10 • Memory- / Binärfunktionen • void *memset(void *m, int c, size_t n) • kopiert n mal das Zeichen c in den Speicherbereich m • void *memcpy(void *m1, void *m2, size_t n) • kopiert n Bytes von Speicherbereich m2 nach m1 • void *memmove(void *m1, void *m2, size_t n) • kopiert n Bytes von Speicherbereich m2 nach m1 • Überlappungen der Bereiche werden korrekt behandelt • void *memcmp(void *m1, void *m2, size_t n) • Vergleich von n Bytes der Speicherbereiche m1 und m2 • void *memchr(void *m, int c, size_t n) • liefert Pointer auf erstes Auftreten von c in m, sonst NULL • Achtung! Es finden keine Bereichsprüfungen statt! Overflow! Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Sortieren 1 • Sortieren von Zahlen, Strings, allgemein von Daten, ist oft auftretende Aufgabenstellung • Meist: Daten sind in Feldern vorhanden • Sortieren von Feldelementen • Intuitiver Algorithmus: • Feld von oben nach unten (oder von links nach rechts) durchlaufen und elementweise sortieren • Feld solange immer wieder durchlaufen, bis Feld sortiert ist • Bubblesort-Algorithmus • http://de.wikipedia.org/wiki/Bubblesort Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Sortieren 2 • 1. Durchlauf bei Bubblesort Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Sortieren 3 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Sortieren 4 • die größten Elemente wandern nach und nach an das Ende des Feldes • steigen wie Blasen auf Bubblesort • Algorithmus für int-Feld mit n Elementen:void bsort(int v[], int n) int i, j; for(i = 0; i < n; i++) for(j = 0; j < n-i-1; j++) if(v[j] > v[j+1]) swap(v, j, j+1); Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Sortieren 5 • Bubblesort für Feld von Strings Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Sortieren 6 • Sortierprogramm für Strings Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Sortieren 7 • Diskussion • Stabilität? • Geschwindigkeit? Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Sortieren 8 • Schnellerer Algorithmus Quicksort • rekursiver Algorithmus für int-Feldvoid qsort(int v[], int left, int right) int i, last; if(left >= right) return; swap(v, left, (left + right) / 2); last = left; for(i = left + 1; i <= right; i++) if(v[i] < v[left]) swap(v, ++last, i); swap(v, left, last); qsort(v, left, last - 1); qsort(v, last + 1, right); Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Sortieren 9 • Prinzip: teile und herrsche • http://de.wikipedia.org/wiki/Quicksort Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Sortieren 10 • Quicksort für Feld von Strings Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Sortieren 11 • Sortierprogramm für Strings Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Sortieren 12 • Diskussion • Stabilität? • Geschwindigkeit? Programmieren in C - Peter Klingebiel - HS Fulda - DVZ