Einleitung


Computersprachen und Problemlösungen

Computersprachen dienen dazu bestimmte Probleme exakt formulieren zu können. Und natürlich soll die gefundene Lösung mit Hilfe einer Maschine, eines Computers, nützliche Arbeit verrichten. Eine Lösung besteht aus den beiden großen Teilen - Daten und Algorithmen. Die verwendete Sprache braucht also Möglichkeiten Daten und Verarbeitungsschritte zu formulieren.

Für Daten bieten die Sprachen immer eine gewisse Anzahl von eingebauten Datentypen, die uns bei der Formulierung helfen. Die bekanntesten Datentypen sind “char” (engl. character / Zeichen), “int” (engl. Integer / Ganzzahl), “float” (Fließkommazahl) und Zeiger auf solche Variable. Damit lassen sich schon viele grundlegende Anwendungen schreiben. Insbesondere konnte man damit in “C” bereits ganze Betriebssysteme entwickeln. Unix (und damit auch Linux) sind gute Beispiele dafür.

Überschreiten wir die Schwelle zu den Problemen der Benutzer, dann müssen wir in der Lage sein, Kunden und Artikel, Lagerpositionen und Auftragsbestände oder Drücke und Temperaturen zu bearbeiten. Dies geschieht an Hand eines Modells für einen Kunden oder eines beliebigen anderen Elements der Wirklichkeit. Die Frage stellt sich nach der Fähigkeit der Programmiersprachen, solche Modelle zu erstellen und korrekt einzusetzen. Das Hilfsmittel in "C" dazu ist die Struktur. Andere Sprachen, wie Pascal sagen auch “record” (Satz) dazu. Ein Element der Welt wird in "C" durch eine Struktur beschrieben. Ein solches Modell wird auch als privater Datentyp bezeichnet.

Datentypen beinhalten immer mehrere Aussagen. Zum einen verbergen sich hinter einem bestimmten Datentyp z.B. “float” Informationen zur Darstellung der Daten, wie viel Speicherplatz benötigt wird und wie der interne Aufbau einer Variablen ist. Bei dem gewählten Beispiel “float” ist eventuell festgelegt, daß der Aufbau sich nach dem "IEEE"-Standard des amerikanischen Verbandes der Elektroingenieure richtet.


Einleitung    Seite 13

Manche Sprachen (z.B. C/C++) erlauben dem Compilerautor, die genauen Eigenschaften (Größe, Aufbau) festzulegen; andere Sprachen legen diese Eigenschaften generell fest (z.B. Java).

Die zweite große Information, die zu einem Datentyp gehört, ist die Menge der möglichen Aktionen, die auf eine Variable dieses Datentyps angewendet werden dürfen.

Von C zu C++

In C können private Datentypen zwar definiert und benutzt werden, aber der Compiler kann nur einen Teil prüfen. Ihm fehlt die Fähigkeit, die richtige Anwendung der Operationen auf private Datentypen zu garantieren. Und damit sind wir beim Thema der Sicherheit der Programmierung.

Leider schleichen sich in das schönste Programm gelegentlich Fehler ein. Manche lassen sich leicht mit Hilfe des Compilers finden. Hier einen Parameter vergessen oder dort ein Komma zu viel, der Compiler meldet sich. Unangenehmer wird es, wenn der Compiler die Fehler nicht entdecken kann, weil zwar die Syntax stimmt, nur leider ein falscher Name verwendet wurde. Hier braucht man einen Debugger und viel Zeit und Intuition zum Fehlersuchen.

Noch schlimmer wird die Fehlersuche, wenn der Fehler nur manchmal oder nur bei ganz bestimmten, zufälligen Kombinationen auftritt. Solche Fehler werden manchmal über Jahre nicht gefunden.

Solange sich ein solcher Fehler in ein kleines Programm am Heimcomputer einschleicht, sind die Folgen absehbar. In einem Betriebssystem oder in einem Bankprogramm können die Folgen dramatisch sein.

Ein Lösungsansatz verbirgt sich hinter der Abkürzung OOP (Objekt Orientierte Programmierung). Die OOP ist nicht eine einzelne Methode sondern eine bestimmte Sichtweise. Man spricht hier auch vom Paradigma der OOP.


Seite 14    Einsteigerseminar C++

Grundidee der OOP

Mit der OOP wird gedanklich die Aktion hin zu den einzelnen Objekten verlagert. An Stelle eines allwissenden Gesamtprogramms tritt die Verknüpfung vieler Objekte mit eigener Aktionsfähigkeit.

Die Ideen der OOP, die wir an Hand von C++ erörtern wollen, lassen sich in vier Bereiche aufteilen.

1) Wie erreicht man sicherere Programme?
Man kann bei der Definition von Datenobjekten festlegen, wer sie verändern darf. Der Compiler überwacht jede Veränderung. Seiteneffekte werden erheblich reduziert.
C++ kann Daten in Objekten kapseln.

2) Wie kann man Programme natürlicher formulieren?
In C++ werden viele Beschränkungen aufgehoben. So kann man den Namen eines Unterprogramms mehrfach verwenden. Der Compiler erkennt Unterschiede an Hand der Parameterliste. Oder ein Pluszeichen kann auch Bruchzahlen oder komplexe Zahlen addieren - wenn sie dem Compiler sagen, wie.
C++ kann Operatoren überlagern.

3) Wie kann man Code wiederverwenden oder sogar zukaufen?
In einem Objekt werden Daten und Code beschrieben. Ein solches Objekt kann in einem weiteren Objekt einfach und geschützt wiederverwendet (vererbt) werden. Sollte der gekaufte Code einen Fehler besitzen, kann dieser Fehler im äußeren Objekt abgefangen werden.
C++ kann Klassen vererben.

