Kurs 6108 Programmierkurs C++ Wintersemester 2001/02 Prof. R. Schrader Nils Eissfeldt eissfeldt@zpr.uni-koeln.de 470-6026 Jürgen Gräfe graefe@zpr.uni-koeln.de 470-6010 Vorlesung freitags 15:15 16:45 Uhr Sprechstunde dienstags 10:00 11:00 Uhr Weyertal 80, 2. Etage links http://www.zaik.uni-koeln.de/afs/teachings/courses/progkurs/ WS 2001/02 Programmierkurs C++ Seite 1
1 Vorbemerkungen 1.1 Vorraussetzungen und Ziele Es sind keine Vorkenntnisse nötig Es gibt keine Scheine Vermittelt werden: Grundkenntnisse der Programmierung in C++ Konzept der objektorientierten Programmierung Verwendung der Standardbibliotheken 1.2 Übungsaufgaben Kursbegleitende Übungsaufgaben werden gestellt Die Aufgaben werden nicht korrigiert Musterlösungen werden in der Vorlesung besprochen Grundsätzlich können wir in diesem Rahmen nur das Handwerkszeug zum Programmieren an die Hand geben. Um programmieren zu lernen muß man programmieren üben. WS 2001/02 Programmierkurs C++ Seite 2
1.3 Homepage http://www.zaik.uni-koeln.de/afs/ teachings/courses/progkurs/ Auf der Internetseite zu diesem Kurs finden sich weitere Informationen Literaturhinweise Mailingliste Beantragen eines Accounts Folien und Beispielprogramme Übungsaufgaben und Musterlösungen WS 2001/02 Programmierkurs C++ Seite 3
1.4 Arbeiten am Computer Die Beispiele, Übungen und Musterlösungen werden systemunabhängig gestaltet und lassen sich mit jedem aktuellen C++ Compiler unabhängig vom verwendeten Betriebssystem übersetzen. Arbeiten in der UNI Für das Arbeiten an der UNI steht der SUN-Pool zur Verfügung: Pohligstraße, 3. Etage Mo. Fr. 9:00 17:00 Uhr (ggf. in der 5. Etage melden) WS 2001/02 Programmierkurs C++ Seite 4
Arbeiten zu Hause Besonders empfehlenswert ist das Arbeiten unter Linux, da dort der Compiler und viele nützliche Tools für das Programmieren bereits vorhanden sind. Außerdem ist Linux kostenlos. CD s mit aktuellen Linux-Distributionen kann man sich im Rechenzentrum kopieren. Auch unter Windows gibt es (neben kommerziellen Compilern wie Visual C++) kostenlose Compiler. Auf unseren WWW-Seiten findet sich ein Link zu Cygwin, welches neben einer UNIX-Artigen Umgebung für Windows auch den unter Linux verbreiteten GNU C++-Compiler enthält. WS 2001/02 Programmierkurs C++ Seite 5
2 Grundlagen 2.1 Allgemeiner Aufbau eines Computers Die wesentlichen Komponenten lassen sich folgendermaßen kategorisieren: CPU Bildschirm Tastatur / Maus Speicher Festplatte Netzwerk CPU Die Central Processing Unit führt die notwendigen Berechnungendurch, macht logische Verknüpfungen, bearbeitet Daten, steuert das Verhalten aller Komponenten des Computers, regelt IO Die CPU liest den Programmcode aus dem Speicher und führt ihn aus. Speicher Dieser enthält die Daten und den Programmcode die von der CPU benötigt werden. Ein- und Ausgabegeräte (I/O) Dienen z.b. als Schnittstelle zum Benutzer, zum Datenaustausch oder als Massenspeicher. WS 2001/02 Programmierkurs C++ Seite 6
2.2 Allgemeiner Softwareaufbau Anwendungsprogramme Benutzer Schnittstelle Bibliotheks- Routinen Betriebssystem Hardware Betriebssystem Das Betriebssystem steuert alle Betriebsabläufe im Computer. Darunter fallen: Laden, Ausführen und Abbrechen von Programmen Organisation des Speichers Zugriff auf Peripheriegeräte Organisation und Verwaltung der Festplattendaten Verwaltung von Zeitscheiben bei gleichzeitiger Ausführung von Programmen (Multitasking) Verwaltung des Benutzerzugangs Verwaltung von Zugriffsrechten auf Daten WS 2001/02 Programmierkurs C++ Seite 7
Benutzerschnittstelle Komanndointerpreter (Shell) bieten die Möglichkeit interaktiv Befehle auszuführen. Fenstersysteme wie XWindows stellen grafische Oberflächen für Programme zur Verfügung. Bibliotheksroutinen Vorgefertigte Unterprogramme, welche in Bibliotheken zusammengefasst werden, können in eigenen Programmen verwendet werden. Anwendungssoftware übrige Software mit den unterschiedlichsten Aufgaben, z.b. Werkzeuge zur Programmerstellung Editoren (XEmacs, vim, pico) Compiler (gcc, g++) Textverarbeitungen (soffice) WWW-Browser (lynx, opera, netscape) E-Mail Programme (pine, mutt) WS 2001/02 Programmierkurs C++ Seite 8
2.3 Dateien und Verzeichnisse (Unix) Dateien sind abstrakte Gebilde zur Speicherung von Daten auf einem Speichermedium wie Festplatte oder Diskette. Jede Datei hat einen Namen Unix verwaltet die Zugriffsrechte Dateien werden in Verzeichnissen abgelegt Verzeichnisse können mehre Dateien und auch weitere Unterverzeichnisse enthalten Es ergibt sich eine Baumförmige Struktur von Dateien und Verzeichnissen: / etc Datei 1... home eissfeldt datei-1 graefe datei-2 tmp usr...... WS 2001/02 Programmierkurs C++ Seite 9
Für Verzeichnisse gelten folgende Regeln: Das Wurzelverzeichnis (root) wird mit einem / (Slash) bezeichnet. Dateien werden durch Aneinanderreihung von Katalognamen eindeutig bestimmt (Pfade). Pfade die mit / beginnen starten im Wurzelverzeichnis, ansonsten im aktuellen Verzeichnis. Mit cd kann man zwischen Verzeichnissen wechseln. Jedes Verzeichnis enthält Verweise auf sich (.) und auf das übergeordnete Verzeichnis (..) Jeder Benutzer hat ein eigenes Verzeichnis /home/<benutzername> (Home) Dieses Verzeichnis heißt auch ~ WS 2001/02 Programmierkurs C++ Seite 10
2.4 Wichtige Befehle und Programme man ls cp mv rm mkdir cd grep cat Zeigt die Hilfe zu einem Befehl oder Programm an. Mit man ls wird z.b. die Benutzung von ls erklärt. zeigt den Inhalt eines Verzeichnisses an; mit ls -l auch etwas ausführlicher. Kopiert den Inhalt einer Datei in eine andere Datei. Verzeichnisse mit cp -r kopieren. Verschiebt eine Datei in ein anderes Verzeichnis oder benennt die Datei um. Löschen einer Datei oder eines Verzeichnisses. Erstellen eines Verzeichnisses. Wechselt in das angegebene Verzeichnis sucht eine Zeichenkette in Dateien. Zeigt eine Datei am Bildschirm an. WS 2001/02 Programmierkurs C++ Seite 11
2.5 Benötigte Werkzeuge zur Programmentwicklung Um Programme zu erstellen werden folgende Werkzeug benötigt: Ein Editor (z.b. Emacs/XEmacs, vim, pico) zum Erstellen der Quelltexte. Der Compiler (g++) wandelt den Quelltext in die für den Computer lesbare Maschinensprache um. Der Linker (ld) verbindet ein oder mehrere Dateien mit Maschinensprache zu einem Programm. Debugger (gdb, dbx) helfen dem Entwickler Fehler im Quelltext zu finden. Zu beachten ist, daß der Linker oft vom Compiler automatisch aufgerufen wird und nicht extra gestartet werden muß. WS 2001/02 Programmierkurs C++ Seite 12
Diese Programme werden von der Shell ausgeführt, welche nach dem Anmelden in einem XTerm-Fenster zur Verfügung steht: Beispiele von Kommandos, welche in der Shell ausgeführt werden schreiben wir innerhalb des Programmierkurses in folgender Form: $ kommando wobei $ den Benutzer- und systemabhängigen Prompt bezeichnet, welcher in einer Shell erscheint und zu einer Eingabe auffordert. WS 2001/02 Programmierkurs C++ Seite 13
Programme werden mit einem Editor erstellt. Durch den Aufruf von $ xemacs first.cc wird der Editor XEmacs gestartet und die Datei first.cc geöffnet. Ist diese nicht vorhanden wird eine leere Datei angelegt. XEmacs kann sowohl über die Menüs mit der Maus, als auch über die Tastatur durch sogenannte Tastenkürzel gesteuert werden. WS 2001/02 Programmierkurs C++ Seite 14
Die wichtigsten Tastenkürzel im XEmacs lauten: ^H t ^H i ^X u ^X^C ^X^F ^X^S ^X^W ^S ^R Startet ein Tutorial Öffnet die Info-Seiten zum XEmacs Änderung zurücknehmen Editor beenden Datei öffnen Datei speichern Speichert die Datei unter einen anderen Namen Suchen innerhalb der geöffneten Datei Sucht rückwärts wobei ^X bedeutet, daß die Taste X zusammen mit der Control- bzw. Steuerungstaste zu betätigen ist. Empfehlenswert ist das durch ^H t aufzurufende Tutorial, welches den ungeübten Benutzer mit XEmacs vertraut macht. WS 2001/02 Programmierkurs C++ Seite 15
Nach dem Bearbeiten der Quelldatei kann sie mit dem Compiler in ein für den Computer ausführbares Format gebracht werden. Dies geschieht mit Eingabe des Befehls $ g++ first.cc nach einer kurzen Wartezeit wurde die Datei a.out erstellt. Will man einen anderen Namen, so kann man diesen mit dem Parameter -o angeben. Mit $ g++ -o first first.cc wird die Datei first anstatt a.out erstellt. Diese kann jetzt aufgerufen werden und liefert eine entsprechende Ausgabe. $./first Dies ist mein erstes C++ Programm Wichtig hierbei ist die Angabe des Pfades./ vor dem Dateinamen. Unix sucht normalerweise keine ausführbaren Programme im aktuellen Verzeichnis, so daß dieses explizit angegeben werden muß. WS 2001/02 Programmierkurs C++ Seite 16
Oft läßt sich das geschriebene Programm aufgrund von Fehlern nicht vom Compiler übersetzten: $ g++ -o first first.cc first.cc: In function int main() : first.cc:9: parse error before return Es werden aber Informationen darüber gegeben wo der Fehler zu finden ist. So hat der Compiler in Zeile 9 ein Problem gemeldet. 1 / / Dies i s t mein e r s t e s Programm i n C++ 2 # i n c l u d e < i o s t r e a m > 3 using namespace s t d ; 4 5 i n t main ( ) 6 { 7 c o u t < < " Dies i s t mein " ; 8 c o u t < < " e r s t e s C++ Programm " << e n d l ; 9 return 0 ; 10 } Zurückzuführen ist dies auf ein vergessenes Semikolon in der vorangehenden Zeile, wodurch der Befehl return nicht erkannt werden konnte. WS 2001/02 Programmierkurs C++ Seite 17
2.6 Programme und Programmiersprachen Was ist ein Programm? Programmieren heißt, einem Computer mitzuteilen, was er tun soll und wie er es zu tun hat. Ein Programm beschreibt einen Algorithmus, dh. eine endliche Folge eindeutiger Anweisungen. Ein Programm ist eine in einer formalisierten Sprache (Programmiersprache) ausgedrückte Folge von Anweisungen, die vom Computer verstanden und nacheinander abgearbeitet wird. WS 2001/02 Programmierkurs C++ Seite 18
Welche Sprache spricht ein Computer? Die Hardware des Computers, insbesondere der Prozessor, besteht aus logischen Bausteinen (UND, ODER, NICHT,...) und arbeitet intern nur mit den Werten 0 (falsch) und 1 (wahr). Grund: Diese Werte lassen sich elektrische einfach realisieren, z.b. Strom fließt bzw. Strom fließt nicht. Der Computer versteht also nur Binärdaten. Befehle für den Prozessor und Daten werden in 0/1-Folgen kodiert ( 00110110 ) ( 01100100 ) ( 11110110 ) Zahlen werden als Dualzahlen dargestellt. WS 2001/02 Programmierkurs C++ Seite 19
Das Schreiben von Binärcode ist viel zu unübersichtlich und unverständlich. Vereinfachung durch symbolische Beschreibung der einzelnen Maschinenbefehle Assembler MOV AX, 0 ADD AX, x00ac JMP x0815 der Assembler-Code ist prozessorabhängig und wird durch geeignete Programme in Maschinencode übersetzt. Für spezielle Anwendungen wird Assembler auch heute noch verwendet (zeitkritische Anwendungen, hardwarenahe Programmierung). Vereinfachung durch Beschreibung des Programms in einer maschinenunabhängigen Sprache, die den Benutzer möglichst gut unterstützt höhere Programmiersprache. Beispiele sind: C/C++, Pascal, Java, Basic, Perl, Python,... Der Programmtext muß von einem Programm, dem Compiler, in Maschinencode übersetzt werden. Nur der Compiler ist maschinenabhängig. WS 2001/02 Programmierkurs C++ Seite 20
Beispiel: Nullstellen eines Polynoms Problem: Wie lauten die Nullstellen der Funktion f : R R mit f(x) = ax 2 + bx + c? Eingabedaten: a, b, c R Algorithmus: 1. berechne Diskriminante D = b 2 4ac 2. Wenn D > 0, weiter mit Schritt 6. 3. Wenn D = 0, weiter mit Schritt 8. 4. f hat keine reellen Nullstellen 5. fertig 6. f hat zwei Nullstellen: b+ D 2a 7. fertig und b D 2a 8. f hat die doppelte reelle Nullstelle b 2a 9. fertig WS 2001/02 Programmierkurs C++ Seite 21
1 / / D i e s e s Programm b e r e c h n e t d i e N u l l s t e l l e n e i n e s 2 / / Polynoms z w e i t e n Grades f ( x ) = ax ^2+ bx+c 3 # i n c l u d e < i o s t r e a m > 4 # i n c l u d e < cmath> 5 using namespace s t d ; 6 7 i n t main ( ) 8 { 9 / / E i n g a b e d a t e n a, b, c 10 f l o a t a, b, c ; 11 12 / / Wert z u r s p e i c h e r u n g d e r D e t e r m i n a n t e 13 f l o a t D; 14 15 / / E i n l e s e n d e r P a r a m e t e r durch den B e n u t z e r 16 c i n > > a > > b > > c ; 17 18 / / Berechnen d e r D e t e r m i n a n t e 19 D = b b 4. 0 a c ; 20 21 i f ( D = = 0 ) / / D o p p e l t e r e e l e N u l l s t e l l e 22 { 23 c o u t < < " D o p p e l t e N u l l s t e l l e : " 24 << b / ( 2. 0 a ) < < e n d l ; 25 } 26 e l s e i f ( D > 0 ) / / Zwei N u l l s t e l l e n 27 { 28 c o u t < < " N u l l s t e l l e 1: " 29 < < ( s q r t ( D) b ) / ( 2. 0 a ) 30 << e n d l ; 31 c o u t < < " N u l l s t e l l e 2: " 32 << ( s q r t ( D) b ) / ( 2. 0 a ) 33 << e n d l ; 34 } 35 e l s e c o u t < < " Keine N u l l s t e l l e n " << e n d l ; 36 } WS 2001/02 Programmierkurs C++ Seite 22