Programmierkurs C. Sommersemester 2011, 1. Vorlesung. Stuttgart, den 11. April Heiko Schulz

Größe: px
Ab Seite anzeigen:

Download "Programmierkurs C. Sommersemester 2011, 1. Vorlesung. Stuttgart, den 11. April 2011. Heiko Schulz"

Transkript

1 Programmierkurs C Sommersemester 2011, 1. Vorlesung Stuttgart, den 11. April 2011 Heiko Schulz Universität Stuttgart, Fachbereich Mathematik Mit herzlichem Dank an Prof. Dr. H. Harbrecht & Dr. F. Eenberger!

2 Organisatorisches Der Programmierkurs C 2 L Der Programmierkurs C ist eine Pichtveranstaltung für Bachelorstudenten im Rahmen des Moduls G5 Grundlagen der Computermathematik. L Voraussetzungen: elementare Mathematikkenntnisse. L Ziel: Grundlegenden Umgang mit der Programmiersprache C erlernen. L Anwesenheitsschein, keine Benotung. Benotung in Ausnahmefällen möglich (mündliche Prüfung). L Fragen oder Anregungen bitte an Dr. Heiko Schulz (heiko.schulz@mathematik.uni-stuttgart.de). L Skript, Übungen, etc. pp. auf der Internetseite:

3 Organisatorisches Termine 3 Die Vorlesungen nden täglich vom 11. bis zum im 2. Block (9:45-11:15 Uhr) im Hörsaal statt, im Anschluss nden die Übungen entsprechend der folgenden Tabelle statt: Gruppe Zeit Raum Tutoren 1 11:30-13:00 Uhr V B. Russig & M. Staehle 2 11:30-13:00 Uhr V A. Dipper & C. Taut 3 11:30-13:00 Uhr V C. Ageu & F. Breckle 4 14:00-15:30 Uhr V B. Russig & M. Staehle 5 14:00-15:30 Uhr V A. Dipper & C. Taut 6 14:00-15:30 Uhr V C. Ageu & F. Breckle

4 Inhalt 4 L Computergrundlagen, Algorithmen, Compiler, L Operatoren, Kontrolluss, Variablen, Funktionen, L Flieÿkommazahlen, Stellenauslöschung, Modultechnik, L Funktionen und Rekursion, Felder und Zeiger, Zeichenketten, L zusammengesetzte Datentypen, Ein- und Ausgabe von Dateien, Laufzeitanalyse, L Chirierung, komplexe Zahlen, Sortieralgorithmen, L Newton-Verfahren, mathematische Funktionen, dynamische Speicherverwaltung, L verkettete Listen, Stapel, Schlangen, Graphen und Bäume, L Makros, eigene Datentypen, Ausblick auf C++.

5 Warum Programmieren lernen? 5 L Programmierkenntnisse sind die Grundlage zur Anwendung mathematischer Fähigkeiten in der Praxis und für die Numerische Mathematik. L Auch für reine Mathematiker ist eine wichtige Zusatzqualikation. Computermathematik nimmt auch in der reinen Mathematik einen immer höheren Stellenwert ein. L Erfahrungen in Programmierung sind heute in vielen Bereichen gefragt: Datenbanken, Internetseiten, Automatisierung von Aufgaben,...

6 Programmierung in der Theorie 6 L Grundlage des Programmierens: Der Begri des Algorithmus, des automatisierten Entscheidens, des Durchführens einer Berechnung nach festen Regeln. Ô Algorithmus: Formale Handlungsvorschrift zur Lösung eines Problems oder einer bestimmten Art von Problemen in endlich vielen Schritten. L Formalisierung mit Turingmaschinen (Alan Turing, 1937): theoretische Maschine, die Symbole auf einem beliebig langen Band liest und schreibt (Lesen, Schreiben, Lese-Schreib-Kopf bewegen), um damit von einem Anfangszustand zu weiteren Zuständen (und ggf. zu einem Endzustand) zu gelangen. L Pro Schritt: In Abhängigkeit vom aktuellen Zustand und vom gegeben Programm Symbol an der aktuellen Position (ggf.) ändern und Kopf nach links oder rechts bewegen.

