Informatik I Programmieren in C Zusammenfassung des Semesters Prof. Dr. Nikolaus Wulff
Agenda Elementare Einführung C Programm Syntax Datentypen, Variablen und Konstanten Operatoren und Ausdrücke Kontrollstrukturen Funktionen und Programmstruktur Zeiger und Felder Strukturen Ein- / Ausgabe Bibliotheksfunktionen Prof. Dr. Nikolaus Wulff Programmieren in C 2
Compile & Link Schritte Hello.c Compiler Hello.obj stdio.h Erstellen des Quelltext. Übersetzen Binden/Linken mit den Bibliotheksfunktionen des Betriebsystems. Test und Ausführung der Anwendung. Linker Hello.exe Bibliotheksfunktionen Die einzelnen Schritte können manuell per Hand als auch automatisiert durchgeführt werden. Prof. Dr. Nikolaus Wulff Programmieren in C 3
Der Entwicklungszyklus Editieren Testen (Debugging) Compilieren Programmierung ist ein zyklischer Prozess: Quellcode erstellen Quellcode übersetzen Programm testen Durch Testen kann man die Anwesenheit von Fehlern zeigen, niemals aber deren Abwesenheit! Prof. Dr. Nikolaus Wulff Programmieren in C 4
Modularer Aufbau Die in einer xxx.h Datei deklarierten Methoden werden meist in einer xxx.c Datei implementiert. Dies macht im Fehlerfall das Suchen der zugehörigen Implementierung einfacher. f2c.h Application implements f2c.c #include Main.c f2c.o Main.o Prof. Dr. Nikolaus Wulff Programmieren in C 5
Schleifen Wiederholte Anweisungen: while( <expr> ) { statement; } do { statement; } while ( <expr> ); for( <expr 1 >; <expr 2 >; <expr 3 >) { } statement; Prof. Dr. Nikolaus Wulff Programmieren in C 6
Kontrollstrukturen Entscheidungsabhängige Programmausführung: if( <expr> ) { statement; } if( <expr> ) { statement 1 ; } else { statement 2 ; } if( <expr> ) { statement 1 ; } else if( <expr 2 > ){ statement 2 ; } else if( <expr 3 > ){ statement 3 ;... } else { statement N ; } Prof. Dr. Nikolaus Wulff Programmieren in C 7
Die switch-anweisung switch( <expr> ) { case <const 1 >: }; statement 1 ; break; case <const 2 >: statement 2 ; break;... case <const N >: statement N ; break; default: statement default Prof. Dr. Nikolaus Wulff Programmieren in C 8
Operatoren Operator Funktion, arithmetisch Operator Funktion, boolesche * / % + - ++ -- Multiplikation Division Modulo Addition Subtraktion Inkrement Dekrement! < <= > >= && logisches NICHT (NOT) kleiner als kleiner als oder gleich größer als größer als oder gleich logisches UND (AND) logisches ODER (OR) Redundante Operatoren: saldo++; => saldo = saldo + 1; Operator ==!= = Funktion Gleichheit Ungleichheit Zuweisung Operator & ^ << >> ~ Funktion, bitweise Bit-AND Bit-OR Bit-XOR exklusiv oder Bit Verschiebung links Bit Verschiebung rechts Bit-Komplement Prof. Dr. Nikolaus Wulff Programmieren in C 9
Datentypen und Zeiger C kennt die Datentypen: char, short, int, long, float, double Hinzu kommen die benutzerdefinierten Typen: enum, typedef und struct Mit dem &-Operator lässt sich die Adresse einer Variablen bestimmen. Zeiger werden mit * deklariert. Wird der *-Operator auf eine Zeigervariablen angewandt, so wird diese ausgelesen oder gesetzt. Prof. Dr. Nikolaus Wulff Programmieren in C 10
Zeiger und Speicher 0123456789AB Speicher: Hello World0 0xFF01200 while(*str++) { len++; } str str=0xff01200 str++ str=0xff01201... str++ str=0xff01209 str++ str=0xff0120a str++ str=0xff0120b *str = 'H' len=0 *str = 'e' len=1 *str = 'l' len=9 *str = 'd' len=10 *str = 0 len=11 Zeiger erlauben es jede beliebige Stelle im Speicher zu referenzieren. Prof. Dr. Nikolaus Wulff Programmieren in C 11
Funktionen Funktion werden in *.h Dateien deklariert: <returnvalue> <fctname>(<arg 1 >,...,<arg N >); und in *.c Dateien implementiert. Funktionen mit dem Schlüsselwort static sind nur innerhalb ihrer Quelldatei sicht- und aufrufbar. Funktionen mit dem Schlüsselwort extern sind außerhalb der Quelldatei implementiert und werden vom Linker hinzu gebunden. Prof. Dr. Nikolaus Wulff Programmieren in C 12
C Strukturen Im Allgemeinen kennen Programmiersprachen für genau diese Problematik ein eigenständiges Modellierungselement: z.b. in Pascal den record, in C das struct und OO-Sprachen besitzen hierzu das Konzept der Klasse. Ein struct ist ein neuer Datentyp. Zusammengesetzt als Aggregat aus bereits bekannten Datentypen: struct <identifier> { type 1 <identifier 1 >; };... ; type N <identifier N >; Prof. Dr. Nikolaus Wulff Programmieren in C 13
Zeiger auf Funktionen Ein Funktionszeiger wird deklariert als: <return_type> (*ptr_name)(<arg_liste>) Wichtig ist die Klammer bei der Deklaration eines Function Pointers: int *f; /* Zeiger auf ein int */ int *f(); /* Funktion mit Rückgabe int-zeiger */ int (*f)(); /* Zeiger auf Funktion mit Rückgabe int */ Prof. Dr. Nikolaus Wulff Programmieren in C 14
Typedef auf FunctionPointer Mit einem typedef lässt sich die Schreibweise für einen FunctionPointer elegant vereinfachen: /** * Declare a real valued Function. */ typedef double (*Fct)(double x); /** * Differentiate a given Function. */ double differentiate(fct f, double x); Ebenso wie normale Zeiger können nun auch Zeiger auf Funktionen als Variablen verwendet werden. Prof. Dr. Nikolaus Wulff Programmieren in C 15
Die C Standardbibliothek assert.h ctype.h errno.h float.h iso646.h limits.h locale.h math.h setjmp.h Definiert das assert Debug Marko Klassifizierung (is...) und Konvertierung (to...) von Zeichenketten Definiert Fehlerbehandlungsmakros Definiert float min, max, eps, etc. Synonyme für and, bitor, not, xor etc. Definiert char, int,... min max Bereiche Landesspezifische Währung, Zeit, Datum Mathematische Funktionen Sprünge definieren Prof. Dr. Nikolaus Wulff Programmieren in C 16
Die C Standardbibliothek cont. signal.h Interrupts und Fehlersignale stdarg.h Funktionen mit variabler Argumentliste stddef.h Makros NULL, size_t, offsetof etc stdio.h Ein- und Ausgabe per Konsole, Datei... stdlib.h Allgemeine Bibliotheksfunktionen string.h Manipulation von Zeichenketten time.h Zeitfunktionen wchar.h Wide Character 16/32-bit Zeichen wctype.h Wide Character Zeichenfunktionen Prof. Dr. Nikolaus Wulff Programmieren in C 17
Datei Funktionen Wichtige IO-Funktionen sind: fclose, fopen Stream schließen oder öffnen feof Testet ob Stream zu Ende ist ferror Testet Stream auf Fehler fflush Leert Puffer eines Streams fgetc, fputc Liest/schreibt ein Zeichen fgets, fputs Liest/schreibt eine Zeichenkette fscanf, fprintf Liest/schreibt formatierte Daten fread, fwrite Unformatiertes Lesen/Schreiben printf/scanf sind nur Spezialfälle von fprintf/fscanf. Prof. Dr. Nikolaus Wulff Programmieren in C 18
Zusammenfassung Die erste Programmiersprache (in einem Semester!) ist ein Gewaltritt und erfordert volle Konzentration und Mitarbeit. Vieles hat sich noch nicht so ganz gesetzt. Jedoch nächstes Semester wird sich einiges wiederholen und das Bild abrunden. Wichtig ist es, von Anfang an mit zu machen und die Übungen und Praktika Ernst zu nehmen. Der Stoff wird (leider) sehr schnell schwierig... Prof. Dr. Nikolaus Wulff Programmieren in C 19