Skip to main content
main-content

Über dieses Buch

In diesem Buch geht es um die Lösung realitätsnaher Probleme aus Forschung und Technik. Sowohl die Probleme als auch deren Lösungen werden jeweils ausführlich erläutert. Abgesehen von den Einführungs-Aufgaben handelt es sich um größere Projekte, die in der Regel in Übungsveranstaltungen nicht behandelt werden können. Grafiktools erhöhen den Spaß am Programmieren. Die in diesem Buch behandelten Aufgaben mit Lösungen erfordern bereits Grundkenntnisse in C und C++.

Inhaltsverzeichnis

Frontmatter

Teil I

Frontmatter

1. Prozessüberwachung

Zusammenfassung
In der Prozesstechnik treten häufig kritische Messgrößen auf, die ständig überwacht werden müssen, damit sie nicht „aus dem Ruder“ laufen. Beispielsweise könnte die Temperatur in einem Reaktor eine solche Größe sein. Typischerweise unterscheidet man drei Intervalle: den erlaubten Normalbereich, das Voralarm-Intervall und das Alarm-Intervall für völlig unakzeptable Werte. In der Regel löst der Voralarm eine Störmeldung aus, der Alarm darüber hinaus oft eine Aktion, die Schlimmeres verhindern soll. Letztlich hängt das von dem zu überwachenden Prozess selbst ab. Manchmal ist es auch von Interesse, den augenblicklichen Mittelwert nach jedem neuen Messwert zu kennen. Der lässt sich mit einer Formel für den „dynamischen Mittelwert“ errechnen.
Thomas Hoch, Gerd Küveler

2. Fehlerrechnung (Mittelwert, Standardabweichung)

Zusammenfassung
Zur Ermittlung einer physikalischen Größe X führt man häufig zahlreiche Messungen durch. Die einzelnen Messwerte weichen voneinander ab, d. h. sie sind mit Fehlern behaftet. Man unterscheidet systematische und zufällige Fehler. Systematische Fehler („Unrichtigkeiten“) sind häufig Instrumenten-bedingt. Sie lassen sich korrigieren, wenn sie bekannt sind, z. B. durch Eichung. Zufällige Fehler („Unsicherheiten“) dagegen entstehen durch nicht vorhersehbare und nicht beeinflussbare Veränderungen der Messbedingungen trotz unverändertem Messaufbau. Dazu gehören statistische Temperaturschwankungen, Erschütterungen oder Ablesefehler. Mit den zufälligen Fehlern, die bei jeder Messung auftreten, befasst sich die Fehlerrechnung, um die es in diesem Projekt geht. Der Mittelwert \( \overline{x} \) (arithmetisches Mittel) ist der beste Schätzwert einer „wahren“ Messgröße X. Dieser sowie die Fehlergrenzen lassen sich mittels mathematisch-statistischer Verfahren ermitteln. Anwendungsbeispiele für derartige Messreihen sind: Ermittlung von Temperatur, Helligkeit, Druck, Durchmesser, etc.
Thomas Hoch, Gerd Küveler

3. RC4-Verschlüsselung

Zusammenfassung
Ziel dieses Projekts ist es, ein Programm zu entwickeln, das eine beliebige Datei mit dem sogenannten RC4-Algorithmus verschlüsselt. Beim RC4 handelt es sich um eine Stromchiffre. Das ist ein Verschlüsselungsverfahren, das die Daten Byte für Byte verschlüsselt (im Gegensatz zur Blockchiffre, bei der Datenblöcke von 64 oder 128 Bit verschlüsselt werden). Der RC4 ist ein sehr kompakter Algorithmus und wird/wurde bei vielen Standards, wie SSH, HTTPS, WEP und WPA als Verschlüsselungsverfahren eingesetzt. RC4 (Ron’s Code 4) wurde 1987 von Ronald L. Rivest entwickelt. Es war längere Zeit von großer Bedeutung, wird aber heute in professionellen Anwendungen kaum noch angewendet, weil es inzwischen sicherere Verfahren gibt. Für private Zwecke ist RC4 jedoch immer noch brauchbar, zumal er relativ leicht zu programmieren ist.
Thomas Hoch, Gerd Küveler

4. GrafServer (Programmierung mit Grafikausgabe)