7 Programmierung in der Theorie 7 L Eine Berechnungsvorschrift zur Lösung eines Problems heiÿt genau dann Algorithmus, wenn eine zu dieser Berechnungsvorschrift äquivalente Turingmaschine existiert, die für jede Eingabe, die eine Lösung besitzt, stoppt. Ô Formalisierung des Berechenbarkeitsbegris. (siehe z.b.

8 Programmierung in der Praxis - Programmiersprachen 8 L Eine Programmiersprache ist eine formale Sprache, welche zur Formulierung von Computerprogrammen verwendet wird. L Ein Computerprogramm ist eine formale Darstellung eines Algorithmus; ein Algorithmus hat viele verschiedene solche Repräsentationen (man spricht von einer Implementierung). L Unterscheidung: Maschinencode (wird direkt vom Prozessor ausgeführt) und abstraktere, für Menschen besser lesbare Hochsprachen, die erst in Maschinencode übersetzt werden müssen. L Der Quelltext wird von einem Übersetzungsprogramm, dem Compiler, in für den Prozessor direkt ausführbaren Maschinencode übersetzt. Geschieht die Übersetzung zur Ausführungszeit, so spricht man von einer Skriptsprache.

9 Programmierung in der Praxis - Programmiersprachen 9 L Programmiersprachen: Assembler, Algol, Fortran, C, C++, D, Java, Pascal, Ada, JavaScript, Lisp, Perl, PHP, Python,... L Imperative Programmiersprachen es wird beschrieben, wie der Algorithmus ablaufen muss, es wird der Lösungsweg vorgegeben. Beispiele: Fortran, Basic, Pascal, C,... L deklarative Programmiersprachen: Hier wird das Problem beschrieben, der Computer muss anhand der Problembeschreibung die Lösung nden. Akademisch, aber durchaus inzwischen in der Praxis einsetzbar. Beispiele: Haskell, Lisp.

10 Computer I 10 L Computer (lat. computare = zusammenrechnen) ist ein Apparat, der Daten mithilfe einer programmierbaren Rechenvorschrift verarbeiten kann. L Unterscheidung in analoge und digitale Computer. L Analoge Computer: Darstellung der Daten nicht als diskrete Werte, sondern als kontinuierliche analoge Gröÿen, zum Beispiel in Form von geometrischen Längen (Rechenschieber), Winkeln, Wasserständen, elektrischen Spannungen oder Strömen. L Grundlage der Digitalen Computer: Darstellung der Daten als diskrete Einheiten. Atomare Dateneinheit Bit (eine Zier aus 0, 1 ), davon abgeleitet: Byte = 8 Bit, Kibibyte (KiB) = 1024 Byte, Mibibyte (MiB) = 1024 Kilobyte, etc. pp.

11 Computer II 11 L Erster digitale Computer: Zuse Z3 (1941) (K. Zuse, ). L Computer heute: Von-Neumann-Architektur (John von Neumann, 1946), Computer deniert über fünf Hauptkomponenten: L L L L L Recheneinheit (Arithmetisch-Logische Einheit (ALU)), Steuereinheit, Buseinheit, Speicher sowie Eingabe- und Ausgabeeinheit(en). L Recheneinheit und Steuereinheit meist verschmolzen im Hauptprozessor (central processing unit, CPU). L Soll ein Algorithmus auf einem Computer implementiert werden, so muss also eine Folge von Befehlen für den Hauptprozessor geschrieben werden. Wie macht man das? L Zunächst: wie sehen Befehle für Hauptprozessor aus?

12 Hochsprache vs. Maschinensprache 12 L Grundlage für die CPU: Wenige, elementare Befehle Addition, Multiplikation, Division, Teilen mit Rest, Logische Operatoren. L C-Programm: 1 #i n c l u d e < s t d i o. h> 2 3 i n t main ( ) { 4 p r i n t f ( " H a l l o Welt! \ n" ) ; 5 r e t u r n 0 ; 6 } L Gleiches Programm in Maschinensprache: 1 s e c t i o n. t e x t 2 g l o b a l _ s t a r t 3 _ s t a r t : 4 mov edx, l e n 5 mov ecx, msg 6 mov ebx, 1 7 mov eax, 4 8 i n t 0 x80 9 mov ebx, 0 10 mov eax, 1 11 i n t 0 x80 12 s e c t i o n. d a t a 13 msg db ' H a l l o Welt! ',0 x0a 14 l e n equ 12 Ô Hochsprache ist wesentlich abstrakter und verständlicher.

13 Vom Quelltext zum ausführbaren Programm 13 L Übersetzung durch Compiler: Quelltext (für Menschen lesbar, kommentiert) Ô Maschinencode (Instruktionen für den Hauptprozessor, nicht ohne weiteres für Menschen lesbar). L Vor der Übersetzung ruft der Compiler automatisch den Präprozessor auf. Direktiven des Präprozessors: #ifdef: Bedingtes Compilieren #include: Einlesen von Dateien vor dem eigentlichen Compilieren. #dene: Denition von symbolischen Konstanten und Makros. L Der Compiler kann Bibliotheken einbinden, in denen andere (Teil-)Algorithmen bereits implementiert sind.

14 Die Programmiersprache C 14 L C ist eine imperative Hochsprache, weit verbreitet. L C wurde 1972 von Dennis M. Ritchie in den Bell-Laboratorien bei AT&T entwickelt. L Vorgänger: B (1969), BCPL (Basic Combined Programming Language, 1966). L Unix/Linux wurde beinahe vollständig in C geschrieben. L Weiterentwicklung durch Brian W. Kernighan in den 1970er Jahren. L 1978: The C Programming Language von B. W. Kernighan und D. M. Ritchie, diente lange Zeit als Denition von C. L 1989: ANSI-Standard C89 (ANSI = American National Standards Institute). L 1999: ISO-Standard C99 (ISO = International Organization for Standardization).

15 C-Programme I 15 L C-Programme werden von oben nach unten und von links nach rechts gelesen, bestehen aus Blöcken, welche durch {... } abgegrenzt werden. Blöcke bestehen aus Anweisungen, welche durch ein Semikolon abgetrennt werden. Leerzeichen und Zeilenumbrüche werden ignoriert (dienen aber der Lesbarkeit). L Ein C-Programm wird mit einem beliebigen Texteditor geschrieben und der Quelltext dann mithilfe eines Compilers in eine dem Computer verständliche Form (Maschinencode) übersetzt. L Quelltext kann Kommentare enthalten, welche der Computer ignoriert. 1 // d e r R e s t d i e s e r Z e i l e i s t e i n Kommentar 2 /* a l l e s i n n e r h a l b d i e s e s B l o c k s 3 i s t e i n Kommentar */ L Die Sprache beinhaltet Schlüsselwörter, welchen eine bestimmte Bedeutung zukommt.

16 C-Programme II 16 L Es können Variablen und Funktionen deniert werden. L Variable = Speicherbereich, a-priori also Binärzahl. L Wichtig ist die Typisierung (ganze Zahlen, Zeichenketten, etc.). L Viele C-Programme beginnen mit den Zeilen: #include <... > L Anweisung an Präprozessor / Compiler, gewisse Bibliotheken einzubinden. L Bibliothek = Sammlung von vorgefertigten Funktionen, z.b. für Mathematik, Grak, etc. L Funktion = Funktionseinheit eines Programms, welche einen Namen und einen (zumindestens formalen) Rückgabewert hat und immer wieder verwendet werden kann. L Beispiel: Ausgabe einer Zeichenkette auf dem Bildschirm, Berechnung der Quadratwurzel einer Zahl,...

17 Ein- und Ausgabe von Daten 17 L Problem: wie kommen die Daten in und aus dem Programm? L Lösung: Ein- und Ausgabe über Tastatur, Dateien, etc. pp. L Oft benötigt: Ausgabe von Nachrichten auf dem Bildschirm. Funktion hierzu: p r i n t f ( " H a l l o Welt! " ) ; Diese wird von der Bibliothek stdio (Standard Input/Output) zur Verfügung gestellt.

18 Ein erstes C-Programm 18 L Ein lauähiges Programm: 1 /* h e l l o. c */ 2 #i n c l u d e < s t d i o. h> 3 4 i n t main ( ) { 5 p r i n t f ( " H a l l o Welt! \ n" ) ; 6 r e t u r n 0 ; 7 /* h i e r i s t S c h l u s s */ 8 } L Bibliothek stdio.h für Ein-/Ausgabe. L int main() ist der Anfangspunkt des Programms (als Funktion). L return beendet das Programm. L int Datentyp für ganze Zahl (Integer). L Fett gedruckt: Schlüsselwörter. L \n: neue Zeile innerhalb einer Zeichenkette.

19 Compilieren von C-Programmen 19 L Der Quelltext kann in einem beliebigen Editor geschrieben werden. L Übliche Dateiendung.c. L Compilieren aus der Konsole mit dem GNU C Compiler: $ gcc -std=c99 -Wall -o hello hello.c L Programmstart aus der Konsole: $./hello Hello, world! L Komfortabler: Integrated Development Environment (IDE), enthält Editor mitzusätzlichen Werkzeugen, Dokumentation, etc. L Hier eingesetzt: Eclipse (Java-basiert, quelloen) mit den C Development Tools (CDT).

20 Der Debugger 20 L Ein Debugger (engl. bug = Wanze, Fehler) dient zum Aufspüren von Fehlern im Programm. L Das Programm kann schrittweise ausgeführt werden, wobei nach jedem Schritt der Wert von Variablen kontrolliert / modiziert werden kann. L Es können Unterbrechungspunkte (break points) deniert werden, bei denen das Programm unterbrochen wird. L Hier verwendet: GNU Debugger gdb. Grundversion Textinterface, aber auch komfortablere, grasche Varianten.

21 Die Entwicklungsumgebung Eclipse 21 L Ein Projekt erstellen. L Dateien hinzufügen und Quelltext editieren. L Quelltext übersetzen und ausführen. L Fehlersuche, Schrittweises ausführen (debugging) mit Hilfe des GNU Debugger.

22 Schlüsselwörter von C 22 auto, bool, break, case, char, const, continue, default, do, double, else, enum, extern, false, oat, for, goto, if, inline, int, long, register, restrict, return, short, signed, sizeof, static, struct, switch, true, typedef, union, unsigned, void, volatile, while.

23 Variablen I - Prinzip 23 L Eine Variable ist eine Benennung eines bestimmten Speicherbereichs, der Variablen können neue Werte zugewiesen werden und diese kann in Ausdrücken verwendet werden. L Variablentypen in C: ganze Zahlen (int), Zeichen (char), Wahrheitswerte (bool), leerer Datentyp (void),... L Eine Variable muss vor der Benutzung deklariert (vereinbart) werden. L Syntax für das Deklarieren einer Variable: DATENTYP NAME;, beispielsweise: 1 i n t i ; 2 f l o a t j = 1. 0 ; L Die Wahl des Namens der Variablen obliegt dem Programmierer, aber mit Einschränkungen:

24 Variablen II - Benennung 24 Regeln für Variablennamen in C: L Variablennamen können aus Buchstaben (ohne Umlaute und ÿ), Ziern und dem Unterstrich bestehen. L Das erste Zeichen eines Variablennamens muss ein Buchstabe sein. L Die Länge eines Variablennamens ist beliebig. L Der Variablenname darf nicht mit einem vordenierten Schlüsselwörter übereinstimmen. L Zwischen Groÿ- und Kleinschreibung wird unterschieden (case-sensitive).

25 Elementare Datentypen - char 25 L Der Datentyp char repräsentiert ein Zeichen. L Ein Zeichen benötigt 1 Byte (8 Bit) Speicherplatz. L char ist ein Ganzzahl-Datentyp; es wird der (numerische) ASCII-Wert (American Standard Code for Information Interchange) des Zeichens gespeichert. L Es gibt vorzeichenbehaftete und vorzeichenlose Varianten (Datentypen: signed char/unsigned char). Im Falle von signed ist das erste Bit Vorzeichenbit, bei unsigned nicht. L Wertebereich: signed char: , unsigned char:

26 Elementare Datentypen - int 26 L Der Datentyp int repräsentiert die ganzen Zahlen (integer). L Der Speicherbedarf ist 4 Bytes (32-Bit) oder 8 Bytes (64-Bit). L Es gibt vorzeichenbehaftete und vorzeichenlose Varianten (Datentypen: signed int/unsigned int). Im Falle von signed ist das erste Bit Vorzeichenbit, bei unsigned nicht. L Wertebereich: unsigned int: (= ). signed int: , L Integer-Zahlen werden exakt dargestellt.

27 Elementare Datentypen - oat und double 27 L Der Datentyp oat repräsentiert Gleitkommazahlen einfacher Genauigkeit, double repräsentiert Gleitkommazahlen doppelter Genauigkeit. Für ernsthafte Berechnungen sollte stets double verwendet werden. L Der Speicherbedarf sind 4 Bytes (oat) bzw. 8 Bytes (double). L Allgemeine Darstellung einer Gleitkommazahl: z M B E mit Mantisse M, (fester) Basis B und Exponent E. L Die Genauigkeit ist durch die Anzahl der Ziern von M begrenzt. L Wertebereich (B 10): oat : , double : L Die eigentliche Beschränkung ist die Anzahl der Mantissenstellen!

28 Elementare Datentypen - Beispiel 28 #i n c l u d e < s t d i o. h> i n t main ( i n t argc, char ** a r g v ) { i n t n, m; double x, y ; n = ; m= ; x =1.797 e308 ; y =1.798 e308 ; p r i n t f ( "%d %d\n", n, m) ; p r i n t f ( "%g %g\n", x, y ) ; } r e t u r n 0 ;

29 Elementare Datentypen - Konstanten und Variablen 29 L Konstanten = sich nicht ändernde Daten, z.b. ist in i n t main ( ) { p r i n t f ( " H a l l o L e u t e! " ) ; r e t u r n 0 ; } Hallo Leute! eine Zeichenketten-Konstante. L Im Gegensatz dazu: Variablen als benannte Speicherbereiche, welche geändert werden können. Weitere Beispiele: L Integer: int i=-12; L Zeichen: char c='x'; L Zeichenkette: Eine Zeichenkette\n, Steuerzeichen: beginnen mit \, z.b. \n für neue Zeile, \t für Tabulator, etc. L Flieÿkomma: oat a=1.205; oat b=2.83e-10;

30 Ausgabe von Werten mit printf 30 L Mit printf(... ); können Zeichenketten ausgegeben werden. L Allgemeiner können auch Werte von Variablen ausgegeben werden, dafür wird in die Zeichenkette ein Platzhalter eingefügt: 1 i n t a =1; 2 i n t b =2; 3 p r i n t f ( " Der Wert von a i s t : %i, d e r von b i s t %i ", a, b ) ; L Platzhalter: %i, %u Integer (signed, unsigned), %f, %g Flieÿkomma, %c Zeichen, %s Zeichenkette. L Länge, Vor- und Nachkommastellen bei Flieÿkommazahlen: %02i Integer mit mindestens zwei Ziern. %.2f Fliekommazahl mit zwei Nachkommastellen ausgeben.

31 Ausdrücke und Operatoren 31 L Ein Ausdruck besteht aus Operanden, welche durch Operatoren verknüpft sind, z.b. oat zahl = 13.57; L Es gibt verschiedene Gruppen von Operatoren, z.b.: Arithmetische Operatoren, Vergleichsoperatoren, Logische Operatoren, Zuweisungsoperatoren, Inkrement- und Dekrementoperatoren. L Zuweisungsoperator = weist Variablen konstante Werte oder den Wert anderer Variablen des gleichen Typs zu: i n t a ; f l o a t b, c ; a =100; b = 1. 1 ; c =2*b ;

32 Arithmetische Operatoren 32 L Deniert für int, oat, double,... L Operatoren: +, -, *, /, % für Addition, Subtraktion Multiplikation, Division, Teilungsrest (Modulo). L Die Regel Punkt vor Strich ist gültig, d.h. die Operatoren + und - haben eine geringere Priorität als *, / und %. L Bei gleicher Priorität werden die Operatoren von links nach rechts abgearbeitet. L Beispiel: i n t a, b, c ; a =10; b = 2; c =( a+b ) *3+4;

33 Vielen Dank für Ihre Aufmerksamkeit und bis morgen...