C/C++ anwenden: Technisch-wissenschaftliche Übungsaufgaben mit Lösungen [1. Aufl.] 978-3-658-22164-5;978-3-658-22165-2

In diesem Buch geht es um die Lösung realitätsnaher Probleme aus Forschung und Technik. Sowohl die Probleme als auch der

542 155 15MB

German Pages VIII, 229 [224] Year 2019

Report DMCA / Copyright

DOWNLOAD FILE

Polecaj historie

C/C++ anwenden: Technisch-wissenschaftliche Übungsaufgaben mit Lösungen [1. Aufl.]
 978-3-658-22164-5;978-3-658-22165-2

Table of contents :
Front Matter ....Pages I-VIII
Front Matter ....Pages 1-1
Prozessüberwachung (Thomas Hoch, Gerd Küveler)....Pages 3-7
Fehlerrechnung (Mittelwert, Standardabweichung) (Thomas Hoch, Gerd Küveler)....Pages 9-16
RC4-Verschlüsselung (Thomas Hoch, Gerd Küveler)....Pages 17-23
GrafServer (Programmierung mit Grafikausgabe) (Thomas Hoch, Gerd Küveler)....Pages 25-32
Planetenbahn (Darstellung bewegter Bilder) (Thomas Hoch, Gerd Küveler)....Pages 33-39
Spektrum (Darstellung eines Bilds) (Thomas Hoch, Gerd Küveler)....Pages 41-47
Haus-vom-Nikolaus (Thomas Hoch, Gerd Küveler)....Pages 49-54
Zeigeruhr (Prozedurale Version) (Thomas Hoch, Gerd Küveler)....Pages 55-62
Sonnenrotation (Interaktive Bildverarbeitung) (Thomas Hoch, Gerd Küveler)....Pages 63-81
Kondensator/Tiefpass (Objektorientierung) (Thomas Hoch, Gerd Küveler)....Pages 83-88
Front Matter ....Pages 89-89
GrafObjectServer (Objektorientierte Grafik-Programmierung) (Thomas Hoch, Gerd Küveler)....Pages 91-100
Ebenes Pendel (Thomas Hoch, Gerd Küveler)....Pages 101-109
Zeigeruhr (Objektorientierte Version) (Thomas Hoch, Gerd Küveler)....Pages 111-119
Wärmeleiter (Thomas Hoch, Gerd Küveler)....Pages 121-130
Multifunktionsplotter (Thomas Hoch, Gerd Küveler)....Pages 131-150
Front Matter ....Pages 151-151
Bitoperationen mit C/C++ (Thomas Hoch, Gerd Küveler)....Pages 153-167
Nützliche Klassen der C++-Standard-Bibliothek (Thomas Hoch, Gerd Küveler)....Pages 169-183
Systemnahe Programmierung (Thomas Hoch, Gerd Küveler)....Pages 185-207
Back Matter ....Pages 209-229

Citation preview

Thomas Hoch Gerd Küveler

C/C++ anwenden Technisch-wissenschaftliche Übungsaufgaben mit Lösungen

C/C++ anwenden

Thomas Hoch • Gerd Küveler

C/C++ anwenden Technisch-wissenschaftliche Übungsaufgaben mit Lösungen

Thomas Hoch FB Ingenieurwissenschaften Hochschule RheinMain Rüsselsheim, Deutschland

Gerd Küveler FB Ingenieurwissenschaften Hochschule RheinMain Rüsselsheim, Deutschland

ISBN 978-3-658-22164-5    ISBN 978-3-658-22165-2  (eBook) https://doi.org/10.1007/978-3-658-22165-2 Die Deutsche Nationalbibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie; detaillierte bibliografische Daten sind im Internet über http://dnb.d-nb.de abrufbar. Springer Vieweg © Springer Fachmedien Wiesbaden GmbH, ein Teil von Springer Nature 2019 Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Jede Verwertung, die nicht ausdrücklich vom Urheberrechtsgesetz zugelassen ist, bedarf der vorherigen Zustimmung des Verlags. Das gilt insbesondere für Vervielfältigungen, Bearbeitungen, Übersetzungen, Mikroverfilmungen und die Einspeicherung und Verarbeitung in elektronischen Systemen. Die Wiedergabe von allgemein beschreibenden Bezeichnungen, Marken, Unternehmensnamen etc. in diesem Werk bedeutet nicht, dass diese frei durch jedermann benutzt werden dürfen. Die Berechtigung zur Benutzung unterliegt, auch ohne gesonderten Hinweis hierzu, den Regeln des Markenrechts. Die Rechte des jeweiligen Zeicheninhabers sind zu beachten. Der Verlag, die Autoren und die Herausgeber gehen davon aus, dass die Angaben und Informationen in diesem Werk zum Zeitpunkt der Veröffentlichung vollständig und korrekt sind. Weder der Verlag, noch die Autoren oder die Herausgeber übernehmen, ausdrücklich oder implizit, Gewähr für den Inhalt des Werkes, etwaige Fehler oder Äußerungen. Der Verlag bleibt im Hinblick auf geografische Zuordnungen und Gebietsbezeichnungen in veröffentlichten Karten und Institutionsadressen neutral. Springer Vieweg ist ein Imprint der eingetragenen Gesellschaft Springer Fachmedien Wiesbaden GmbH und ist ein Teil von Springer Nature. Die Anschrift der Gesellschaft ist: Abraham-Lincoln-Str. 46, 65189 Wiesbaden, Germany

