Home

C/C++ Skriptum

image

Contents

1. Bild 0 5 Projektfenster Die Programmiersprachen C und C Einf hrung 9 TU Wien Institut E114 Prof DDr F Rattay Eingabe des Quelltextes Im ge ffneten Quelltextfenster kann nun der oben angegebene Quelltext eingegeben werden Bild 0 6 Dieses Fenster ffnet sich entweder von selbst beim Hinzuf gen einer Sourcedatei zum Projekt oder es kann durch Doppelklick auf eine Sourcedatei im Projektfenster ge ffnet werden Es ist darauf zu achten wirklich alle Zeichen genau so einzugeben wie sie angegeben sind Insbesondere Leerzeichen sind f r eine reibungslose bersetzung wichtig Man beachte auch hier die Online Hilfe der IDE um die genaue Tastenbelegung des Editors kennenzulernen Ist die Eingabe beendet sollte man das Abspeichern mit F2 nicht vergessen da es gerade bei der Programmierung zu Abst rzen kommen kann die die gerade eingegebenen Daten vernichten k nnen Bild 0 6 Texteditor bersetzen und Linken Durch Anwahl des Men punktes Make oder dr cken der Taste F9 wird nun der bersetzungsproze angesto en Bild 0 7 Der integrierte Compiler bersetzt den Sourcecode in den Objectcode und meldet evtl aufgetretene Fehler im Ausgabe Fenster Bild 0 8 Sollte ein Fehler aufgetreten sein kann man durch Doppelklick auf die entsprechende Zeile einfach in das entsprechende Sourcecode Fenster genau an die Stelle an der der Fehler aufgetreten ist gelangen Hier kann man die n tigen Korrekturen
2. Konto ktol Konto kto2 Konto kto3 Zuweisen von Werten zu einem Objekt ktol Merke_KontoNo 47 11 ktol Merke_Betrag 43 kto2 Merke_KontoNo 2211 kto2 Merke_Betrag 3 kto3 Merke_KontoNo 007 kto3 Merke_Betrag 456 Auslesen der Wert tol Schreibe_KontoNo to2 Schreibe_Betrag to3 Schreibe_KontoNo wO N SE w to3 Schreibe_Betrag Die Programmiersprachen C und C Streams und File I O Prof DDr F Rattay 89 TU Wien Institut E114 Prof DDr F Rattay return 0 Ein Ausgabe mit Dateien Die Fin bzw Ausgabe von Daten unter Zuhilfenahme von Dateien erfordert das Einbinden der Header Files iostream h und fstream h include lt iostream h gt include lt fstream h gt Ein wesentlicher Vorteil der Datei Stream Klassen in C gegen ber den Mechanismen im herk mmlichen C liegt darin da die Dateien bei der Deklaration der Objekte automatisch ge ffnet werden bzw geschlossen werden wenn die Lebensdauer eines Stream Objektes erlischt Jedes mit einer Datei verkn pfte Objekt ist von einer der drei Klassen ifstream Eingabestrom ofstream Ausgabestrom fstream Ein und Ausgabestrom Diese Klassen wurden f r die Dateibearbeitung von istream ostream bzw iostream abgeleitet und verf gen daher ber die gleichen Memberfunktionen einschlie lich der berladenen lt lt bzw gt gt Operatoren Beispiel
3. cin gt gt i exit 0 Programm ordnungsgem verlassen Man erkennt da zun chst ein Array mit drei Elementen 0 2 vgl Kapitel 0 von Pointern auf Kontoobjekte angelegt wird Diese Pointer zeigen zun chst noch ins Leere die eigentliche Erzeugung der konkreten Objekte findet erst in den drei folgenden Zeilen statt Hier kommt ein weiteres C Schl sselwort ins Spiel der Operator new Er dient als Ersatz f r die in C benutztenmalloc und calloc Funktionen Er alloziert Speicher f r ein Objekt des gew nschten Typs wobei der entsprechend Typ hinter dem Operator angegeben wird In unserem Fall ist der Typ die Klasse Konto In der for Schleife wird jedem Array Element also den Pointern das frisch erzeugte Objekt zugewiesen Anschlie end zeigt jedes Arrayelement auf ein Objekt der Klasse Konto s a Bild Zugriff auf Objekte ber Array aus Pointern Auch hier wird wieder der Konstruktor aufgerufen jetzt mit den Parametern i die Kontonummern sind einfach die fortlaufenden Array Indizes und dem festen Betrag von 100 Array von Pointern auf Objekte der Klasse Konto Konto kontoArray 3 kontoArray mn o eea PONE A Pa Bild Ein Array aus Pointern auf Objekte Nach der Initialisierung des Objekt Arrays werden im Prinzip die gleichen Operationen und Funtkionsaufrufe get tigt wie im Beispiel zuvor Nat rlich wird jetzt ber das Pointer Array auf die Objekte und ihre Member Funktionen zugegrif
4. man die Zeile struct Point3D a b Variablen des Typs Point3D die jeweils einen Punkt enthalten durch folgende Deklaration ersetzen Die Programmiersprachen C und C Benutzerdefinierte Datenstrukturen Structs Unions 33 TU Wien Institut E114 Prof DDr F Rattay struct float x float y float Zz long number a b Variablen des Typs Point3D die jeweils einen Punkt enthalten und au erdem wird die include Anweisung in der zweiten Zeile nicht mehr ben tigt Wird die Deklaration so durchgef hrt ist es nicht mehr m glich an anderer Stelle erneut Variablen von diesem struct zu erzeugen da es keinen Namen erhalten hat und somit nicht mehr zugreifbar ist Zugriff auf Komponenten Der Zugriff auf die einzelnen Komponenten eines structs erfolgt mit der sogenannten Punktnotation wie sie auch im Hauptprogramm verwendet wird a x ein Schreibender Zugriff auf die Komponente x der Struktur a ein a x Lesender Zugriff auf die Komponente x der Strukutur a Werden Strukturvariablen ber Zeiger angesprochen so wird statt der Punktnotation die Pfeilnotation verwendet s u wobei der lesende und schreibende Zugriff auf die Variable a aus der Struktur x dann wie folgt aussieht a gt x ein Schreibender Zugriff auf die Komponente x der Struktur a ber Pointer ein a gt x Lesender Zugriff auf die Komponente x der Strukutur a ber Pointer
5. Bibliotheken so da keine einheitliche Verwendung z B der Namen der header Dateien m glich ist Gl cklicherweise gibt es jedoch sehr viele bereinstimmungen unter den bekanntesten Compilern Ein Stream ist im Gegensatz zu einem festen Datum als eine unendliche Folge von Daten zu verstehen Streams sind also Datenstr me in die Informationen eingeleitet werden oder die Daten kontinuierlich liefern In C werden drei gro e Klassen von Datenstr men unterschieden istream ostream iostream Weitere Streams werden der Dateiverwaltung zugeordnet ofstream Ausgabestrom auf eine Datei ifstream Eingabestrom aus einer Datei fstream Ein Ausgabestrom ber Dateien Die Objekte cout cin und cerr sind vordefiniert sobald die Header Datei iostream h in das Programm mit include aufgenommen wird Die Objekte cin cout cerr sind lediglich Default namen Um Objekte oder Zeichenstr me lesen bzw schreiben zu k nnen werden die shift Operatoren lt lt bzw gt gt berladen Diese Operatoren agieren auf den Objekten die den Datenstr men zugeordnet wurden Beispiel float f_wert 1 235 Programm gibt sowohl Double d_wert 1 222 loat double als char name Joern auch strings aus cout lt lt f_wert cout lt lt d_wert cout lt lt name Da der Operator gt gt bzw lt lt als Ergebnis stets eine Referenz auf das stream Objekt selbst zur ckgibt k nnen die Operatoren auch meh
6. Speicherverwaltung mit Zeiger uam genauen 27 Bunklianen nassen a a o r a 29 7 Benutzerdefinierte Datenstrukturen Structs Unions sesssssessseseesseessresseessesesee 31 TA SER De 31 TAis Z griff auf Komponenten entnehmen 34 1 2 Neue Typnamen erzeugen mit typedef u en ennsahn 35 1a OTS E E P E E E E E E EEE 40 8 Literatur zu der Programmiersprache Een eaal 43 Die Programmiersprachen C und C Einf hrung 2 TU Wien Institut E114 Prof DDr F Rattay 92 Klassen und Objekte u ans see ei 44 9 T Beispiel BankKonto users es 44 9 2 Eine Klasse WEFF Er Haie 45 9 3 Bizeugen Von Objekten una Dr Bu 49 9 4 Konstruktoren und Destr kteren u u uan seem en en 51 9 5 Dynamische Objektene an a TE S N E RIES 52 10 Member Funktionen Zugriffsrechte und andere Konstrukte u ee 56 FOT SEriends satellite ne 65 10 2 Referenzen 22H 2s 4 edel na 68 10 3 Konstanten ars ERBEN SEEN 71 11 berladen von Operatoren und Funktionen 74 11 1 berladen von Funktionen ncesnssenssensnnnsensnnnennsenennnnennne 74 11 2 Das berladen von Operatoren uunsseeesseseseneennenenenenenensenenenennnenenennnn 76 12 Streams und File VO 22 220 ae 82 121 Manip laterenssae rn ae u En 82 12 2 Format Funktionen n us nennen ana 83 12 3 Staus Abfragen zusagen en 86 12 4 TVO Operatoren auf eigenen Datentypen u zusessssesssssesssnsensnnennnnnnsnnnennnn 88 12 5 Ein Ausgabe mit Dateien 2 ana
7. class Konto ffentliche Daten und Funktionen public Member Variablen long m_1Kontonummer Methoden Konto long double Konstruktor Konto Destruktor void einzahlen double void abheben double void kontostand_ausgeben Private Daten und Funktionen private double m_dKontostand J endif Zun chst einmal sorgen die beiden Pr prozessor Anweisungen s Kapitel 0 des C Skriptes daf r da die Datei nicht fter als einmal in eine cpp Datei eingebunden werden kann um multiple Deklarationen zu verhindern Wurde die h Datei noch nicht in eine bestimmte cpp Datei eingebunden so wird das Makrolabel _KONTO_H_ definiert Beim n chsten Versuch konto h in die gleiche cpp Datei einzubinden wird die gesamte Klassendeklaration einfach bersprungen da sie komplett zwischen den Pr prozessoranweisungen ifndef und endif steht Solche mehrfachen Einbindungen k nnen in gr eren Softwareprojekte auftreten wenn n mlich Headerdateien in andere Headerdateien eingebunden werden m ssen was man an sich zu vermeiden sollte was aber manchmal nicht zu verhindern ist Als n chstes folgt das Schl sselwort class und schlie lich der Klassenname Konto Klassenbezeichner haben oft auch eigene Pr fixe z B CKonto o wir halten uns in diesem Skript lediglich an die Konvention den ersten Buchstaben eines Klassennamens gro zu schreiben Nach den geschweiften Klammern folgt das
8. eingeleitet wird Es gilt die folgende Syntax if Ausdruck if Zweig F r den Fall da die Auswertung des Ausdrucks O0 ergibt wird der i f Zweig bersprungen und die Programmausf hrung unmittelbar hinter diesem fortgesetzt M chte man einen Block erzeugen der nur ausschlie lich im Fall einer negativen Auswertung des Ausdrucks abgearbeitet wird so steht hierf r die else Anweisung zur verf gung else Anweisung Die else Anweisung kann nach folgender Syntax an einen if Block angeh ngt werden if Ausdruck if Zweig else Die Programmiersprachen C und C Kontrollstrukturen 21 TU Wien Institut E114 Prof DDr F Rattay else Zweig Nat rlich lassen sich nach diesem Muster beliebig viele if else Bl cke aneinander h ngen Man spricht dann von sogenannten else if Ketten Beispiel if AmpelROT BleibStehen else if StrasseWirklichFrei Gehe berDieStrasse else if AutofahrerIstBeiRotGefahren MeckernUndStehenbleiben else NichtMeckernUndStehenbleiben switch Anweisung Die switch Anweisung ist eine besondere Art von Auswahl unter mehreren Alternativen Hier wird untersucht ob ein Ausdruck einen von mehreren konstanten Werten besitzt Ist dies der Fall so wird entsprechend verzweigt Die Syntax hierzu lautet switch Integer case Wertl Statements case Wert2 St
9. end zu implementieren sind Die Programmiersprachen C und C Klassen und Objekte 44 TU Wien Institut E114 Prof DDr F Rattay Zur Veranschaulichung wird im folgenden anhand des einfachen Beispiels eines Bankkontos eine Klasse entworfen Anschlie end werden einige Objekte dieser Klasse erzeugt und manipuliert Der Status des Bankkontos soll vereinfachend durch seine Kontonummer und seinen aktuellen Kontostand beschrieben sein Zus tzlich hat ein Kontoobjekt die F higkeit seinen Kontostand zu ndern d h Geld abzuheben oder einzuzahlen Abgesehen davon mu sich ein Kontoobjekt auf einen definierten Startzustand bringen Konto anlegen und gegebenenfalls auch wieder korrekt l schen k nnen Konto k ndigen Man sieht an dieser Beschreibung bereits da in der objektorientierten Programmierung immer vom Objekt ausgegangen wird dem bestimmte Eigenschaften und F higkeiten zugeschrieben werden In einer fiktiven umgangssprachlichen Klassendeklaration die eine Anzahl von Kontoobjekten beschreibt s he das etwa so aus Objekte der Klasse Konto bestehen aus Statusbeschreibung Kontonummer Lange Ganze Zahl Aktueller Kontostand Reelle Zahl F higkeiten Konto initialisieren Parameter Betrag Reelle Zahl Konto l schen Parameter Geld einzahlen Parameter Betrag Reelle Zahl Geld abheben Parameter Betrag Reelle Zahl Kontonummer ausgeben Parameter Kontonummer Lange Ganze Zahl Ende
10. ersetzt dabei ab jetzt die Ausgabe mit printf Es handelt sich dabei um einen sogenannten Ausgabestream Genaueres zu Streams findet sich in Kapitel 11 dieses Skriptes Die Funktionen in der Kontoklasse sind ansonsten sehr simpel gehalten und sollten verst ndlich sein Im n chsten Bild ist nochmals die Logik und die Syntax der Implementierung von Member Funktionen verdeutlicht Die Programmiersprachen C und C Klassen und Objekte 48 TU Wien Institut E114 Prof DDr F Rattay hier keine konkreten Im Headerfile T ennamen n tig class KLASSENNAME PNAME FUNKTIONSNAME PARAMETERLISTE Im Implementierungsfile R CKGABETYPNAME KLASSENNAME FUNKTIONSNAME PARAMETERLISTE If N Anweisungen die die Funktion realisieren konkrete Variablen namen n tig Ausnahme inline Methoden nur bei kurzen Funktionen sinnvoll R CKGABETYPNAME FUNKTIONSNAME PARAMETERLISTE Anweisungen die die Funktion realisierg i Semikolon in der Klammer Bild Logik und Syntax der Methoden Implementierung Erzeugen von Objekten Neben dem h und cpp Dateienpaar die die Klasse Konto zusammen komplett beschreiben gibt es noch die Datei bank cpp im Projekt Sie enth lt ein einfaches main Hauptprogramm da in C genau wie in C obligatorisch ist Vor Beginn des eigentlichen Hauptprogramms wird auch hier die Datei Konto h eingebunden da im Hauptprogramm Objekte der Klasse Konto erzeugt werden s
11. wie und wann diese bersetzung vonstatten geht er ffnet eine weitere Differenzierungsm glichkeit f r Programmiersprachen Man unterscheidet n mlich sogenannte Compilersprachen von Interpretersprachen Bei Compilersprachen ist der Ablauf w hrend der Programmierung wie folgt Der Programmierer schreibt seinen Programmtext d h die Abfolge der Befehle in der jeweiligen Programmiersprache mit einem sogenannten Editor Dieser Editor kann ein Textverarbeitungsprogramm wie z B Microsoft Word oder aber eine speziell f r diesen Zweck entwickelte Software z B EMACS bei UNIX Systemen sein Das Ergebnis dieses ersten Schrittes ist eine Textdatei die den sogenannten Sourcecode oder deutsch Quellcode enth lt Im n chsten Schritt wird die vom Programmierer erstellte Textdatei mit dem Sourcecode von einem weiteren Programm dem sogenannten Compiler Zeile f r Zeile eingelesen und in Maschinensprache bersetzt W hrend des als Compilierung bezeichneten Prozesses gibt der Compiler Fehlermeldungen Die Programmiersprachen C und C Einf hrung 5 TU Wien Institut E114 Prof DDr F Rattay aus falls der Programmierer syntaktische z B Semikolon fehlt oder semantische Fehler z B das Programm gibt 11 Zeilen Text aus soll aber nur zehn Zeilen ausgeben erzeugt hat Ist ein solcher Fehler aufgetreten so bricht der bersetzungsvorgang mit einer entsprechenden Fehlermeldung ab und der Programmierer begibt sich
12. Designproze d h die Zerlegung des Problemfeldes in Klassen und die Bestimmung der Interaktion der Objekte untereinander stellt dabei die eigentliche Problematik dar Sind diese Schritte sauber durchgef hrt ist die eigentliche Programmierung relativ simpel Die Programmiersprachen C und C Klassen und Objekte 55 TU Wien Institut E114 Prof DDr F Rattay Member Funktionen Zugriffsrechte und andere Konstrukte Im letzten Kapitel sind die Grundkonzepte der objektorientierten Programmierung Klassen und Objekte bereits eingef hrt worden Dieses Kapitel wird sich noch einmal n her mit der Bedeutung von Methoden Member Funktionen und der verschiedenen Zugriffsbeschr nkungen insbesondere im Hinblick auf das Schlagwort Information Hiding besch ftigen Anhand eines einfachen Beispiels wird die M glichkeit erl utert Objekte verschiedener Klassen zu benutzen ohne das man den Aufbau der Datenstrukturen innerhalb eines Objekts kennen mu Zus tzlich wird das Konzept der friends vorgestellt mit dem einige Zugriffseneinschr nkungen gezielt wieder aufgehoben werden k nnen Au erdem werden die beiden C Konstrukte Referenzen und Konstanten vorgestellt die es in dieser Form in reinem C nicht gibt Member Funktionen zum Zugriff auf Attribute Der normale Weg in C um von au en auf ein Attribut eines Objekts zuzugreifen ist der da man eine oder mehrere Methoden definiert die den Wert des Attributs lesen bzw schreiben
13. KBRUCH H inline static int min int a int b Hilfsfunktion return a lt b a b KBruch KBruch int z 0 int n 1 Bruch z n kuerzbar ggt gt 1 unsigned KBruch ggt const Ermittelt den gr ten gemeinsammen Teiler Die Programmiersprachen C und C Vererbung 94 TU Wien Institut E114 Prof DDr F Rattay unsigned teiler min abs zaehler nenner while zaehler teiler 0 nenner teiler 0 teiler return teiler bool KBruch istkuerzbar const return kuerzbar void KBruch kuerzen Der Bruch wird gek rzt wenn er k rzbar ist if kuerzbar falls kuerzbar int teiler ggt zaehler teiler teilen nenner teiler kuarzbar false nicht mehr kuerzbar Zun chst mu die Header Datei der Basisklasse eingebunden werden da die Deklaration der abgeleiteten Klasse darauf aufbaut include BRUCH H Entscheidend f r die Tatsache da es sich um eine abgeleitete Klasse handelt ist dann die eigentliche Klassendeklaration class KBruch public Bruch 3 Eine abgeleitete Klasse wird dadurch deklariert da ihre Basisklasse hinter einem Doppelpunkt und einem optionalen Zugriffsschl sselwort angegeben wird Dabei spielt es keine Rolle ob die Basisklasse selbt eine abgeleitete Klasse ist Das optionale Zugriffschl sselwort gibt an ob und inwiefern der Zugriff auf geerbte Komponenten weiter eingeschr
14. Mehrdeutigkeiten aufzul sen Grunds tzlich sollten diese aber durch den Programmierer vermieden werden Ein Destruktor darf nicht berladen werden Das berladen von Operatoren Neben Funktionen lassen sich in C auch Operatoren berladen Unter Operatoren werden folgende un ren und bin ren Funktionen bzw Relationen verstanden x A amp I lt gt l lt lt gt gt lt lt gt gt l lt gt amp amp I 0 new delete gt Erkl rung Addition Subtraktion Multiplikation Division Modulo N bitweise XOR bitweise OR bitweise NOT Zuweisungsoperator lt Kleiner als gt Gr er als Zuweisung Zuweisung r Zuweisung Zuweisung Zuweisung lt lt Bitverschiebung gt gt Bitverschiebung lt lt Zuweisung gt gt Zuweisung logisches Gleich l logisches Ungleich lt logisches Kleiner Gleich gt logisches Gr er Gleich amp amp logisches UND N logisches ODER Inkrement 1 Dekrement 1 Array Index 0 Funktionsaufruf Typkonstruktion Die Programmiersprachen C und C berladen von Operatoren und Funktionen 76 TU Wien Institut E114 Prof DDr F Rattay gt Auswahloperator new delete dynamische Speicherverwaltung Der Operator lt lt ist in C bereits standardm ig berladen Er hat mindestens die folgenden beiden Bedeutungen a cout lt lt Test Ausgabe eines String auf den Bildschirm D
15. N heres zu diesem Vorgehen s u und in folgendem Bild 0 2 Die Programmiersprachen C und C Benutzerdefinierte Datenstrukturen Structs Unions 34 TU Wien Institut E114 Prof DDr F Rattay Deklaration Point3D float y struct Point3D a Init a Definition als einfache Variable a number struct Point3D a a mallocl sizeofa Init a Definition als Zeiger auf ein struct a gt number Bild 0 2 Zugriff auf die Komponenten eines structs Neue Typnamen erzeugen mit typedef Mit Hilfe von Strukturen ist es z B auch m glich mehr als einen Funktionswert aus einer Funktion zur ckzugeben indem man alle einfachen Werte die man zur ckgeben m chte in einem struct zusammenfa t und dieses dann als einzigen Wert aus der Funktion zur ckgibt Das setzt nat rlich voraus da die Funktion den R ckgabetyp der Struktur besitzt Um einen solchen Typen zu erzeugen benutzt man das Schl sselwort typedef vor einer struct Definition wie im folgenden Beispiel Header Datei mit Deklaration des structs typedef struct int x int y Ret_stru Hauptprogramm zum Testen include stdlib h include ret_stru h Die Programmiersprachen C und C Benutzerdefinierte Datenstrukturen Structs Unions 35 TU Wien Institut E114 Prof DDr F Rattay Funktionsdeklaration Ret_stru test Hauptprogramm main Ret_stru main_value Anlegen einer Variable
16. Rattay Programmier Compiler C Hauptanwendungsbereich Besonderheiten sprache Interpreter I BASIC Einsteigersprache inzwischen Einfach zu lernen auch oft zur GUI Programmierung Inzwischen aber trotzdem verwendet sehr m chtig C C C sehr selten I Vielseitig verwendbar auch Erlaubt sehr kompakte maschinennahe und effiziente Systemprogrammierung Programmierung Grafikprogrammierung verbunden mit hohen Abstraktions m glichkeiten COBOL Kaufm nnische Programme Sehr schwerf llig Sourcecode fast wie Umgangssprache Maschinennahe Programmierung Kryptische Befehle extrem flexibel und erweiterbar FORTRAN CI Numerische Problemstellungen Eingeschr nkter en Sprachumfang lteste Hochsprache LISP I K nstliche Intelligenz V llig andere Konzepte als bei herk mmlichen Objektorientiert SMALLTALK C Objektorientierte Programmierung Strenge De BE a SQL I und C Spezialsprache zur Weite Verbreitung viele Die verwendete IDE Im Rahmen dieser Veranstaltung wird eine Entwicklungsumgebung d h ein integriertes Paket aus Editor Compiler Linker und Debugger der Firma Borland verwendet Diese Borland C 3 0 genannte IDE ist kompatibel mit dem als Public Domain freie Software verf gbarem System DJGPP Von letzterem stammen die Bildschirmkopien die im folgenden die einzelnen Bedienschritte illustrieren sollen Die grunds tzliche Bedienung der IDE wird anhand des oben skizzierten Beispiels d h der Ausgabe von z
17. Reihe PC Professionell beide Hrsg Carl Hanser Verlag M nchen Wien 1983 9 Precht M EDV Grundwissen Eine Einf hrung in Theorie und Meier N Kleinlein J Praxis der modernen EDV 4 Auflage Addison Wesley Longmann Bonn 1997 Die Programmiersprachen C und C Literatur zu der Programmiersprache C 43 TU Wien Institut E114 Prof DDr F Rattay Klassen und Objekte Zu Beginn des C Teils des Skriptes wird dieses Kapitel die beiden zentralen Elemente von C Klassen und Objekte einf hren Sie stellen gleichsam die wesentlichste Erweiterung der Sprache C dar um Objektorientierung zu erm glichen Es ist von gro er Wichtigkeit f r das weitere Verst ndnis gleich zu Beginn die beiden Begriffe sauber zu definieren und abzugrenzen so da zun chst eine abstrakte allgemeine Beschreibung erfolgt bevor im Anschlu daran die programmtechnische Umsetzung beschrieben wird Eine Klasse stellt die Beschreibung eines abstrakten Datentypen dar d h sie erm glicht die Definition benutzerdefinierter Datentypen ebenso wie die Erweiterung bereits vorhandener Ein Objekt ist eine konkrete zur Laufzeit des Programms definierte Variable eines solchen abstrakten Datentyps Analog dazu kann eine Variable vom Typ int als Objekt der Klasse int betrachtet werden und eine solche Variable ist in C auch nichts anderes Dieser Zusammenhang ist von zentraler Bedeutung f r das Verst ndnis von C und anderen objektorientierten Programmier
18. auch in anderen Bereichen im Programm verwendet werden sollen Man beachte da der Definition der Variablen unbedingt das Schl sselwort st ruct voranzustellen ist da der Compiler sonst eine Fehlermeldung ausgibt Ausnahme Definition mittypedef s u include stdlib h include point3d h main float in Variable zur Eingabe der Koordinaten EL struct Point3D a b elrscr Bildschirm l schen printf Bitte die x Koordinate des 1 Punktes eingeben n Die Programmiersprachen C und C Benutzerdefinierte Datenstrukturen Structs Unions 32 TU Wien Institut E114 Prof DDr F Rattay scanf f amp in a x in printf Bitte die y Koordinate des 1 Punktes eingeben n scanf f amp in a y in printf Bitte die z Koordinate des 1 Punktes eingeben n scanf f amp in a z in a number 1 printf Bitte die x Koordinate des 2 Punktes eingeben n scanf f sin b x in printf Bitte die y Koordinate des 2 Punktes eingeben n scanf f sin b y in printf Bitte die z Koordinate des 2 Punktes eingeben n scanf f sin b z in b number 2 printf Summe der x Komponenten f n a xtb x printf Summe der y Komponenten f n a ytb y printf Summe der z Komponenten f n a z tb z exit 0 Man kann das struct auch direkt im Hauptprogramm deklarieren und Variablen von ihm erzeugen Dann mu
19. auf ein struct a gt number Bild 0 4 Aufbau einer linearen Liste mit f nf Elementen Dann wird der aktuelle Zeiger der jetzt auf dem letzten Listenelement steht wieder auf das erste zur ckgesetzt und der Durchlauf der Liste zur Ausgabe auf dem Bildschirm beginnt vgl folgenden Sourcecode include stdlib h include list_ele h Hauptprogramm main Inte 5 List_element first NULL Zeiger auf den Start der Liste List_element actual NULL Zeiger auf das aktuelle Listenelement 1 Listenelement erzeugen und Zeiger Initialisieren Die Programmiersprachen C und C Benutzerdefinierte Datenstrukturen Structs Unions 38 TU Wien Institut E114 Prof DDr F Rattay first List_element malloc sizeof List_element first gt entry 0 first gt next NULL actual first 4 weitere Listenelement rzeugen und hinten an die Liste h ngen for i 1 i lt 4 i actual gt next List_element malloc sizeof List_element actual actual gt next actual gt entry i actual gt next NULL actual first Zeiger wieder auf Anfang Liste komplett ausgeben do printf Listeneintrag d n actual gt entry actual actual gt next while actual NULL exit 0 Im Zusammenhang mit der oben erw hnten rekursiven Deklarationsweise ist die Dekla
20. die in der k nstlichen Intelligenz verbreitete Sprache LISP eine interpretierte Sprache Bei einem interpretierten Programm findet der oben beschriebene 2 Schritt synchron zur Programmausf hrung statt D h jede Anweisung wird erst dann in Maschinensprache bersetzt wenn das Programm bereits l uft Tritt ein Fehler auf so h lt die Programmausf hrung an und der Quellcode kann direkt verbessert werden Im allgemeinen wird ein solches Vorgehen als benutzerfreundlicher empfunden wobei es allerdings einige Einschr nkungen gibt Der durch Interpretation erzeugte Maschinencode ist meist ineffizienter als compilierter Code Au erdem sind leistungsf hige Sprachkonstrukte wie etwa objektorientierte Datenstrukturen s a C Teil dieses Skriptes entweder gar nicht oder nur sehr aufwendig zu bersetzen Durch den Einsatz von IDEs schwinden zunehmend die f r den Programmierer sichtbaren Unterschiede zwischen Compiler und Interpreter Insbesondere bei IDEs zur visuellen Programmierung z B Borland Delphi M werden auch hybride Verfahren eingesetzt 4 bersicht ber einige Programmiersprachen Im folgenden soll eine kurze bersicht ohne jeden Anspruch auf Vollst ndigkeit ber einige g ngige Programmiersprachen gegeben werden wobei die oben vorgestellten Unterschiede zur Geltung kommen Tabelle 1 Einige Programmiersprachen und ihre Eigenschaften Die Programmiersprachen C und C Einf hrung 7 TU Wien Institut E114 Prof DDr F
21. durchf hren Bild 0 7 Make Die Programmiersprachen C und C Einf hrung 10 TU Wien Institut E114 Prof DDr F Rattay Der Link Vorgang ist durch Auswahl des Make Befehls aus der Men leiste nicht mehr als eigenst ndiger Schritt zu erkennen er wird bei fehlerfreier Compilierung automatisch ausgef hrt und erzeugt das lauff hige Programm W hlt man statt des Make Befehls den Compile Befehl ALT F9 so wird lediglich der Sourcecode des aktuellen Fensters bersetzt aber kein Linking durchgef hrt und es werden auch keine evtl vorhandenen anderen Sourcefiles compiliert An dieser Stelle machen sich bereits die Vorteile einer IDE bemerkbar Es werden n mlich nur solche Sourcefiles neu bersetzt die vom Programmierer auch ver ndert worden sind und nicht etwa alle Sourcefiles in einem Projekt Ein solches Vorgehen mu bei autonomen Kommandozeilenprogrammen m hsam vom Programmierer initiiert und kontrolliert werden Zur Verdeutlichung des bersetzungsvorgangs sind die wesentlichen Schritte in den folgenden Screenshots festgehalten Bild 0 8 Debugging Ausf hren und Debugging des Programms An dieser Stelle ist ein ausf hrbares Programm von der IDE erstellt worden Dieses Programm kann man nun starten indem man den Run Befehl aus der Men leiste anw hlt Beim Start des Programms wechselt der Bildschirm auf den Ausgabebildschirm und man sieht das Ergebnis des Programms n mlich zehn Zeilen mit
22. e den Speicherbedarf und den Platz die Speicheradresse an der die Variable im Speicher abgelegt ist kennen Das Problem dabei ist da durch die Deklaration Umfang und Struktur der Daten fix vorgegeben sind Damit m ssen bereits zum Zeitpunkt der Programmerstellung alle Angaben bez glich Gr e und Art der zu verwaltenden Daten festgelegt werden In der Praxis ist aber im Vorhinein oft nicht bekannt wie gro die zu bearbeitende Datenmenge ist bzw es ist Flexibilit t hinsichtlich der Datenhaltung gew nscht Eine M glichkeit diese Einschr nkung zu umgehen ist es Variablen ber ihre Adresse im Speicher zu verwalten Dazu werden sogenannte Zeiger verwendet Unter einem Zeiger versteht man eine Variable die als Wert die Speicheradresse einer anderen Variable enth lt man sagt Sie zeigt auf eine andere Variable Zeiger werden in C sehr h ufig benutzt da sie manchmal die einzige M glichkeit darstellen eine Berechnung auszudr cken und normalerweise mit Hilfe von Zeigern kompakter und effizienter programmiert werden kann Zeiger und Adressen Da ein Zeiger die Adresse eines Objektes enth lt kann man ber den Zeiger auf indirektem Wege auf das Objekt zugreifen Dies l t sich am einfachsten anhand eines Beispiels erl utern Nehmen wir an x und y seien Variablen beispielsweise vom Typ int und p_x ein Zeiger der auf eine noch nicht n her angegebene Art und Weise definiert wurde Die Anweisung P_xX amp X weist dem Zei
23. einzelnen Klassen bereits bin r bersetzt geliefert werden Dadurch ist es nicht notwendig da der Anwender die Interna der Bibliothek kennt sie aber trotzdem benutzen kann Ein bekanntes Beispiel f r eine solche Klassenbibliothek sind die Microsoft Foundation Classes kurz MFC die dem Programmierer eine umfangreiche und benutzerfreundliche Klassensammlung zur Programmierung von Windows Applikationen zur Verf gung stellen Bei unserem Programm wird jetzt der Quelltext der neuen Implementierung der Klasse Rec angegeben Man beachte da nur das Rec cpp File und das Rec h File ausgetauscht werden m ssen das Hauptrogramm bleibt exakt so wie es ist Die Implementierung ndert sich aber die Schnittstelle bleibt die gleiche Hier nun der modifizierte Quelltext zun chst das Headerfile mit der Klassendeklaration ifndef _REC_H_ define _REC_H_ class Rec Methoden hier aendert sich nichts public Konstruktion Rec Rec const double amp const double amp const double amp const double amp Ausgabe auf Bildschirm void printCoordinates void printPlaneContent void setCoordinates const double amp const double amp const double amp const double amp private 2 Implementierung der Attribute Untere linke Ecke wird gespeichert wie bisher double m_dLowerLeftX m_dLowerLeftY Neu jetzt wird auch die Obere linke Ecke gespeichert double m_dUpperlLef
24. erl utert Bruch h und Bruch cpp Dateiname Bruch h ifndef _Bruch_h define _Bruch_h include lt stdlib h gt include lt iostream h gt Klasse Bruch class Bruch protected Schl sselwort Erkl rung in Abschnitt Vererbung int zaehler int nenner public Schl sselwort Erkl rung in Abschnitt Vererbung Bruch Default Konstruktor Bruch int Konstruktor aus Zaehler Bruch int int Konstruktor aus Zaehler u Nenner Bruch Destruktor void Ausgabe Ausgabefunktion Bruch operator Bruch Multiplikation mit anderem Bruch Bruch operator int Multiplikation mit einer ganzen Zahl int Die Programmiersprachen C und C berladen von Operatoren und Funktionen 78 TU Wien Institut E114 endif _Bruch_h Dateiname Bruch cpp include BRUCH H Bruch Bruch zaehler initialisieren 0 1 nenner Bruch Bruch int z Konstruktor mit zaehler initialisieren Z nenner 1 Bruch Bruch int zZ amp Nenner Default Konstruktor Prof DDr F Rattay z hler int n Konstruktor mit Z hler lt lt endl if n 0 cerr lt lt Fehler Nenner ist 0 exit 1 hi zaehler z initialisieren nenner n Bruch Bruch Die Programmiersprachen C und C berladen von Operatoren und Funkti
25. k nnen Das folgende Beispiel zeigt dieses Vorgehen anhand des Beispiels einer Klasse f r die rechnerinterne Darstellung von Rechtecken Dabei werden nacheinander zwei verschiedene Klassen entworfen die jeweils Rechteckobjekte beschreiben Die interne Darstellung der Koordinaten ist dabei unterschiedlich der Benutzer hier die main Funktion merkt gar nicht da sich die interne Darstellung ge ndert hat Man kann die Klassen einfach austauschen denn solange sich die Zugriffsfunktionen d h das Interface der Klasse nicht ver ndern ist es nicht n tig das Hauptprogramm zu anzupassen Hier nun die Klassendeklaration und Implementierung sowie das zugeh rige Hauptprogramm zum Test Die Deklaration der Klasse Rec ifndef _REC_H_ define _REC_H_ class Rec Methoden public Konstruktion Rec Rec const double amp const double amp const double amp const double amp Ausgabe auf Bildschirm void printCoordinates void printPlaneContent void setCoordinates const double amp const double amp const double amp const double amp private Die Programmiersprachen C und C Member Funktionen Zugriffsrechte und andere Konstrukte 56 TU Wien Institut E114 Prof DDr F Rattay 1 Implementierung der Attribute nur untere linke und obere rechte Ecke werden gespeichert double m_dLowerLeftX m_dLowerLeftY double m_dUpperRightX m_dUpperRightY e
26. oder es Pointer auf andere Objekte enth lt In diesen F llen mu der belegte Speicher von Hand beim L schen des Objekts wieder freigegeben werden Der Zusammenhang von Konstruktoren und Destruktoren mit der Erzeugung und Vernichtung von Objekten ist n chsten Bild dargestellt Die Programmiersprachen C und C Klassen und Objekte 51 TU Wien Institut E114 Prof DDr F Rattay M gliche F lle der Objekterzeugung Statisch ee ie en re PAS ai rn KLASSENNAMEfOBJEKTVARIABLE PARAMETER F R KONSTRUKTOR Dynamisch Kt e oo KLASSENNAME OBJEKTPOINTERVARIABLE _ __ FINDER ARENE E OBJEKTPOINTERVARIABLE new KLASSENNAME PARAMETER F R KONSTRUKTOR E EE A e ai Aufruf des Konstruktors KLASSENNAME AKTUELLE PARAMETER 4 Initialisierungsanweisungen Bild Zusammenhang von Konstruktoren und Destruktoren mit der Erzeugung und Vernichtung von Objekten Im Gegensatz zum Destruktor ist der Konstruktor in unserem Beispiel auch implementiert Selbst wenn man keine der beiden Funktionen bei der Deklaration angibt so werden sie trotzdem aufgerufen und ausgef hrt auch wenn der Programmierer das dann nicht erkennen kann Ein Konstruktor erf llt den Zweck beim Erzeugen eines Objekts bestimmte Member Variablen auf einen definierten Startwert zu setzen H ufig wird z B f r int Variablen der Wert 0 angesetzt oder aber es wird ein Startwert explizit bergeben was im Konto Beispiel der Fall ist Unser Kons
27. so mu te man bislang einen Pointer auf die entsprechende Variable bergeben In C ist es aber auch m glich eine Referenz auf ein Objekt anzulegen und dann diese Referenz zu bergeben Eine Referenz stellt dabei nichts weiter dar als einen neuen Namen f r ein bereits deklariertes Objekt Das folgende Bild und der anschlie ende Sourcecode zeigen einige Beispiele f r die Benutzung von Referenzen Die Programmiersprachen C und C Member Funktionen Zugriffsrechte und andere Konstrukte 68 TU Wien Institut E114 Prof DDr F Rattay TYPNAME VARIABLENNAME REFERENZZEICHEN INITIALISIERUNG inta 7 int b 13 int amp r a Bild Definition und Benutzung von Referenzen Hauptprogramm zur Definition von Referenzen tinclude iostream n include conio h Funktionsdeklaration void testFuncl int void testFunc2 int amp int main int apc Normale Integer Variable int amp b a b als Referenz zweiter Name auf a Bildschirm loeschen celrscr Die Programmiersprachen C und C Member Funktionen Zugriffsrechte und andere Konstrukte 69 TU Wien Institut E114 Prof DDr F Rattay Initialisierung a 95 a bekommt den Wert 5 b 10 b bekommt neuen Wert gleichzeitig auch a c 15 cout lt lt Wert von a lt lt a lt lt Wert von b lt lt b lt lt Mips Aufruf bei normaler Variablenuebergabe a
28. vom Compiler Hersteller mitgelieferten Funktionsbibliotheken Da C an sich nur einen sehr begrenzten Sprachumfang hat siehe Schl sselw rter ist ein reger Zugriff auf solche Bibliotheken notwendig Die main Funktion besteht wie jede Funktion aus dem Funktionskopf in dem die bergabeparameter und der R ckgabewert definiert werden und dem Funktionsblock der von geschweiften Klammern begrenzt wird Ein Block ist eine Ansammlung von Anweisungen die durch die Klammerung quasi zu einer Anweisung zusammengefa t werden Das unten stehende Beispiel zeigt den prinzipiellen Aufbau eines einfachen C Programms Wie beim ersten Programm einer neu zu erlernenden Programmiersprache blich gibt dieses Programm den Text hello world auf dem Bildschirm aus Hierzu wird die Funktion print f ben tigt die in einer Standard Funktionsbibliothek definiert und in der Header Datei stdio h deklariert ist Daher mu diese Header Datei mittels include Anweisung eingebunden werden um die Funktion print f im Programm bekannt zu machen und verwenden zu k nnen Diese Funktion gibt den in Klammern angegebenen Text auf dem Bildschirm aus Die Zeichenkombination n ist ein sogenanntes Steuerzeichen das daf r sorgt da der n chste auszugebende Text in der n chsten Zeile am Zeilenanfang erscheint wie wenn man in einem Texteditor die Eingabe Taste bet tigt include lt stdio h gt main printf hello world n Die Programmiersprachen C und C Grun
29. werden Auch an dieser Stelle sei wieder auf weiterf hrende Literatur verwiesen z B 10 Konstanten Als letzter Teil in diesem Kapitel wird im folgenden das bereits verwendete C Sprachkonstrukt const erl utert const erlaubt die Deklaration und Definition von konstanten Objekten also von Objekten denen au er bei ihrer Initialiserung im weiteren Programmverlauf keine neuen Werte zugewiesen werden k nnen Ein solches Objekt bleibt im Verlauf seiner Lebensdauer konstant In C wurde dieses Verhalten durch die Verwendung des Pr prozessor Statements define erreicht Da dieses Statement jedoch eine reine Textersetzung durchf hrt bietet es keine M glichkeit f r Typpr fungen Au erdem kann man sich Werte die mit de fine definiert wurden nicht im Debugger ansehen was die Fehlersuche oft erschwert Das n chste Beispielprogramm und das n chste Bild zeigen die Deklaration und einige Anwendungen f r konstante Variablen Selbstverst ndlich lassen sich auch selbstdefinierte Objekte als konstant deklarieren wie das Beispiel der Objektvariable d zeigt Die Programmiersprachen C und C Member Funktionen Zugriffsrechte und andere Konstrukte 71 TU Wien Institut E114 Prof DDr F Rattay ARIABLENNAME WERT INITIALISIERUNG const TYPNAME const inta 7 int b 13 Eai a b Fehler einer Konstanten darf man nichts zuweisen Fehler EPO r Bild Verhalten von Variablen die als konstant deklarie
30. BEN H int main Bild 0 1 Einbinden von selbst deklarierten Funktionen Die Programmiersprachen C und C Funktionen Datei MAIN_N C char IpctstrString 30 Dies ist ein Teststring n return Stringausgeben IpctstrString 15 Prof DDr F Rattay 30 TU Wien Institut E114 Prof DDr F Rattay Benutzerdefinierte Datenstrukturen Structs Unions In diesem Kapitel geht es haupts chlich umkomplexere Datenstrukturen die im Gegensatz zu den in Kapitel 0 behandelten einfachen Datentypen dazu in der Lage sind auch umfangreichere Datenansammlungen unter einem Bezeichner abzuspeichern und den Zugriff auf einzelne Teile dieser Daten zu erm glichen Die beiden wesentlichen komplexeren Datenstrukturen die C bietet sind struct und union Structs Ein struct ist die Zusammenfassung mehrerer einzelner Variablen zu einem Verbund der sp ter unter einem Namen angesprochen werden kann Im folgenden wird ein einfaches Beispiel f r die Deklaration eines structs vorgestellt das die drei Koordinaten eines dreidimensionalen Punktes enthalten soll wie er etwa im CAD Bereich oft ben tigt wird struct Point3D float x float y float z long number Man sieht an diesem Beispiel da die Struktur Point3D dazu dient drei gleichartige Variablen vom Typ double aufzunehmen wobei jede Koordinate x y und z durch je eine Variable beschrieben wird Zus tzlich enth lt die Struktur in diese
31. C Schl sselwort public Dieses Schl sselwort gibt an da die folgenden Deklarationen ffentlich d h von au erhalb der Klasse aus zugreifbar sind N heres zu den einzelnen Sicherheitsstufen folgt im n chsten Kapitel In der n chsten Zeile wird die ffentliche Member Variable m_lKontonummer deklariert und im Anschlu daran die Methoden die ebenfalls public sind Schlie lich gibt es noch einen private Teil in dieser Klassendeklaration in dem die nicht ffentliche Member Variable m_dKontostand deklariert wird Damit ist die Deklaration der Klasse Konto zun chst einmal abgeschlossen und die h Datei die sogenannte ffentliche Schnittstelle oder auch das Interface der Klasse Dieser Teil der Klasse ist im Prinzip das einzige was ein Benutzer ber diese Klasse an Informationen zur Verf gung haben mu um mit ihr zu arbeiten Alle anderen Informationen wie etwa die Datentypen f r Kontonummer und Betrag sollen intern in der Implementierung versteckt bleiben s a n chstes Kapitel Man beachte au erdem da die h Datei nicht in das Projekt eingef gt werden darf da sie ber include eingebunden wird Die Programmiersprachen C und C Klassen und Objekte 46 TU Wien Institut E114 Prof DDr F Rattay Syntax einer Klassendeklaration class NAME public optional Attribute TYPNAME MEMBERVARIABLE Methoden RUCKGABETYP FUNKTIONSNAME PARAMETERLISTE private optional Attr
32. Klasse A als friend D h da A auf private Elemente von B zugreifen darf und damit den Schutz von privaten Datenstrukturen die Kapselung umgehen darf Das wird in der Methode SumAPlusB ausgenutzt die als Parameter ein Objekt der Klasse B erwartet In der Methode wird dann direkt auf die Member Variable m_iWert des Objekts zugegriffen obwohl sie private deklariert wurde Allgemein ist zu beachten da eine Klasse nur von sich aus andere Klassen zu friends erkl ren und damit den Zugriff auf ihre internen Strukturen erlauben kann Der umgekehrte Weg n mlich da eine Klasse sich als friend einer anderen erkl rt ist nicht m glich Es ist au erdem m glich auch einzelne Methoden zu friends zu erkl ren an dieser Stelle sei aber auf weiterf hrende Literatur verwiesen wie etwa 10 Referenzen In den gerade vorgestellten Beispielen taucht immer wieder das Zeichen amp auf das man als Referenzoperator bezeichnet In reinem C besitzt dieses Konstrukt eine andere Bedeutung Adressoperator w hrend es in C dazu benutzt wird um Kopien von Variablennamen zu erzeugen Wie bereits in Kapitel 0 des C Kurses erl utert wurde wird bei der bergabe einer Variable an eine Funktion immer nur eine Kopie innerhalb der Funktion angelegt Ver ndert man also diese Kopie so ndert sich der Variablenwert au erhalb der Funktion berhaupt nicht M chte man einen Parameterwert innerhalb einer Funktion oder Methode manipulieren
33. TU Wien Institut E114 Prof DDr F Rattay TU Wien Institut E114 Prof DDr F Rattay Computersimulation f r Elektrotechniker Die Programmiersprachen C und C Die Programmiersprachen C und C Einf hrung 1 TU Wien Institut E114 Prof DDr F Rattay 1 Einf hren e A a TE A 4 1 1 Hochsprachen und maschinennahe Sprachen sssessesssesesesessseesseesseesseessees 4 1 2 Spezialisierung bestimmter Programmiersprachen ursersneenneennenner nen 5 1 3 bersicht ber einige Programmiersprachen eeeennenen 7 1 4 Die verwendete IDE essen 8 1 4 1 Starten der IDE und Anlegen eines Projektes 8 124 2 Bineabe des Quelltextes rer 10 1 4 3 bersetzen und Linken a usc lee ed 10 1 4 4 Ausf hren und Debugging des Programms 2u22sussneennennnen 11 2 Grundbegriffe und Sprachstrukturen 22200sssssssnsesssnnensennennnnnennnnnnennnnnnnnnn 14 2 1 BEZeICHNEr seele ee 14 2 2 29ChlUsselW rler uses nie ikien Rh Ebbe le 14 2 3 Aufbau eines C Programms an aeinnunksaesuckehissunhn 15 2 4 Einbinden von Header Dateien r000000000020000s000nnssssnnssnnnnssnennessennennsnnennnn 15 23 Die Funktion man sasea een 15 3 Variablen Einfache Datentypen wuuussuuusununsesnsesuntssunsnnlantee 17 3A Varlablemnamen anne nern 17 3 2 Datentypen eena a R A E A A SS 18 ZR Deklaration na SEIEN 19 42 Kontrollstenkluren ae a a a ehe 21 942 AED ee re 26 5 1
34. UpperRightX urx m_dUpperRightY ury Neu Initialisierung der neuen Eckpunkte m_dUpperLeftx 11x m_dUpperlLeftY ury m_dLowerRightX urx m_dLowerRightY 11y Ausgabe des Flaecheninhalts auf dem Bildschirm void Rec printPlaneContent double el e2 pc Neu Berechnung des Flaecheninhalts durch Berechnung der Kantenlaengen und anschliessender Multiplikation el m_dLowerRightX m_dLowerLeftX e2 m_dUpperLeftY m_dLowerLeftY pc el e2 cout lt lt Flaecheninhalt des Rechtecks lt lt pc lt lt Nina return Ausgabe der Koordinaten des Rechtecks auf dem Bildschirm void Rec printCoordinates Die Programmiersprachen C und C Member Funktionen Zugriffsrechte und andere Konstrukte 63 TU Wien Institut E114 Prof DDr F Rattay Neu Fuer jede Ausgabe wird jetzt eigene Member Variable benutzt cout lt lt Untere linke Ecke X lt lt m_dLowerLeftX lt lt Untere linke Ecke Y lt lt m_dLowerLeftY lt lt n cout lt lt Untere rechte Ecke X lt lt m_dLowerRightX lt lt Untere rechte Ecke Y lt lt m_dLowerRightY lt lt AR cout lt lt Obere rechte Ecke X lt lt m_dUpperRightX lt lt Obere rechte Ecke Y lt lt m dUpperRightY lt lt Ant cout lt lt Obere linke Ecke X lt lt m_dUpperLeftX lt lt Obere linke Ecke Y lt lt m_dUppe
35. W hrend des schrittweisen Weitergehens ist es m glich bestimmte Werte in einem separaten Fenster zu betrachten was an dieser Stelle ebenfalls wieder f r die Variable i unter Benutzung des Watch Befehls aus dem Men Debug erfolgen soll Bild 0 11 Variablen watching 1 Die Programmiersprachen C und C Einf hrung 12 TU Wien Institut E114 Prof DDr F Rattay Bild 0 12 Variablen watching 2 Bild 0 13 Ausf hrungszeile Damit hat man die grundlegenden Schritte vom Editieren bis zum Testen eines neu zu entwickelnden Programmes zun chst einmal durchgef hrt Die Vorgehensweise unterscheidet sich auch bei anderen C C IDEs z B Microsoft Visual C 2 im Prinzip nicht von dem hier skizzierten Nat rlich kann und soll ein solches Skript wie das hier vorliegende keine ersch pfende Bedienungsanleitung darstellen sondern vielmehr Konzepte vermitteln die als Grundlage zur C Programmierung verstanden werden m ssen F r weitergehende Informationen sei zum einen auf die Online Hilfen der im Skript vorgestellten IDEs verwiesen und zum anderen auf weiterf hrende Literatur wie z B 5 und 6 Zur Programmiersprache C sind die Werke 7 und 8 empfehlenswert wobei es nat rlich noch eine gro e Menge anderer lesenswerter Literatur gerade zu diesem Thema gibt Grunds tzliche Dinge zum Rechneraufbau und zur Rechnerbenutzung sind in 9 zu finden Die Programmiersprachen C und C Einf
36. anismen f r selbstdefinierte Objekte geschaffen werden k nnen Hierzu werden typischerweise die Operatoren gt gt bzw lt lt berladen und auf eigene Objekte angewendet Vorsicht Da der linke Operand immer der Stream ist k nnen lt lt bzw gt gt nicht als Memberfunktionen deklariert werden Sollen diese auf private Elemente des rechten Operanden zugreifen m ssen sie als friend deklariert werden Im folgenden soll ein l ngeres Beispiel zur Verwendung von streams vorgestellt werden Hierbei sollen Konten mit Kontonummer und Inhabername eingerichtet beschrieben und ausgelesen werden Beispiel Headerfile Konto h class Konto public int KontoNo int Betrag int Merke_KontoNo int Nummer int Schreibe_KontoNo int Merke_Betrag int amount int Schreibe_Betrag Realisierung Konto c include lt iostream h gt include lt Konto h gt int Konto Merke_KontoNo int Nummer KontoNo Nummer return 1 int Konto Schreibe_KontoNo cout lt lt KontoNo lt lt endl return 1 Die Programmiersprachen C und C Streams und File I O 88 TU Wien Institut E114 int Konto Merke_Betrag int amount Betrag amount return 1 int Konto Schreibe_Betraqg cout lt lt Betrag lt lt endl return 1 Anwendung main c include lt iostream h gt include lt Konto h gt int main Deklaration
37. ar ne 90 1 Vererbung 2 na u Nails 93 14 Literatur zur Programmiersprache CHH 2 2 2 22 ea 97 Die Programmiersprachen C und C Einf hrung 3 TU Wien Institut E114 Prof DDr F Rattay Einf hrung Um dem Leser einen berblick ber verschiedene Programmiersprachen Konzepte und Entwicklungsumgebungen zu geben sollen im folgenden die wesentlichen Eigenschaften der in diesem Skript behandelten Programmiersprache C im Vergleich zu anderen Sprachen dargestellt werden Hochsprachen und maschinennahe Sprachen Prinzipiell benutzt man Programmiersprachen um dem Computer eine genaue Beschreibung einer von ihm zu erledigenden Aufgabe zu geben Da man diese Beschreibung nicht einfach umgangssprachlich formulieren kann ist eine Kommunikationsmethode erforderlich die sowohl vom Rechner als auch vom Menschen verstanden wird Von entscheidender Bedeutung ist die Frage wie weit der Programmierer sich an den Rechner ann hern mu um eine Programm entwerfen zu k nnen bzw wie weit ihm der Rechner oder besser gesagt die verwendete Programmiersprache entgegenkommt Man spricht in diesem Zusammenhang von sogenannten Hochsprachen die dem Programmierer ein relativ hohes Abstraktionsniveau bieten und im Gegensatz dazu von Assembler oder Maschinensprachen Um ein Programm in Assembler zu programmieren sind genaueste Kenntnisse ber den internen Aufbau des Rechners notwendig Der Programmierer mu z B wis
38. ass struct union typedef auto extern register static mutable const volatile if while else case switch default do for break continue return goto const_cast dynamic_cast reinterpret_cast static_cast typeid typename namespace using new delete sizeof operator this friend private public protected inline virtual explicit template catch throw try asm Neben diesen Standard Schl sselw rtern existieren noch andere reservierte W rter die alternativ zu den Symbolen f r Operatoren Operator Symbole verwendet werden k nnen Aufbau eines C Programms Ein C Programm gliedert sich in aller Regel in folgende Bereiche auf Pr prozessor Anweisungen zum Einf gen von Header Dateien Deklaration von Funktionen und globalen Variablen Definition d h die Implementierung der zuvor deklarierten Funktionen Von den genannten Bereichen ist nur einer in jedem C Programm zwingend erforderlich Die Implementation einer Funktion und zwar der Funktionmain Wie der Name vermuten l t handelt es sich hierbei um eine Art Hauptprogramm Die Notwendigkeit der anderen Bereiche h ngt von der jeweiligen Programmieraufgabe und insbesondere den in der main Funktion verwandten Variablen Typen und Funktionen Einbinden von Header Dateien Bei umfangreichen Programmieraufgaben empfielt es sich das Programm zu modularisieren Dazu werden die verschiedenen Funktionen auf mehrere Quellcodedateien aufgeteilt Um die in einer Datei definierten Funktionen aber i
39. atements case Wert3 Statements case Wert4 Die Programmiersprachen C und C Kontrollstrukturen 22 TU Wien Institut E114 Prof DDr F Rattay Statements case Wert5 Statements case Wert6 Statements case Wert Statements Die Ausdr cke Wertl Wert7 beziehen sich hierbei auf den Inhalt des Integers Die case Marken sind hierbei lediglich als Textmarken zu interpretieren Das bedeutet da bei der obigen Konstellation im Falle einer Verzweigung nach Wert4 auch die Statements unter Wert5 bis Wert7 abgearbeitet werden Um dies zu verhindern und nach Abarbeiten eines Statements den gesamten swit ch Block zu verlassen mu am Ende der Statements die break Anweisung stehen break Anweisung Die break Anweisung f hrt dazu da der aktuelle Block geschweifte Klammern unmittelbar verlassen wird Die Syntax lautet break Unter Verwendung dieses Schl sselwortes kann jetzt der obige swit ch Block so geschrieben werden wie er eigentlich gedacht war switch Integer case Wertl Statements break case Wert2 Statements break case Wert3 Statements break case Wert4 Statements break case Wert5 Statements break case Wert6 Die Programmiersprachen C und C Kontrollstrukturen 23 TU Wien Institut E114 Prof DDr F Rattay Statements break case Wert Statements break default default_Statements break Letzlich nehmen noch die S
40. auf bestimmte Aufgabengebiete hingewiesen werden Die ziemlich alte Programmiersprache FORTRAN z B galt und gilt als spezialisiert auf numerische Probleme Speziell zur Abfrage und Spezifikation von Datenbanken wurden SQL Structured Queuery Language und seine zahlreichen Dialekte entwickelt Letztlich sind die meisten verf gbaren Hochsprachen f r die eine oder andere Aufgabe mehr oder weniger geeignet wobei die Wahl der richtigen Programmiersprache oft durch pers nliche Vorlieben bzw Vorgaben aus dem EDV technischen Umfeld bestimmt wird Der Turnaround Zyklus bei einer Compilersprache Die in diesem Skript behandelte Programmiersprache C stellt einen leistungsf higen und sehr weit verbreiteten Kompromi zwischen einer Hochsprache und Assembler dar Sie wurde urspr nglich dazu entworfen das Betriebsystem UNIX das bis zu diesem Zeitpunkt komplett in Assembler geschrieben war in einer Hochsprache neu zu programmieren um unabh ngig von der verwendeten Hardware zu werden Bei der Implementierung eines Betriebssystems kommt es sowohl auf u erste Effizienz an als auch auf die elegante und bersichtliche Handhabung komplexer Datenstrukturen Beide Anforderungen werden von C in ausreichendem Ma e erf llt wenn man ber die zweifellos n tige Erfahrung verf gt Da eine Hochsprache wie bereits erw hnt nicht direkt durch den Rechner verstanden werden kann ist eine bersetzung in Maschinensprache notwendig Die Art und Weise
41. bjektes pa t die eingestellte width eines Objektes berschnitten wird selbstdefinierte Eigenschaften von Objekten erkannt werden ein Fehler Hardware etc aufgetreten ist C stellt zus tzlich zu den Operatoren gt gt bzw lt lt Memberfunktionen der Klassen i st ream bzw ostream zur Verf gung int istream get extrahiert ein einzelnes Zeichen aus dem Eingabestrom und liefert dieses als Ergebnis zur ck darunter auch das EOF Zeichen und whitespaces istream amp istream get char amp c liest das n chste Zeichen auf c whitespaces und EOF werden nicht ignoriert Das Ergebnis ist der zu bearbeitende iostream ostream amp ostream put char amp c schreibt ein Zeichen auf den ostream analog zu getle istream amp istream get char str int Ing char trenn n liest maximal Ing 1 Zeichen auf den String str Es wird die Eingabe abgebrochen falls ein gelesenes Zeichen identisch mit trenn ist istream amp istream getline char str int Ing char trenn n entspricht dem get Befehl n wird in str mit aufgenommen istream amp istream read char str int 1ng Diese Funktion liest Ing Zeichen in str ein Der Einlesevorgang kann vorher abgebrochen werden EOF etc ostream amp ostream write char str int Ing Diese Funktion gibt Ing Zeichen aus str aus istream amp istream ignore lint anz char trenn EOF Diese Funktion berliest anz Zeichen Im Falle da ein Zeichen iden
42. chleifen eine wichtige Position unter den Strukturelementen ein while und for Schleife Die Syntax diese beiden Schleifen lautet for Ausdruckl Ausdruck2 Ausdruck3 Statements beziehungsweise f r die whi 1e Schleife while Ausdruck2 Statements Ausdruck1 und Ausdruck3 sind entweder Zuweisungen oder Funktionsaufrufe w hrend hingegen Ausdruck2 eine Bedingung ist Beispiele for int i 0 i lt 20 i printf Die Zahl i ist jetzt 3d i int i 0 while i lt 20 ist jetzt d i printf Die Zahl i Die Programmiersprachen C und C 24 Kontrollstrukturen TU Wien Institut E114 Prof DDr F Rattay Beide Konstrollstrukturen haben die Eigenschaft da die Abbruchbedingung vor der Schleife steht M chte man nun aber mindestens einmal die Schleife durchlaufen selbst wenn die Abbruchbedingung bereits erf llt ist so kann man das do Statement benutzen do Anweisung do arbeitet immer im Zusammenhang mitwhile und sorgt daf r da die Abbruchbedingung erst nach dem Durchlaufen der Schleife gepr ft wird Die Syntax lautet dann int i 0 do printf Die Zahl i ist jetzt 3d i while i lt 20 Die Programmiersprachen C und C Kontrollstrukturen 25 TU Wien Institut E114 Prof DDr F Rattay Zeiger Um eine Variable verwalten zu k nnen mu das System ihren Wert ihre Gr
43. chte Ecke Y lt lt m dUpperRightY lt lt An cout lt lt Obere linke Ecke X lt lt m_dLowerLeftX lt lt Obere linke Ecke Y lt lt m_dUpperRightY lt lt n Setzen der Rechteckkoordinaten durch Angabe von unterer linker und oberer rechter Ecke void Rec setCoordinates const double amp 1l11x const double amp lly const double amp urx const double amp ury Die Programmiersprachen C und C Member Funktionen Zugriffsrechte und andere Konstrukte 58 TU Wien Institut E114 Prof DDr F Rattay m_dLowerLeftX Il x m_dLowerLeftY ly m_dUpperRightX urx m_dUpperRightY ury Das Hauptprogramm include iostream h include conio h include rec h int main Rec recl Konstruktion ueber Default Konstruktor Rec rec2 1 0 1 0 10 0 10 0 Konstruktion ueber anderen Konstruktor Bildschirmausgabe celrscr recl printCoordinates recl printPlaneContent rec2 printCoordinates rec2 printPlaneContent Umsetzen der Koordinaten von rec2 rec2 setCoordinates 1 0 1 0 5 0 5 0 rec2 printCoordinates rec2 printPlaneContent return 0 Im wesentlichen werden in der Klasse Rec nur bereits bekannte Standard Konstrukte verwendet bis auf den Referenzoperator amp auf den weiter unten eingegangen wird Wichtig ist an dieser Stelle da in dieser Implement
44. dbegriffe und Sprachstrukturen 16 TU Wien Institut E114 Prof DDr F Rattay Variablen Einfache Datentypen Bei der praktischen Umsetzung von Problemstellungen in ein Computerprogramm spielen benutzerdefinierte Variablen und Konstanten ber die der Anwender frei verf gen kann eine zentrale Rolle Solchen Variablen k nnen w hrend der Programmausf hrung der sog Laufzeit oder engl runtime Inhalte zugewiesen und zu einem sp teren Zeitpunkt wieder ausgelesen werden Hierzu werden die Inhalte zwischenzeitlich irgendwo im Speicher des Rechners abgelegt Wo dies geschieht h ngt von der Art und Weise ab wie die Variablen erzeugt werden Die vollst ndige stilistisch saubere Erzeugung einer Variable unterteilt sich in zwei Abschnitte Definition Initialisierung Unter Definition versteht man die Bekanntmachung des Namens den man f r die Variable vorgesehen hat und unter der Initialisierung die Zuweisung eines ersten Inhaltes in den zugeh rigen Speicherbereich Um eine Variable zu erzeugen m ssen zun chst drei wichtige Informationen bekannt sein Wie soll die Variable hei en Variablennamen Was f r Information soll in der Variablen gespeichert werden Variablentyp Welchen Inhalt soll die Variable nach ihrer Erzeugung erhalten Initialisierungswert Variablennamen Bei der Vergabe von Variablennamen sind einige syntaktische und stilistische Aspekte zu ber cksichtigen Die
45. dem Text Hello World Bild 0 9 Bild 0 10 Da am Ende des Programms kein expliziter Stop Befehl angegeben wurde erscheint der Ausgabebildschirm nur ganz kurz Man kann sich diesen Bildschirm durch Wahl des Befehls User Screen aus dem Men eintrag Windows aber erneut ansehen Bild 0 9 Hello World 1 Die Programmiersprachen C und C Einf hrung 11 TU Wien Institut E114 Prof DDr F Rattay Bild 0 10 Hello World 2 Zum Debugging sind einige weitere Schritte notwendig Das Programm wird im Prinzip genauso gestartet wie bei dereinfachen Ausf hrung allerdings gibt man einen Punkt oder besser gesagt eine Zeile im Sourcecode vor an dem die Programmausf hrung zun chst anhalten soll Diese Zeile ist vor dem Starten im Sourcecode Fenster durch Set Reset Breakpoint aus dem Men Debug oder dr cken von CTRL F8 zu markieren Bild 0 11 Startet man das Programm jetzt wie oben beschrieben so wird die Ausf hrung genau an dieser Stelle angehalten Der Bildschirm wechselt nur kurz auf den Ausgabebildschirm um dann wieder zur ck in das Sourcecodefenster zu wechseln Jetzt hat man die M glichkeit sich einzelne Daten ber das gerade laufende Programm anzusehen was an dieser Stelle nur exemplarisch f r die Laufvariable i durchgef hrt werden soll s Bild 0 12 Bild 0 13 Au erdem kann man die Programmausf hrung Schritt f r Schritt durchf hren indem mit der Taste F8 Zeile f r Zeile weitergeht
46. den Bildschirm Direkter Zugriff auf private Element von b weil B als friend deklariert ist void A SumAPlusB const B amp b cout lt lt Summe von A und B lt lt m_iWert b m_iWert lt lt n Headerdatei zur Klasse B ifndef _B_H_ define _B_H_ class B Die Klasse B hat die Klasse A zum friend und erlaubt Objekten der Klasse A den Zugriff auf private Datenstrukturen friend class A Konstruktor public B const int amp Privates Attribut zu Demo Zwecken private Die Programmiersprachen C und C Member Funktionen Zugriffsrechte und andere Konstrukte 66 TU Wien Institut E114 int m_iWert endif Implementierung von B include b h Konstruktor B B const int amp init m_iWert init Hauptprogramm include iostream h include a h include b h int main Erzeugen zweier Objekte a und b A a 10 Bb 10 Aufruf der Summenmethode von A a SumAPlusB b exit 0 Die Programmiersprachen C und C Member Funktionen Zugriffsrechte und andere Konstrukte Prof DDr F Rattay 67 TU Wien Institut E114 Prof DDr F Rattay Klasse 1 erkl rt Klasse 2 zum friend Klasse 1 Klasse 2 Klasse 2 darf auf private Daten von Klasse 2 zugreifen Bild Konzept der friend Klassen In obigem Beispiel deklariert die Klasse B die
47. der Deklaration Man erkennt bereits an dieser Beschreibung einige wesentliche Eigenschaften einer Klassendeklaration Die Beschreibung des Status bzw der Attribute durch sogenannte Member Variablen erfolgt durch Variablendeklarationen innerhalb der Klassendeklaration Die F higkeiten der Objekte einer Klasse werden durch Funktionsdeklarationen innerhalb der Klassendeklaration festgelegt wobei diese Funktionen Member Funktionen oder Methoden genannt werden Genau hier liegt die zentrale Erweiterung zu den structs in C Structs k nnen lediglich Variablen verschiedener Typen enthalten vgl Kapitel O des C Kurses und fassen diese zusammen In diesem Zusammenhangt ist der Begriff der Kapselung ebenfalls sehr wichtig Er beschreibt das Verschwinden von internen Informationen in einer Klasse ein Konzept das als Information Hiding bekannt ist und auf das weiter unten erneut eingegangen wird vgl n chstes Kapitel Eine Klasse in C Kommen wir zur programmtechnischen Umsetzung dieser Konzepte in C Das Programm besteht aus drei Sourcefiles wobei zwei die Endung cpp tragen und eines die Endung h tr gt Im File konto h befindet sich die Klassendeklaration auch Schnittstellen Interface oder Headerdatei genannt Sie sieht folgenderma en aus Headerfile zur Klasse Konto ifndef _KONTO_H_ define _KONTO_H_ Die Programmiersprachen C und C Klassen und Objekte 45 TU Wien Institut E114 Prof DDr F Rattay
48. e C char Ein Byte kann ein Zeichen aus dem Zeichensatz der Maschine aufnehmen int Ganzzahliger Wert in der f r die Maschine nat rlichen Gr e Einfach genauer Gleitkommawert Doppelt genauer Gleitkommawert Diese Grundtypen k nnen je nach Bedarf noch durch sogenannte Qualifizierer beeinflu t werden Hierzu stehen die drei Schl sselw rter short Long und unsigned zur Verf gung Der Wertebereich den die verschiedenen Typen belegen ist von dem jeweiligen Betriebssystem bzw vom Computertyp abh ngig F r das 32 Bit Betriebssystem Windows 95 beispielsweise gelten die in Tabelle 4 Werte Die Programmiersprachen C und C Variablen Einfache Datentypen 18 TU Wien Institut E114 Prof DDr F Rattay Tabelle 4 Durch Modifizierer erweiterte einfache Datentypen Anzahl der Bytes Wertebereich EC SE HE BEE S S EEE ara hr re Dong int a OOO O nsigna ine a OO o oaas E a E T E e E ES E O Deklaration Um eine Variable zu Erzeugen mu sie dem System zuerst bekannt gemacht werden Dieser Vorgang wird Deklaration genannt Die Deklaration setzt sich syntaktisch aus einem Variablentyp und dem Variablennamen zusammen die durch einen Zwischenraum getrennt sind 7 Beispiel int n_Nummer Es k nnen auch mehrere Variablen des gleichen Typs in einer Zeile kommasepariert deklariert werden wie zum Beispiel double dVariable_1 dVariable_2 dVariable_3 quivalent zu der vorherg
49. e abgeleitete Klasse selbst Basisklasse sein kann kann eine ganze Klassenhierarchie entstehen s 0 Die Klasse Fahrzeug beschreibt Eigenschaften von Fahrzeugen Die Klasse Auto erbt diese Eigenschaften und erweitert sie Die Klasse BMW erbt die Eigenschaften von Auto also die erweiterten Eigenschaften von Fahrzeug und erweitert sie weiter C unterst tzt Mehrfachvererbung eine abgeleitete Klasse kann mehrere Basisklassen besitzen Konstruktoren werden nicht an die abgeleitete Klasse vererbt Bei der Deklaration der Konstruktoren werden die Parameter durchgereicht Zugriffsrechte Schl sselw rter private Auf diese Komponenten kann nur diese Klasse zugreifen protected Die eigene und die abgeleiteten Klassen haben Zugriff public Diese Komponenten sind ffentlich Zur Erl uterung wird die Klasse KBruch k rzbarer Bruch eingef hrt Die Programmiersprachen C und C Vererbung 93 TU Wien Institut E114 Prof DDr F Rattay Beispiel Dateiname KBruch h ifndef _KBruch_h define _KBruch_h include BRUCH H header Datei der Basisklasse class KBruch public Bruch protected bool kuerzbar true Bruch ist kuerzbar unsigned ggt const Hilfsfunktion gr ter gemeinsamer teiler public KBruch int int Konstruktor void kuerzen Bruch kuerzen bool istkuerzbar const liefert ob kuerzbar 3 endif _KBruch_h Dateiname KBruch cpp include
50. egten Anzahl char Variablen angefordert werden Kann malloc erfolgreich ausgef hrt werden d h es ist noch hinreichend viel Speicher verf gbar so liefert die Funktion einen Zeiger auf den Beginn des reservierten Speicherblocks zur ck War malloc nicht erfolgreich so erh lt p den Wert NULL Vor einem Zugriff auf den reservierten Speicher sollte unbedingt berpr ft werden obmalloc erfolgreich war da es sonst beim Zugriff auf den inWirklichkeit nicht reservierten Speicher zu einem Programmabsturz kommen kann Das gilt auch f r das Freigeben des Speichers mit free Dies erledigt zum Beispiel folgende Anweisungsfolge include lt stdlib h gt Die Programmiersprachen C und C Zeiger 27 TU Wien Institut E114 include lt malloc h gt include lt string h gt typedef int BOOL defineFALSE 0 define TRUE 1 void main char p int nBlockgroesse p char if p NULL malloc Dies Prof DDr F Rattay 299 nBlockgroesse ist ein einfacher strcpy p Speicherblock free p Es ist von gro er Wichtigkeit den erhaltenen Speicher nach Gebrauch wieder freizugeben Wird dem Zeiger der auf den Speicherblock verweist im Beispiel p vor der Freigabe des Speichers durch free ein anderer Wert zugewiesen so ist dieser Speicherblock quasi verloren d h er kann im weiteren nicht mehr benutzt werden Mit Hilfe dieser Mechanismen lassen sich auch wesentlich komplexere Da
51. ehenden Liste k nnen alle Variablen auch einzeln deklariert werden double dVariable_1 Durchmesser des ersten Teilkreises double dVariable_2 Rohlingsdurchmesser double dVariable_3 L nge des Flansches Der Vorteil liegt hierbei in der bersichtlichkeit und der M glichkeit zu jeder Variablen einen Kommentar hinzuzuf gen Variablen k nnen auch innerhalb der Deklaration initialisiert werden indem nach dem Variablennamen ein Gleichheitszeichen und eine Konstante angegeben wird Beispiel double dVariable_1l 1 4 char cChar A char lpstrString 20 Ich bin ein String Durch die Verwendung der eckigen Klammern und kann von jedem Variablentyp eine eindimensionales Feld Array erzeugt werden Die einzelnen Komponenten k nnen wiederum durch eckige Klammern mit einer Komponentenangabe angesprochen werden Achtung die Variablen bezeichnen in diesem Fall einen Zeiger des entsprechenden Typs nicht den Inhalt vergleiche Kapitel 0 Die Programmiersprachen C und C Variablen Einfache Datentypen 19 TU Wien Institut E114 Prof DDr F Rattay Beispiel int main int Vektor 12 Vektor mit 12 Integerwerten Vektor 0 14 Vektor 1 4 Vektor 2 115 return 0 Der Bezeichner Vektor ist also vom Typ int und nicht vom Typ int w hrend hingegen durch Verwendung der Klammern Vektor wieder dereferenzier
52. ehn Zeilen mit dem Text Hello World dargestellt Es ist zun chst noch nicht notwendig den Programmtext im einzelnen zu verstehen er sollte lediglich so bernommen werden um Fehlermeldungen beim bersetzen zu verhindern Beide IDEs sind zus tzlich mit einer leistungsstarken umfassenden Online Hilfe ausgestattet so da bei weiteren Fragen oder Problemen zun chst diese konsultiert werden kann Starten der IDE und Anlegen eines Projektes Zun chst mu die IDE durch Eingabe von bc f r Borland C oder rhide f r DJGPP auf der Kommandozeile gestartet werden bei Verwendung von Windows 95 entsprechende Links erzeugen anklicken und in DOS Box starten Bild 0 3 Nach dem Start der IDE ist es notwendig ein Projekt anzulegen indem man den Befehl Open Project aus der Men leiste anw hlt Bild 0 4 Im sich nun ffnenden Projektfenster kann man eine oder mehrere Sourcedateien in das Projekt einf gen Bild 0 5 Das Anlegen eines Projektes ist eigentlich f r gr ere Programmieraufgaben die aus einer gr eren Anzahl an Dateien bestehen k nnen gedacht Trotzdem sollte man auch bei kleineren Aufgaben mit dem Anlegen eines Projektes beginnen um zum einen die Arbeitsweise zu erlernen und zum anderen alle M glichkeiten der IDE ausnutzen zu k nnen Die Programmiersprachen C und C Einf hrung 8 TU Wien Institut E114 Prof DDr F Rattay Bild 0 3 IDE leer Bild 0 4 Projekt ffnen
53. er Operator lt lt wird stets zur Ausgabe verwendet wenn cout verwendet wird b unsigned char Bl 0145 Bl 01100101 in Bin rdarstellung unsigned char Ergeb Ergeb Bl lt lt 1 Bitweises Verschieben von Bl um 1 Bit nach links Ergeb 11001010 in Bin rdarstellung Die Operatoren und sind Kurzschreibweisen f r die folgenden Zuweisungen und f r alle einfachen Datentypen int float char berladen a l ist identisch mit a a l a 7 123 ist identisch mit a a 7 123 a 10 ist identisch mit a a 10 b 3 ist identisch mit b b 3 Es sind logische von bin ren Operatoren zu unterscheiden Logische Operatoren geben als Ergebniswert TRUE oder FALSE aus siehe auch Abschnitt logische Ausdr cke Bin re bitweise Operatoren f hren eine logische Funktion auf die angegebenen Parameter aus Beispiel unsigned char a 0145 Bin r 01100101 unsigned char b b a a Ergebnis von a OR a an b zuweisen psp a if b a Ist Wert von a identisch mit Wert von b cout lt lt gleich dann Ausgabe des String gleich else ansonsten cout lt lt ungleich Ausgabe der Mitteilung Die Programmiersprachen C und C berladen von Operatoren und Funktionen 77 TU Wien Institut E114 Prof DDr F Rattay ungleich Beispiel Im Folgenden wird das berladen am Beispiel der Konstruktoren der Klasse Bruch
54. er verwendet Da dies ein typisches Beispiel f r den Einsatz von structs ist soll an dieser Stelle noch einmal auf die in Kapitel 0 gelegten Grundlagen zur dynamischen Speicherverwaltung zur ckgegriffen werden und der Aufbau und Durchlauf ein linearen Liste programmiert werden Die einzelnen Listenelemente beinhalten aus Gr nden der bersichtlichkeit lediglich eine Integerzahl Ein Listenelement besteht damit aus einem Zeiger auf seinen Nachfolger und der erw hnten Integerzahl Der Aufbau der Liste ist in folgendem Bild beschrieben NULL actual Zeige Listenelement Zeiger first Typname List_element Bild 0 3 Struktur einer einfachen linearen Liste Im Programm werden zun chst zwei Zeiger definiert die auf den Typ List_element zeigen k nnen Diese werden initial direkt auf den NULL Pointer gesetzt Dann beginnt der Aufbau der Liste indem ein Startelement des Typs List_element mit Hilfe der malloc Funktion erzeugt wird In der sich anschlie enden for Schleife werden vier weitere Listeneintr ge an das erste angeh ngt Die Vorgehensweise zum Anh ngen kann man dabei dem folgendem Bild 0 4 entnehmen Die Programmiersprachen C und C Benutzerdefinierte Datenstrukturen Structs Unions 37 TU Wien Institut E114 Prof DDr F Rattay Deklaration struct Point3D a Init a Definition als einfache Variable a number struct Point3D a a mallocl sizeofa Init a Definition als Zeiger
55. ersetzt werden kann Format Funktionen Ein weiterer Weg die Formatierung von Streams zu beeinflussen liegt in der Verwendung von Format Funktionen Diese sind der Klasse ios zuzuordnen aus der z B ostream istream etc abgeleitet werden Daher sind die Einstellungen die durch die ios Memberfunktionen definiert werden auch bei den Ein Ausgabe Streams wirksam Die wichtigsten Funktionen sind los dec Die Ausgabe soll dezimal dargestellt werden ios hex hexadezimal LOosHN ct oktal ios left linksb ndig jos right rechtsb ndig jos internal mit F llzeichen zwischen Basis und Wert 10os showbase Bei der Ausg soll zus tzl die Basis ausgegeben werden 10os showpoint Der Punkt soll nicht unterdr ckt Die Programmiersprachen C und C Streams und File I O 83 TU Wien Institut E114 Prof DDr F Rattay werden 10s showpos Ein t Zeichen soll vor der zahl ersch bei pos Zahlen 1os uppercas Hex Ausgabe mit Gro buchstaben OX1A22ZF jios scientific Gleitkommadarstellung mit exponent Format 1 23e4 los fixed Gleitkommadarstellung mit fixed Format 12 34 1os width n entspricht set w n 1os precision n entspricht set precision n Die in der Tabelle angegenenen ios Flags werden mit Hilfe der Funktion long ios setf long setBits long delete Bits OL gesetzt bzw gel scht Vorsicht Der R ckgabewert der Funktion ist eine long Zahl und kein st ream Objek
56. existieren ios noreplace Datei darf nicht existieren ios binary unter DOS zum Unterdr cken von CR LF Es wird LF am Zeilenende geschrieben Typischerweise werden die Flags durch I oder gleichzeitig gesetzt wie z B ofstream datei xyz out ios outlios app los nocreate Der wichtigste Unterschied zu den Standard Str men istream ostream iostream liegt bei der Dateibearbeitung im wahlfreien Zugriff auf Daten im Strom Hierzu kann der Zugriff auf ein Datum durch die Positionierung innerhalb einer Datei gesteuert werden Hierzu werden die Anweisungen fstream amp fstream seekg long pos fstream amp fstream seekg long offset int bezug fstream amp fstream seekg long pos fstream amp fstream seekp long offset int bezug definiert seekg stellt den Lesezeiger durch Positionieren absolut mit pos oder relativ zu einem vorgegebenen Bezugspunkt bezug durch offset ein seekp stellt analog den Schreibzeiger ein Beide Funktionen sind auch f r die Klassen ifstream und ofstream definiert Um einfache Bez ge zu kennzeichnen wurden drei Konstanten eingef hrt ios beg 0x0 Dateibeginn LOST C T 0x1 relativ zur aktuellen Position ios end 0x2 Dateiende Zur Ermittlung der aktuellen Position dienen long fstream tellg void long fstream tellp void Unter DOS sollte im Textmodus stets tellg tellp gemeinsam mit seekg seekp Befehlen genutzt werden da die Position i
57. falschen Ausgaben usw Um diese Fehler zu entdecken ist es unabdingbar ein Werkzeug zur Verf gung zu haben das die Fehlersuche erleichtert Ein solches Werkzeug ist der Debugger der ein fertig bersetztes Programm als Eingabe erh lt Nach Start des zu untersuchenden Programms im Debugger kann man je nach Komfort Zeile f r Zeile den Quellcode abarbeiten lassen Speicherbereiche anschauen und das Programm genau inspizieren Sollte der Fehler gefunden werden beginnt die Programmierung wieder bei Schritt 1 blicherweise h lt man sich bei der Entwicklung vor allem von komplexeren Systemen die mit Abstand meiste Zeit in der Debugging Phase auf da die Fehlersuche den gr ten Teil der gesamten Programmierzeit ben tigt Nach Durchlauf aller Schritte ist man schlie lich beim lauff higen Programm angelangt da man nun auch ohne den Debugger stand alone ausf hren kann Es soll nicht verschwiegen werden da der eigentlichen Programmierphase bei komplexeren Softwaresystemen eine ausgiebige Analyse und Designphase vorausgeht Hier wird die Struktur des gesamten Programms festgelegt und die Interaktion einzelner Programmteile untereinander beschrieben Diese Vorphasen bei der Software Entwicklung sind meist wesentlich umfangreicher als die eigentliche Programmierung sie sind aber nicht Bestandteil dieses Skriptes s a 3 Der gesamte Ablauf der Programmierung mit einer Compilersprache ist noch einmal in folgendem Bild zu
58. fen Dabei mu man eine andere Notation verwenden Statt des Punktes wird nun die Pfeilnotation gt verwendet Dies ist immer dann notwendig wenn auf ein Element eines Objektes ber einen Pointer und nicht direkt zugegriffen wird Abgesehen von diesem Unterschied ist das Vorgehen und das Ergebnis des Hauptprogrammes exakt das gleiche wie im ersten Beispiel Die Erzeugung und der Zugriff auf Objekte ber Pointer in C ist eine bliche Vorgehensweise da dieses Verfahren die Ausf hrungsgeschwindigkeit von Programmen erh ht und den Die Programmiersprachen C und C Klassen und Objekte 54 TU Wien Institut E114 Prof DDr F Rattay Speicherbedarf reduziert Bei der bergabe von Pointern auf Objekte an Funktionen werden z B nur die Pointer bergeben nicht aber die ganzen Objekte Zusammenfassung In diesem Kapitel wurden die Begriffe Klasse und Objekt erl utert voneinander abgegrenzt und ihre programmtechnische Umsetzung in C beschrieben Es mag vielleicht sehr aufwendig aussehen Klassen und Objekte bei der Programmierung zu verwenden h tte man doch das Konto Beispiel auch mit einfachem C schnell und elegant realisieren k nnen Es sei an dieser Stelle darauf verwiesen da die objektorientierte Programmierung allgemein und C im Speziellen explizit f r die Entwicklung von sehr gro en Softwareprodukten entworfen worden sind In solchen Projekten bietet die Objektorientierung eine optimale Unterst tzung Der Analyse und
59. ger p_x die Adresse von x zu Dabei liefert der Adressoperator amp die Adresse px zeigt also jetzt auf x Um nun indirekt ber den Zeiger auf die variable x zuzugreifen und ihren Wert beispielsweise der Variablen y zuzuweisen bedient man sich folgender Anweisung y px Der sog Verweis Operator behandelt seinen Operanden als die Adresse des eigentlichen zielobjektes und ben tzt diese Adresse um den Wert der des Zielobjektes zu manipulieren ist quasi das Gegenst ck zu amp Wie werden Zeiger nun definiert Die Definition eines Zeigers hnelt der einer beliebigen Variablen int p_x definiert den Zeiger f r das obige Beispiel Es festgelegt das es sich bei p_x um einen Zeiger auf eine Variable des Typs int handelt Das hat zur Folge da es nicht erlaubt ist p_x die Adresse einer Variable beispielsweise vom Typ double zuzuweisen Es hat sich als n tzlich erwiesen ein p oder p_ vor den Namen des Zeigers zu setzen um von vornherein klar zu machen da es sich bei der Variable um einen Zeiger handelt Pointer engl Zeiger Dies beugt Fehlern beim Umgang mit Zeigern vor einer der h ufigsten Fehlerursachen beim Programmieren inC Zeiger lassen sich dementsprechend auch in Ausdr cken verwenden y p_x 1 Diese Anweisung beispielsweise addiert den Wert eins zum Inhalt der Variablen x und weist das Ergebnis y zu Analog weist die folgende Anweisung x den Wert von y 1 zu tp x y 1 Zeiger und Arrays In C h
60. hen unions dienen i w dazu Speicherplatz zu sparen und sollten immer dann verwendet werden wenn man eindeutig festlegen kann da eine Komponente einer Struktur wahlweise den einen oder den anderen Typ zu einem Zeitpunkt hat nie aber beide Nach Eingabe und bersetzung des Beispielprogramms sieht man da je nach Auswahl des Datenformats eine von beiden Komponenten undefinierte Werte aufweist w hrend die andere den eingegebenen Wert enth lt non Literatur zu structs unions und Listen findet sich in 7 8 Die Programmiersprachen C und C Benutzerdefinierte Datenstrukturen Structs Unions 42 TU Wien Institut E114 Prof DDr F Rattay Literatur zu der Programmiersprache C 1 N N Ohne Titel Begleitunterlagen zum Hardwarepraktikum f r Ingenieurinformatiker FBI Informatik Universit t Dortmund 2 N N Online Hilfe zum Microsoft Developer Studio 97 Microsoft Corporation 3 N N Softwaretechnologie Skriptum zur GlechnamigenVorlesung FB Informatik LS X der Universit t Dortmund 4 N N Online Hilfe zu Borland Delphi 3 Borland 1996 5 N N Turbo C 3 0 Benutzerhandbuch Borland 1992 6 Schildt H Turbo C C the Complete Reference Osborne McGraw Hill Berkeley 1990 7 Kernighan B W Programmieren in C Ritchie D M Institut f r Spanende Fertigung Universit t Dortmund Unver ffentlichte Studienarbeit 1998 8 Weinert K Spanende Fertigung III Schreiner A T Janich E
61. hoden beginnen mit einem Kleinbuchstaben bei zusammengesetzten W rtern beginnt ein neuer Wortteil mit einem Gro buchstaben wie bei eineGrosseZahl Konstantennamen werden gro geschrieben wobei bei zusammengesetzten W rtern die Wortbestandtele mit einem Underscore verbunden werden wie beispielsweise bei MAXIMALE_LAENGE Selbstdefinierte Typennamen Namen von Strukturen Aufz hlungstypen oder Klassen in C beginnen mit einen Gro buchstaben und werden ansonsten wie Variablen benannt Schl sselw rter C und C zeichnen sich verglichen mit anderen Programmiersprachen durch eine sehr begrenzte Anzahl reservierter Bezeichner sog Schl sselw rter aus Diese haben bereits eine vordefinierte Bedeutung und dienen zur Beschreibung von Aktionen vordefinierten Datentypen und Objekten C Sie d rfen daher nicht anderweitig verwendet werden Die folgende Tabelle gibt eine bersicht ber die Schl sselw rter von C und C Tabelle 2 Schl sselw rter in C und C kursiv Se n Die Programmiersprachen C und C Grundbegriffe und Sprachstrukturen 14 TU Wien Institut E114 Basisdatentypen Datentypen Speicherklassen Qualifizierer Kontrollstrukturen Sprunganweisungen Typumwandlungen Typsystem Namensr ume Operatoren Zugriffsschutz Funktionsattribute Generizit t Ausnahmebehandlung Assemblercode Prof DDr F Rattay bool true false char wchar_t short signed unsigned int long float double void enum cl
62. hrung 13 TU Wien Institut E114 Prof DDr F Rattay Grundbegriffe und Sprachstrukturen Bezeichner Bezeichner sind Namen f r beliebige Objekte im Programm Variablen Funktionen selbstdefinierte Datentypen Klassen Objekte etc Bezeichner sind aus beliebigen Buchstaben keine deutschen Umlaute Ziffern und dem Zeichen _ Underscore zusammengesetzt wobei allerdings das erste Zeichen keine Ziffer sein darf Beispiel f r g ltige Bezeichner sind hallo _hallo hallo123 Ung ltig sind 123hallo hallo oder tsch Weiterhin sind zwei Gesichtspunkte zu beachten C und C sind Case Sensitive d h es unterscheidet zwischen Gro und Kleinschreibung Hello Hello und HeLIO sind also unterschiedliche Bezeichner W rter werden durch Zeichen die keine Buchstaben Ziffern oder Underscores sind begrenzt Daher ist zum Beispiel elseif ein einzelner Bezeichner und nicht die Aufeinanderfolge von else und if Bei der Wahl der Bezeichnernamen ist es wichtig konsistent vorzugehen Sie sollten nach bestimmten frei w hlbaren Regeln aufgebaut werden damit bereits aus dem Namen zu erkennen ist um was f r eine Art von Bezeichnern es sich handelt Die verschiedenen Compilerhersteller und Autoren von B chern zum Thema C und C haben eigene Richtlinien f r die Schreibweise herausgegeben Einige dieser Regeln haben sich als n tzlich herausgestellt und zu einem Quas Standard herausgebildet Namen von Variablen und Funktionen bei C auch Met
63. hstabe am Anfang 1_Name ung ltig weil eine Zahl am Anfang steht VARIABLEeins VARIABLEzwei sind nicht unterscheidbar weil sie in den ersten acht Buchstaben identisch sind Musterbeispiele lpctstr_Vorname_1 Die ersten sieben Buchstaben charakterisieren den Variablentyp Ipctstr long pointer to a constant string danach wird der Inhalt Vorname 1 beschieben n_Alter n zeigt an da es sich bei der Variable um einen Integerwert handelt n wie Nummer vgl Variablentyp der das Alter beinhaltet _PI f symbolisiert da es sich hierbei um einen Flie kommawert handelt die Gro schreibung da es eine Konstante ist und PI steht f r die Kreiskonstante 7 Durch die Erg nzung des Variablennamens mit einer vorangestellten Typkennzeichnung kann w hrend der Programmierung leicht erkannt werden ob evtl ung ltige Zuweisungen durchgef hrt werden wie zum Beispiel n_ Alter 14 3 Es ist sofort ersichtlich da die Zuweisung des Flie kommawertes 14 3 dem Typ der Variable n_Alter Integer wiederspricht Datentypen Unter dem Datentyp versteht man die Art des Inhaltes einer Variablen In der Programmiersprache C gibt es nur sehr wenige elementare Datentypen aus denen jedoch beliebig viele sog komplexe Datentypen zusammengesetzt werden k nnen s Kapitel 0 Im folgenden sind die vier implementierten Grundtypen und die dazugeh rigen Speicherbereiche aufgelistet Tabelle 3 Grundtypen der Programmiersprach
64. ibute TYPNAME MEMBERVARIABLE Methoden R CKGABETYP FUNKTIONSNAME PARAMETERLISTE k Bild Die prinzipielle Syntax einer Klassendeklaration Es f llt an dieser Stelle auf da noch nirgends beschrieben wurde wie z B das Abheben eines Geldbetrages von unserem Kontoobjekt konkret funktionieren soll Eigentlich haben wir bislang lediglich Funktionsdeklarationen angegeben aber diese Funktionen noch nicht mit Leben gef llt Genau das geschieht in der Datei konto cpp die die sogenannte Implementierung der Klassenmethoden enth lt und die wie folgt aussieht Implementierung der Klasse Konto include iostream h Einbinden der Standard Stream Klassen include konto h Einbinden der Klassendeklaration Konto Konto long kontonummer double startbetrag Initialisierung des Kontos m_l1Kontonummer kontonummer m_dKontostand startbetrag Konto Konto L schen des Kontos An dieser Stelle gibt es erstmal nix zu tun void Konto einzahlen double betrag Die Programmiersprachen C und C Klassen und Objekte 47 TU Wien Institut E114 Prof DDr F Rattay m_dKontostand betrag void Konto abheben double betrag if m_dKontostand lt betrag cout lt lt Kein Kredit Transaktion abgebrochen n else m_dKontostand betrag void Konto kontostand_ausgeben cout lt lt Kontostand des Kontos lt lt m_lKontonummer
65. ie Implementierung hingegen darf nur einmal vorgenommen werden Sie k nnte f r Stringausgeben wie folgt aussehen Beispiel int Stringausgeben const char 1lpctstrString int nNumberOfCharacters int nCounter 0 do if lpcetstrString nCounter 0 putchar lpctstrString nCounter else return 1 nCounter tt t while nCounter lt nNumberOfcharacters return 0 Um selbst implementierte Funktionen in beliebig vielen Quelldateien nutzen zu k nnen wird dabei in aller Regel die in Bild 0 1 dargestellte Filestruktur verwendet Die Programmiersprachen C und C Funktionen 29 TU Wien Institut E114 Datei SRINGAUSGEBEN C include lt stdio h gt int Stringausgeben const char IpctstrString int nNumberOfCharakters int nCounter 0 do if IpetstrString nCounter 0 putchar IpctstrString nCounter else return 1 nCounter while nCounter lt nNumberOfCharakters return 0 Datei MAIN_1 C include STRINGAUSGEBEN H int main int main char IpctstrString 30 Dies ist ein Teststring n return Stringausgeben IpctstrString 15 return Stringausgeben IpctstrString 15 Datei MAIN_2 C include STRINGAUSGEBEN H char IpctstrString 30 Dies ist ein Teststring n Datei STRINGAUSGEBEN H ifndef __STRINGAUSGEBEN_H define _ STRINGAUSGEBEN_H int Stringausgeben const char int endif __STRINGAUSGEBEN_H include STRINGAUSGE
66. iefen das bisher gelernte Die Programmiersprachen C und C Member Funktionen Zugriffsrechte und andere Konstrukte 73 TU Wien Institut E114 Prof DDr F Rattay berladen von Operatoren und Funktionen berladen von Funktionen Durch das berladen von Funktionen k nnen unterschiedliche Funktionen mit dem gleichen Funktionsbezeichner aber verschiednen Argumenten aufgerufen werden Der Vorteil dieser Vorgehensweise liegt in der Vereinfachung der eigentlichen Implementation da der verwendete Datentyp f r eine Funktionalit t h ufig irrelevant ist Das Verhalten der Funktion bleibt identisch egal auf welche Datentypen diese angewendet wird Beispiel Die Funktion kann in der Mathematik auf nat rliche reelle und komplexe Zahlen oder Vektoren angewendet werden Die Funktionalit t bleibt gleich die Addition w hrend die Funktion auf unterschiedliche Datentypen nat rlich reell komplex Vektor auch gemischt angewendet werden kann In C ist der Operator f r int ganze Zahlen und float bzw double reelle Zahlen berladen d h f r die unterschiedlichen Operationen existiert nur ein Symbol Beispiel int maximum int int Prototyp der Funktion maximum zweier int Zahlen int maximum const int int hier f r ein Array und eine int Zahl int j 10 int k 12 int al4 547 971 int main cout lt lt Maximum von Array und Einzelzahl lt lt
67. ierung der Klasse Rec nur die linke unter und die rechte obere Ecke des Rechtecks gespeichert werden Soll der Fl cheninhalt ausgegeben werden m ssen die Kantenl ngen jeweils extrahiert werden genau wie bei der Ausgabe der Koordinaten bei der die beiden fehlenden Eckpunkte Die Programmiersprachen C und C Member Funktionen Zugriffsrechte und andere Konstrukte 59 TU Wien Institut E114 Prof DDr F Rattay aus den gespeicherten generiert werden m ssen Die Member Variablen sind als private deklariert was generell immer so gehalten werden sollte um sie vor Zugriffen von au en zu sch tzen Es existiert au er public und private noch eine weitere Sicherheitsstufe n mlich protected in C die in Zusammenhang mit der Technik der Vererbung s Kapitel 12 von Bedeutung ist Alternative Implementierung der Klasse Rec Man stelle sich jetzt vor der Entwickler der Klasse Rec beschlie t die Implementierung dahingehend zu ndern alle vier Eckpunkte direkt abzuspeichern Dieses Vorgehen ben tigt zwar etwas mehr Speicher aber daf r ist der Zugriff auf die Daten zur Ausgabe und zur Fl cheninhaltsberechnung schneller W rde man die Member Variablen ffentlich zug nglich machen und im Hauptprogramm ohne den Umweg ber Methoden der Klasse auf diese Variablen zugreifen dann m te die Implementierung des Hauptprogramms ge ndert werden Au erdem m te der Entwickler des Hauptprogramms oder die Entwickler anderer Programmte
68. ile oder Klassen die Objekte der Klasse Rec benutzen wollen den internen Aufbau der Klasse Rec kennen Bei Verwendung von Member Funktionen als ffentliche Schnittstelle ist diese interne Kenntnis nicht notwendig Bei der Entwicklung von gro en Programmen ist eine solche interne Kenntnis von anderen Programmteilen nicht erw nscht und man versucht bewu t nur ber genau definierte Schnittstellen andere Objekte zu benutzen Dieses Verstecken von Informationen bezeichnet man in der Informatik als Information Hiding bezeichnet und es wird durch objektorientierte Programmierung gut unterst tzt wie man auch im n chsten Bild sieht Andere Programmteile Schnittstelle Klasse 1 Schnittstelle Klasse 2 Klasse 1 Klasse 2 Implementierung Implementierung als Black Box als Black Box Entwickler 1 Entwickler 2 Bild Konzept des Information Hiding in der Programmierung mit C W hrend in unserem einfachen Beispiel der Umweg des Zugriffs ber Methoden eher umst ndlich erscheint ist dieses Vorgehen bei gr eren Programmen sehr sinnvoll Oftmals ist es z B so da der Hersteller einer IDE eine sogenannte Klassenbibliothek mitliefert Von einer solchen Bibliothek bekommt Die Programmiersprachen C und C Member Funktionen Zugriffsrechte und andere Konstrukte 60 TU Wien Institut E114 Prof DDr F Rattay der Anwender lediglich die Headerfiles mit den Zugriffsfunktionen zu sehen w hrend die Implementierungsfiles der
69. include lt fstream h gt include lt iostream h gt include lt iomanip h gt int main ASC Zuordnungstabelle ofstream outfile new ofstream OutDatei txt jlos out if outfile Fehlerbehandlung und Ende for int i 32 i lt 256 it XKoutfile lt lt Zahl lt lt setw 3 lt lt ij lt lt lt lt Zeichen lt lt char i lt lt endl delete outfile Nat rlich mu nicht immer ein Objekt mit new generiert werden Ebenfalls ist auch die Angabe des Dateinamens bei der Deklaration nicht sofort notwendig Eine Datei kann selbstverst ndlich auch nach der Deklaration ge ffnet werden und explizit auch wieder geschlossen werden Die Programmiersprachen C und C Streams und File I O 90 TU Wien Institut E114 Prof DDr F Rattay Dies geschieht mit den Anweisungen void fstream open const char dateiname int modus int prot void fstream close void Mit modus werden verschiedene Arten der Dateibehandlung charakterisiert Die verschiedenen Modi werden durch ios Flags beschrieben jos out ffnen zum Schreiben default f r ofstream jos app Schreiben an das Dateiende und nur dahinter jos ate Positionieren auf das Dateiende at end Schreiben auch vor Dateiende m glich jos in ffnen zum lesen default f r ifstream ios trunc Alten Dateiinhalt l schen default wenn nicht app oder ate angegeben jos nocreate Datei mu
70. ktes zugegriffen In diesem Fall wird die Member Funktion Kontostand_ausgeben aufgerufen Durch die Notation Objekt Element kann man auf einzelne Elemente eines Objektes zugreifen unter der Bedingung da diese Elemente zugreifbar sind d h da sie public deklariert sind W rde man etwa versuchen im Hauptprogramm auf die Member Variable m_dBetrag zuzugreifen so w rde der Compiler beim bersetzen eine Fehlermeldung ausgeben Diese Variable ist private deklariert und deshalb nicht von au en sichtbar N heres ber diese Schutzfunktionen und die dahinterstehenden Konzepte findet sich im n chsten Kapitel Dynamische Objekte In Kapitel 0 wurde bereits auf die dynamische Speicherverwaltung eingegangen Da Klassen im Prinzip nichts anderes als benutzerdefinierte Datentypen darstellen kann man Variablen eines Klassentyps also Objekte genauso dynamisch erzeugen wie Variablen eines anderen Typs Als Beispiel werden wieder drei Kontoobjekte erzeugt allerdings sollen sie diesmal nicht mehr in einzelnen Objekt Variablen abgelegt werden sondern es soll ein Array s Kapitel 0 und 0 aus dem C Skript mit drei Eintr gen Die Programmiersprachen C und C Klassen und Objekte 52 TU Wien Institut E114 Prof DDr F Rattay angelegt werden wobei jeder Array Eintrag ein Pointer auf ein Kontoobjekt darstellt s Bild kontopointarray wmf Der Quellcode f r ein solches Vorgehen sieht dann so aus Hauptprogramm zur Kontoverwaltung in eine
71. le und Anweisungen angeboten die auf einer h heren Abstraktionsstufe liegen So kann man z B Befehle zur einfachen Ausgabe von Text auf dem Bildschirm verwenden wie etwa writeln Hello World in Pascal die relativ einfach zu verstehen sind Die gleiche Anweisung in Assembler besteht aus einer gro en Anzahl kryptischer Befehle und Zahlen im Hexadezimalformat 1 Um einen Eindruck ber die unterschiedlichen Abstraktionsniveaus zu erhalten ist im folgenden ein einfaches Beispielprogramm einmal in C und einmal in Assembler dargestellt C Code include stdio h main int i 0 for 1 0 i lt 9 i printf Hello World n exit 0 Die Programmiersprachen C und C Einf hrung 4 TU Wien Institut E114 Prof DDr F Rattay Disassonblar window Bild 0 1 Assembler Sourcecode das komplette Programm ist ungef hr f nfmal so lang Die momentan gr te Abstraktionsstufe erreichen die bereits erw hnten visuellen Entwicklungssysteme Sie erfordern z T nicht einmal mehr die Eingabe des Programms als Text sondern der Programmierer klickt sich seinen gew nschten Programmablauf aus diversen vorgefertigten Elementen auf dem Bildschirm mit der Maus zusammen Solche Systeme sind meist eng mit der Entwicklung von graphischen Benutzeroberfl chen z B Windows X11 verkn pft 2 Spezialisierung bestimmter Programmiersprachen In diesem Zusammenhang soll auch auf die Spezialisierung einiger Pro grammiersprachen
72. len vergeben wird sondern nur f r eine einzige D h es kann zu einem Zeitpunkt genau eine Komponente aus der Anzahl der deklarierten Komponenten ausgew hlt und benutzt werden Bei Auswahl einer anderen Komponente wird die zuerst benutzte Komponente berschrieben Die Gr e des zu reservierenden Speicherbereichs richtet sich nach der gr ten in der union vorgesehenen Komponente Allgemein ist die Syntax zur Definition einer union die folgende union NAME TYP1 VAR_NAMEI ntweder Benutzung dieser Komponente TYP2 VAR_NAME2 oder dieser Das union Konstrukt wird h ufig dann verwendet wenn von vornherein feststeht da nur eine Komponente der Struktur benutzt wird Es gibt z B die M glichkeit in der oben vorgestellten Struktur Point3D die Koordinaten entweder als ganzzahligen Wert oder als Flie kommazahl abzulegen Ist bekannt da der 3D Punkt immer nur in einer von beiden Varianten benutzt werden soll kann die union zum Einsatz kommen Zur Einfachheit wird im Hauptprogramm nur die x Koordinate eingelesen und ausgegeben mit den anderen Koordinaten kann analog verfahren werden Zun chst die Deklaration im Headerfile struct Point3D union float fx int ix x_koord union float fy int iy y_koord union Die Programmiersprachen C und C Benutzerdefinierte Datenstrukturen Structs Unions 40 TU Wien Institut E114 Prof DDr F Rattay float fz DnE dA z_koord long numbe
73. lt lt betr gt lt lt m_dKontostand lt lt n In dieser Datei tauchen alle Member Funktionen aus der Headerdatei wieder auf und werden implementiert d h ihr Verhalten wird konkret programmiert Damit der Compiler alles richtig verarbeiten kann mu als erstes die Headerdatei mit der Klassendeklaration via include eingebunden werden Dieser Header mu auch an allen anderen Stellen im Programm eingebunden werden an denen die Klasse Konto benutzt werden soll um z B Objekte dieser Klasse zu erzeugen Jeder Funktionskopf in der cpp Datei sieht im Prinzip genauso aus wie eine normale C Funktion nur da er die zus tzliche Klausel Klasse enth lt Dieser Ausdruck wird ben tigt um dem Compiler mitzuteilen zu welcher Klasse die entsprechende Member Funktion geh rt da er das allein durch die include Pr prozessoranweisung nicht ermitteln kann In unserem Beispiel sagt der Ausdruck void Konto einzahlen double betrag also folgendes Die Funktion einzahlen ist eine Member Funktion der Klasse Konto Sie gibt keinen R ckgabewert zur ck void und erh lt genau einen Parameter vom Typ double n mlich betrag In der Schnittstellenbeschreibung der Klasse ist es nicht notwendig einen konkreten Namen f r den Paramter anzugeben genau wie bei der Deklaration von Funktionen in C Im Rumpf der jeweiligen Methode folgt dann der C Code der den Programmablauf dieser Member Funktion beschreibt Die Anweisung cout
74. lter Wert von c im Hautprogramm cout lt lt Normale Variablenuebergabe n cout lt lt Wert von c vor dem Funktionsaufruf lt lt c lt lt nt testFuncl c cout lt lt Wert von c nach dem Funktionsaufruf lt lt c lt lt Wins Aufruf mit Referenz neuer Wert auch im Hauptprogramm cout lt lt Uebergabe per Referenz n cout lt lt Wert von c vor dem Funktionsaufruf lt lt c lt lt Ins testFunc2 c cout lt lt Wert von c nach dem Funktionsaufruf lt lt G lt lt ANTG exit 0 Beispielfunktion zur standardmaessigen Uebergab von Variablen void testFuncl int in Die Programmiersprachen C und C Member Funktionen Zugriffsrechte und andere Konstrukte 70 TU Wien Institut E114 Prof DDr F Rattay int a 5 in a Veraenderung des uebergebenen Parameters return Beispielfunktion zur Manipulation einer Referenz in einer Funktion void testFunc2 int amp inRef int a 5 inRef a Veraenderung des Referenzwertes return Man beachte da man die Begriffe Referenz und Pointer nicht synonym behandeln darf Eine Referenz ist tats chlich ein zus tzlicher Variablenname f r ein bereits deklariertes Objekt w hrend ein Pointer auf die Adresse eines Objekts zeigt Besondere Bedeutung kommt Referenzen in Zusammenhang mit berladenen Operatoren zu wie sie in Kapitel 0 beschrieben
75. m Array aus Pointern include iostream h include stdlib h include kontol h Einf gen der Header Datei in bank cpp main int 1 Anlegen eines Arrays aus Pointern auf Kontoobjekte Konto kontoArray 3 Erzeugen von 3 Objekten der Klasse Konto for i 0 i lt 2 i kontoArray i new Konto i1 100 0 Ausgeben der aktuellen Kontost nde der 3 Objekte kontoArray 0 gt kontostand_ausgeben kontoArray 1 gt kontostand_ausgeben kontoArray 2 gt kontostand_ausgeben 50 von kontoArray 0 abheben und dann den neuen Stand ausgeben kontoArray 0 gt abheben 50 0 kontoArray 0 gt kontostand_ausgeben Versuch 100 von k2 abzuheben geht nicht kein Kredit kontoArray 1 gt abheben 100 0 75 auf k2 einzahlen und Kontostand ausgeben kontoArray 1 gt einzahlen 75 0 kontoArray 1 gt kontostand_ausgeben Erneuter Versuch 100 abzuheben diesmal klappt es kontoArray 1 gt abheben 100 0 Die Programmiersprachen C und C Klassen und Objekte 53 TU Wien Institut E114 Prof DDr F Rattay kontoArray 1 gt kontostand_ausgeben Manipulation und Ausgabe des Standes von k3 kontoArray 2 gt einzahlen 10000 0 kontoArray 2 gt abheben 5000 0 kontoArray 2 gt kontostand_ausgeben Ordnungsgem es L schen des Kontoarrays for i1 0 i lt 2 i delete kontoArray i
76. m Beispiel noch eine Integer Variable um jeden Punkt mit einer eindeutigen Nummer versehen zu k nnen Allgemein lassen sich innerhalb eines structs beliebig viele Variablen zusammenfassen wobei nat rlich irgendwann die Grenzen der berschtlichkeit erreicht werden Die allgemeine Form der Deklaration sieht wie folgt aus struct NAME TYPl VAR_NAMEI TYP2 VAR_NAME2 Das Ergebnis entspricht dann dem im Bild 0 1 dargestelltem Die Programmiersprachen C und C Benutzerdefinierte Datenstrukturen Structs Unions 31 TU Wien Institut E114 Prof DDr F Rattay Allgemeine Struktur eines structs struct Typ1 varl Name Typ2 var2 Typ3 var3 Struktur von Point3D Point3D float y float z long number Bild 0 1 Aufbau und Funktionsweise eines structs Im folgenden ist ein kleines Hauptprogramm angegeben in dem zwei Variablen vom Point3D definiert werden Nach dem Einlesen der Werte f r alle drei Koordinaten beider Punkte erfolgt eine komponentenweise Addition Vektoraddition und das Ergebnis erscheint als Ausgabe auf dem Bildschirm In diesem Beispiel erfolgt die Deklaration der Struktur in einem Headerfile und es wird ihr direkt ein Name Point3D zugeordnet Anschlie end kann man an allen Stellen im Programm an denen die Struktur bekannt ist weitere Variablen vom Typ Point3D deklarieren Diese Vorgehensweise wird des fteren verfolgt da es h ufig vorkommt da neu deklarierte Strukturen
77. maximum a k lt lt endl cout lt lt Maximum Int und Int lt lt maximum j K lt lt endl Die Funktion maximum wurde hier auf zwei unterschiedliche Datentypen angewendet F r den Programmierer ist das Verhalten der Funktion auf den Daten entscheidend die Datentypen sind transparent F r jeden unterschiedlichen Datentypen mu eine eigene Realisierung der Funktion maximum implementiert werden F r die Funktion maximum int a int b gilt die konventionelle Maximumfunktionalit t int maximum int a int b Int Int Die Programmiersprachen C und C berladen von Operatoren und Funktionen 74 TU Wien Institut E114 Prof DDr F Rattay Vergleich if a gt b return b else return a Das Ergebnis der Relation max a b mit a als int Array und b als int Zahl ist lautet b falls b gr er als alle Elemente von a ist ansonsten das erste Element in a das gr er als b ist int maximum const int a b Implementierung array und int Vergleich for int i 0 i lt length a i if a i gt b return alil Teste Array Elemente auf a i gt b return b b gr er als alle Elemente des Arrays Beim berladen von Funktionen mu auf die Auswertungsreihenfolge durch den Compiler geachtet werden damit sowohl eine korrekte Syntax als auch die beim Programmieren beabsichtigte Semantik eines Programmabschnittes verwendet wird Daher sollte
78. n main_value vom Type Ret_stru Initialisierug der Variable main_value x 0 main_value y 0 main_value test Aufrufen der Funktion Bildschirmausgabe printf main_value x d n main_value x printf main_Value y d n main_value y exit 0 Funktionsimplementierung Ret_stru test Ret_stru value Zuweisen von 2 Werten an die Variablen des structs value x 1 value y 2 R ckgabe des structs return value In obigem Beispiel wird das Schl sselwort typedef verwendet um einen neuen Datentypnamen n mlich Ret_stru zu erzeugen Anschlie end kann man Funktionen definieren die diesen Typen als R ckgabetypen s Kapitel 0 besitzen Der Vorteil dieses Vorgehens ist der da der neue Datentypname Die Programmiersprachen C und C Benutzerdefinierte Datenstrukturen Structs Unions 36 TU Wien Institut E114 Prof DDr F Rattay im folgenden Programm genauso verwendet werden kann wie die bereits vorhanden Datentypen z B int oder float Man beachte au erdem die etwas andere Syntax der struct Deklaration bei der Verwendung von typedef Implementierung einer einfachen linearen Liste Eine weitere Besonderheit von Strukturen in C ist die da man bereits innerhalb der Deklaration einer Struktur rekursiv genau auf diese Struktur zur ckgreifen kann H ufig wird dieses Vorgehen zum Aufbau dynamischer Speicherstrukturen im Rechn
79. n der Datei durch die Kombination CRLF zur Zeilenendenkennzeichnung verf lscht wird Beispiel fstream datei hallo in ios nocreatelios ate 1os binary Die Programmiersprachen C und C Streams und File I O 91 TU Wien Institut E114 Prof DDr F Rattay if datei cerr lt lt Fehler return 1 Fehler datei seekg 0 ios geb Auf den Dateianfang datei read obj size of obj Objekt obj lesen datei seekp 0 ios end An das Ende der Datei datei write obj size of obj obj schreiben datei close Datei schlie en Die Programmiersprachen C und C Streams und File I O 92 TU Wien Institut E114 Prof DDr F Rattay Vererbung Das wichtigste Merkmal der Vererbung besteht darin da Eigenschaften einer Klasse von einer anderen Klasse abgeleitet werden k nnen F r neue Klassen m ssen nur noch Neuerungen implementiert werden Eigenschaften die schon einmal in einer anderen Klasse implementiert wurden k nnen bernommen und m ssen nicht noch einmal imp lementiert werden Dies f hrt neben einer Einsparung an Code zu einem Konsistenzvorteil da gemeinsame Eigenschaften nicht an mehreren Stellen stehen und somit nur einmal gepr ft oder ge ndert werden m ssen Die Klasse von der geerbt wird nennt man Basis klasse Die Klasse die erbt nennt man abgeleitete Klasse Fahrzeug Basisklasse Abgeleitete Klasse Bild 0 1 Vererbung Da ein
80. n einer anderen Datei nutzen zu k nnen m ssen in der nutzenden Datei die Funktionsnamen bzw die Deklaration der Funktionen bekannt gemacht werden Hierzu definiert man zu einer Quellcodedatei Dateinamenserweiterung c eine sog Header Datei Dateinamenserweiterung h In dieser Header Datei werden alle Funktionen und Variablen die auch von au erhalb der Quellcodedatei aufrufbar sein sollen deklariert Wie eine solche Deklaration erfolgt wird in Kapitel O erl utert Die Header Datei mu nun mit Hilfe einer sog Pr prozessor Anweisung dem Befehl include lt dateiname h gt in die aufrufende Datei eingebunden werden Der Pr prozessor f hrt wie der Name vermuten l t vor dem eigentlichen Compilieren des Programmcodes einen Vorlauf durch bei dem u a die include Anweisungen durch die jeweils angegebenen Header Dateien ersetzt wird reine Textersetzung Durch dieses Einbinden der Header Datei sind alle in ihr deklarierten Funktionen bekannt und k nnen benutzt werden Die Funktion main Wie bereits angedeutet ist die Funktion main in jedem C Programm erforderlich Jedes Programm beginnt seine Ausf hrung am Anfang vonmain Die Funktion main wird normalerweise andere Funktionen aufrufen um ihre Aufgaben zu erledigen solche Funktionen k nnen aus dem gleichen Die Programmiersprachen C und C Grundbegriffe und Sprachstrukturen 15 TU Wien Institut E114 Prof DDr F Rattay Programm kommen oder aus vorher entwickelten oder
81. n folgende Regeln beachtet werden Wenn sowohl der Identifikationsname einer Funktion als auch die Signatur Art und Reihenfolge der Parameter mit anderen Funktionen bereinstimmen so wird die letzte im Programm aufgelistete Funktionsdefinition verwendet Beispiel void funktionsname int f1 char ch void funktionsname int xxx char zeichen Wenn der Identifikationsname berladener Funktionen und die Signatur bereinstimmen jedoch der Typ des R ckgabewerts nicht so stellt dies eine fehlerhafte Zweitdeklaration dar Wenn sich Signaturen von zwei oder mehreren Funktionen in bezug auf den Typ oder die Zahl der Argumente unterscheiden werden diese Funktionen als berladen betrachtet Hierbei bestimmt die Reihenfolge der Parameter in der Argumentenliste bereits die neue Funktion Vorsicht Ist eine Zuweisung nicht direkt m glich versucht der Compiler sie ber eine Standard Konversion zu erreichen gibt es keine passende versucht der Compiler eine vom Programmierer definierte Existiert auch diese nicht wird ein Fehler ausgegeben Die Programmiersprachen C und C berladen von Operatoren und Funktionen 75 TU Wien Institut E114 Prof DDr F Rattay C ist bzgl der Typenpr fung wesentlich genauer als ANSI C Vorsicht bei mehrdeutigen bereinstimmungen Beispiel void f1 unsigned int void EL int void f1 char unsigned int var void l var Mehrdeutigkeit Ein Compiler versucht
82. ndif Die Implementierung der Klasse Rec Implementierung der Methoden von Rec tinclude iostream h include rec h default Konstruktor Rec Rec m_dLowerLeftX 0 0 m_dLowerLeftY 0 0 m_dUpperRightX 0 0 m_dUpperRightY 0 0 Konstruktor mit dem explizit Koordinaten gesetzt werden koennen Rec Rec const double amp l1x const double amp 1l1ly const double amp urx const double amp ury m_dLowerLeftX Il x m_dLowerLeftY ly m_dUpperRightX urx m_dUpperRightY ury Die Programmiersprachen C und C Member Funktionen Zugriffsrechte und andere Konstrukte 57 TU Wien Institut E114 Prof DDr F Rattay Ausgabe des Flaecheninhalts auf dem Bildschirm void Rec printPlaneContent double pc pc m_dUpperRightX m_dLowerLeftX m_dUpperRightY m_dLowerLeftY cout lt lt Flaecheninhalt des Rechtecks lt lt pc lt lt n return Ausgabe der Koordinaten des Rechtecks auf dem Bildschirm void Rec printCoordinates cout lt lt Untere linke Ecke X lt lt m_dLowerLeftX lt lt Untere linke Ecke Y lt lt m_dLowerLeftY lt lt n cout lt lt Untere rechte Ecke X lt lt m_dUpperRightX lt lt Untere rechte Ecke Y lt lt m_dLowerLeftY lt lt Tan cout lt lt Obere rechte Ecke X lt lt m_dUpperRightX lt lt Obere re
83. nen hier auch eingesetzt werden Der Vorteil beim Einsatz des objektorientierten Konzepts liegt nun in der Nutzung der Eigenintelligenz des Operators gt gt Eigenschaften des Operators gt gt Das Ergebnis der Anwendung von cin gt gt x ist stets eine Referenz auf das Objekt der Klasse iostrean Um den Erfolg bzw den Status einer Eingabe zu verfolgen werden Zustands variablen gesetzt Dar ber hinaus wurde der Operator auf streams definiert um analog zur C Syntax den Erfolg einer Streamoperation testen zu k nnen nn gibt einen boolschen Wert aus Beispiel if cin gt gt x Dann Fehler aufgetreten Bereits durch die Syntax eines Programms wird der erwartete Typ der Eingabedaten festgelegt Beispiel ASTA 23 float y char name 10 cin gt gt x gt gt y gt gt name Abh ngig von den eingegebenen Daten selbst falls keine base field Einstellung besetzt ist wird die Eingabe wie folgt interpretiert octal falls erstes Zeichen eine 0 Null und sonst nur Ziffern 0 9 hexadez falls die ersten Zeichen 0x sonst A F und 0 9 dez falls als erste Zeichen 1 2 9 sonst 0 9 Die Programmiersprachen C und C Streams und File I O 85 TU Wien Institut E114 Prof DDr F Rattay F hrende Leerzeichen werden stets berlesen Das Lesen eines Operanden endet wenn der Datenstrom mit einem EOF beendet wird ein Zeichen erkannt wird welches nicht zum Typ des zu beschreibenden O
84. ngen Zeiger und Arrays sehr eng zusammen Jede Operation mit Array Indizes kann auch mit Zeigern ausgedr ckt werden Die Anweisung int al6 deklariert ein Array mit 6 Elementen numeriert von a 0 bis a 5 Deklariert man p_a als Zeiger auf einen int Wert Inte tpo so kann man nach der Zuweisung Die Programmiersprachen C und C Zeiger 26 TU Wien Institut E114 Prof DDr F Rattay p_a amp 2 0 ber den Zeiger p_a auf das Array zugreifen p_a zeigt dann auf das Element a 0 x p a hat demnach das gleiche Ergebnis wie die Anweisung x a 0 Zeigt p_a auf ein Element des Arrays so zeigt p_a 1 auf das nachfolgende Element d h durch erh hen des Wertes von p_a lassen sich die einzelnen Array Elemente durchlaufen Zeigt also p_a auf a 0 so liefert p_a 1 den Inhalt von all Dies gilt unabh ngig vom Datentyp oder der Gr e der Elemente im Array a Die Bedeutung von addiere 1 zu einem Zeiger und als Verallgemeinerung die gesamte Arithnetik mit Zeigern ist so definiert da p_a 1 auf das n chste Objekt zeigt und da pa i auf das i te Objekt nach p_a zeigt Es besteht also ein enger Zusammenhang zwischen Array Indizes und Zeigerarithmetik Nach Sprachdeinition ist der Wert einer Variablen oder eines Ausdrucks vom Typ Array die Adresse des Elementes 0 des Anfangselementes des Array Deshalb sind nach der Zuweisung p_a amp a 0 die Werte von p_a und a identisch Da der Name eines Vektors
85. nkt wird Die Programmiersprachen C und C Vererbung 95 TU Wien Institut E114 Prof DDr F Rattay public es gibt keine weiteren Einschr nkungen protected alle public Komponenten der Basisklasse sind ab der aktuellen Klasse nur noch protected nur noch f r die eigene und die abgeleiteten Klassen sichtbar private alle Komponenten der Basisklasse werden zu privaten Komponenten Beispiel int main KBruch x 99 12 x Ausgabe Liefert das Ergebnis 99 12 auf dem Bildschirm cout lt lt x ist lt lt x istkuerzbar kuerzbar unkuerzbar lt lt endl cout lt lt kuerzen lt lt endl x kuerzen cout lt lt endl lt lt x x Ausgabe Liefert das Ergebnis 33 4 auf dem Bildschirm Die Programmiersprachen C und C Vererbung 96 TU Wien Institut E114 Prof DDr F Rattay Literatur zur Programmiersprache C 10 Joussutis N Objektorientierte Programmierung in C Addison Wesley 1994 11 Stroustrup B Die C Programmiersprache Addison Wesley 1992 12 Stroustrup B The Design and Evolution of C Addison Wesley 1984 13 Lippman S C Einf hrung und Leitfaden Addison Wesley 1991 14 Booch G Object oriented Analysis and Design Standardwerk zu objektorientierter Analyse und Design 15 Kruglinski D Inside Visual C 4 2 Microsoft Press Die Programmiersprachen C und C Literatur zur Programmiersprache C 97
86. nnen sondern direkt durchgef hrt werden m ssen Um dieses Ziel zu erreichen kann eine Klasse eine andere als friend deklarieren Die so deklarierte zweite Klasse hat dann ausnahmsweise auch Zugriff auf die privaten Datenstrukturen der ersten Klasse Ein Anwendungsfall sind z B Status Objekte wie sie in der Computergrafik verwendet werden und die die gesamten Grunddaten einer Grafikpipeline enthalten Auf diese Daten wird in der Regel sehr oft zugegriffen und die Zugriffe m ssen gerade in der Computergrafik m glichst schnell ablaufen An dieser Stelle ist der Zugriff ber eine Methode zu langsam da dabei jedesmal ein Funktionsaufruf durchgef hrt werden mu wobei dann wom glich auch noch Parameter bergeben werden m ssen Hier nun ein einfaches Beispiel zur Deklaration von friends Headerdatei zur Klasse A ifndef _AH_ define _A_H_ include iostream h tinelude b h class A Konstruktor public A const inte amp Methode zur Summenbildung void SumAPlusB const B amp Privates Attribut zu Demo Zwecken private int m_iWert endif Implementierung von A include a h include b h Die Programmiersprachen C und C Member Funktionen Zugriffsrechte und andere Konstrukte 65 TU Wien Institut E114 Prof DDr F Rattay Konstruktor A A const int amp init m_iWert init Druckt die Summe des Wert ines Objektes von A und B auf
87. nnzeichnet den fehlerfreien Stream ios eofbit 0x01 kennzeichnet das Erreichen des Endes eines Streams ios failbit 0x02 letzter Vorgang nicht korrekt abgeschlossen jos badbit 0x04 Fataler Fehler mit Datenverlust ios hardfail 0x80 Hardware Fehler erkannt Der Unterschied zwischen failbit und badbit liegt darin da bei failbit der Datenstrom erhalten werden konnte ohne da mit Datenverlusten zu rechnen ist undbadbit jedoch mit Datenverlust einhergeht Das Lesen des Datenstroms wird stets unterbrochen Beispiel RRZN int wert cin gt gt wert Eingabe xyz failbit gesetzt da zZaehler erwartet werden cin gt gt wert Eingabe Oxyz badbit und failbit gesetzt da x verloren geht y ist im Puffer und wird als n chstes gelesen Um den Status eines Stroms zu lesen gibt es die Anweisungen int ios rdstate void Um den Status eines Stroms zu l schen oder speziell zu setzen wurde die Anweisung void ios clear int status 0 definiert Beispiel int Konto lese_Nummer istream amp strm int Knt_nnmr ifl strm gt gt Knt_nmr return L ifl Knt_nmr lt 0 strm clear strm rdstate I ios failbit Fehler im Stream return Knt_nnr Die Programmiersprachen C und C Streams und File I O 87 TU Wien Institut E114 Prof DDr F Rattay VO Operatoren auf eigenen Datentypen Der wesentliche Vorteil von Streams liegt darin da eigene Ein und Ausgabemech
88. ollen Dieses Erzeugen erfolgt direkt zu Beginn der main Funktion In den Zeilen Konto k1 123456 100 0 Konto k2 221069 50 0 Konto k3 14443 0 0 werden drei Objekte der Klasse Konto angelegt Im wesentlichen findet hier nichts anderes als eine Variablendeklaration statt nur da der Typ der Variablen ein Abstrakter Datentyp n mlich die Klasse Konto ist Man spricht in diesem Zusammenhang auch von Instanziierung eines Objektes der Klasse Konto bzw vom Erzeugen von Instanzen einer Klasse Hier jetzt der Sourcecode des Hauptprogramms include iostream h include stdlib h include konto h Einf gen der Headerdatei in bank cpp main Erzeugen von 3 Objekten der Klasse Konto Konto k1 123456 100 0 Konto k2 221069 50 0 Die Programmiersprachen C und C Klassen und Objekte 49 TU Wien Institut E114 Prof DDr F Rattay Konto k3 14443 0 0 Ausgeben der aktuellen Kontost nde der 3 Objekte kl kontostand_ausgeben k2 kontostand_ausgeben k3 kontostand_ausgeben 50 von kl abheben und dann den neuen Stand ausgeben kl abheben 50 0 kl kontostand_ausgeben Versuch 100 von k2 abzuheben geht nicht kein Kredit k2 abheben 100 0 75 auf k2 einzahlen und Kontostand ausgeben k2 einzahlen 75 0 k2 kontostand_ausgeben Erneuter Versuch 100 abzuheben diesmal klappt es k2 abheben 100 0 k2 kon
89. onen Destruktor 79 TU Wien Institut E114 Prof DDr F Rattay void Bruch Ausgabe cout lt lt zaehler lt lt lt lt nenner lt lt endl Bruch Bruch operator Bruch b return Bruch zaehler b zaehler nenner b nenner Bruch Bruch operator int f return Bruch f zaehler nenner Die Konstruktoren der Klasse Bruch unterscheiden sich lediglich durch die Parameter mit denen sie aufgerufen werden Dadurch entscheidet der Compiler selbst welcher der Konstruktoren geeignet ist int main cout lt lt Testprogramm f r die Klassen Bruch und Bruch lt lt endl lt lt endl Bruch a Bruch b 4 Bruch c 7 9 a Ausgabe Liefert das Ergebnis 0 1 auf dem Bildschirm b Ausgabe Liefert das Ergebnis 4 1 auf dem Bildschirm c Ausgabe Liefert das Ergebnis 7 9 auf Die Programmiersprachen C und C berladen von Operatoren und Funktionen 80 TU Wien Institut E114 dem Bildschirm Die Programmiersprachen C und C berladen von Operatoren und Funktionen Prof DDr F Rattay 81 TU Wien Institut E114 Prof DDr F Rattay Streams und File VO In diesem Abschnitt wird die grunds tzliche Eigenschaft der Ein und Ausgabe mit Hilfe von Streams vorgestellt Es handelt sich hierbei um eine Hierarchie voneinander abgeleiteten Klassen Leider existiert in C noch keine einheitlich standardisierte Form der I 10
90. r Nun das Hauptprogramm include stdlib h include pun3d h main float fin Variable zur Eingabe der Koordinaten als Flie kommazahl int iin Variable zur Eingabe der Koordinaten als ganze Zahl int choice Auswahlvariable struct Point3D a Definition einer Variablen des Typs Point3D elrscr Bildschirm l schen printf Soll die Koordinate als ganze Zahl 1 Eingeben oder als Flie kommazahl 2 Eingeben angegeben werden n scanf d amp choice switch choice case 1 printf Bitte die x Koordinate des 1 Punktes eingeben n scanf f amp fin a x_koord fx fin Zuweisung an die Fie kommakomponente Die Programmiersprachen C und C Benutzerdefinierte Datenstrukturen Structs Unions 41 TU Wien Institut E114 Prof DDr F Rattay break case 2 printf Bitte die x Koordinate des 1 Punktes eingeben n scanf d amp siin a x_koord ix iin Zuweisung an die Integerkomponente break default break printf Flie kommakomponente x f n a x_koord fx printf Integerkomponente x d n a x_koord ix exit 0 Im vorangegangenen Beispiel erkennt man die Deklaration und Benutzung einer Datenstruktur die innerhalb eines structs mehrere unions verwendet um die wahlweise Speicherung der Punktkoordinaten in Ganz oder Flie kommazahlen zu erm glic
91. rLeftY lt lt n Setzen der Rechteckkoordinaten durch Angabe von linker unterer und rechter oberer Ecke void Rec setCoordinates const double amp 1l11x const double amp lly const double amp urx const double amp ury m_dLowerLeftX 1x m_dLowerLeftY ly m_dUpperRightX urx m_dUpperRightY ury Neu Setzen der neuen Koordinaten m_dUpperLeftx 11x m_dUpperlLeftY ury m_dLowerRightX urx m_dLowerRightY 11y Wenn man die beiden Dateien gegen die alten Versionen im Projekt austauscht dann ndert sich am Verhalten des Hauptprogramms nichts Lediglich der interne Aufbau der Klasse Rec hat sich ge ndert was sich aber in der Schnittstelle nicht niederschl gt Deshalb k nnen Objekte dieser Klasse genauso verwendet werden wie vorher Die Programmiersprachen C und C Member Funktionen Zugriffsrechte und andere Konstrukte 64 TU Wien Institut E114 Prof DDr F Rattay Friends Nachdem wir gerade die Technik zum Verstecken von Informationen kennengelernt haben folgt jetzt eine Methode mit der man diese Sicherheitsmechanismen gezielt au er Kraft setzen kann Man sollte das Konstrukt der friend Klassen nur sehr sparsam verwenden und wenn es sich umgehen l t am besten berhaupt nicht Allerdings kann es manchmal vorkommen da vor allem aus Geschwindigkeitsgr nden Zugriffe auf interne Datenstrukturen nicht ber Methoden erfolgen k
92. ration von List_element im Headerfile von Interesse Sie ist hier angegeben typedef struct List_element struct List_element next int entry List_element Wie man sieht bezieht sich bereits die Deklaration des structs auf sich selbst Das Nachfolgeelement soll wieder ein Zeiger auf ein Listenelement sein Eine solche Deklaration ist in C erlaubt und durchaus blich Es g be auch gar keine andere M glichkeit eine Komponente einer Struktur auf die gleiche Die Programmiersprachen C und C Benutzerdefinierte Datenstrukturen Structs Unions 39 TU Wien Institut E114 Prof DDr F Rattay Struktur zeigen zu lassen respektive sie daf r vorzubereiten Man beachte da gleichzeitig mit der Deklaration der Struktur auch ein neuer Typname List_element vereinbart wird der im Hauptprogramm genauso verwendet werden kann wie ein eingebauter Typname Das Listenbeispiel zeigt eine ganz typische Anwendung f r structs wie sie in C h ufig eingesetzt wird Der Einsatz von Strukturen erh ht die bersichtlichkeit in der Programmierung und ist au erdem die Basis f r die sp tere Erweiterung von C um Klassen und Objekte s C Teil dieses Skriptes Unions Eine weitere M glichkeit komplexere Datenstrukturen zu bearbeiten bietet das union Konstrukt Bei seiner Benutzung wird fast genauso vorgegangen wie bei der eines structs nur das nicht f r alle Komponenten Speicherplatz bei der Defintion einer Variab
93. rfach hintereinander ausgef hrt werden Die Leserichtung ist stets von links nach rechts Beispiel cout lt lt f_wert lt lt d_wert lt lt name Entspricht obigem Manipulatoren Manipulatoren sind spezielle Objekte deren Aufgabe es ist die Aus bzw die Eingabe von Daten zu steuern Mit der Anwendung eines Manipulator Objektes ist nicht immer eine Ausgabe oder eine Eingabe verbunden Die Programmiersprachen C und C Streams und File I O 82 TU Wien Institut E114 Prof DDr F Rattay Es gibt parameterlose und parameterbehaftete Manipulatorobjekte Die meisten Objekte werden ber die Datei iostream h gelesen Zus tzlich ben tigt wird die Header Datei iomanip h falls parametarisierte Manipulatoren genutzt werden sollen Manipulatoren werden speziell zur Formatierung herangezogen Die wichtigsten sind flush Ausgabepuffer leeren endl In ausgeben und Ausgabepuffer leeren ends Io ausgeben und Ausgabepuffer leeren Ws Trennzeichen berlesen dcc Dezimalkonvertierung hex Hexadezimalkonvertierung OCE Oktalkonvertierung setw int n Ausgabebreite setzen f r das unmittelbar folgende Datum setprecision int n Setzen der Ausgabegenauigkeit Stellen hinter dem Punkt setfill int c Setzen des F llzeichens default Parameterlose Manipulatoren sind Funktionen vom Typ ostream amp manipulatorname ostream amp str wobei ost ream durch die anderen Stream Klassen
94. rt worden sind Hauptprogramm zur Definition von Referenzen include iostream h include conio h Ausnmahmsweise Klassendeklaration in cpp File class ConstTest Attribute public int m_iA Methoden public ConstTest int in m_iA in F3 Die Programmiersprachen C und C Member Funktionen Zugriffsrechte und andere Konstrukte 72 TU Wien Institut E114 Prof DDr F Rattay int main const int a 10 Konstante Integer Variable mit Init const double b 3 141592 Konstante double Variable mit Init const double c Konstante double Variable ohne Init Fehler const double c 6 5 Konstante double Variable mit Init Kein Fehler const ConstTest d 10 Konstantes Objekt der Klasse ConstTest Bildschirm loeschen celrscr Initialisierung a 5 Versuch einer Zuweisung Fehlermeldung cout lt lt Wert von a lt lt a lt lt Wert von b lt lt b lt lt Wert von c lt lt G lt lt n cout lt lt Member Variable a des Objekts d lt lt d m_ iA lt lt n d m_iA 5 Versuch des schreibenden Zugriffs auf m_iA Fehler exit 0 Nach den ersten beiden Kapiteln des C Kurses sind die wesentlichen Grundlagen zur objektorientierten Programmierung in C gelegt Die n chsten beiden Kapitel stellen weitergehende Konzepte vor und vert
95. sammengefa t Die Programmiersprachen C und C Einf hrung 6 TU Wien Institut E114 Prof DDr F Rattay Analyse und Designphase Debuggen Fertiges Programm Bild 0 2 Editier Compilier Link Debug Zyklus Der gerade skizzierte Ablauf ist typisch f r den Entwicklungsproze bei Benutzung einer Compilersprache Er wird Turnaround genannt und die Zeit die f r einen Durchlauf ben tigt wird ist als Turnaround Zeit bekannt Je k rzer diese Zeit ist desto effizienter sind die Entwicklungswerkzeuge Compiler Linker etc Im Prinzip stellen die Programme Compiler Linker Editor und Debugger eigenst ndige Programme dar die einzeln aufgerufen und mit Eingaben versorgt werden m ssen Um den Komfort f r den Entwickler zu erh hen sind sie heute meistens in einer Integrierten Entwicklungsumgebung oder IDE Integrated Development Environment zusammengefa t Eine IDE erleichtert den Umgang mit den einzelnen Komponenten indem z B bei Auftreten eines Fehlers bei der Compilierung direkt der Editor gestartet das Sourcefile geladen und die entsprechende Zeile im Sourcefile angezeigt wird Au erdem bieten IDEs in der Regel weitgehende M glichkeiten um gro e Projekte zu verwalten und graphische Benutzeroberfl chen zu implementieren 2 Die Sprache C ist eine Compilersprache es gibt auch interpretierte Versionen die allerdings keine gro e Verbreitung gefunden haben im Gegensatz dazu ist z B
96. sen wie die CPU des Rechners aufgebaut ist aus welchen Registern sie besteht und an welchen Adressen im Speicher ein bestimmtes Betriebssystem Unterprogramm s Kapitel 0 Kapitel 0 anf ngt Assembler bietet aber immerhin im Unterschied zur reinen Maschinensprache die M glichkeit Befehle mit einigerma en verst ndlichen K rzeln darzustellen z B wird ein Sprungbefehl um an eine andere Stelle im Programm zu gelangen oft durch JMP f r JuMP abgek rzt Die reine Maschinensprache die haupts chlich in der Anfangszeit der Programmierung benutzt wurde bietet nicht einmal diesen Komfort sondern codiert alle n tigen Anweisungen direkt im bin ren Format der einzigen Sprache die der Rechner direkt versteht Trotz des hohen Aufwandes und der gro en Fehleranf lligkeit die Assembler Programme mit sich bringen haben sie auch heute noch ihre Berechtigung da sie n mlich in der Regel sehr schnell und sehr kompakt sind Aus diesen Gr nden wird Assembler oft in systemnahen oder sehr geschwindigkeitsabh ngigen Bereichen wie z B der Programmierung von Treibersoftware verwendet Ein sehr viel h heres Abstraktionsniveau bieten die Hochsprachen wie etwa BASIC Pascal COBOL Smalltalk usw sowie die visuellen Entwicklungssysteme neuerer Bauart wie etwa Visual BASIC Delphi oder Powerbuilder Bei Verwendung einer solchen h heren Programmiersprache sind genaue interne Kenntnisse des Rechners nicht mehr notwendig Es werden Befeh
97. sprachen Eine Klasse beschreibt zur Entwurfszeit des Programms die Eigenschaften den Status und die F higkeiten die Methoden der zur Laufzeit von ihr abgeleiteten Objekte Objekte werden also nicht in einer Klasse definiert sondern durch eine Klasse Es k nnen beliebig viele Objekte einer bestimmten Klasse erzeugt werden aber jedes erzeugte Objekt geh rt zu genau einer Klasse Objekte k nnen zur Laufzeit miteinander kommunizieren sie k nnen Objekte aus anderen Klassen enthalten und sie k nnen aufgrund der in ihrer Klasse beschriebenen Methoden Aktionen durchf hren Au erdem k nnen weitere Beziehungen z B Vererbung zwischen Objekten bestehen wobei diese Beziehungen ebenfalls durch Klassendeklarationen beschrieben werden Zur Verdeutlichung des Verh ltnisses von Klassen und Objekten dient auch das folgende Bild Klasse Beschreibung der Methoden und Attribude der sp ter generierten Objekte Klasse 1 Klasse 2 Schablone 1 Schablone 2 Methoden Methoden F higkeiten F higkeiten Attribute Attribute Status Status Erschaffung Lebendauer Vernichtung Bild Verh ltnis von Klassen und Objekten Beispiel Bankkonto Das generelle Vorgehen in der objektorientierten Programmierung sieht immer so aus da man versucht die Problemstellung durch eine Ansammlung von Objekten und die Beziehungen zwischen ihnen zu beschreiben Die Objekte m ssen dann einzelnen Klassen zugeordnet werden welche anschlie
98. synonym zur Adresse des Anfangselements ist kann man die Zuweisung pa amp a 0 auch so formulieren pa a Wesentlich berraschender ist die Tatsache da statt a i auch a i geschrieben werden kann Der Compiler wandelt a i sofort in a i um die zwei Angaben sind quivalent Einen Unterschied zwischen Arraynamen und Zeiger mu man sich allerdings merken Ein Zeiger ist eine Variable also sind pa a und pa erlaubt Ein Array Name ist jedoch keine Variable Ausdr cke wie a pa oder a sind nicht erlaubt Speicherverwaltung mit Zeigern Wie bereits angedeutet wurde kommt es bei Programmieraufgaben oft vor da bei der Programmerstellung Umfang und Art der zu bearbeitetenden und zu speichernden Daten nicht festgelegt ist F r derartige h ufig auftretende F lle eignet sich die sogenannte dynamische Speicherverwaltung Mit Hilfe der Standardbibliotheksfunktionmalloc lassen sich in einem Teil des Hauptspeichers dem sogenannten Heap engl Halde Speicherbl cke definierter Gr e nach Bedarf reservieren der dann nach Gebrauch mit Hilfe der ree Funktion wieder freigeben werden mu Zum Zugriff auf den reservierten Speicherblock bedient man sich eines Zeigers Definiert man zum Beispiel den Zeiger p mit char p als Zeiger auf eine Variable vom Typ char und blockgroesse mit int blockgroesse 10 so kann mit Hilfe der Anweisung p char malloc blockgroesse ein Speicherblock mit der durch blockgroesse festgel
99. syntaktischen Vorschriften sind verbindlich und zum Teil auch von dem verwendeten Compiler abh ngig w hrend die stilistischen Aspekte die weiter unten erl utert werden im Laufe der Zeit gewachsen sind und die Lesbarkeit des C Quellcodes verbessern Syntaktisch gelten die folgenden Grundregeln 7 Namen bestehen aus Buchstaben und Ziffern Das erste Zeichen mu ein Buchstabe sein Das Unterstrichzeichen _ gilt als Buchstabe Nur die ersten acht Zeichen eines Namens sind signifikant es k nnen aber durchaus mehr Zeichen benutzt werden Es d rfen keine Schl sselw rter als Namen vergeben werden Gro und Kleinbuchstaben werden unterschieden Diese allgemeinen Regeln m ssen immer ber cksichtigt werden w hrend die folgenden Richtlinien im wesentlichen die Lesbarkeit des Codes f rdern Variablennamen sollten eine Bedeutung erkennen lassen hierbei erh ht insbesondere die Verwendung des Zeichens _ die Lesbarkeit von langen Namen Die Programmiersprachen C und C Variablen Einfache Datentypen 17 TU Wien Institut E114 Prof DDr F Rattay Variablennamen werden im allgemeinen klein begonnen und gem der g ngigen Schreibweise fortgesetzt w hrend Konstanten bis auf die Typkennzeichnung gro geschrieben werden Dem eigentlichen Variablennamen wird ein K rzel f r den Variablentyp vorangestellt Zu diesen Regeln einige Beispiele Negativbeispiele SName ung ltig weil kein Buc
100. t so da der Einbau dieses Aufrufs in eine gt gt bzw lt lt zur Ausgabe des Funktionswertes f hrt Dieser Wert entspricht dem alten Flageintrag bevor set f zur Wirkung kommt Die einzelnen Bits sollten sinnvoll gesetzt werden d h sie sollten sich nicht widersprechen Ansonsten werden default Werte angenommen Beispiel cout width 17 cout setf ios scientific 1os scientific jios fixed cout precision 3 cout fill cout lt lt 317 2299 lt lt endl Ergibt als Ausgabe 3 172e 02 Gesamte Stellenzahl 17 Die Programmiersprachen C und C Streams und File I O 84 TU Wien Institut E114 Prof DDr F Rattay Bemerkungen Die Breite der Ausgabe wird nicht fest eingehaltene wenn die Stellenzahl der Ausgabe gr er ist als die vorgeschriebene Breite Somit entspricht diese Zahl eher einer unteren Schranke die mindestens erf llt werden mu Es wird immer bis auf diese Stellenzahl mit F llzeichen aufgef llt Um die Oder Anweisung in der set Funktion zum L schen der Bits kompakter zu schreiben gibt es vordefinierte Bit Masken basefield dec oct hex adjustfield left right internal floutfield scientific fixed Zur Eingabe von Objektdaten ber streams wird standardm ig die Klasse istream verwendet Die Eingabe erfolgt unter der Verwendung des Operators gt gt als Standardeingabestrom wird ein verwendet Die zuvor besprochenen Formatoperatoren k n
101. t werden kann und somit Vektor 2 wieder vom Typint ist Die Programmiersprachen C und C Variablen Einfache Datentypen 20 TU Wien Institut E114 Prof DDr F Rattay Kontrollstrukturen Unter dem Begriff Kontrollstrukturen versteht man alle Arten von Anweisungen die einen Einflu auf die Reihenfolge nehmen in der ein Quellcode abgearbeitet wird Hierzu geh ren Schleifenstrukturen Verzweigungen und Bedingungsketten Der Einflu bereich einer Kontrollstruktur ist in der Regel durch den zur Anweisung geh rigen Block begrenzt Vor den weiteren Ausf hrungen sollen deshalb noch einmal kurz die beiden Begriffe Anweisung und Block ins Ged chtnis zur ckgerufen werden Ein Ausdruck wie zum Beispiel n n t5D wird durch ein nachgestelltes Semikolon zu einer Anweisung das Semikolon beendet die Anweisung Mehrere Anweisungen und oder Vereinbarungen Deklarationen Definitionen k nnen durch geschweifte Klammern zu einem Block zusammengefa t werden Beispiel Anfang des Blocks a int n 0 1 Vereinbarung er int m 1 2 Vereinbarung SL n n 5 1 Anweisung EY m m 2 2 Anweisung Ende des Blocks Ein solcher Block ist syntaktisch quivalent zu einer einzelnen Anweisung Nach der rechten Klammer steht kein Semikolon In jedem Block k nnen Variablen vereinbart werden if Anweisung Die i f Anweisung erzeugt eine Verzweigungsstruktur die durch einen Entscheidungsausdruck
102. tX m_dUpperLleftY Neu jetzt wird auch die untere rechte Eck gespeichert double m_dLowerRightX m_dLowerRightY Die Programmiersprachen C und C Member Funktionen Zugriffsrechte und andere Konstrukte 61 TU Wien Institut E114 Prof DDr F Rattay Obere rechte Ecke wird gespeichert wie bisher double m_dUpperRightX m_dUpperRightY endif Im folgenden die modifizierte Implementierung der Klasse Rec Implementierung der Methoden von Rec include iostream h include recl h default Konstruktor Rec Rec m_dLowerLeftX 0 0 m_dLowerLeftY 0 0 m_dUpperLeftX 0 0 Neu x Koordinate der oberen linken Ecke wird initialisiert m_dUpperLeftY 0 0 Neu y Koordinate der oberen linken Ecke wird inittalisiert m_dLowerRightX 0 0 Neu x Koordinate der unteren rechten Ecke wird initialisiert m_dLowerRightY 0 0 Neu y Koordinate der unteren rechten Ecke wird initialisiert m_dUpperRightX 0 0 m_dUpperRightY 0 0 Konstruktor mit dem explizit Koordinaten gesetzt werden koennen Rec Rec const double amp l1x const double amp 1l1ly const Die Programmiersprachen C und C Member Funktionen Zugriffsrechte und andere Konstrukte 62 TU Wien Institut E114 Prof DDr F Rattay double amp urx const double amp ury m_dLowerLeftX 1x m_dLowerLeftY lly m_d
103. tenstrukturen dynamisch erzeugen Auf diese wird in Kapitel 0 noch n her eingegangen Die Programmiersprachen C und C Zeiger 28 TU Wien Institut E114 Prof DDr F Rattay Funktionen Durch die Verwendung von Funktionen k nnen gro e Problemstellungen in kleinere Teilprobleme untergliedert werden wodurch sich eine wesentlich bersichtlichere Programmstruktur ergibt Dabei gilt wie f r auch f r Variablen da jede Funktion bevor sie in einer C Quellcode Datei genutzt werden kann zun chst bekannt gemacht deklariert werden mu Dies geschieht durch die Definition eines sogenannten Prototyps der nichts anderes ist als ein Aufrufmuster f r die entsprechende Funktion Die Syntax bei der Definition von Funktionen ist dabei wie folgt lt R ckgabetyp gt lt Funktionsname gt lt bergabetyp gt lt bergabetyp2 gt lt bergabetyp3 gt Das folgende Beispiel deklariert die Funktion Stringausgeben Beispiel int Stringausgeben const char const int Hierbei wird ein Zeiger auf den auszugebenden String bergeben und ein Integer der zum Beispiel angeben kann wie viele Zeichen des Strings ausgegeben werden m ssen Der Typ int der vor dem Funktionsnamen steht beschreibt den Typ des R ckgabewertes den die Funktion ber return an die Aufruffunktion z B main zur ckgibt Die Deklarationszeile mu wie bereits erw hnt in jeder Datei eingef gt werden in der die Funktion genutzt wird D
104. tisch mit dem in trenn angegebenen Wert gelesen wurde kann der Lesevorgang auch vorzeitig Zahl der gelesenen Zeichen lt anz abgebrochen werden trenn ist default mit EOF belegt int istream qgcount void Diese Funktion gibt als R ckgabewert die Zahl der beim letzten get getline bzw read Aufruf gelesenen Zeichen aus ostream amp ostream flush void leert den Ausgabepuffer in dem alle darin befindlichen Zeichen ausgegeben werden int istream peek void liest das n chste Zeichen aus der Eingabe ohne es dem Datenstrom zu entnehmen Hiermit wird eine kontextsensitive Verhaltensweise eines Programms erreicht werden Ein mehrfaches peek liefert identische Zeichen istream amp istream putback char c schreibt ein Zeichen in den Eingabestrom so da als n chstes Zeichen c gelesen wird Gelesene Zeichen k nnen so wieder in den Eingabestrom zur ckgelangen Status Abfragen Speziell beim Lesen unbekannter Zeichenstr me k nnen Fehler und unerwartete Zeichen auftreten Typische Zeichen sind Gelesenes Zeichen pa t nicht zum Datentyp und kann auch nicht konvertiert werden Das Datenstromende ist erreicht worden Die Programmiersprachen C und C Streams und File I O 86 TU Wien Institut E114 Prof DDr F Rattay Ein Hardware Fehler ist aufgetreten Diese Stream Eigenschaften werden als Flags in einen Statuswort in ios gespeichert Die Stati von io_state sind jios goodbit 0x00 ke
105. tostand_ausgeben Manipulation und Ausgabe des Standes von k3 k3 einzahlen 10000 0 k3 abheben 5000 0 k3 kontostand_ausgeben exit 0 Programm ordnungsgem verlassen Im folgenden Bild ist noch einmal das Zusammenspiel der drei Dateien graphisch aufbereitet Die Programmiersprachen C und C Klassen und Objekte 50 TU Wien Institut E114 Prof DDr F Rattay Headerdatei 1 mit Klassen deklaration 1 Implementierung der Methoden aus Klasse 1 Bild Zusammenspiel von Header Implementierungs und Hauptprogrammdatei Konstruktoren und Destruktoren Headerdatei 2 mit Klassen deklaration 2 Implementierung der Methoden aus Klasse 2 Die runden Klammern am Ende der einzelnen Zeilen deuten auf die bergabe von Parametern an eine Funktion hin und an dieser Stelle wird tats chlich eine spezielle Funktion aufgerufen Jedesmal wenn in einem C Programm ein Objekt einer Klasse erzeugt wird dann wird genau zu diesem Zeitpunkt eine spezielle Funktion der sogenannte Konstruktor aufgerufen Diese Funktion findet sich auch in der Klassendeklaration wieder und tr gt immer exakt den gleichen Namen wie die Klasse Ihr Gegenst ck ist der Destruktor der genau dann aufgerufen wird wenn ein Objekt gel scht wird In unserem einfachen Beispiel ist er leer er bekommt aber gr ere Bedeutung wenn ein Objekt dynamisch erzeugt werden soll es also ber Pointer angesprochen wird
106. truktor ist so deklariert da er zwei Parameter erh lt n mlich die Kontonummer vom Typ long und den Betrag vom Typ double den das Konto bei seiner Er ffnung also der Erzeugung des Kontoobjektes enthalten soll Die konkreten Werte f r die Parameter werden also im Hauptprogramm direkt an den Konstruktor bergeben der sie dann den beiden Member Variablen zuweist Dieses Vorgehen ist typisch f r C und jede gut entworfene Klasse sollte einen Konstruktor enthalten um eine vern nftige Initialiserung durchzuf hren Man sollte sich nie darauf verlassen da z B ein int Member vom Compiler beim Anlegen mit 0 initialisiert wird Das kann zwar der Fall sein in der Regel stehen aber v llig zuf llige Werte in den Member Variablen Es ist au erdem durchaus m glich und blich mehrere Konstruktoren zu implementieren Sind mehere Konstruktoren vorhanden so m ssen sie sich durch ihre Parameterliste eindeutig unterscheiden lassen Ein Konstruktor mit leerer Parameterliste wird als Default Konstruktor bezeichnet Er wird standardm ig aufgerufen wenn ein Objekt ohne die Angabe von Parametern instanziiert wird Beim Erzeugen eines Objekts entscheidet der Compiler dann anhand der aktuellen Parameterliste welcher Konstruktor aufgerufen wird Dieses Verfahren entspricht dem in Kapitel 0 beschriebenen Overloading Die Notation In der Zeile k1 kontostand_ausgeben im Hauptprogramm wird ber die Notation auf ein Element eines Obje
107. wieder zu Schritt 1 um den Fehler zu korrigieren Die Compilierung liefert als Ausgabe eine Objektdatei Objectfile welche im Gegensatz zum Sourcefile keinen lesbaren Text enth lt sondern bin r dargestellte Maschinenanweisungen In aller Regel bersetzt ein Compiler den Sourcecode in mehreren Stufen Passes die dem Programmierer allerdings in heutigen Systemen weitgehend verborgen bleiben Es folgt bei den meisten Entwicklungsumgebungen s u ein dritter Schritt der Linker deutsch Binder Der Linker ist ein Werkzeug das mehrere Objectfiles zu einem gesamten ausf hrbaren Programm zusammensetzt Es ist h ufig so da eine Programmieraufgabe aus Gr nden der bersichtlichkeit und Modularisierung in mehrere kleinere und damit leichter handhabbare Teile zerlegt wird welche dann einzeln entwickelt und anschlie end zusammengelinkt werden Als Eingabe f r diesen Schritt dienen die durch Schritt 2 erzeugten Objectfiles und als Ausgabe erh lt man schlie lich das fertige bin re Programm das dann ausgef hrt und getestet werden kann Auch in diesem Schritt werden u U Fehler ausgegeben die oft mit fehlenden Teilen des Gesamtprogramms zusammenh ngen und ebenfalls zu einem R cksprung in Schritt 1 f hren Die vierte Phase ist das sogenannte Debugging bzw das Testen des Programms Es kommt in der Praxis so gut wie nie vor da ein neu entwickeltes Programm sich so verh lt wie es geplant war Es kommt zu Abst rzen

Download Pdf Manuals

image

Related Search

Related Contents

DigiTel Manual  Samsung SGH-D820 Наръчник за потребителя  TH-AC 190 Kit  Kramer Electronics 3.5mm IR, M/M, 18.3m  Digital Photography Guidebook For Advertising  Tutorial : Einstieg in Movicon  Cámara digital con zoom KODAK DC290 Manual del usuario  Conceptronic 8 port Gigabit switch  10.11  Bilan Carbone Entreprises – Collectivités  

Copyright © All rights reserved.
Failed to retrieve file