4) Wie kann man intelligente Objekte anlegen?
In der OOP spricht man von Botschaften, die man einem Objekt sendet. Sendet man verschiedenen Objekten (einem Kreis, einem Rechteck...) die Botschaft “drucke dich”, dann erscheint die richtige Figur. In der Denkweise der OOP wählt ein Objekt die Reaktion auf eine Botschaft selber aus.
C++ kann während der Laufzeit die “richtige” Aktion aus einer Menge der möglichen finden. (Polymorphismus)


Einleitung    Seite 15

Die OOP besteht damit aus den vier Bereichen:

Beginnen wollen wir mit C und seinen Strukturen. Neben der Beschreibung von Strukturen wird insbesondere das Arbeiten mit Informationsdateien (header files) und Bibliotheken wichtig sein. Den Übergang von C zu C++ bildet danach die Erweiterung der Struktur zur geschützten Klasse.

Entwicklungsgeschichte von C++

Die Geschichte von C++ beginnt natürlich mit C. Die Entwickler des Betriebssystems  suchten nach einer Möglichkeit, die in Assembler geschriebene Anfangsversion in einer Hochsprache neu zu schreiben. Hilfe kam von Dennis Ritchie, der die Sprache C entwickelte. Das Standardwerk zu C war lange Jahre “The C Programming Language” von Kernighan und Ritchie (kurz: K&R). 1985 stellt Bjarne Stroustrup seine Implementierung von C++ vor. C++ sollte C um eine verbesserte Typprüfung und das Klassenkonzept erweitern. Der erste Name der Sprache war “C mit Klassen”, bis ein Mitarbeiter im Inkrementieroperator von C eine treffende Beschreibung fand: C++. C++ sollte ein besseres C sein.

Viele Ideen und Details flossen in den aus dem Jahre 1989 ein (Standard X3.159). Insbesondere verhalfen die Prototypen (Funktionsdeklarationen) zu einer wesentlich verbesserten Typprüfung. Seit Anfang 1990 befasste sich ein ANSI-Kommittee mit der Standardisierung von C++. (Komitee X3.J16). Die Grundlage der Standardisierung findet sich in “The Annotated C++ Reference Manual” von Margaret Ellis und Bjarne Stroustrup (kurz: ARM). Seit November 1997 ist der Standard verabschiedet (siehe: www.cygnus.com/misc/wp).

C++ Compiler übersetzen immer auch C-Programme. Schließlich ist C++ eine Erweiterung von C. Übersetzt man existierende C-Programme neu, werden wegen der strikteren Syntaxprüfung oft bisher unentdeckte Nachlässigkeiten vom Compiler gemeldet.


Seite 16    Einsteigerseminar C++

Hinweis zur Gestaltung des Buches

Die Dateiendungen spiegeln ihre Verwendung wider. Für Informationsdateien wird im Buch die Erweiterung “.h” für C und “.hpp” für C++ benutzt. Programmdateien enden auf “.c” für C oder “.cpp” für C++. Diese Unterscheidung ist abhängig vom Compiler und oft nicht zwingend notwendig.

An vielen Stellen finden Sie kleinere Programmausdrucke. Ein Kasten mit einem Listing, dem Zeilennummern vorangestellt sind, ist ein syntaktisch korrektes Programm, das übersetzt und danach automatisch mit der Nummerierung versehen wurde. Es eignet sich gut für eigene Experimente.


Rahmen3

Ein Kasten mit einem Listing ohne Zeilennummern stellt kein übersetzbares Programmstück dar, sondern soll einen bestimmten Sachverhalt erläutern. Auf die sonst notwendigen Details, wie Blockklammern, main() etc. wurde hier verzichtet.


Bitte beachten Sie, daß der Bildschirm ANSI-Steuerzeichen verstehen sollte. Dies geschieht z.B. durch das Laden eines Treibers (ansi.sys bei DOS/Windows) oder durch Auswahl eines geeigneten Terminals (TERM-Variable bei Linux/Unix). Bitte nutzen Sie hier zur Installation die Hilfemöglichkeiten Ihres Betriebssystems.


Einleitung    Seite 17

  

Rahmen5

Die Beispiele dieses Buches beschränken sich auf Programme, die Sie auf einem Terminal (oder unter Windows: einer MS-DOS Eingabeaufforderung) ausführen können.

Programme für graphische Oberflächen benötigen das Wissen um diese Oberflächen und die zugehörigen Bibliotheken. Die Darstellung des notwendigen Wissens würde sicher den Rahmen eines Einsteigerseminares sprengen.

Für Ihre Experimente können Sie frei erhältliche Compiler aus dem benutzen: g++ für Linux/Unix, oder DJGPP für DOS/Windows (siehe: www.delorie.com/djgpp/getting.html)

Auch andere Hersteller bieten Einstiegsversionen ihrer Compiler sehr preiswert oder umsonst an. Schauen Sie doch einmal auf der Web-Seite Ihres bevorzugten Lieferanten vorbei. Auch von Verlagen gibt es immer wieder Kombinationen aus einem Buch und dem Compiler,

Übrigens genügt für die allermeisten Beispiele eine ältere Compilerversion. Suchen Sie sich also möglichst gleich eine Arbeitsumgebung mit dem Compiler, um mit den Beispielen arbeiten zu können.

Und noch etwas: auch wenn die Beispiele zum Download bereitstehen- Abtippen hilft immer beim Merken.


Seite 18    Einsteigerseminar C++