programmierkurs c++
TRANSCRIPT
Zentrum für Angewandte Informatik KölnArbeitsgruppe Faigle / SchraderUniversität zu Köln
Kurs 6108
Programmierkurs C++Wintersemester 2001/02
Prof. R. Schrader
Nils [email protected]
470 - 6026
Jürgen Grä[email protected]
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
Zentrum für Angewandte Informatik KölnArbeitsgruppe Faigle / SchraderUniversität zu Köln
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
Zentrum für Angewandte Informatik KölnArbeitsgruppe Faigle / SchraderUniversität zu Köln
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
Zentrum für Angewandte Informatik KölnArbeitsgruppe Faigle / SchraderUniversität zu Köln
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
Zentrum für Angewandte Informatik KölnArbeitsgruppe Faigle / SchraderUniversität zu Köln
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
Zentrum für Angewandte Informatik KölnArbeitsgruppe Faigle / SchraderUniversität zu Köln
2 Grundlagen
2.1 Allgemeiner Aufbau eines Computers
Die wesentlichen Komponenten lassen sich folgendermaßenkategorisieren:
CPU
Speicher
Tastatur / MausBildschirm
Festplatte Netzwerk
CPU Die Central Processing Unit führt die notwendigenBerechnungendurch, macht logische Verknüpfungen,bearbeitet Daten, steuert das Verhalten allerKomponenten des Computers, regelt IO
Die CPU liest den Programmcode aus dem Speicher undführt ihn aus.
SpeicherDieser enthält die Daten und den Programmcodedie von der CPU benötigt werden.
Ein- und Ausgabegeräte (I/O)Dienen z.B. als Schnittstellezum Benutzer, zum Datenaustausch oder alsMassenspeicher.
WS 2001/02 Programmierkurs C++ Seite 6
Zentrum für Angewandte Informatik KölnArbeitsgruppe Faigle / SchraderUniversität zu Köln
2.2 Allgemeiner Softwareaufbau
Anwendungsprogramme
BenutzerSchnittstelle
Bibliotheks-Routinen
Betriebssystem
Hardware
Betriebssystem
Das Betriebssystem steuert alle Betriebsabläufe imComputer. 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 gleichzeitigerAusführung von Programmen (Multitasking)
• Verwaltung des Benutzerzugangs
• Verwaltung von Zugriffsrechten auf Daten
WS 2001/02 Programmierkurs C++ Seite 7
Zentrum für Angewandte Informatik KölnArbeitsgruppe Faigle / SchraderUniversität zu Köln
Benutzerschnittstelle
• Komanndointerpreter (Shell) bieten die Möglichkeitinteraktiv Befehle auszuführen.
• Fenstersysteme wie XWindows stellen grafischeOberflächen für Programme zur Verfügung.
Bibliotheksroutinen
Vorgefertigte Unterprogramme, welche in Bibliothekenzusammengefasst werden, können in eigenen Programmenverwendet 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
Zentrum für Angewandte Informatik KölnArbeitsgruppe Faigle / SchraderUniversität zu Köln
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
home
usr
tmp
eissfeldt
graefe
datei-1
datei-2
Datei 1
...
...
...
WS 2001/02 Programmierkurs C++ Seite 9
Zentrum für Angewandte Informatik KölnArbeitsgruppe Faigle / SchraderUniversität zu Köln
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
Zentrum für Angewandte Informatik KölnArbeitsgruppe Faigle / SchraderUniversität zu Köln
2.4 Wichtige Befehle und Programme
man Zeigt die Hilfe zu einem Befehl oder Pro-
gramm an. Mitman ls wird z.B. die Benut-
zung vonls erklärt.
ls zeigt den Inhalt eines Verzeichnisses an; mit
ls -l auch etwas ausführlicher.
cp Kopiert den Inhalt einer Datei in eine andere
Datei. Verzeichnisse mitcp -r kopieren.
mv Verschiebt eine Datei in ein anderes Verzeich-
nis oder benennt die Datei um.
rm Löschen einer Datei oder eines Verzeichnisses.
mkdir Erstellen eines Verzeichnisses.
cd Wechselt in das angegebene Verzeichnis
grep sucht eine Zeichenkette in Dateien.
cat Zeigt eine Datei am Bildschirm an.
WS 2001/02 Programmierkurs C++ Seite 11
Zentrum für Angewandte Informatik KölnArbeitsgruppe Faigle / SchraderUniversität zu Köln
2.5 Benötigte Werkzeuge zurProgrammentwicklung
Um Programme zu erstellen werden folgende Werkzeug
benötigt:
• Ein Editor (z.B. Emacs/XEmacs, vim, pico) zum
Erstellen der Quelltexte.
• DerCompiler (g++) wandelt den Quelltext in die für
den Computer lesbare Maschinensprache um.
• DerLinker (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
Zentrum für Angewandte Informatik KölnArbeitsgruppe Faigle / SchraderUniversität zu Köln
Diese Programme werden von der Shell ausgeführt, welchenach dem Anmelden in einemXTerm-Fenster zur Verfügungsteht:
Beispiele von Kommandos, welche in der Shell ausgeführtwerden schreiben wir innerhalb des Programmierkurses infolgender Form:
$ kommando
wobei$ den Benutzer- und systemabhängigen Promptbezeichnet, welcher in einer Shell erscheint und zu einerEingabe auffordert.
WS 2001/02 Programmierkurs C++ Seite 13
Zentrum für Angewandte Informatik KölnArbeitsgruppe Faigle / SchraderUniversität zu Köln
Programme werden mit einem Editor erstellt. Durch den
Aufruf von
$ xemacs first.cc
wird der Editor XEmacs gestartet und die Dateifirst.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
Zentrum für Angewandte Informatik KölnArbeitsgruppe Faigle / SchraderUniversität zu Köln
Die wichtigsten Tastenkürzel im XEmacs lauten:
^H t Startet ein Tutorial
^H i Öffnet die Info-Seiten zum XEmacs
^X u Änderung zurücknehmen
^X^C Editor beenden
^X^F Datei öffnen
^X^S Datei speichern
^X^W Speichert die Datei unter einen anderen Namen
^S Suchen innerhalb der geöffneten Datei
^R Sucht rückwärts
wobei^X bedeutet, daß die TasteX zusammen mit der
Control- bzw. Steuerungstaste zu betätigen ist.
Empfehlenswert ist das durchH t aufzurufende Tutorial,
welches den ungeübten Benutzer mit XEmacs vertraut macht.
WS 2001/02 Programmierkurs C++ Seite 15
Zentrum für Angewandte Informatik KölnArbeitsgruppe Faigle / SchraderUniversität zu Köln
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 Dateia.out erstellt.
Will man einen anderen Namen, so kann man diesen mit dem
Parameter-o angeben. Mit
$ g++ -o first first.cc
wird die Dateifirst anstatta.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
Zentrum für Angewandte Informatik KölnArbeitsgruppe Faigle / SchraderUniversität zu Köln
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 # inc lude< i o s t r e a m >3 us ing namespace s t d ;45 i n t main ( )6 {7 cou t < < " Dies i s t mein " ;8 cou t < < " e r s t e sC++ Programm " << end l ;9 re turn 0 ;
10 }
Zurückzuführen ist dies auf ein vergessenes Semikolon in der
vorangehenden Zeile, wodurch der Befehlreturn nicht
erkannt werden konnte.
WS 2001/02 Programmierkurs C++ Seite 17
Zentrum für Angewandte Informatik KölnArbeitsgruppe Faigle / SchraderUniversität zu Köln
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
Zentrum für Angewandte Informatik KölnArbeitsgruppe Faigle / SchraderUniversität zu Köln
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
Zentrum für Angewandte Informatik KölnArbeitsgruppe Faigle / SchraderUniversität zu Köln
Das Schreiben von Binärcode ist viel zu unübersichtlich undunverständlich.
• Vereinfachung durch symbolische Beschreibung dereinzelnen Maschinenbefehle⇒ Assembler
MOV AX, 0
ADD AX, x00AC
JMP x0815
– der Assembler-Code istprozessorabhängigund wirddurch geeignete Programme in Maschinencodeübersetzt.
– Für spezielle Anwendungen wird Assembler auchheute noch verwendet (zeitkritische Anwendungen,hardwarenahe Programmierung).
• Vereinfachung durch Beschreibung des Programms ineiner maschinenunabhängigen Sprache, die den Benutzermöglichst gut unterstützt⇒ höhere Programmiersprache.
– Beispiele sind: C/C++, Pascal, Java, Basic, Perl,Python, ...
– Der Programmtext muß von einem Programm, demCompiler, in Maschinencode übersetzt werden.
– Nur der Compiler ist maschinenabhängig.
WS 2001/02 Programmierkurs C++ Seite 20
Zentrum für Angewandte Informatik KölnArbeitsgruppe Faigle / SchraderUniversität zu Köln
Beispiel: Nullstellen eines Polynoms
• Problem: Wie lauten die Nullstellen der Funktion
f : R→ R mit f(x) = ax2 + bx+ c?
• Eingabedaten:a, b, c ∈ R
• Algorithmus:
1. berechne DiskriminanteD = b2 − 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 und −b−√D
2a
7. fertig
8. f hat die doppelte reelle Nullstelle−b2a
9. fertig
WS 2001/02 Programmierkurs C++ Seite 21
Zentrum für Angewandte Informatik KölnArbeitsgruppe Faigle / SchraderUniversität zu Köln
1 / / D ieses 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 s2 / / Polynoms zwe i t en Grades f ( x ) = ax ^2+bx+c3 # inc lude < i o s t r e a m >4 # inc lude < cmath>5 us ing namespace s t d ;67 i n t main ( )8 {9 / / E ingabeda ten a , b , c
10 f l o a t a , b , c ;1112 / / Wert zu r s p e i c h e r u n g der De te rm inan te13 f l o a t D;1415 / / E i n l e s e n der Pa rame te r durch den Benu tze r16 c i n > > a > > b > > c ;1718 / / Berechnen der De te rm inan te19 D = b ∗ b − 4 . 0 ∗ a ∗ c ;2021 i f ( D = = 0 ) / / Doppe l te r e e l e N u l l s t e l l e22 {23 cou t < < " Doppe l te N u l l s t e l l e : "24 <<−b / ( 2 . 0 ∗ a ) < < end l ;25 }26 e l s e i f ( D > 0 ) / / Zwei N u l l s t e l l e n27 {28 cou t < < " N u l l s t e l l e 1: "29 < < ( s q r t ( D)− b ) / ( 2 . 0 ∗ a )30 << end l ;31 cou t < < " N u l l s t e l l e 2: "32 << (− s q r t ( D) − b ) / ( 2 . 0 ∗ a )33 << end l ;34 }35 e l s e cou t < < " Keine N u l l s t e l l e n " << end l ;36 }
WS 2001/02 Programmierkurs C++ Seite 22