Zusammenfassung
Hier geht es um die Entwicklung eines kleinen Programms zur Einübung der Arbeit mit unserem einfachen Grafik-Tool GrafServer (zum Download auf unserer Buch-Webseite). Die GrafServer/GrafClient-Umgebung (kurz GrafServer genannt) bietet eine Möglichkeit, in einfachen C++-Programmen (Konsolenanwendungen mit main()-Funktion) Grafiken auszugeben. Weil die Einbindung einer Grafik-Bibliothek in Konsolenanwendungen problematisch ist, wurde ein Client-Server-Ansatz gewählt: Die Grafik wird von einem Server-Programm (unter Java entwickelt) dargestellt (GrafServer). Die Konsolenanwendung enthält einen Grafik-Client (GrafClient), der als cpp-Datei dem Projekt hinzugefügt wird (GrafClient.cpp). Der Client stellt die Verbindung zum Server her und kann dann Grafik-Befehle an diesen schicken. Die Header-Datei GrafClient.h wird in das Projektverzeichnis kopiert und mit #include "GrafClient.h" in die jeweilige main()-Funktion eingebunden.
Thomas Hoch, Gerd Küveler

5. Planetenbahn (Darstellung bewegter Bilder)

Zusammenfassung
Den Umlauf der Erde um die Sonne soll unter Verwendung des GrafServers/Grafclients als „Film“ auf dem Grafik-Display darstellt werden. Eine Planetenbahn lässt sich einfach durch Anwendung des Newtonschen Gravitationsgesetzes simulieren. Dabei erlauben wir uns die Vereinfachung, nur den Einfluss der Sonne, aber nicht den der anderen Planeten, zu berücksichtigen. Die Berechnung erfolgt iterativ, das heißt, die einzelnen Bahnpunkte werden Schritt für Schritt in einer Endlosschleife berechnet. Die physikalischen Grundlagen werden erläutert und die notwendigen Formeln bereitgestellt.
Thomas Hoch, Gerd Küveler

6. Spektrum (Darstellung eines Bilds)

Zusammenfassung
Ein Bild (CCD-Aufnahme), – in diesem Fall ein Ausschnitt des Sonnenspektrums – das aus einer Textdatei ausgelesen wird, soll in Grauwert-Darstellung ausgegeben werden. Die einzelnen Pixel sind in einer Datei (Buch-Webseite), ohne Header bzw. Formatbeschreiber, zeilenweise abgespeichert. Die einzelnen Pixelwerte liegen als Textwerte (ASCII-Format) im Bereich von 0 (schwarz) bis 255 (weiß) vor und sind durch Leerzeichen (blanks) getrennt. Damit das Programm flexibel bleibt, sollen die Anzahl der Zeilen, die Anzahl der Spalten und der Name der Bilddatei von der Konsole eingelesen werden. Auf unserer Buch-Webseite finden Sie eine Testdatei namens spektrum1_140x1240.txt mit 140 Zeilen und 1240 Spalten. Die Pixelwerte sind zeilenweise hintereinander abgespeichert.
Thomas Hoch, Gerd Küveler

7. Haus-vom-Nikolaus

Zusammenfassung
Ein Kinderspiel, das jeder kennt, ist leider kein „Kinderspiel“, wenn man es programmieren möchte. Das-ist-das-Haus-vom-Nikolaus. Ein einfaches Kinderspiel, bei dem Bleistift und Papier ausreichen. Es geht darum, die Kanten eines Hauses zu zeichnen, ohne den Stift abzusetzen. Natürlich lässt sich das auch per Computer spielen. Die Aufgabe besteht darin, zunächst mit Hilfe des Grafserver/Grafclient ein „Musterhaus“ mit allen acht Kanten (nummeriert) zu zeichnen. Anschließend soll der Benutzer über die Text-Konsole aufgefordert werden, eine Kantennummer einzugeben. Daraufhin wird die Kante rechts neben dem „Musterhaus“ auf dem Grafik-Display gezeichnet. Außerdem soll in der Mitte das Wörtchen „Das“ erscheinen. So geht es weiter, bis alle 8 Kanten gezeichnet sind und der komplette Spruch ausgegeben ist. Bei fehlerhafter Eingabe soll ein entsprechender Hinweis gegeben werden.
Thomas Hoch, Gerd Küveler

8. Zeigeruhr (Prozedurale Version)

Zusammenfassung
Bei diesem Projekt geht es um die grafische Darstellung einer Zeigeruhr mit Hilfe der GrafServer/GrafClient-Umgebung. Hierzu benötigen wir etwas Mathematik, genauer gesagt, Trigonometrie. Um die aktuelle Zeit durch eine Zeigeruhr darzustellen, müssen wir zunächst die Zeit durch geeignete C++-Funktionen lesen, was leider etwas umständlich ist. Stehen der Stunden-, Minuten- und Sekundenwert zur Verfügung, so müssen die entsprechenden Zeiger im korrekten Winkel gezeichnet werden. Diese werden jeweils als Linie gezeichnet, für die wir den Anfangs- und Endpunkt berechnen müssen (hier kommt die anfangs erwähnte Trigonometrie ins Spiel).
Thomas Hoch, Gerd Küveler

