informatik ii grundlagen der programmierung programmieren in c module und bibliotheken 2 hochschule...
TRANSCRIPT
Informatik IIGrundlagen 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
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 2
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 3
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 4
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 5
Wdh: Files 4
• High-Level- und Low-Level-Funktionen
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 6
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 7
• Ö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()
Wdh: Files 6
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 8
Wdh: Files 7
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 9
Wdh: Files 8
• Beispiel: Netzwerkserver
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 10
Wdh: Files 9
• Beispiel: Netzwerkclient
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 11
Wdh: Files 10
• Beispiel: Pipe
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 12
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 13
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 14
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 15
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 16
ctype-Funktionen 3
• Implementierung isalnum() für ASCII
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 17
ctype-Funktionen 4
• Implementierung tolower() für ASCII
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 18
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 19
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 20
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 21
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 22
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 23
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 24
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 25
Stringfunktionen 8
• Implementierung von strlen()
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 26
Stringfunktionen 9
• Implementierung von strcmp()
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 27
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 28
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 29
Sortieren 2
• 1. Durchlauf bei Bubblesort
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 30
Sortieren 3
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 31
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 32
Sortieren 5
• Bubblesort für Feld von Strings
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 33
Sortieren 6
• Sortierprogramm für Strings
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 34
Sortieren 7
• Diskussion– Stabilität?– Geschwindigkeit?
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 35
Sortieren 8
• Schnellerer Algorithmus Quicksort• rekursiver Algorithmus für int-Feld
void 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 36
Sortieren 9
• Prinzip: teile und herrsche
• http://de.wikipedia.org/wiki/Quicksort
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 37
Sortieren 10
• Quicksort für Feld von Strings
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 38
Sortieren 11
• Sortierprogramm für Strings
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 39
Sortieren 12
• Diskussion– Stabilität?– Geschwindigkeit?