Vorwort

So ungefähr stellen wir uns unseren „Buch-User“ vor: Sie verfügen bereits über Grundkenntnisse der Programmiersprache C mit der Erweiterung C++. Diese haben Sie eventuell erworben, indem Sie einen entsprechenden einsemestrigen Informatik-Einführungskurs für Techniker, Ingenieure oder Naturwissenschaftler absolviert haben oder die erste Woche eines entsprechenden zweiwöchigen Kompaktkurses. Sie kennen sich also mit Datentypen (int, float, …) aus, auch mit Feldern (Arrays) und Pointern, jedenfalls wissen Sie, was man darunter versteht. Sie haben Erfahrungen mit Ablaufstrukturen (Schleifen und Auswahlen) und wissen, wie man eine Funktion schreibt. Dann sollten die Praktikumsaufgaben des ersten Teils keine Überforderung darstellen, aber auch nicht langweilen. Begleitend zu einem Informatik-II-Kurs sollten auch die Aufgaben des zweiten Teils mit ihrer Objektorientierung nach und nach lösbar werden. Grundkenntnisse in Mathematik sollten Sie besitzen und Physik nicht gerade hassen. Unsere Praktikumsaufgaben unterscheiden sich von den Übungen im Laufe eines Programmierkurses durch Umfang und Komplexität. In der Regel werden Sie zur Lösung deutlich mehr als zwei Schulstunden benötigen. Die Aufgaben sind meist praktische ­Anwendungen aus Technik und Wissenschaft. Die Musterlösungen wurden mit Visual Studio Community 2017 für Windows von Microsoft erstellt, welches Sie kostenlos aus dem ­Internet herunterladen und installieren können. Wir waren bemüht, auch den sachlichen Hintergrund zu den einzelnen Aufgaben zu erklären und Tipps zum Lösungsweg zu geben. Schwierige oder weniger gebräuchliche Sprachelemente bei den Musterlösungen, an die Sie sich vielleicht nicht mehr so genau erinnern, werden erläutert. Im ersten Teil ermöglicht unser einfaches Grafik-Tool GrafServer die bildhafte Darstellung der Ergebnisse, beispielsweise bei der Visualisierung einer Simulation des Erdumlaufs um die Sonne oder bei der Darstellung von Bildern. Eine kleine Aufgabe führt in die Verwendung des GrafServers ein. Dessen ausführliche Benutzeranleitung finden Sie im Anhang. Dieses Tool können Sie natürlich auch für selbst definierte Projekte nutzen. Sie finden es auf unserer Buch-Webseite (siehe unten) zum Download. Die Aufgaben des ersten Teils kommen, bis auf eine Ausnahme, ohne Objektorientierung aus.

V

VI

Vorwort