9. Sonnenrotation (Interaktive Bildverarbeitung)

Zusammenfassung
Dies ist die „Königsaufgabe“ des ersten Teils. Entsprechend ausführlich sind die Lösungshinweise. Die Auswertung von Messdaten gehört zu den Standardaufgaben experimentell arbeitender Naturwissenschaftler. Häufig handelt es sich um elektronisch, mit einer speziellen CCD-Kamera, aufgenommene Bilder. In der Astrophysik spielen Sternspektren eine bedeutende Rolle. Das gilt in besonderem Maß für die Sonnenphysik. Die vorliegende Aufgabe gibt einen Einblick in die Computer-gestützte Alltagsarbeit eines astronomischen Beobachters. Konkret geht es um die Bestimmung der Sonnenrotations-Rate mit Hilfe des Dopplereffekts unter Verwendung zweier Spektral-Aufnahmen. Wissenschaftler anderer Fachrichtungen haben ganz ähnliche Probleme zu lösen.
Thomas Hoch, Gerd Küveler

10. Kondensator/Tiefpass (Objektorientierung)

Zusammenfassung
Im zweiten Teil dieses Buchs spielt die objektorientierte Programmierung (OOP) eine wichtige Rolle. Deshalb soll die vorliegende letzte Aufgabe des ersten Teils eine kleine „Aufwärmübung“ darstellen. Unter einem Tiefpass versteht man in der Elektronik einen Filter, der Signalanteile mit Frequenzen unterhalb einer Grenzfrequenz mit nahezu originaler Amplitude passieren lässt. Anteile mit höheren Frequenzen werden dagegen gedämpft. Wichtigstes Anwendungsgebiet ist die Rauschunterdrückung in Audiogeräten. Die Aufgabe besteht darin, ein RC-Glied (Tiefpass 1. Ordnung) zu simulieren. Die Idee bei der Simulation ist, den Ablauf in kleine Zeitintervalle zu zerlegen. Innerhalb eines Zeitintervalls geht man von der Näherung aus, dass ein konstanter Strom in den Kondensator fließt und er sich entsprechend auflädt bzw. entlädt.
Thomas Hoch, Gerd Küveler

Teil II

Frontmatter

11. GrafObjectServer (Objektorientierte Grafik-Programmierung)

Zusammenfassung
In diesem Kapitel werden anhand von zwei kleinen Programmbeispielen die GrafObjectServer/GrafObjectClient-Umgebung, kurz GrafObjectServer oder GObS, vorgestellt. Wie der GrafServer aus Teil I besteht GObS aus einem Server (ebenfalls GrafObjectServer genannt), der in Java programmiert wurde, und einem C++-Client (GrafObjectClient), der in das C++-Projekt eingebunden wird (Dateien GrafObjectClient.h und GrafObjectClient.cpp). GObS dient wie der GrafServer dazu, möglichst einfach Anwendungen mit grafischer Ausgabe zu erstellen. Im Gegensatz zum GrafServer ist GObS ein objektorientiertes Framework. Zwar lässt sich GObS auch nutzen, ohne selbst eigene Klassen zu erstellen, aber ein gewisses Verständnis der Objektorientierung ist vorteilhaft, denn man muss auch in einfachen Programmen Objekte der vordefinierten Klassen erzeugen. Die genannten Tools kann man von unserer Buch-Webseite herunter laden.
Thomas Hoch, Gerd Küveler

12. Ebenes Pendel

Zusammenfassung
Bei diesem Projekt wird es wieder etwas physikalischer. Es soll die Bewegung eines mathematischen Pendels, das in einer Ebene schwingt, simuliert werden. Das Projekt hat gewisse Ähnlichkeiten mit dem Projekt Planetenbahn, da in beiden Fällen die Bewegungsgleichungen Differenzialgleichungen sind, die numerisch gelöst werden müssen. Im Unterschied zum Planetenbahn-Projekt setzen wir hier zur Darstellung den GrafObjectServer ein. Ein ebenes (mathematisches) Pendel besteht aus einer punkt- oder kugelförmigen Masse m, die über einen masselosen Stab der Länge ℓ drehbar an einem Aufhängepunkt befestigt ist. Die Masse bewegt sich unter Einfluss der Erdbeschleunigung g.
Thomas Hoch, Gerd Küveler

13. Zeigeruhr (Objektorientierte Version)

