Version 2.01 - 27. April 2010    Hydroinformatik I ”C++ und Visual C++”Olaf Kolditz und Bastian Kolditz    TU Dresden / UF...
2VorlesungskonzeptEin wesentlicher Bestandteil der Hydroinformatik ist die Informationsverarbei-tung. Typische Hydrodaten ...
3.Abbildung 2: Informationsverarbeitung in der Hydrologie - Beispiel aus der Hy-drogeologieOrganisatorischesDie Pr¨ fung ’...
4Es gibt viele und sehr gute C++ B¨ cher. Bei Amazon finden sie locker uber                                   u            ...
5.                      Abbildung 4: Vorlesungs-KonzeptDie Implementierung des Dialogs in Abb. 4 ist das erste greifbare Z...
Part IC ++ Basics
Kapitel 1Einfuhrung    ¨             7
8                                                                   ¨                                                     ...
1.2 PARADIGMEN                                                              91.2     ParadigmenProgrammier-Paradigmen sind...
10                                                                   ¨                                                    ...
1.3 COMPILER                                                                11f¨ r das PCS-Objekt ist CProcess, davon abge...
12                                                                  ¨                                                     ...
1.3 COMPILER                                                           13.                 Abbildung 1.5: Ein Kompromiss: ...
14                                                                   ¨                                                    ...
1.4 ”HELLO WORLD”                                                          151.4.2    Exercise E1                       Ab...
16                                                                   ¨                                                    ...
1.6 TESTFRAGEN                                                               171.6    Testfragen  1. Was bedeutet das ++ i...
Kapitel 2DatentypenJede Programmiersprache bietet die Verwendung elementarer Datentypen an,wie z.B. Ganzzahlen oder Gleitk...
2.2 SPEICHERBEDARF                                                         192.2     SpeicherbedarfDie unterschiedlichen D...
20                                                     KAPITEL 2 DATENTYPEN2.4       Testfragen     1. Was ist der genaues...
Kapitel 3Ein- und AusgabeEin Programm (ob prozedural, modular, objekt-orientiert) ist eigentlich nichtsweiter als eine Dat...
22                                              KAPITEL 3 EIN- UND AUSGABE.               Abbildung 3.1: Wissenschaftliche...
3.1 DIE STANDARD-STREAMS                                                   233.1     Die Standard-StreamsEs gibt vier Stan...
24                                                   KAPITEL 3 EIN- UND AUSGABE     cout << uppercase // f¨r Hex-Ziffern  ...
3.3 TESTFRAGEN                                                               25    cout << "TypetNumber of bytesn";    cou...
Kapitel 4Klassen                                source:                                TU DresdenData abstraction    class...
4.1 DATEN-ABSTRAKTION                                                        27Das Sprachelement der Klassen sind das ents...
28                                                          KAPITEL 4 KLASSENEin weiterer Vorzug von OO-Sprachen ist z.B. ...
4.3 INSTANZEN EINER KLASSE                                                   29diese bekommen echten Speicher f¨r ihre Dat...
30                                                       KAPITEL 4 KLASSEN4.4      Konstruktor und DestruktorWohl die wich...
4.5 DATENINITIALISIERUNG MIT DEM KONSTRUKTOR                                 314.5     Dateninitialisierung mit dem Konstr...
32                                                           KAPITEL 4 KLASSENint main(){  CStudent* m_std = new CStudent(...
4.6 DATENSCHUTZ                                                             33void CStudent::SetBankAccount(long new_bank_...
34                                                            KAPITEL 4 KLASSEN4.7       Testfragen     1. Geben sie eine ...
Kapitel 5Strings                            ¨Wir haben schon in mehreren Ubungen den Datentyp string benutzt, ohne diesenD...
36                                                         KAPITEL 5 STRINGSgesagt, genauer im Kapitel 9.2.2 an. Hier nur ...
5.2 OPERATIONEN MIT STRINGS                                                  375.2.2    Zuweisen von strings              ...
38                                                          KAPITEL 5 STRINGS                                             ...
5.2 OPERATIONEN MIT STRINGS                                                  39string name;int pos;if(m_std->name_first.fi...
40                                                           KAPITEL 5 STRINGS5.2.9    Umwandeln von strings in charManchm...
5.3 TESTFRAGEN                                                              415.3    Testfragen  1. Welche Klasse bietet u...
Kapitel 6Ein- und Ausgabe - IINachdem wir uns im Kapitel 3 bereits mit der Ein- und Ausgabe uber die¨Standard-Ger¨te (Tast...
6.2 ARBEITEN MIT FILE-STREAMS                                               43   • ifstream: ist von istream abgeleitet f¨...
44                                                 KAPITEL 6 EIN- UND AUSGABE - II#include <iostream>    //   for using   ...
6.2 ARBEITEN MIT FILE-STREAMS                                                  456.2.4    ¨         Ubung: Ein einfacher K...
46                                           KAPITEL 6 EIN- UND AUSGABE - IIAlle benutzten fstream Methoden finden sie in T...
6.2 ARBEITEN MIT FILE-STREAMS                                                      47   • Zeichenketten: RotIch bin mir zi...
48                                            KAPITEL 6 EIN- UND AUSGABE - IIMSVS legt allerhand Zeug’s an. Das executable...
6.3 FILE-STREAMS UND KLASSEN                                                  49.               Abbildung 6.8: Der Windows...
50                                             KAPITEL 6 EIN- UND AUSGABE - II     • keyword # : zur Trennung von Datens¨t...
6.3 FILE-STREAMS UND KLASSEN                                                  51Der Lesealgorithmus funktioniert wird folg...
52                                             KAPITEL 6 EIN- UND AUSGABE - II C++ Ding                   Was tut’s ifstre...
6.5 TESTFRAGEN                                                               536.5    Testfragen  1. Was ist die Basis-Kla...
Kapitel 7Referenzen und ZeigerReferenzen und Zeiger (pointer), d.h. die Symbole & und * sind uns bereitsmehrfach begegnet,...
7.1 REFERENZEN                                                                  557.1     Referenzen7.1.1    Das Call-by-r...
56                                          KAPITEL 7 REFERENZEN UND ZEIGERDefinition:  CStudent::Read(ifstream& ref_input...
7.2 ZEIGER                                                                      57oder bei Objekten, die erst zur Laufzeit...
58                                          KAPITEL 7 REFERENZEN UND ZEIGERdouble* ptr_x = NULL;ptr_x = &x;if(!ptr_x) cout...
7.4 SUMMARY                                                                   59char* Zeichenkette;int* iVektor;double* dV...
Script hydroinformatik i
Script hydroinformatik i
Script hydroinformatik i
Script hydroinformatik i
Script hydroinformatik i
Script hydroinformatik i
Script hydroinformatik i
Script hydroinformatik i
Script hydroinformatik i
Script hydroinformatik i
Script hydroinformatik i
Script hydroinformatik i
Script hydroinformatik i
Script hydroinformatik i
Script hydroinformatik i
Script hydroinformatik i
Script hydroinformatik i
Script hydroinformatik i
Script hydroinformatik i
Script hydroinformatik i
Script hydroinformatik i
Script hydroinformatik i
Script hydroinformatik i
Script hydroinformatik i
Script hydroinformatik i
Script hydroinformatik i
Script hydroinformatik i
Script hydroinformatik i
Script hydroinformatik i
Script hydroinformatik i
Script hydroinformatik i
Script hydroinformatik i
Script hydroinformatik i
Script hydroinformatik i
Script hydroinformatik i
Script hydroinformatik i
Script hydroinformatik i
Script hydroinformatik i
Script hydroinformatik i
Script hydroinformatik i
Script hydroinformatik i
Script hydroinformatik i
Script hydroinformatik i
Script hydroinformatik i
Script hydroinformatik i
Script hydroinformatik i
Script hydroinformatik i
Script hydroinformatik i
Script hydroinformatik i
Script hydroinformatik i
Script hydroinformatik i
Script hydroinformatik i
Script hydroinformatik i
Script hydroinformatik i
Script hydroinformatik i
Script hydroinformatik i
Script hydroinformatik i
Script hydroinformatik i
Script hydroinformatik i
Script hydroinformatik i
Script hydroinformatik i
Script hydroinformatik i
Script hydroinformatik i
Script hydroinformatik i
Script hydroinformatik i
Script hydroinformatik i
Script hydroinformatik i
Script hydroinformatik i
Script hydroinformatik i
Script hydroinformatik i
Script hydroinformatik i
Script hydroinformatik i
Script hydroinformatik i
Script hydroinformatik i
Script hydroinformatik i
Script hydroinformatik i
Script hydroinformatik i
Script hydroinformatik i
Script hydroinformatik i
Script hydroinformatik i
Script hydroinformatik i
Script hydroinformatik i
Script hydroinformatik i
Script hydroinformatik i
Script hydroinformatik i
Script hydroinformatik i
Script hydroinformatik i
Script hydroinformatik i
Script hydroinformatik i
Script hydroinformatik i
Script hydroinformatik i
Script hydroinformatik i
Script hydroinformatik i
Script hydroinformatik i
Script hydroinformatik i
Script hydroinformatik i
Script hydroinformatik i
Script hydroinformatik i
Script hydroinformatik i
Script hydroinformatik i
Script hydroinformatik i
Script hydroinformatik i
Upcoming SlideShare
Loading in...5
×

Script hydroinformatik i

1,583

Published on

Published in: Education, Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
1,583
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
0
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Transcript of "Script hydroinformatik i"

  1. 1. Version 2.01 - 27. April 2010 Hydroinformatik I ”C++ und Visual C++”Olaf Kolditz und Bastian Kolditz TU Dresden / UFZ Leipzig Angewandte Umweltsystemanalyse Umweltinformatik SS 2010 c OGS Publisher 2010
  2. 2. 2VorlesungskonzeptEin wesentlicher Bestandteil der Hydroinformatik ist die Informationsverarbei-tung. Typische Hydrodaten sind z.B: digitale Gel¨ndemodelle (DGM), Nieder- aschlagsmessungen, Wasserpegel, Bodentemperaturen, Bodenkarten (Bodenty-pen), geologische Schnitte u.v.a. (s. Abb. 1 und 2) Abbildung 1: Informationsverarbeitung in der Hydrologie - DatentypenEine grundlegende Methodik f¨ r die Informationsverarbeitung ist die wissen- uschaftliche Programmierung. Daher besch¨ftigen wir uns im ersten Semester ader Veranstaltung ’Hydroinformatik’ mit der objekt-orientierten Programmie-rung in C++.Es gibt zwei M¨glichkeiten eine Programmiersprache zu erlernen: mehr theore- otisch oder mehr praktisch. Wir beschreiten den zweiten Weg. Das heißt anhandvon dem, was wir f¨ r das Programmieren ben¨tigen, erarbeiten wir uns die u oTheorie. Unser Motto ist ’Learning by doing’.
  3. 3. 3.Abbildung 2: Informationsverarbeitung in der Hydrologie - Beispiel aus der Hy-drogeologieOrganisatorischesDie Pr¨ fung ’Hydroinformatik I’ (erstes Semester) ist eine Klausur. Die Pr¨fung u u’Hydroinformatik II’ (zweites Semester) besteht aus zwei Teilen, einer Klausurund einer Programmier-Hausarbeit. Bei den Klausuren geht es um die Beant-wortung von Verst¨ndnisfragen (siehe Testfragen zu jeder Vorlesung). aSprache: normalerweise in Deutsch. Da die Syntax von Computersprachen (wieC++) immer in Englisch ist, w¨ rde ich auch mal eine Vorlesung in Englisch uanbieten.Konsultationen: immer nach der Vorlesung (Freitag ab 11 Uhr).Kontakt: jederzeit by e-mail (olaf.kolditz@ufz.de), in dringenden F¨llen auch aper Handy (0151 52739034), ich empfehle auch eine mailing Liste der Studentenanzulegen, wenn alle damit einverstanden sind.Vorlesungsunterlagen: lege ich erstmal auf meinem UFZ Server ab(http://www.ufz.de/index.php?de=11877).
  4. 4. 4Es gibt viele und sehr gute C++ B¨ cher. Bei Amazon finden sie locker uber u ¨50 C++ B¨ cher (Abb. 3). Sehr gut finde das Buch von Prinz & Prinz ”C++ u- Lernen und professionell anwenden”, da es eine gute Kombination aus Theo-rie und Programm-Beispielen ist. Zu diesem Lehrbuch gibt es auch ein extra¨Ubungsbuch. Unsere Vorlesung lehnt sich an dieses Buch an. Abbildung 3: C++ LiteraturDas heisst, etwas anders wird unsere Vorgehensweise sein. Im ersten Semesterwollen wir zielgerichtet die C++ Grundlagen anhand der Entwicklung einereinfachen ’Datenbank’-Anwendung erlernen - learning-by-doing - und die Datenschließlich in einer graphischen Benutzerschnittstelle (GUI) sichtbar machen.Somit besch¨ftigen wir uns auch zielgerichtet mit den Grundlagen von Visual aC++.Das Vorlesungskonzept: • Zielgerichtetes Erlernen der C++ Grundlagen, • Entwicklung einer ’Datenbank’-Anwendung, • Umsetzung in eine graphische Benutzerschnittstelle (Visual C++, C++ GUI), siehe Abb. 4.
  5. 5. 5. Abbildung 4: Vorlesungs-KonzeptDie Implementierung des Dialogs in Abb. 4 ist das erste greifbare Ziel der Ver-anstaltung Hydroinformatik I. In dieser GUI-Anwendung k¨nnen sie (fast) alles, owas wir lernen werden, wiederfinden: Datentypen, Ein- und Ausgabe mit ver-schiedene Ger¨ten (Tastatur, Bildschirm, Dateien), Klassen, Vererbung, Con- atainer (Listen, Vektoren) und graphische Programmierung unter Windows. Eslohnt sich also dranzubleiben ...
  6. 6. Part IC ++ Basics
  7. 7. Kapitel 1Einfuhrung ¨ 7
  8. 8. 8 ¨ KAPITEL 1 EINFUHRUNG1.1 HistorischesDie Programmiersprache C++ wurde von dem d¨nischen Informatiker Bjar- ane Stroustrup in den Bell Labs des nordamerikanischen Telekommunikations-konzerns AT&T (American Telephone & Telegraph Corporation) ab 1979/80entwickelt. C++ stellt eine Weiterentwicklung der ebenfalls von AT&T ent-wickelten, Programmiersprache C dar. Die Programmiersprache C wurde alsGrundlage f¨ r C++ aufgrund seiner effizienten Codeverarbeitung und einfachen u¨Ubertragbarkeit auf anderen Plattformen verwendet. C wurde in C++ nach demVorbild der Programmiersprache Simula-67 (1967), der ersten objektorientiertenProgrammiersprache, im Wesentlichen um ein Klassenkonzept, d.h. die Abbil-dung von Objekten in verschiedenen Klassen mit unterschiedlichen Attributen,erweitert. Daher wurde C++ zun¨chst unter dem Namen ’C mit Klassen’ (C awith classes) entwickelt. Der Name C++ wurde 1983 von Rick Mascitti erst-mals angewandt. Dabei ist das ++ eine Andeutung an den Inkrement-Operator(Inkrement: Erh¨hung einer Variable um 1), der die Verbesserungen gegen¨ ber o udem Vorg¨nger C zum Ausdruck bringen soll. Im Jahr 1985 erschien die erste aVersion von C++, die eine wichtige Grundlage f¨ r die weitere Entwicklung und uStandardisierung von C++ darstellte, da die Sprache zu dieser Zeit noch nichtakzeptiert war. Im Jahre 1989 erschien die erweiterte Version 2.0 von C++.In den 90er Jahren begann nun der Standardisierungs- und Vereinheitlichungs-prozess von C++, der eingeleitet wurde durch das Buch ’The Annotated C++Reference Manual’ (1990) von Margaret Ellis und Bjarne Stroustrup. Die ge-normte Fassung von C++ erschien 1998 (ISO/IEC 14882:1998), die 2003 miteiner neuen Version (ISO/IEC 14882:2003) nochmals nachgebessert wurde. Abbildung 1.1: Bjarne Stroustrup (http://www.research.att.com/bs/)
  9. 9. 1.2 PARADIGMEN 91.2 ParadigmenProgrammier-Paradigmen sind sogenannte Leitlinien / Konzepte f¨ r die Ge- ustaltung von Programmen, diese k¨nnen durch entsprechende Sprachmittel un- oterst¨ tzt werden. Allerdings bedeutet die Benutzung einer objekt-orientierten uSprache nicht automatisch ein objekt-orientiertes Programm (OOP). • Prozedurales Programmieren: Welche Prozeduren ben¨tigen Sie f¨ r Ihr o u Programm ? Verwenden Sie die optimalen Algorithmen. • Modulares Programmieren: Welche Module ben¨tigen Sie f¨ r Ihr Pro- o u gramm ? Strukturieren Sie Ihr Programm entsprechend modular. Die Da- ten sollten in den Modulen gekapselt sein. • Objekt-orientiertes Programmieren: Welche Klassen ben¨tigen Sie f¨ r Ihr o u ¨ Programm ? Uberlegen Sie, welche Gemeinsamkeiten die Klassen haben, benutzen Sie das Konzept der Vererbung. • Datenabstraktion: Welche Datentypen ben¨tigen Sie f¨ r Ihr Programm ? o u Erstellen Sie f¨ r jeden benutzerdefinierten Typen m¨glichst viele Opera- u o tionen.
  10. 10. 10 ¨ KAPITEL 1 EINFUHRUNG. Abbildung 1.2: Objekt-orientiertes Programmieren - OOPDie Abb. 1.2 soll das Konzept des Objekt-Orientierten Programmierens (OOP)mal aus einer anderen Sichtweise erl¨utern. Normalerweise bedeutet die Pro- agrammentwicklung (prozedural und modular) eine stetige Erweiterung des Co-des (Abb. oben). Irgendwann ist das Programm dann so un¨ bersichtlich ge- uworden, dass eigentlich niemand mehr durchblickt. Die grundlegenden Idee vonOOP dagegen sind, dass, erstens Objekte (logische Einheiten des Programms)streng gekapselt sind (sich also nicht gegenseitig beeinflussen) und, zweitens,dass es ganz schmale Schnittstellen zwischen diesen Objekten gibt (z.B. nuruber eine Adresse (sogenannte pointer)) (Abb. unten). Nat¨ rlich wachsen auch¨ udiese Objekte weiter und stoßen irgendwann an Grenzen ...Ein Beispiel aus der Praxis unserer eigenen Programmentwicklung OpenGeo-Sys. Die Abb. 1.3 zeigt das objekt-orientierte Konzept der Kernels von Open-GeoSys zur L¨sung von partiellen Differentialgleichungen. Letztlich f¨ hren alle o unumerischen Methoden zur L¨sung von linearen Gleichungssystemen Ax = b. oDaher haben wir ein Objekt konstruiert (PCS von ProCesS), das die Aufgabeubernimmt, alle Bausteine f¨ r die Assemblierung und L¨sung der Gleichungs-¨ u osysteme einzusammeln. Dabei geht es um geometrische (Punkte, Polylinien,Fl¨chen, Volumen), topologische (Element-Netze), numerische und physikali- asche Daten (z.B. Materialeigenschaften, Anfangs- und Randbedingungen). Ent-scheidend f¨ r die Machbarkeit eines objekt-orientierten Konzepts ist, dass der uAlgorithmus zum Aufstellen und L¨sen der Gleichungssysteme vollkommen ounabh¨ngig von dem spezifischen physikalischen Problem ist. Die Basisklasse a
  11. 11. 1.3 COMPILER 11f¨ r das PCS-Objekt ist CProcess, davon abgeleitet werden die speziellen Klas- usen f¨ r die spezifischen Probleme (z.B. Str¨mung, Stoff- und W¨rmetransport, u o aDeformation). Wenn Sie diesen Abschnitt noch mal durchlesen, sollten sie aller-dings stutzig werden, da neben dem erwarteten Begriff der Objekt-Orientierungauf der des Algorithmus auftaucht. Richtig, OpenGeoSys ist kein reines OOPsondern eine Kombination von objekt-orientierten und prozeduralen Konzepten.Anyway, der Schritt von C zu C++ (3. zur 4. Version, Abb. 1.3) bedeutete eineReduzierung des Quellcodes von 10MB auf 3MB, also um 70% !!! Abbildung 1.3: Objekt-orientiertes Konzept des Kernels von OpenGeoSys1.3 CompilerBevor wir irgendetwas programmieren k¨nnen, ben¨tigen wir zwei Werkzeuge: o oeinen Editor und einen Compiler. In der Abb. 1.4 sind die wichtigsten Schritteder Programmerstellung zu sehen.In der Computer-Welt (und deshalb auch in der Programmier-Welt) gibt es zweiverschiedene Philosophien: Microsoft (MS) und ’den Rest’. Um diesem Problem’auszuweichen’ und fair zu sein, benutzen wir Werkzeuge aus beiden Welten.Wir beleuchten dieses ’Problem’ sp¨ter noch mal, wenn wir uber Open Source a ¨Projekte (z.B. OpenGeoSys, unsere eigene Software-Entwicklung) sprechen. Wirinstallieren uns zun¨chst den GNU Compiler (Abschn. 1.3.1) und sp¨ter den MS a aCompiler (Abschn. 1.3.2) f¨ r das visuelle C++ Programmieren. u
  12. 12. 12 ¨ KAPITEL 1 EINFUHRUNG Editor Source file Header file Compiler Object file Linker Libraries Executable Abbildung 1.4: Quell-Code Kompilation1.3.1 GNUDas GNU-Projekt wurde von Richard Stallman mit dem Ziel gegr¨ ndet, ein uvollst¨ndig freies Betriebssystem, genannt GNU (GNU is not Unix), zu ent- awickeln. Bekannt geworden ist das Projekt vor allen Dingen auch durch die vonihm eingef¨ hrte GNU General Public License (GPL), unter der viele bekannte uSoftwareprojekte ver¨ffentlicht werden (Quelle: Wikipedia). oWenn ihr mehr uber das GNU Projekt erfahren wollt, schaut nach unter ¨http://de.wikipedia.org/wiki/GNU-ProjektAls Kompromiss benutzen wir cygwin (Abb. 1.5). Dass erm¨glicht uns, auch ounter Windows mit GNU Software arbeiten zu k¨nnen. Die Linux / Ubuntu o’Freaks’ haben die GNU Software automatisch mit dem Betriebssystem auf ih-rem Rechner. Die Anleitung zur Installation finden sie im Anhang, Abschn.12.2.2.2 (und wird nat¨ rlich in der Vorlesung besprochen) u
  13. 13. 1.3 COMPILER 13. Abbildung 1.5: Ein Kompromiss: cygwin1.3.2 MS Visual C++Auch die nicht-MS-Fans m¨ ssen zugeben, das MS Visual C++ Studio ist eine utolle Entwicklungsumgebung. Die wird uns enorm helfen, wenn wir uns sp¨ter amit GUI Programmierung besch¨ftigen. Die Express-Version von VC++ kann akostenlos direkt bei Microsoft unterhttp://www.microsoft.com/germany/express/download/webdownload.aspx her-untergeladen werden.1.3.3 QtAls plattformunabh¨ngiges visuelles C++ empfehle ich Qt (siehe Abschn. 11 aund 12.8)
  14. 14. 14 ¨ KAPITEL 1 EINFUHRUNG1.4 ”Hello World”Unser allererstes C++ Programm.1.4.1 GrundlagenJedes C/C++ Programm ben¨tigt eine main() Funktion oint main(){ return 0;}Die main() Funktion ist der ’Startpunkt’ eines jeden C/C++ Programms. Diewichtigsten Bausteine einer Funktion sind: • Typ (R¨ ckgabewert): int (return 0) u • Name: main • Argumente: (), man kann die main Funktion auch mit Argumenten auf- rufen, z.B. der Name der Eingabe-Datei, • Funktionsrumpf: ...Die Struktur der main() Funktion ist in der Abb. 1.6 dargestellt. function type function name function arguments int main() function start { ... function block return 0; function end } Abbildung 1.6: Struktur der Funktion main()
  15. 15. 1.4 ”HELLO WORLD” 151.4.2 Exercise E1 Abbildung 1.7: cygwin aufrufenAbbildung 1.8: cygwin drive ist /cygwin/home/user, wechseln zum Arbeitsver-zeichnis cd c:/myworkdirectory (oder copy und paste) Abbildung 1.9: slash (/) ist nicht gleich slash () ¨Die einzige C Ubung:#include <stdio.h>int main(){ printf("Hello World"); return 0;}Abbildung 1.10: Kommandozeile: gcc main.c, das Ergebnis ist a.exe, Aufruf desProgramms: ./aJetzt endlich zu C++ ...
  16. 16. 16 ¨ KAPITEL 1 EINFUHRUNG#include <iostream>using namespace std;int main(){ cout << "Hello World" << endl; return 0;}Abbildung 1.11: Kommandozeile: g++ main.cpp, mit ls den Inhalt des Verzeich-nisses ansehen, das Ergebnis ist a.exe, Aufruf des Programms: ./a1.5 Students ForumVielen Dank f¨ r Ihre Fragen zur ersten Vorlesung! uJB Der C compiler funktioniert, der C++ aber nicht: Wahrscheinlich haben sie nur den C Compiler (GCC) installiert. Die k¨nnen jederzeit cygwin o Komponenten nachinstallieren, siehe Abschn. 12.2.2.2. ¨DB Ich habe den MS VC++ installiert und kann die Ubungen nachvollziehen. Brauche ich den GNU Compiler von cygwin wirklich noch ?: Eigentlich nicht, mit MS VC++ haben sie einen kompletten Compiler mit allem drum und dran, dennoch kann ein Ausflug in die Konsolenwelt ja nicht schaden ... und sie k¨nnen sp¨ter in ihre Bewerbungen schreiben, dass sie o a auch unter Linux Programme entwickelt haben.MF Die aktuelle cygwin Installation sieht anders aus als im Skript beschrieben: [OK] Im Anhang (Abschn. 12.2.2.2) finden sie eine bessere Beschreibung der cygwin Installation. C++ und Mac: erstmal eine Adresse http://developer.apple.com/TOOLS/xcode/
  17. 17. 1.6 TESTFRAGEN 171.6 Testfragen 1. Was bedeutet das ++ im Namen der Programmiersprache C++ ? 2. Ist C++ eine standardisierte Programmiersprache ? 3. Was ist der Unterschied zwischen C und C++ ? 4. Was sind sogenannte Programmier-Paradigmen ? 5. Welche verschiedenen Programmier-Paradigmen kennen sie und worin un- terscheiden sie sich ? 6. Welches Paradigma verfolgen wir in der Vorlesung ? 7. Was ist objekt-orientierte Programmierung ? 8. Was ist ein Kompiler ? 9. Erkl¨ren sie die einzelnen Schritte bei einer Kompilierung (s. Abb. 1.4). a ¨ 10. Welchen Kompiler benutzen sie f¨ r die C++ Ubungen ? u 11. Welche Funktion ben¨tigt jedes C oder C++ Programm ? o 12. Was ist der Typ einer Funktion ? 13. Was ist eine Parameterliste einer Funktion ? 14. Was ist der R¨ ckgabewert einer Funktion ? u
  18. 18. Kapitel 2DatentypenJede Programmiersprache bietet die Verwendung elementarer Datentypen an,wie z.B. Ganzzahlen oder Gleitkommazahlen, logische Ausdr¨ cke oder Zeichen- uketten. Die Besonderheit von objekt-orientierten (OO) Sprachen ist die Erstel-lung benutzerdefinierter Datentypen. Dies war schon in der Sprache C mit sog.’typedef struct’ Typen m¨glich. OO Sprachen, wie C++, bieten aber noch mehr oan, die Verkn¨ pfung von benutzerdefinierten Datentypen mit den entsprechen- uden Methoden. Diese Konstrukte nennt man Klassen, aber darum geht es erstim n¨chsten Kapitel. Zun¨chst m¨ ssen wir uns (kurz) mit den handels¨ blichen a a u uDatentypen herumschlagen.2.1 Elementare Datentypen ¨Die nachfolgende Tabelle zeigt eine Ubersicht der elementaren Datentypen. Typ Bezeichner Erl¨uterung a Wahrheitswerte bool Wert kann true (=1) oder false (=0) sein Zeichen char Zeichen, statische Zeichenketten wchar t ’wide character type’ (≥ 2 Byte) string Dynamische Zeichenketten Ganzzahlen short Ganze Zahlen mit geringer Genauigkeit int Ganze Zahlen mit hoher Genauigkeit long Ganze Zahlen mit sehr hoher Genauigkeit Gleitpunktzahlen float Reelle Zahlen mit geringer Genauigkeit double Reelle Zahlen mit hoher Genauigkeit long double Reelle Zahlen mit sehr hoher Genauigkeit ¨ Tabelle 2.1: Ubersicht elementarer Datentypen 18
  19. 19. 2.2 SPEICHERBEDARF 192.2 SpeicherbedarfDie unterschiedlichen Datentypen werden durch den Compiler verschieden ver-arbeitet und gespeichert (Gr¨ße des ben¨tigten Speicherplatzes). o o Typ Speicherplatz Wertebereich bool 1 Byte (weniger geht leider nicht) char 1 Byte -128 bis + 127 bzw. 0 bis 255 int 2/4 Byte -32768 bis +32767 bzw. -2147483648 bis + 2147483647 short 2 Byte -32768 bis +32767 long 4 Byte -2147483648 bis + 2147483647 float 4 Byte ± 3.4E+38, 6 Stellen Genauigkeit double 8 Byte ± 1.7E+308, 15 Stellen Genauigkeit long double 10 Byte ± 1.7E+4932, 19 Stellen Genauigkeit Tabelle 2.2: Speicherbedarf elementarer DatentypenDer sizeof Operator ermittelt die ben¨tigte Speichergr¨ße f¨ r einen bestimm- o o uten Datentypen, z.B. sizeof(float) = 4: eine einfach genaue Gleitkommazahl ¨ben¨tigt 4 Byte Speicher. Wir verwenden den sizeof Operator in der Ubung E34. o2.3 Escape-SequenzenEscape-Sequenzen sind n¨ tzliche Helfer, z.B. zum Formatieren von Ausgaben uoder f¨ r die Benutzung von Sonderzeichen in der Ausgabe. u Zeichen Bedeutung Wirkung a alert (BEL) Ausprobieren b backspace (BS) eine Position zur¨ ck u t horizontal tab (HT) horizontaler Tabulator n line feed (LF) Zeilenumbruch v vertical tab (VT) vertikaler Tabulator r carriage return (CR) Zeilenumbruch 0 end of string Zeilenende ” ” Zeichen ’ ’ Zeichen ? ? Zeichen Zeichen Tabelle 2.3: N¨ tzliche Escape-Sequenzen u
  20. 20. 20 KAPITEL 2 DATENTYPEN2.4 Testfragen 1. Was ist der genaueste Datentyp in C++ ? 2. Wie groß ist der Speicherbedarf von einem string Datentyp ? 3. Mit welcher Anweisung k¨nnen wir den Speicherbedarf von elementaren o Datentypen ermitteln ? 4. Was sind Escape-Sequenzen ? 5. Was ist der Unterschied zwischen den Escape-Sequenzen n und r ? 6. Was ist die C++ Entsprechung der Klasse cout f¨ r einen Zeilenumbruch u ?
  21. 21. Kapitel 3Ein- und AusgabeEin Programm (ob prozedural, modular, objekt-orientiert) ist eigentlich nichtsweiter als eine Datenverarbeitung zwischen einer Eingabe (Input) und einerAusgabe (Output). I und O k¨nnen mehr oder weniger schick gemacht sein: o 1. I/O Standardger¨te, a 2. I/O Dateien, 3. Datenbanken (I) und Visualisierung (O).Aus didaktischen Gr¨ nden m¨ ssen wir leider mit dem Langweiligsten - I/O u uStandardger¨te - anfangen. Spannend wird’s, wenn Daten durch die Visualisie- arung ’lebendig’ werden. Die Abb. 3.1 zeigt eine professionelle Datenaufbereitungeinen Porenraummodells in unserem Labor f¨ r wissenschaftliche Visualisierung u(TESSIN-VISLab) am UFZ in Leipzig.Die iostream KlasseDie Ein- und Ausgabe in C++ erfolgt mit sogenannten Str¨men (streams). Die oI/O-Stream-Klassen (Abb. 3.2) bieten vielf¨ltige M¨glichkeiten, die wir uns in a o ¨den nachfolgenden Ubungen n¨her anschauen. a 21
  22. 22. 22 KAPITEL 3 EIN- UND AUSGABE. Abbildung 3.1: Wissenschaftliche Visualisierung ios istream ostream iostream Abbildung 3.2: I/O stream KlassenDie Klasse iostream geht durch Mehrfachvererbung aus den Klassen istreamund ostream hervor. iostream stellt damit die Funktionalit¨t beider I/O Klas- asen zu Verf¨ gung. u
  23. 23. 3.1 DIE STANDARD-STREAMS 233.1 Die Standard-StreamsEs gibt vier Standard-Streams: • cin: Standard-Eingabe uber die Tastatur, Objekt der Klasse istream ¨ • cout: Standard-Ausgabe auf dem Bildschirm, Objekt der Klasse ostream • cerr und clog: zwei Objekte der Klasse ostream f¨ r die Fehlerausgabe. uExercise E3.1:#include <iostream>using namespace std;int main(){ int zahl; cout << "Bitte eine ganze Zahl eingeben: "; cin >> zahl; cout << zahl << endl; return 0;}Die Ein- >> und Ausgabeoperatoren << transportieren die Str¨me von und zu oden Eingabe- bzw. Ausgabeger¨ten. Dabei formatieren sie die Datentypen (z.B. a ¨int in der Ubung E3.1) entsprechend den Einstellungen der Klasse ios. DieseEinstellungen k¨nnen durch Flags ver¨ndert werden (siehe n¨chsten Abschnitt). o a a3.2 Formatierte Ausgabenredmehr Beschreibung notwendig3.2.1 Formatierte Ausgabe von Ganzzahlen ¨In der nachfolgenden Ubung besch¨ftigen wir uns mit den verschiedenen Aus- agabem¨glichkeiten von ganzen Zahlen. oExercise E3.2.1:#include <iostream>using namespace std;int main(){ int zahl; cout << "Bitte eine ganze Zahl eingeben: "; cin >> zahl;
  24. 24. 24 KAPITEL 3 EIN- UND AUSGABE cout << uppercase // f¨r Hex-Ziffern u << " oktal tt dezimal t hexadezimal n " << oct << zahl << " tt " << dec << zahl << " tt " << hex << zahl << endl; return 0;}3.2.2 Formatierte Ausgabe von Gleitpunktzahlen ¨In der nachfolgenden Ubung besch¨ftigen wir uns mit den verschiedenen Aus- agabem¨glichkeiten von realen Zahlen. o Methoden Wirkung int precision(int n) Genauigkeit wird auf n gesetztExercise E3.2.2:#include <iostream>using namespace std;int main(){ double zahl; cout << "Bitte eine Gleitkommazahl eingeben: "; cin >> zahl; cout.precision(7); // auf sieben Stellen genau cout << "Standard: t" << zahl << endl; cout << "showpoint: t" << showpoint << zahl << endl; cout << "fixed: tt" << fixed << zahl << endl; cout << "scientific: t" << scientific << zahl << endl; return 0;}3.2.3 Ausgabe von Speicherbedarf ¨In dieser Ubung benutzen wir den sizeof Operator, um den Speicherbedarf vonStandard Daten-Typen zu bestimmen.Exercise E3.2.3:#include <iostream>using namespace std;int main(){
  25. 25. 3.3 TESTFRAGEN 25 cout << "TypetNumber of bytesn"; cout << "-----------------------n"; cout << "booltt" << sizeof(bool) << endl; cout << "chartt" << sizeof(char) << endl; cout << "shorttt" << sizeof(short) << endl; cout << "inttt" << sizeof(int) << endl; cout << "longtt" << sizeof(long) << endl; cout << "floattt" << sizeof(float) << endl; cout << "doublett" << sizeof(double) << endl; cout << "long doublet" << sizeof(long double) << endl; return 0;}3.3 Testfragen 1. Sind sie mit der Tab. 2.2 einverstanden ? 2. Welche Ein- und Ausgabeger¨te kennen sie ? a 3. Welche Klasse ben¨tigen wir f¨ r die Standard-Ein- und Ausgabe ? o u 4. Was ist die Basis-Klasse f¨ r alle Ein- und Ausgaben in C++ ? u 5. Mit welcher Klasse k¨nnen wir sowohl Eingabe- als auch Ausgabestr¨me o o benutzen ? 6. Welche Include-Datei ist notwendig, um mit I/O-Str¨men arbeiten zu o k¨nnen ? o 7. Wozu dient der Zusatz using namespace std; nach dem Include von Standard-Klassen, wie I/O Streams ? 8. Was bewirken die Stream-Operatoren << und >> ? 9. Was bewirken die Flags oct, dec, hex f¨ r die formatierte Ausgabe von u Ganzzahlen ? (ToDo) 10. Wie kann ich die Genauigkeit der Ausgabe von Gleikomma-Zahlen festle- gen ? 11. Wie kann man den Speicherbedarf einer Variable ermitteln ? Schreiben sie die C++ Anweisung f¨ r die Berechnung des Speicherbedarfs f¨ r eine u u doppelt-genaue Gleitkomma-Zahl.
  26. 26. Kapitel 4Klassen source: TU DresdenData abstraction class CStudent properties ... Instances methods ... CStudent *m_std; Abbildung 4.1: Das Klassen-Konzept - CStudent 26
  27. 27. 4.1 DATEN-ABSTRAKTION 27Das Sprachelement der Klassen sind das entscheidende Kriterium von objekt-orientierten Konzepten und die objekt-orientierte Programmierung (OOP). Klas-sen sind eine Art Schablone f¨ r einen benutzerdefinierten Datentypen. Dar¨ ber u uhinaus enth¨lt die Klasse neben den Daten auch alle Methoden (Funktionen), aum mit den Daten der Klasse operieren zu k¨nnen. Unser Beispiel f¨ r Klassen, o udas uns im Verlaufe der Vorlesung besch¨ftigen wird, ist - wie k¨nnte es an- a oders sein - CStudent (Abb. 4.1). F¨ r die Konzipierung von Klassen spielt die uAbstraktion der Daten einer Klasse eine besonders wichtige Rolle.4.1 Daten-AbstraktionDie Abb. 4.1 illustriert uns, dass eine Abstraktion von Daten (d.h. Eigenschaf-ten) der Klasse Studenten eine durchaus vielschichtige Angelegenheit sein kann.Eine Aufstellung von Daten / Eigenschaften, die es aus ihrer Sicht zu ber¨ ck- usichtigen gilt, ist ihre n¨chste Hausaufgabe. aDer n¨chste Block zeigt ihnen das Schema der Syntax der Klassen-Definition aCStudent. Das Schl¨ sselwort f¨ r die Klassen-Definition ist class, der Name ist u uCStudent. Der Klassen-Rumpf ist in geschweifte Klammer eingebettet. Wichtigist der Abschluss mit einem Semikolon. Wie bereits erw¨hnt, eine Klasse enth¨lt a aDaten (Eigenschaften) und Methoden (Funktionen) auf den Daten. Prinzipiellgeht diese Datenabstraktion auch mit anderen Sprachen wie C. A data constructtypedef struct {...} in C can be seen as an analogue to a C++ class.Die C Version:typedef struct{ char* name_first; char* name_last; long matrikel_number;} TDStudent;TDStudent *student = NULL;Die C++ Version:class CStudent{ data: ... methods: ...};Bei der Namensgebung von Klassen wird oft ein ’C’ (CStudent) vorangestellt,um die Bedeutung als Klasse (wesentlicher Baustein des Programm-Konzepts)herauszustellen.
  28. 28. 28 KAPITEL 4 KLASSENEin weiterer Vorzug von OO-Sprachen ist z.B. die Sichtbarkeit / Zugreifbarkeitvon Daten zu regeln. Der nachfolgende Block zeigt das Datenschutz-Konzeptvon C++ (Sicherheitsstufen): Daten k¨nnen ¨ffentlich sein (public) oder gezielt o of¨ r ’Freunde’ verf¨ gbar gemacht werden (protected) oder nur exklusiv f¨ r die u u ueigene Klasse sichtbar zu sein (private).class CStudent{ private: ... protected: ... public: ...};4.2 Klassen-DeklarationIm vorangegangenen Abschnitt haben wir uns mit der Datenabstraktion mittelsKlassen besch¨ftigt. So sollte konsequenterweise jede Klasse auch ihre eigenen - asorry - eigenen Quelldateien besitzen. Die Deklaration von Klassen erfolgt ubli- ¨cherweise in einer sogenannten Header-Datei *.h. F¨ r die Methoden / Funk- utionen der Klasse ist eine *.cpp Datei reserviert. F¨ r uns bedeutet dies, zwei uDateien anlegen: • student.h - die Deklaration der Klasse CStudent • student.cpp - die Methoden der Klasse CStudentUm mit der Klasse arbeiten zu k¨nnen, m¨ ssen wir das entsprechende Header- o uFile inkludieren. Dies erfolgt mit der Anweisung #include ”student.h” am An-fang unseres Main-Files.#include "student.h"int main{ return 0;}4.3 Instanzen einer KlasseAn dieser Stelle m¨chten wir unsere Eingangsgraphik (Abb. 4.1) erinnern. In- ostanzen sind Kopien einer Klasse mit denen wir arbeiten k¨nnen, dass heißt o
  29. 29. 4.3 INSTANZEN EINER KLASSE 29diese bekommen echten Speicher f¨r ihre Daten (die nat¨ rlich f¨ r jede Instanz u u ueiner Klasse unterschiedlich sein k¨nnen). oEs gibt zwei M¨glichkeiten, Instanzen einer Klasse zu erzeugen: o#include "student.h"void main(){ // Creating an instances of a class - 1 CStudent m_std_A; // Creating an instances of a class - 2 CStudent *m_std_B;}Der direkte und der mittels eines sogenannten Zeigers (hierf¨ r gibt ein Extra- uKapitel). Wir werden sehen, dass der zweite Weg oft der bessere ist, da wir z.B.die Initialisierung und das Speichermanagement f¨ r unsere Daten selber in die uHand nehmen k¨nnen. Dies k¨nnen wir mittels sogenannter Konstruktoren und o oDestruktoren erledigen. Damit besch¨ftigen wir uns im n¨chsten Abschnitt. a aExercise E4.3:#include "student.h"#include <iostream>using namespace std;int main(){ CStudent *m_std_cpp; // pointer to an instance cout << "E41: Instances of classes" << endl; cout << "What have we created?t : " << m_std << endl; cout << "What size has it?t : " << sizeof(m_std) << endl; TDStudent *m_std_c; // pointer to TD return 0;}-> student.h// Class definitionclass CStudent{ public: protected: private:};// Type definitiontypedef struct{} TDStudent;
  30. 30. 30 KAPITEL 4 KLASSEN4.4 Konstruktor und DestruktorWohl die wichtigsten Methoden von Klassen sind deren Konstruktoren CStudent()und Destruktoren ∼ CStudent(). Diese Funktionen haben den gleichen Namenwie die Klasse selbst. Der nachfolgende Block zeigt die Deklaration unserer er-sten beiden Klassen-Funktionen in der Header-Datei students.h.class CStudent{ public: CStudent(); // constructor ~CStudent(); // destructor};Wie sehen die Konstruktor/Destruktor-Funktionen aus.#include "student.h"CStudent::CStudent(){}CStudent::~CStudent(){}Die Konstruktor/Destruktor-Funktionen werden ’automatisch’ aufgerufen beimErzeugen (¨ ber die Zeiger-Version) und Zerst¨ren der Klassen-Instanz: u o • new ruft den dazugeh¨rigen Konstruktor auf, o • delete ruft den dazugeh¨rigen Destruktor auf. oDie Anwendung der Konstruktor/Destruktor-Funktionen ist im folgenden Quellcode-Abschnitt dargestellt.Exercise E4.4:#include <iostream>using namespace std;#include "student.h"int main(){ CStudent* m_std = new CStudent(); // instance using constructor cout << "E44: Constructor of class CStudent" << endl; cout << "What have we created? m_stdt : " << m_std << endl; cout << "What size has it?t : " << sizeof(m_std) << endl; cout << "What have we created? &m_stdt : " << &m_std << endl; cout << "What size has it?t : " << sizeof(&m_std) << endl; return 0;}
  31. 31. 4.5 DATENINITIALISIERUNG MIT DEM KONSTRUKTOR 314.5 Dateninitialisierung mit dem KonstruktorDer Klassen-Konstruktor kann dar¨ ber hinaus auch zur Initialisierung von Da- uten f¨ r die Klassen-Instanz benutzt werden. Ganz nebenbei schreiben wir unsere uerste Klassen-Funktion in der Quell-Datei der Klasse students.cpp. Wir initiali-sieren den Namen unseres ersten Studenten.Exercise E4.5:CStudent::CStudent(){ // Initializations name_first = "James"; name_last = "Bond";}Daf¨ r m¨ ssen wir die notwendigen Klassen-Variablen (member variables) f¨ r u u uden Namen bereitstellen. Praktischerweise ist es ratsam, die Daten und Metho-den der Klasse zu trennen. Unsere Klassen-Deklaration nimmt langsam Gestaltan ...#include <string>using namespace std;class CStudent{ // Data / Properties public: string name_first; string name_last; // Methods / Functions public: CStudent(); // constructor ~CStudent(); // destructor};F¨ r die Namen benutzen wir die string Klasse von C++ (auch hierzu gibt’s uein Extra-Kapitel). Um den Daten-Typ string aus dieser Klasse benutzen zuk¨nnen, m¨ ssen wir die Klasse wie folgt inkludieren. o u#include <string>using namespace std;Exercise E4.5:#include <iostream>using namespace std;#include "student.h"
  32. 32. 32 KAPITEL 4 KLASSENint main(){ CStudent* m_std = new CStudent(); // instance using constructor cout << "E45: Data initialisation by constructor of class CStudent" << endl; cout << "m_std->name_firstt : " << m_std->name_first << endl; cout << "m_std->name_lastt : " << m_std->name_last << endl; delete(m_std); return 0;}4.6 DatenschutzEine wichtige Eigenschaft der Sprache C++ ist die M¨glichkeit, Daten unter- oschiedlich sichtbar zu machen. Eingangs des Kapitels haben wir gesehen, dasses verschiedene Schl¨ sselw¨rter gibt, um Variablen zu klassifizieren: public, pro- u otected und private. Daten des Typs ’public’ sind uberall sichtbar, aus sie kann ¨von uberall im Programm zugegriffen werden - also auch ver¨ndert werden. Dies ¨ akann sehr schnell problematisch werden, wenn das Programm sehr groß ist odermehrere Programierer gleichzeitg entwickeln. Daten des Typs ’private’ sind nurf¨ r die eigene Klasse sichtbar, dass auf sie k¨nnen nur durch Klassen-eigene u oMethoden zugegriffen werden. Private data sind f¨ r andere Klassen verborgen. uNat¨ rlich gibt es noch einen Kompromiss: Mit dem Schl¨ sselwort ’protected’ u ukann man gewisse Daten f¨ r ’befreundete’ Klassen offnen. Dies ist im Wesentli- u ¨chen das Datenschutz-Konzept von C++. ¨In der folgenden Ubung sehen wir, wie man mit ’private’ data (Kontonummer)umgehen kann. Die Variable bank account ist als private Typ deklariert.class CStudent{ public: long GetBankAccount(); void SetBankAccount(long); private: long bank_account;};Die Zugriffsfunktion GetBankAccount() der Klasse CStudent gibt lediglich denWert der Variable zur¨ ck, ihr Typ ist nat¨ rlich public. Die Kontonummer kann u ualso zun¨chst nicht von ’außen’ ge¨ndert werden. a along CStudent::GetBankAccount(){ return bank_account;}
  33. 33. 4.6 DATENSCHUTZ 33void CStudent::SetBankAccount(long new_bank_account){ bank_account = new_bank_account;}Nat¨ rlich l¨sst sich auch eine Funktion schreiben, mit der man private Daten u avon außen ¨ndern kann: SetBankAccount(long). Letztlich entscheidet der Pro- agrammierer, ob dieser Zugriff zul¨ssig sein soll, wenn nicht gew¨ nscht, werden a udie Get und Set Zugriffsfunktionen einfach nicht bereitgestellt. ¨Die nachfolgende Ubung zeigt zusammenfassend den Zugriff auf private Varia-blen von Außen.Exercise E4.6:int main(){ CStudent* m_std = new CStudent(); // instance using constructor cout << "E46: Data security - using private data" << endl; cout << "m_std->GetBankAccount()t : " << m_std->GetBankAccount() << endl; m_std->SetBankAccount(987654321); // changing private data cout << "m_std->GetBankAccount()t : " << m_std->GetBankAccount() << endl; delete(m_std); return 0;}
  34. 34. 34 KAPITEL 4 KLASSEN4.7 Testfragen 1. Geben sie eine Definition von C++ Klassen mit eigenen Worten (max 5 S¨tze). a 2. Was ist ein benutzerdefinierter Datentyp ? 3. Welches Datennschutz-Konzept gibt es f¨ r Klassen ? u 4. Wozu brauchen wir zwei Dateien f¨ r Klassen, eine H (Header) Datei und u eine CPP (Quelltext) Datei ? 5. Was ist ein Inklude / Include ? 6. Was ist eine Instanz einer Klasse ? 7. Worin besteht der Unterschied zwischen den Anweisungen: CStudent m std 1 und CStudent* m std 2 ? 8. Was ist ein Konstruktor einer Klasse ? 9. Was ist das Gegenst¨ ck zum Klassen-Konstruktor ? u 10. Wie k¨nnen Daten / Variablen einer Klasse initialisiert werden ? o 11. Schreiben sie den Quelltext f¨ r den Klassen-Konstruktor und weisen sie u den Variablen name first und name last ihren eigenen Namen zu. 12. Was verbirgt sich hinter der Anweisung: CStudent* m std = new CStudent() ? 13. Was ist der Unterschied zwischen CStudent und CStudent() ? 14. Wie kann ich meine Daten gegen einen externen Zugriff sch¨ tzen ? u
  35. 35. Kapitel 5Strings ¨Wir haben schon in mehreren Ubungen den Datentyp string benutzt, ohne diesenDatentyp etwas n¨her zu beleuchten. Dieses Vers¨umnis soll in diesem Kapitel a anachgeholt werden.5.1 Die Standardklasse stringString (in Deutsch Zeichenkette) ist vielmehr als nur ein Datentyp, string ist eineStandard-Klasse in C++. String ist eine der genialsten Weiterentwicklungen desC-Datentyps char, die das Hantieren mit Zeichen und Zeichenketten zu einemKinderspiel macht, na sagen wir mal - uns das Programmierleben erheblichvereinfachen wird, wenn wir mit Zeichenketten operieren werden. So wird z.B.der erforderliche Speicherplatz f¨ r Zeichenketten automatisch reserviert und bei uVer¨nderungen angepasst. aWenn wir strings benutzen wollen, m¨ ssen den Header der string-Klasse wie ufolgt inkludieren.#include <string> // for using stringsusing namespace std; // for using standard namesWichtig ist auch die zweite Zeile using namespace std. Diese Anweisung besagt,dass wir im folgenden Standard-Namen benutzen. Sonst m¨ ssten wir vor jeder ustring-Operation noch den Zusatz std:: setzen. Zur Benutung von namespace f¨ r udie Strukturierung und Kapselung von Programmteilen gibt es sp¨ter ein Extra- akapitel (9.2.2). An dieser Stelle zeigen wir die Bedeutung von using namespacestd; in bew¨hrter Weise an einem Beispiel. aSie haben sicher schon bemerkt, dass wir bei #include manchmal eckige Klam-mern <> und manchmal G¨nsef¨ ßchen ” benutzen. Wir schauen uns dies, wie a u 35
  36. 36. 36 KAPITEL 5 STRINGSgesagt, genauer im Kapitel 9.2.2 an. Hier nur soviel, dass mit eckigen Klammern<> an Header-Dateien im Systemverzeichnis von C++ gesucht wird, w¨hrend a” benutzerdefinierte, eigene Header (z.B. student.h) kennzeichnet und somit imaktuellen Arbeitsverzeichnis (also ./) nachgeschaut wird.5.2 Operationen mit strings ¨Die nachfolgende Tabelle zeigt eine Ubersicht der wichtigsten string Operatio-nen, die wir in diesem Kapitel verwenden. Methode Erl¨uterung a .append() verl¨ngert den String a .c str() erzeugt Zeichenfeld mit dem Inhalt des Strings .clear() l¨scht den Inhalt des Strings o .compare() vergleicht Strings .erase() l¨scht Zeichen im String o .find() sucht Zeichen in einem String .insert() f¨ gt in den String ein u .length() ermittelt die L¨nge des Strings a .replace() ersetzt Zeichen im String wichtig f¨ r die Konvertierung von string zu char* u .resize() a ¨ndert L¨nge des Strings a .substr() gibt einen Substring zur¨ ck u >> Eingabeoperator f¨ r Strings u << Ausgabeoperator f¨ r Strings u getline() liest Zeichen aus der Eingabe Tabelle 5.1: string Methoden5.2.1 Initialisieren von stringsEine M¨glichkeit f¨ r die Initialisierung von strings haben wir uns bereits in o uder Exercise E4.5 angesehen bei der Verwendung von Klassen-Konstruktoren.Der Standard-Konstruktor string() erzeugt einen leeren String. Eine zweiteM¨glickeit besteht direkt bei der Deklaration des strings, wie folgt: oExercise E5.2.1:string exercise("Exercise: string initialisation");cout << exercise.length() << endl;
  37. 37. 5.2 OPERATIONEN MIT STRINGS 375.2.2 Zuweisen von strings ¨In der folgenden Ubung schauen wir uns an, wie wir mittels Tastatureingabe(Standard-Eingabe-Ger¨t) strings zuweisen und Teile von strings in andere ko- apieren zu k¨nnen. oExercise E5.2.2:#include ... // Bitte f¨gen sie die notwendigen Header selbst ein umain(){...string eingabe;string eingabe_anfang;string message("Bitte geben Sie eine Zeile mit der Tastatur ein. Schliessen Sie die Eingabe mit Enter ab");//-------------------------------------------------------------------cout << message << endl; // Ausgabe der Eingabeaufforderunggetline(cin,eingabe); // Eingabe einer Zeile uber Tastatur ¨eingabe_anfang(eingabe,0,10); // die ersten 10 Zeichen von eingabe werden nach eingabe_anfang kopiertcout << "Ihr Eingagetext: " << eingabe << endl;cout << "Die ersten 10 Zeichen des Eingagetextes: " << eingabe_anfang << endl;...}5.2.3 Verketten von stringsMit dem Operator + k¨nnen Strings miteinander verkn¨ pft werden und in einem o u ¨neuen string name kopiert. In der folgenden Ubung produzieren wird aus Vor-und Nachnamen den ganzen Namen.Exercise E5.2.3:string name;CStudent* m_std = new CStudent();name = m_std->name_first + m_std->name_last;// odername = m_std->name_first;name += m_std->name_last;Wie bekommen wir einen Zwischenraum (Leerzeichen) zwischen Vor- und Nach-namen ?5.2.4 Vergleichen von stringsOft sind Abfragen notwendig, ob gewisse Zeichenketten gefunden wurden, umdann gewisse Operationen durchzuf¨ hren. Hierf¨ r bietet die String-Klasse meh- u urere M¨glichkeiten an, z.B. den exakten Vergleich (string::compare) oder einen o
  38. 38. 38 KAPITEL 5 STRINGS ¨Teil von Zeichenketten (string::find). Die nachfolgende Ubung zeigt, wenn derNachname BOND gefunden wurde, dann wird der Vorname auf JAMES gesetzt(und nat¨ rlich der russische Geheimdienst informiert). uExercise E5.2.4:if(m_std->name_last.compare("BOND")==0){ m_std->name_first = "JAMES";} ¨Die nachfolgende Ubung zeigt, wie ein Programm beendet werden kann, wenneine bestimmte Taste gedr¨ ckt wird. Hierf¨ r werden einzelne Zeichen mit dem u uOperator == verglichen.string Taste("N");while(Taste == "J"){ cout << "Soll dieses Programm endlich beendet werden? (J/N)" << endl; getline(cin,Taste);}cout << "Programm-Ende" << endl;5.2.5 Suchen in strings ¨Diese Ubung zeigt ihnen, wie nach Zeichenketten in string suchen k¨nnen. Sie osehen, je nach Sorgfalt des Programmierers haben sie eventuell schlechte Karten,wenn ihr Vorname die Zeichenkette ’BON’ enth¨lt. aExercise E5.2.5:if(m_std->name_last.find("BON")!=string::npos){ m_std->name_first = "JAMES";}5.2.6 Einfugen in strings ¨Nun benutzen wir die Einf¨ ge-Funktion von strings (string::insert), um Vor- uund Nachnamen zusammenzusetzen. Dabei ermitteln wir zun¨chst die L¨nge des a aVornamen mit string::length, setzen dann den Positionsz¨hler pos um Eins hoch a(Leerzeichen zwischen Vor- und Nachnamen) und f¨ gen dann den Nachnamen umit string::insert ein.Exercise E5.2.6:
  39. 39. 5.2 OPERATIONEN MIT STRINGS 39string name;int pos;if(m_std->name_first.find("JAMES")!=string::npos){ pos = m_std->name_first.length(); name.insert(pos+1,"BOND");}5.2.7 Ersetzen in stringsEine weitere n¨ tzliche String-Funktion ist das Ersetzen von Zeichen. In der u ¨nachfolgenden Ubung andern wir den Nachnamen. Dazu wird zun¨chst wieder ¨ adie L¨nge des Vornamens mit string::length ermittelt und dann der neue Nach- aname eingef¨gt. So k¨nnen sie ihre Spuren verwischen ... ist auch praktisch bei u oNamens¨nderungen z.B. infolge Heiraten (Beachten sie, dass Triple-Namen wie aM¨ ller-Graf-Kleditsch nicht mehr zul¨ssig sind). u aExercise E5.2.7:string name;int pos;name = "JAMES" + " " + "CHRISTIE"if(m_std->name_first.find("JAMES")!=string::npos){ pos = m_std->name_first.length(); name.replace(pos+1,"BOND");}Was passiert, wenn der neue Nachname l¨nger ist als der alte ? a5.2.8 Loschen in strings ¨Nat¨ rlich k¨nnen auch Zeichen in einem string gel¨scht werden. Diese Funktion u o opasst den Speicherbedarf des gek¨ rzten Strings automatisch an. uExercise E5.2.8:string name;int pos;name = "JAMES" + " " + "CHRISTIE"if(m_std->name_first.find("JAMES")!=string::npos){ pos = m_std->name_first.length(); name.erase(pos); name.replace(pos+1,"BOND");}Abschliessend kommen wir zu zwei weiteren Punkten, (1) das Umwandeln vonC++ strings in C char und (2) das Auslesen von string Teilen.
  40. 40. 40 KAPITEL 5 STRINGS5.2.9 Umwandeln von strings in charManchmal ist es notwendig C++ strings in C char umzuwandeln (wir ben¨tigen odies sp¨ter, wenn wir mit der MFC Klasse CStrings f¨ r grafische Benutzerober- a ufl¨chen arbeiten). Die String-Methoden c str() und data() wandeln strings in achar um. Aufgepasst, ab char m¨ ssen wir uns selber um das Speichermanage- ument k¨ mmern. ufprintf(f," %sn",name.c_str());name.clear();const char *char_string;char_string = name.data();5.2.10 Auswerten von Strings: StringstreamsStringstreams ... l¨sst sich kaum aussprechen .. es handelt sich aber definitiv anicht um stringdreams ... (sie erinnern sich an die Eingangsfolie der Vorlesung).Stringstreams sind eine sehr n¨ tzliche Sache, damit lassen sich Eingabedaten u(von Tastatur und Datei) bequem als Stream auswerten. Um Stringstreams ¨nutzen zu k¨nnen, muss die Klasse sstream inkludiert werden. Die Ubung zeigt, owie man eine eingegebene Zeile (Vor- und Nachnahme) elegant zerlegen kann.Dabei wird die eingebene Zeile zun¨chst in den stringstream kopiert, danach awird input line wie ein normaler stream ausgelesen.Exercise E5.2.10:#include <iostream>#include <string>#include <sstream>using namespace std;int main(){ string name; string name_first; string name_last; stringstream input_line; cout << "Geben Sie bitte Ihren Namen (Vor- und Nachnamen) ein: "; getline(cin,name); input_line.str(name); // Der Name wird nun zerlegt input_line >> name_first; cout << "Vorname:t" << name_first << endl; input_line >> name_last; cout << "Nachname:t" << name_last << endl; input_line.clear(); return 0;}
  41. 41. 5.3 TESTFRAGEN 415.3 Testfragen 1. Welche Klasse bietet uns C++ zur Verarbeitung von Zeichenketten an ? 2. Welchen Include ben¨tigen wir f¨ r die Arbeit mit Zeichenketten ? o u 3. Wof¨ r ist die Anweisung using namespace std n¨ tzlich ? u u 4. M¨ ssen wir selber Speicherplatz f¨ r C++ Zeichenketten (Strings) reser- u u vieren ? 5. Wie k¨nnen wir einen String, sagen wir mit der Zeichenkette ”Das ist eine o gute Frage”, initialisieren ? 6. Wie k¨nnen wir zwei Strings, ihren Vor- und Nachnahmen, miteinander o verbinden ? 7. Mit welcher string Funktion kann ich Zeichenketten miteinander verglei- chen ? 8. Schreiben sie eine Anweisung zum Vergleich der Klassen-Variable m std− >name last mit ihrem Nachnamen ? 9. Mit welcher string Funktion kann ich Zeichenketten suchen ? 10. Schreiben sie eine Anweisung zum Suchen ihres Vornamens in der Klassen- Variable m std− >name first ? 11. Mit welcher string Funktion kann ich Teile in Zeichenketten erstetzen ? 12. Wie k¨nnen wir die L¨nge von Strings ermitteln ? o a 13. Schreiben sie die Anweisungen, um ihren Nachnamen in die Zeichenkette ”JAMES BOND” nach ”JAMES” einzuf¨ gen ?u 14. Was passiert, wenn ihr Nachname l¨nger als ”BOND” ist ? a 15. Mit welcher string Funktion k¨nnen wir Zeichen in einem String l¨schen ? o o 16. Wir haben gesehen, dass es verschiedene Daten-Typen f¨ r Zeichenketten u in C, C++, MFC, .NET und Qt gibt. Zeichenketten geh¨ren zu den wich- o tigsten Daten-Typen bei der Programmierung. Wie k¨nnen wir einen C++ o string in eine C Zeichenkette (char) umwandeln ? 17. K¨nnen wir eine .NET Zeichenkette (String∧) in eine C++ Zeichenkette o (string) umwandeln ? 18. Was ist ein stringstream ? 19. Welchen Include ben¨tigen wir f¨ r die Arbeit mit Stringstreams ? o u
  42. 42. Kapitel 6Ein- und Ausgabe - IINachdem wir uns im Kapitel 3 bereits mit der Ein- und Ausgabe uber die¨Standard-Ger¨te (Tastatur und Bildschirm) besch¨ftigt haben, geht es in diesem a aTeil um die Dateiverarbeitung.6.1 Die fstream KlassenAbb. 6.1 zeigt die Hierarchie der fstream Klassen. ios istream ostream iostream ifstream ofstream fstream Abbildung 6.1: Die fstream KlassenDiese sind von den bereits bekannten ios stream Klassen abgeleitet. 42
  43. 43. 6.2 ARBEITEN MIT FILE-STREAMS 43 • ifstream: ist von istream abgeleitet f¨ r das Lesen von Dateien. u • ofstream: ist von ostream abgeleitet f¨ r das Schreiben von Dateien. u • fstream: ist von iostream abgeleitet f¨ r das Lesen und Schreiben von Da- u teien.6.2 Arbeiten mit File-Streams6.2.1 File-Streams anlegenEr¨ffnungsmodus: Um eine Datei benutzen zu k¨nnen, muss diese zun¨chst o o age¨ffnet werden. Daf¨ r gibt es verschiedene M¨glichkeiten (siehe Tab. 6.1). o u o Flag Funktion ios::in Eine (existierende) Datei wird zum Lesen ge¨ffnet. o ios::out Eine Datei wird zum Schreiben ge¨ffnet. o Existierende Inhalte werden uberschrieben. ¨ ios::app Die neuen Inhalten werden an die existierenden angeh¨ngt. a ios::trunc ¨ Eine bestehende Datei wird beim Offnen auf die L¨nge 0 gek¨ rzt. a u ios::ate Schreib- und Leseposition werden auf das Dateiende gesetzt. ios::binary Schreib- und Leseoperationen werden im Bin¨rmodus ausgef¨hrt. a u Tabelle 6.1: Er¨ffnungsmodi f¨ r Dateien o uDie default Werte sind: • ios::in f¨ r ifstream u • ios::out | ios::trunc f¨ r ofstream u6.2.2 File-Streams schließenWir wissen schon, dass es bei objekt-orientierten Sprachen immer zwei passendeDinge gibt, z.B. Klassen-Konstruktoren und -Destruktoren. So ist zu erwarten,dass es zu einer Methode ’Datei ¨ffnen’ (open()) auch eine Methode ’Datei oschließen’ gibt (close()) (Tab. 6.4)6.2.3 ¨ Ubung: Eine einfache Kopierfunktion ¨In unserer ersten Ubung zur Dateiverarbeitung schreiben wir eine einfache Ko-pierfunktion.Exercise E6.2.3: Eine einfache file copy Funktion
  44. 44. 44 KAPITEL 6 EIN- UND AUSGABE - II#include <iostream> // for using cout#include <fstream> // for using ifstream / ofstream#include <string> // for using stringusing namespace std; // namespace for std functionsint main(){ //---------------------------------------------------------------- ifstream input_file; // Instance of class ifstream input_file.open("input_file.txt"); // Open file "text_file.txt" string my_string; // Instance of class string input_file >> my_string; // Reading a string from file cout << my_string.data() << endl; // Output of string to screen //---------------------------------------------------------------- ofstream output_file; // Instance of class ifstream output_file.open("output_file.txt"); // Open file "text_file.txt" output_file << my_string; // Writing a string to a file //---------------------------------------------------------------- return 0;}Die Ein- >> und Ausgabeoperatoren << formatieren die Datentypen (z.B. int ¨in der Ubung E6.2.3) entsprechend den Einstellungen der fstream Klasse. DieseEinstellungen k¨nnen durch Flags ver¨ndert werden (siehe n¨chsten Abschnitt). o a aDie main() Funktion kann auch mit einer Parameterliste (int argc, char*argv[]) versehen werden. Die Anzahl der Parameter (argc) wird automatischerkannt. MIt jedem Leerzeichen in der Tastatureingabe entsteht ein neuer Ein-gabeparameter (Abb. 6.2).int main(int argc, char *argv[]){ ifstream input_file; // Instance of class ifstream input_file.open(argv[1]); // Open file, name from cin ofstream output_file; // Instance of class ifstream output_file.open(argv[2]); // Open file, name from cin return 0;}Die Benutzung der main Funktion mit Eingabeparametern ist in der folgendenAbbildung zu sehen. Abbildung 6.2: Die main Funktion mit Parametern
  45. 45. 6.2 ARBEITEN MIT FILE-STREAMS 456.2.4 ¨ Ubung: Ein einfacher Konverter ¨Ihre Frage nach dem Sinn der Ubung 6.2.3 ist vollkommen berechtigt, wozuein Programm schreiben, um eine Datei zu kopieren. Das kann ich doch auchmit dem Windows-Explorer oder mit cp file1 file2 machen. Richtig, abergenauso funktionieren Kopierprogramme, Windows-Explorer ruft ’unser’ Ko- ¨pierprogramm auf. Wenn wir auch nur kleine Anderungen in unserer Datei vor-nehmen wollen (z.B. eine laufenden Nummer in jede Zeile einf¨ gen), kann uns uder Windows-Explorer nicht mehr weiter helfen. Dies ist insbesondere danna¨rgerlich, wenn die Datei ziemlich groß ist ... Auch hier sagen sie zu Recht, eineNummerierung in eine gr¨ßere Datei einf¨ gen, das kann ich z.B. auch mit EX- o u ¨CEL machen. In der n¨chsten Ubung schreiben wir einen kleinen Konverter, also agenau was EXCEL im Hintergrund macht, wenn wir eine neue Spalte einf¨ gen. uExercise E6.2.4: Ein einfacher Konverterint main(){ //---------------------------------------------------------------- ifstream input_file; // Instance of class ifstream input_file.open("input.txt"); // Open file "text_file.txt" ofstream output_file; // Instance of class ifstream output_file.open("output.txt"); // Open file "text_file.txt" //---------------------------------------------------------------- char line[80]; int i=0; while(input_file.getline(line,80)) // Loop condition { output_file << i << " " << line << endl; i++; // Incrementor (+1) } //---------------------------------------------------------------- return 0;}Unser Konverter macht nichts anderes, als die Datei input.txt zu ¨ffen, nach- oeinander alle Zeilen lesen und am Anfang der Zeile eine Nummer (i) einzuf¨ gen uund dann in die neue Datei output.txt zu schreiben. ¨Was ist neu bei dieser Ubung. C++ Ding Was tut’s while() eine Kontrollstruktur f¨ r Schleifen u (solange der Ausdruck in () wahr (true) ist wird die Schleife ausgef¨hrt) u i++ der Inkremetor (z¨hlt Eins hoch) a Tabelle 6.2: C++ news
  46. 46. 46 KAPITEL 6 EIN- UND AUSGABE - IIAlle benutzten fstream Methoden finden sie in Tab. 6.4.6.2.5 Einschub: Erstes Arbeiten mit MS VC++Wir haben den Editor von MS VC++ ja schon mehrfach benutzt, da die Syntax ¨des Quelltextes sehr sch¨n angezeigt wird (Abb. 6.3). Uberhaupt ist MS VC++ oein sehr sch¨nes Entwicklungssystem f¨ r Programmentwicklung ... Wir f¨ hren o u u ¨die Ubung E6.2.4 jetzt mal mit MS VC++ aus. Abbildung 6.3: Der MS VC++ EditorStandardm¨ßig werden folgende Einf¨rbungen benutzt f¨ r a a u • Keywords: Blau • Kommentare: Gr¨ n u • Normaler Quelltext: Schwarz • Includes: Rot
  47. 47. 6.2 ARBEITEN MIT FILE-STREAMS 47 • Zeichenketten: RotIch bin mir ziemlich sicher, dass man in einem gut versteckten MS VC++ Menu-punkt alles selber einstellen kann ...Highlighting of sytax ... ist nur eines der sehr n¨ tzliches features (langsam gleiten uwir in IT slang ab). Um MS VC++ richtig nutzen zu k¨nnen, m¨ ssen wir o uein sogenanntes Projekt anlegen (mal sehen, ob ihre Begeisterung danach nochanh¨lt). Die Schritte f¨ r die Projekterstellung finden sie in der Anlage (Abschn. a u12.4) ... Nachdem das Projekt angelegt ist, k¨nnen wir damit arbeiten. o ¨ Abbildung 6.4: Ubersetzen sie das Projekt mit F7 (build solution) Abbildung 6.5: Das Debug Verzeichnis
  48. 48. 48 KAPITEL 6 EIN- UND AUSGABE - IIMSVS legt allerhand Zeug’s an. Das executable finden sie im UnterverzeichnisDebug und kann nat¨ rlich mit einem Doppelklick gestartet werden. Wir starten udie Konsolenanwendung aus MSVS mit Ctrl-F5 (Abb. 6.6).Abbildung 6.6: Starten der Konsolenanwendung mit Ctrl-F5 oder Menu-Auswahl (Start without debugging) ¨Hier wartet schon die erste Uberraschung auf uns: pwd wird nicht erkannt undwir werden aufgefordert eine Zeit einzugeben (Abb. 6.7). Abbildung 6.7: Das Debug VerzeichnisWas ist passiert ? • pwd ist ein Linux-Befehl, den kennt der Windows-Compiler nicht. • time gibt es auch als DOS-Befehl, hat aber eine ganz andere Bedeutung: nicht Ausgabe der Zeit sondern Zeit ¨ndern. aWir sehen also, dass unser Quellcode von verschiedenen Compilern unterschied-lich interpretiert wird.
  49. 49. 6.3 FILE-STREAMS UND KLASSEN 49. Abbildung 6.8: Der Windows bereinigte QuelltextSie sehen ’Sch¨nheit’ hat auch ihren Preis ... dennoch die Funktionalit¨t der MS o aVC++ Entwicklungsumgebung, das muss man neidlos anerkennen, ist einfachKlasse.6.3 File-Streams und KlassenWir wollen eine Lesefunktion f¨ r die Klasse CStudent schreiben. Bevor wir udamit beginnen, m¨ ssen wir uns Gedanken uber eine geeignete Struktur f¨ r die u ¨ uDarstellung eines CStudent Datensatzes in einer Datei machen. Der Vorschlagf¨ r die Strukturierung von Datens¨tzen ist die Benutzung von Schl¨ sselw¨rtern u a u ozur Trennung von Datenbl¨cken, z.B. o#STUDENT $NAME_FIRST James $NAME_LAST Bond ...#STOPWir benutzen zwei verschiedene Symbole f¨ r Schl¨ sselw¨rter: u u o
  50. 50. 50 KAPITEL 6 EIN- UND AUSGABE - II • keyword # : zur Trennung von Datens¨tzen f¨ r eine Instanz von CStudent, a u • subkeyword $ : zur Identifizierung der einzelnen Daten f¨ r die CStudent u Instanz. • #STOP zeigt das Ende der Datenbasis an. (Eigentlich w¨re dies nicht a n¨tig, da das Dateiende auch mit dem Parameter eof (end-of-file) ab- o gefragt werden kann. Wir werden aber sehen, dass mit #STOP einiges einfacher zu programmieren ist.)Exercise E6.3: Implementierung der CStudent Lesefunktionios::pos_type CStudent::Read(ifstream& input_file){ //---------------------------------------------------------------------- string input_line; char buffer[256]; // MAX_LINE ios::pos_type position; //---------------------------------------------------------------------- while(true) { position = input_file.tellg(); input_file.getline(buffer,256); input_line = buffer; if(input_line.size()<1) // empty line continue; // Dealing with keywords if(input_line.find(’#’)!=string::npos) // keyword found return position; // Dealing with subkeywords if(input_line.find("$NAME_FIRST")!=string::npos) { input_file.getline(buffer,256); input_line = buffer; name_first = input_line; } if(input_line.find("$NAME_LAST")!=string::npos) { input_file >> name_last; } if(input_line.find("$subkeyword")!=string::npos) { input_file >> member; } } //---------------------------------------------------------------------- return position;}
  51. 51. 6.3 FILE-STREAMS UND KLASSEN 51Der Lesealgorithmus funktioniert wird folgt: Nach dem Auffinden eines Schl¨ ssel- uworts #STUDENT, wird in einer while Schleife nach subkeywords ($) gesucht,wenn gefunden, werden der CStudent Instanz die Werte aus der Eingabedateizugewiesen (also die Namen). Wenn das n¨chste Schl¨ sselwort (#STUDENT a uoder #STOP) gefunden wird, geht’s mit der vorletzten Position raus aus derFunktion. Die vorletzte position ist wichtig, damit die letzte Zeile sp¨ter noch- amal gelesen werden kann, um das Schl¨ sselwort auswerten zu k¨nnen ... u oDie Implementierung der main Funktion, in der die CStudent::Read() Funktionaufgerufen wird, ist im folgenden Block dargestellt.#include <iostream> // for using cout#include <fstream> // for using ifstream / ofstream#include <string> // for using string#include "student.h" // for using CStudentsusing namespace std; // for std functionsint main(){ //---------------------------------------------------------------- // File handling ifstream input_file; // ifstream instance input_file.open("data_set.txt"); if(!input_file.good()) // Check is file existing { cout << "! Error in STD::Read: file could not be opened" << endl; return 0; } input_file.seekg(0L,ios::beg); // Rewind file //---------------------------------------------------------------- CStudent* m_std = new CStudent(); // CStudent instance m_std->Read(input_file); //---------------------------------------------------------------- input_file.close(); return 0;}Die main Funktion besteht aus zwei Teilen, dem File-Handling und dem Aufrufder Lesefunktion. Beim File-Handling wird der stream aus der Datei data set.txtge¨ffnet, anschließend erfolgt der Test, ob das File erfolgreich ge¨ffnet werden o okonnte; wenn nicht, wir die main Funktion sofort beendet. ¨Was ist neu bei dieser Ubung.Wir benutzen den Referenz-Operator & (Kapitel 7) als Parameter der FunktionCStudent::Read(). Eine Referenz ist eigentlich nicht anderes als ein andererBezeichner (Alias) f¨ r eine bereits existierende Instanz eines Objekts. Es kann ualso mehrere solcher Referenzen geben und vor Benutzung einer Referenz mussdie Instanz des Objekts physikalisch (also speicherm¨ßig) vorhanden sein, sonst a’crashed’ unser Programm.
  52. 52. 52 KAPITEL 6 EIN- UND AUSGABE - II C++ Ding Was tut’s ifstream& input file eine Reference auf ein Objekt wird in Kapitel 7 ausf¨ hrlich abgehandelt u Tabelle 6.3: C++ news6.4 fstream MethodenDie bisher benutzten fstream Methoden sind in der Tab. 6.4 zusammengestellt. Methode Funktion open() o ¨ffnet die Datei good() ¨ tested erfolgreiche Offnung der Datei seekg(pos,ios::beg) geht zur Position pos in der Datei seekg(0L,ios::beg) spoolt zum Dateianfang zur¨ ck u tellg() merkt sich die aktuelle Position im stream getline(buffer,256) holt eine Zeile der L¨nge 256 (Zeichen) aus dem stream a und kopiert diese in buffer close() schließt Datei >> Eingabeoperator f¨ r Dateien u << Ausgabeoperator f¨ r Dateien u Tabelle 6.4: fstream MethodenDie string Auswertung spielt bei der Lesefunktion eine wichtige Rolle, daher ha-ben wir uns wir uns im vorangegangenen Kapitel mit der string Klasse besch¨ftigt. a
  53. 53. 6.5 TESTFRAGEN 536.5 Testfragen 1. Was ist die Basis-Klasse f¨ r alle Ein- und Ausgaben in C++ ? u 2. Was sind die C++ Klassen f¨ r das Lesen und Schreiben von Dateien ? u 3. Welchen Include ben¨tigen wir f¨ r das Arbeiten mit I/O File-Klassen ? o u 4. Was sind die Standard-Flags f¨ r File-Streams (Lesen und Schreiben) ? u 5. Mit welchem Flag k¨nnen wir zu schreibende Daten an eine existierende o Datei anh¨ngen ? a 6. Was ist der Unterschied zwischen ASCII- und Bin¨r-Formaten ? a 7. Mit welchem Flag k¨nnen wir Daten in einem Bin¨r-Format schreiben ? o a Mit welcher Anweisung wird ein File ge¨ffnet ? Mit welcher Anweisung o wird ein File geschlossen ? 8. Was bewirken die Stream-Operatoren << und >> ? 9. Wie k¨nnen wir mit Dateinamen in unserem Hauptprogramm main(...) o arbeiten ? 10. Welche Anweisung ben¨tigen wir f¨ r die Erzeugung einer Instanz f¨ r einen o u u Eingabe-Strom ? 11. Welche Anweisung ben¨tigen wir f¨ r die Erzeugung einer Instanz f¨ r einen o u u Ausgabe-Strom ? 12. F¨ r die Erstellung einer Datenbank ist es wichtig einzelnen Datens¨tze zu u a trennen. Wie k¨nnen wir soetwas in der Datenbank-Datei bewerkstelligen o ? 13. Ist es wichtig das Ende einer Datenbank-Datei, z.B. mit einem Schl¨ ssel- u wort #STOP, zu markieren ? o u ¨ 14. Mit welcher Abfrage k¨nne wir pr¨ fen, ob die Offnung einer Datei erfolg- reich war ? 15. Mit welcher Anweisung k¨nnen wir die aktuell gelesene Position in einer o ge¨ffneten Datei abfragen ? o 16. Mit welcher Anweisung k¨nnen wir zu einer bestimmten Position in einer o ge¨ffneten Datei springen ? o 17. Mit welcher Anweisung k¨nnen wir eine komplette Zeile aus ge¨ffneten o o Datei auslesen ?
  54. 54. Kapitel 7Referenzen und ZeigerReferenzen und Zeiger (pointer), d.h. die Symbole & und * sind uns bereitsmehrfach begegnet, z.B. in der Parameterliste der main() Funktion ... Generellk¨nnen Zeiger und Referenzen als einfache Variable, Parameter oder R¨ ckgabe- o uwert (return) einer Funktion auftauchen. ¨In der Ubung E6.3 haben wir bereits mit Referenzen gearbeitet und festgestellt,dass Referenzen eigentlich nichts anderes als andere Bezeichner (Alias) f¨ r eine ubereits existierende Instanz eines Objekts sind. Es kann also mehrere solcherReferenzen geben. Bei der Definition eines Zeigers wird also kein neuer Spei-cher reserviert. Die Instanz des Objekts muss physikalisch (also speicherm¨ßig) anat¨ rlich vorhanden sein, sonst ’verabschiedet’ sich unser Programm gleich wie- uder. x &ref_x x Referenz auf das Objekt y Objekt im Speicher Abbildung 7.1: Referenzen auf Objekte 54
  55. 55. 7.1 REFERENZEN 557.1 Referenzen7.1.1 Das Call-by-reference Prinzip - Referenzen als Pa- rameterDef: Eine Referenz ist nichts anderes als ein anderer Name (Alias) f¨ r ein bereits uexistierendes Objekt. Bei der Definition einer Referenz wird also kein neuerSpeicherplatz f¨ r das Objekt belegt (außer nat¨ rlich die 4 Byte f¨ r die Referenz u u uselbst).Die Abb 7.2 soll das Konzept des Referenzierens noch einmal verdeutlichen. • x ist die Instanz eines Datentyps T • &ref x ist eine Referenz (Verweis) auf x ¨In der ersten Ubung sehen die Definition von Referenzen und Zeigern im Quell-text¨Ubung: E7.1.1double x = 1.23456789;double* ptr_x;double& ref_x = x; // initialisation is needed ¨Die Bildschirmausgabe der ersten Ubung zeigt Folgendes: Abbildung 7.2: Referenzen auf ObjekteEine Referenz (ref x) muss bei der Definition initialisiert werden (mit x), sonstbekommen sie eine Fehlermeldung beim Kompilieren.Der Referenztyp-Parameter (&) ist ein Aliasname f¨ r das ’richtige’ Argument. uBeim Aufruf der Funktion wird der Referenz-Parameter mit dem Objekt initia-lisiert. Die Funktion arbeitet also direkt mit dem von außen ubergebenen Argu- ¨ ¨ment. Das ’Call-by-reference’ Prinzip ist sozusagen eine Ubergabe-von-Außen.Wir schauen uns dies mal an bei der CStudent-Lesefunktion aus der letztenVorlesung.¨Ubung: E7.1.1
  56. 56. 56 KAPITEL 7 REFERENZEN UND ZEIGERDefinition: CStudent::Read(ifstream& ref_input_file)Aufruf: ifstream input_file; CStudent* m_std = new CStudent(); // CStudent instance m_std->Read(input_file);Was passiert ? Beim Aufruf der Lese-Funktion Read wird die Adresse des ifstreamObjekts (input file) an die Funktion ubergeben. Das heisst die Lese-Funktion ¨arbeitet intern mit dem ’richtigen’ Objekt. ’Call-by-reference’ Prinzip erm¨glicht oes also der Funktion einen Zugriff auf Daten des Aufrufers.Beim sogenannten ’Call-by-value’ Prinzip k¨nnen Funktions-Argumente inner- ohalb der Funktion nicht ge¨ndert werden. a7.1.2 Referenzen als Ruckgabe-Wert ¨Referenzen auf Objekte k¨nnen auch R¨ ckgabe-Werte von Funktionen sein. o u¨Ubung: E7.1.2 (aus [5])Definition: string& message() { static string m_str("Vorsicht Speicher-Falle"); return m_str; }Aufruf:!!! Das Objekt muss nach dem Verlassen der Funktion noch existieren ¨Was ist neu bei dieser Ubung. C++ Ding Was tut’s static Speicherklasse: der Speicher f¨ r das Objekt bleibt w¨hrend u a der gesamten Programmausf¨ hrung bestehen, u wird in Kapitel 7.3 ausf¨ hrlich abgehandelt. u Tabelle 7.1: C++ news7.2 ZeigerZeiger sind eine der Grundideen moderner Programmiersprachen. Dabei arbei-tet man nicht direkt mit den Daten-Bl¨cken im Speicher sondern mit deren oAdressen. Dies macht insbesondere Sinn, wenn es um große Daten-Objekte geht
  57. 57. 7.2 ZEIGER 57oder bei Objekten, die erst zur Laufzeit angelegt werden (z.B. Vektoren, Li-sten, Strings). Das Klassen-Prinzip unterst¨ tzt die Zeigertechnik optimal, da udie Klasse ihre Daten ja selber verwaltet (siehe Klassenkonstruktur) Der Zeiger(pointer) auf ein Objekt repr¨sentiert dessen Adresse und Daten-Typ. a7.2.1 Definition von Zeigern ¨Die nachfolgende Ubung zeigt, wie wir Zeiger definieren und mit ihnen arbeitenk¨nnen. F¨ r den Zugriff auf Zeiger gibt es den sogenannten Verweisoperator ’*’. o u¨Ubung: E7.2 (aus [5])int main(){ int i, *ptr_i; // Definitionen i = 100; // Zuweisung ptr_i = &i; // Dem Zeiger wird die Adresse der integer Variable i zugewiesen *ptr_i += 1; // Die integer Variable i wird um Eins erh¨ht (i += 1;) o}⇒Geben sie Werte und Adressen der Integer-Variable i und den Zeiger auf i(i ptr) aus.Unabh¨ngig vom Daten-Typ ist der ben¨tigte Speicher f¨ r eine Zeigervariable a o uimmer gleich groß - der zur Speicherung ben¨tigte Platz f¨ r die Adresse des o uObjekts (4 Byte auf einer 32-Bit-Rechner-Architektur, siehe auch Abb. 7.2). ¨Was ist neu bei dieser Ubung. C++ Ding Was tut’s *ptr Verweisoperator (un¨r: ein Operand) a i*i Multiplikations-Operator (bi¨r: zwei Operanden) a Tabelle 7.2: C++ news: Operatoren7.2.2 NULL ZeigerWir haben gesehen, dass Referenzen auf Daten-Objekte zwingenderweise in-itialisiert werden m¨ ssen (sonst streikt der Kompiler). Zeiger m¨ ssen eigentlich u unicht initialisiert werden, ihnen wird bei der Definition eine ’vern¨ nftige’ Adres- use zu gewiesen. Dies bedeutet noch lange nicht, dass sich hinter dieser Adresseetwas Vern¨ nftiges verbirgt. Daher ist es ratsam, auch Zeiger zu initialisieren, uum Nachfragen zu k¨nnen, ob sie tats¨chlich auf existierende Objekte zeigen. o aZum Initialisieren von Pointern gibt es den NULL-Zeiger.
  58. 58. 58 KAPITEL 7 REFERENZEN UND ZEIGERdouble* ptr_x = NULL;ptr_x = &x;if(!ptr_x) cout << "Warning: ptr_x does not have a meaningful adress";Der linke Operand der Operators = muss immer auf eine ’sinnvolle’ Speicher-stelle verweisen. Dieser wird daher auch als so genannter L-Wert (L(eft) value)bezeichnet. Wenn eine Fehlermeldung ’wrong L-value’ erscheint, wissen sie, dasskeine ’sinnvolle’ Adresse vergeben wurde, dies spricht wiederum f¨ r eine Initia- ulisierung von Zeigern mit Zero-Pointer.7.2.3 Zeiger als ParameterDer Verweisoperator ist uns unl¨ngst schon mal begegnet bei der erweiterten amain() Funktion mit Eingabeparametern: int main(int argc, char* argv[])7.3 Zeiger und ArraysWie bereits gesagt, die Verzeigerungs-Technik ist eine der Besonderheiten vonobjekt-orientierten Sprachen, wie z.B. von C++. Mit solchen Pointern k¨nnen owir auch gr¨ßere Daten-Objekte wie Vektoren verwalten. Die zentrale Idee ist: oWenn Startpunkt (id Adresse) und L¨nge des Vektors bekannt sind, wissen wir aeigentlich alles und k¨nnen auf alle Vektor-Daten zugreifen. o7.3.1 Statische ObjekteBei der Einf¨ hrung der String-Klasse hatten wir bereits mit Zeichenketten zu utun. Aus der Sicht des Speichers ist eine Zeichenkette ein Vektor der eine be-stimmte Anzahl von Zeichen enth¨lt. Vektoren k¨nnen nat¨ rlich f¨r (fast) alle a o u uDatentypen definiert werden. Im n¨chsten Kapitel (8) besch¨ftigen wir uns mit a asogenannten Containern, damit k¨nnen z.B. Vektoren, Listen etc. f¨ r ganze o uKlassen generiert werden.char Zeichenkette[80];int iVektor[50];double dVektor[50];7.3.2 Dynamische ObjekteBisher haben wir uns fast ausschließlich mit Datentypen besch¨ftigt, deren aSpeicherbedarf bereits w¨hrend der Kompilierung fest steht und reserviert wird a(bis auf Strings-Objekte). Es gibt aber auch die M¨glichkeit, den Speicherbe- odarf w¨hrend der Programmausf¨ hrung zu ¨ndern - dies geht mit dynamischen a u aDaten-Objekten. Die werden wir folgt deklariert.
  59. 59. 7.4 SUMMARY 59char* Zeichenkette;int* iVektor;double* dVektor;Nun m¨ ssen wir uns allerdings selber um die Speicherreservierung k¨ mmern. u u ¨Dies erfolgt mit dem new-Operator und wird in der n¨chsten Ubung gezeigt. aWir ahnen schon, wenn es etwas zum Vereinbaren von Speicher gibt, muss eswohl auch das Gegenst¨ ck - freigeben von Speicher - geben. Nat¨ rlich habe sie u uRecht. Dies erledigt der delete-Operator.double* dVektor;dVektor = new double[1000];delete [] dVektor;Die Anwendung beider Operatoren zum Speichermanagement sowie eine M¨glich- o ¨keit, den verbrauchten Speicher zu messen, werden in der folgenden Ubung ge-zeigt.¨Ubung: E7.3.2#include <iostream> // for using cout#include <malloc.h> // for using malloc_usable_sizeusing namespace std;int main(){ char* Zeichenkette; // Definitions long size_memory; // Auxiliary variable for memory size Zeichenkette = new char[1000]; // Memory allocation size_memory = malloc_usable_size(Zeichenkette); // calculation of memomry delete [] Zeichenkette; // Memory release return 0;}HomeWork: HW7.3.2Schreiben sie ein kleines Programm, mit der sie den ben¨tigten Speicher ermit- oteln k¨nnen und pr¨ fen sie, ob die Freigabe des Speichers funktioniert hat. o uZeiger k¨nnen auch verschachtelt werden: Zeiger auf Zeiger ... Damit lassen sich omehrdimensionale Datenstrukturen schaffen, z.B. Matrizen.7.4 SummaryDas Verstehen und Arbeiten mit Zeigern und Referenzen ist nicht ganz ein-fach und braucht eine ganze Zeit der praktischen Anwendung. Der *Operator

×