Im zweiten Teil unseres Buchs werden die Aufgaben komplexer. Sie werden tiefer mit der objektorientierten Programmierung vertraut gemacht. Ein weiteres Grafiktool wird vorgestellt, das deutlich mehr Möglichkeiten bietet als der GrafServer. Der GrafObjektServer eignet sich auch wesentlich besser für bewegte Bilder, etwa Spiele. Sämtliche Aufgaben des zweiten Teils benötigen die Objektorientierung oder nutzen den GrafObjectServer (oder beides). Im dritten Teil geht es nicht mehr um Aufgaben. Vielmehr werden einige systemnahe Eigenschaften von C/C++, vor allem unter Windows, kurz erläutert, die man nicht so häufig in kompakter Form behandelt findet. Die Praktikumsaufgaben in Teil I und Teil II sind größtenteils nach einem einheitlichen Schema gegliedert: • Hintergrund Motivation der Aufgabenstellung, Lösungsansätze • Aufgabe Die Aufgabenstellung, Vorschläge zu Herangehensweise und Progammaufbau • Lösungshinweise Detaillierte Hinweise zur Lösung, besondere Schwierigkeiten, Fallstricke • Lösungsvorschlag Unsere Lösung als Progamm-Listing • Bemerkungen Anmerkungen und Erklärungen zu unserer Lösung Auf unserer Buch-Webseite http://www.utd.hs-rm.de/C-Cpp-anwenden finden Sie Tools, Benutzer-Anleitungen und die Quelltexte der Lösungsvorschläge. Inwieweit Sie sich an den Lösungsvorschlägen orientieren, ist allein Ihre Sache. Je stärker Sie sich fühlen, desto weniger werden Sie diese benötigen. Allerdings sind die meisten Aufgaben nicht einfach, und auch wir haben sie nicht „im Vorübergehen“ gelöst. Nehmen Sie es sportlich: Wer aufgibt, hat schon verloren. Groß-Gerau, im Januar 2019 Glashütten Thomas HochGerd Küveler

Inhaltsverzeichnis

Teil I 1 Prozessüberwachung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .   3 2 Fehlerrechnung (Mittelwert, Standardabweichung) . . . . . . . . . . . . . . . . . . . . .   9 3 RC4-Verschlüsselung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  17 4 GrafServer (Programmierung mit Grafikausgabe). . . . . . . . . . . . . . . . . . . . .  25 5 Planetenbahn (Darstellung bewegter Bilder). . . . . . . . . . . . . . . . . . . . . . . . . . .  33 6 Spektrum (Darstellung eines Bilds) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  41 7 Haus-vom-Nikolaus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  49 8 Zeigeruhr (Prozedurale Version) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  55 9 Sonnenrotation (Interaktive Bildverarbeitung) . . . . . . . . . . . . . . . . . . . . . . . .  63 10 Kondensator/Tiefpass (Objektorientierung) . . . . . . . . . . . . . . . . . . . . . . . . . . .  83 Teil II 11 GrafObjectServer (Objektorientierte Grafik-­Programmierung) . . . . . . . . . .  91 12 Ebenes Pendel. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101 13 Zeigeruhr (Objektorientierte Version). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111 14 Wärmeleiter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121 15 Multifunktionsplotter. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131

VII

VIII

Inhaltsverzeichnis

Teil III 16 Bitoperationen mit C/C++ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153 16.1 Binär- und Hexadezimalsystem ������������������������������������������������������������������ 154 16.2 Bit-Manipulationen ������������������������������������������������������������������������������������ 158 16.3 Bitfelder������������������������������������������������������������������������������������������������������ 161 16.4 Assembler und C++������������������������������������������������������������������������������������ 163 17 Nützliche Klassen der C++-Standard-Bibliothek . . . . . . . . . . . . . . . . . . . . . . . 169 17.1 Die Klasse string������������������������������������������������������������������������������������ 169 17.2 Die Klasse vector������������������������������������������������������������������������������������ 171 17.3 Die Klasse thread ������������������������������������������������������������������������������������ 174 18 Systemnahe Programmierung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185 18.1 Die Programmierung von Kommandos in C/C++�������������������������������������� 185 18.2 Parallele Prozesse �������������������������������������������������������������������������������������� 188 18.3 Dynamic Link Libaries (DLL) ������������������������������������������������������������������ 191 18.4 Internet: Netzwerkprogrammierung mit Sockets �������������������������������������� 196 Anhang ������������������������������������������������������������������������������������������������������������������������ 209 Stichwortverzeichnis. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 227

Teil I

Abgesehen von der letzten sollen die Aufgaben des ersten Teils konventionell, das heißt ohne Objektorientierung, gelöst werden. Allerdings verwenden wir bei den Lösungsvorschlägen von Anfang an Sprachelemente von C++, die gegenüber den entsprechenden C-Elementen Vereinfachungen darstellen. Das gilt insbesondere für Ein- und Ausgabe-­Anweisungen. Eine wichtige Rolle spielt unser Grafiktool GrafServer/GrafClient, das im Anhang erläutert wird und das Sie von unserer Buchwebseite (siehe Vorwort) herunterladen können. Und wenn Ihnen das Programmieren mal zuviel wird – lesen Sie zwischendurch einen passenden Science-Fiction-Roman, z. B. den berühmten „Bladerunner“ von Philip K. Dick.

1

Prozessüberwachung