Zusammenfassung
Bei diesem Projekt kommen wir zur Zeigeruhr zurück, die wir schon als prozedurales Programm unter Verwendung des GrafServers kennengelernt haben. Wir sehen uns jetzt an, wie wir eine Zeigeruhr mithilfe des GrafObjectServers darstellen können. In den beiden vorangehenden Kapiteln haben wir schon verschiedene vordefinierte Klassen von GObS kennengelernt. In diesem Kapitel werden wir zur Darstellung einer Uhr eine eigene Klasse definieren. Wir benötigen dazu etwas mehr Kenntnisse der Objektorientierung und werden die Lösung auch in verschiedene Dateien aufteilen. Im Gegensatz zur ersten Version der Zeigeruhr kommt die hier besprochene Lösung aber ohne Trigonometrie aus.
Thomas Hoch, Gerd Küveler

14. Wärmeleiter

Zusammenfassung
Bei diesem Projekt werden wir ein physikalisches System simulieren, nämlich einen eindimensionalen Wärmeleiter, den man sich als dünnen Metallstab vorstellen kann. Bei diesem wird am linken und am rechten Ende die (zeitabhängige) Temperatur vorgegeben. Ziel ist es, den Temperaturverlauf entlang des Stabs zu berechnen und grafisch darzustellen. Wir werden wieder die Objektorientierung nutzen und eine Klasse für den Wärmeleiter erstellen. Dabei werden wir die Lösung in eine Header- und eine Implementationsdatei für die Klasse und eine Datei zum Testen der Klasse aufteilen.
Thomas Hoch, Gerd Küveler

15. Multifunktionsplotter

Zusammenfassung
Bei diesem Projekt soll ein Programm erstellt werden, mit dem sich beliebige mathematische Funktionen grafisch darstellen lassen. Das Programm erlaubt es, verschiedene Funktionen als Text in Form von Ausdrücken einzugeben, die eine Variable x enthalten. Wir werden dazu wieder die Objektorientierung nutzen, im Gegensatz zu den anderen Projekten in Teil II werden wir aber nicht auf das objektorientierte Grafiktool, sondern auf die GrafServer/GrafClient-Umgebung aus Teil I zurückgreifen. Da wir (nahezu) beliebige mathematische Funktionen erlauben möchten, ist eine Hauptschwierigkeit des Programms die Zerlegung und Auswertung der entsprechenden Ausdrücke. In unserem Lösungsvorschlag werden wir dazu eine eigene Klasse (Expression) erstellen, in der auf die in Teil III erläuterten Klassen string und vector der C++-Standardbibliothek zurückgegriffen wird (s. Kap. 17 „Nützliche Klassen der C++-Standard-Bibliothek“). Eine weitere Klasse (FuncPlot) stellt Methoden zur grafischen Darstellung von Funktionen zur Verfügung. Insgesamt ist dieses Projekt programmiertechnisch recht anspruchsvoll.
Thomas Hoch, Gerd Küveler

Teil III

Frontmatter

16. Bitoperationen mit C/C++

Zusammenfassung
Hier geht es um maschinennahe Programmierung. Die Sprache stellt hierfür die spezielle Struktur „Bitfeld“ bereit. Zunächst werden jedoch das Dual- und das Hexadezimalsystem mit ihren Eigenschaften vorgestellt. Abschließend zeigen wir, wie man unter C/C++ auch Assembler-Programme erstellen kann.
Thomas Hoch, Gerd Küveler

17. Nützliche Klassen der C++-Standard-Bibliothek

Zusammenfassung
Die Standard-Bibliothek von C++, oft auch Standard Template Library (STL) genannt, ist sehr mächtig und umfangreich. Sie besteht aus zahlreichen Klassen, meist sogenannten Template-Klassen, von denen viele als Behälter für Daten fungieren (Container-Klassen). Wir werden uns hier auf drei nützliche Beispiele beschränken, die Klassen string, vector und thread. Die Klasse string ist ein Datentyp zur komfortablen Speicherung von Zeichenketten. Die Klasse vector kann wie ein Array viele Werte eines Datentyps speichern, ist aber wesentlich flexibler einsetzbar. Die letztgenannte Klasse, thread, kann zur Programmierung von parallelen Abläufen innerhalb eines Programms eingesetzt werden.
Thomas Hoch, Gerd Küveler

18. Systemnahe Programmierung

Zusammenfassung
Was ist ein Kommando, und wie programmiert man es? Wie kann man sich die Multitasking-Eigenschaft des Rechners zu Nutze machen, und wie programmiert man eine DLL? Mit diesen Fragen wollen wir uns abschließend befassen. Abschließend geht es noch um Internet-Programmierung.
Thomas Hoch, Gerd Küveler

Backmatter

Weitere Informationen