Wir fangen mit einer kleineren Aufgabe an. Schließlich müssen Sie sich ja erst mal warmlaufen. Aber auch „kleinere Aufgaben“ können ihre Tücken haben.

Hintergrund 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.

© Springer Fachmedien Wiesbaden GmbH, ein Teil von Springer Nature 2019 T. Hoch, G. Küveler, C/C++ anwenden, https://doi.org/10.1007/978-3-658-22165-2_1

3

4

1 Prozessüberwachung

Aufgabe Entwickeln Sie ein Programm, das eine Prozess-Messgröße x (was immer das sein mag) überwacht. Der Normalbereich liegt im Intervall [−x1 … +x1], Voralarm soll ausgelöst werden, wenn der Wert zwischen −x2 und −x1 oder +x1 und +x2 liegt. Bei Werten kleiner gleich −x2 oder größer gleich +x2 soll Alarm ausgelöst werden. Die Intervallgrenzen ±x1 und ±x2 gehören bereits zu den betreffenden Alarmzonen. Bildlich sieht das im Prinzip so aus: ……. ---------|--------------------|-------------|-------------|--------------------|--------- ……. -x2 -x1 0 +x1 +x2 Alarmzone | Voralarmzone | Normalbereich | Voralarmzone | Alarmzone

Die Alarmgrenzen x1 und x2 sollen am Anfang des Programms von der Konsole eingegeben werden. Danach ist in einer do…while-Schleife zunächst der Prozess-Messwert x abzufragen und dann der Algorithmus für die Intervall-Prüfung zu realisieren. x, x1und x2 sollen Integergrößen sein. Zusätzlich berechnen Sie bitte den gleitenden Durchschnittswert der Messwerte und geben diesen aus. Anschließend soll der Benutzer gefragt werden, ob er einen weiteren Wert überprüfen möchte (Abfrage auf [j/n]). Lösungshinweise Wenn Sie einmal einen kurzen Blick auf unsern Lösungshinweis werfen, werden Sie feststellen, dass der Kernalgorithmus mit Hilfe einer geschachtelten if-Struktur teilweise ohne den Gebrauch von geschweiften Klammern { } erstellt wurde. Das erfordert schon einige Überlegungen, bevor man mit dem Programmieren loslegt. Natürlich sind auch andere Lösungen möglich. Die sind vielleicht weniger elegant, aber die Hauptsache ist, dass sie funktionieren. Den Mittelwert der bisher eingegebenen Werte, der nach jedem Durchgang ausgegeben werden soll, können Sie folgendermaßen berechnen: Nach dem ersten Wert: xm = x danach: xm = (xm * (n − 1) + x) / n n = lfd. Nummer.

1 Prozessüberwachung

5

Lösungsvorschlag /********************************************************************/ /* prozessueberwachung */ */ /* Ueberwachung der Prozessgröße x auf zwei Grenzen |x1| und |x2| /* 1. Normalbereich: x liegt zwischen -x1 und x1 */ */ /* 2. Voralarm: x liegt zwischen -x1 und -x2 oder zwischen */ /* x1 und x2 */ /* 3. Alarm: x ist größer gleich x2 oder kleiner gleich –x2 */ /* Die Intervallgrenzen gehören bereits zum Alarmbereich. */ /* Eingabeparameter (alle Typ int): (nur einmal zu Beginn) */ /* 1. Voralarmgrenze |x1| (nur einmal zu Beginn) */ /* 2. Alarmgrenze |x2| /* 3. Prozesswert (Messgröße, bei jedem Schleifendurchlauf, s. u.) */ */ /* Bei jedem Schleifendurchlauf wird zusätzlich der dynamische /* Mittelwert aller bisherigen Messwerte berechnet und ausgegeben. */ */ /* Nach jeder Ergebnisausgabe wird gefragt, ob ein neuer Wert /* geprüft werden soll (do ... while-Schleife mit [j/n] Abfrage). */ /********************************************************************/ #include #include // für toupper() using namespace std; int main () { int x, x1, x2;

// Messwert, absolute Voralarmgrenze, // absolute Alarmgrenze int n; // laufende Messwert-Nummer double xm; // dynamischer Mittelwert der Messwerte char norm [] = "Normalbereich\n"; char alarm [] = "Alarm\n"; char vor [] = "Vorlarm\n"; char goon;

// Konsoleneingabe zu Beginn cout > x1; cout > x2; n = 0; // Schleife über alle Messwerte do { n++; // Messwertnummer für Mittelwert cout > x;

6

1 Prozessüberwachung else { if (x2