Einführung in die Programmiersprache C und in C-Zeiger
Inhalt und Lernziele des Kapitels Einführung in die Programmiersprache C und in C-Zeiger.
C++ ist eine leistungsstarke und vielseitige Programmiersprache, die in verschiedenen Bereichen wie Softwareentwicklung, Spieleentwicklung, eingebetteten Systemen und mehr eingesetzt wird. Ihre Vielseitigkeit spiegelt sich auch in der Bandbreite der verfügbaren Ressourcen und Lernmaterialien wider. Von grundlegenden Konzepten bis hin zu anspruchsvollen Programmieraufgaben bietet C++ eine Fülle von Möglichkeiten, um das Verständnis und die Fähigkeiten in der Programmierung zu vertiefen.
Eine Einführung in die Programmiersprache C und in C-Zeiger bildet oft den ersten Schritt in die Welt der C++-Programmierung. Hier werden grundlegende Konzepte vorgestellt und die Bedeutung von Zeigern erklärt, die für viele fortgeschrittene Anwendungen unerlässlich sind.
Im Bereich der elementaren Syntax werden die Kernstrukturen von C++ wie Bedingungen, Alternativen und Mehrfachalternativen ausführlich behandelt. Diese Kontrollstrukturen ermöglichen es, den Ablauf von Programmen zu steuern und komplexe Algorithmen zu implementieren.
Die fundamentalen Datentypen bilden das Rückgrat jeder Programmiersprache. In C++ werden die verschiedenen Datentypen wie Zeichen, Boolesche Variablen, ganze Zahlen und Gleitkommazahlen eingehend erläutert, einschließlich ihrer Operationen und möglicher Fehlerquellen bei Typumwandlungen.
Programmieraufgaben sind ein entscheidender Bestandteil des Lernprozesses. Sie helfen dabei, das theoretische Wissen in die Praxis umzusetzen und fördern das Verständnis für reale Anwendungen. Von der Simulation eines Wettermodells über die Auswertung einer Fahrradtour bis hin zur Simulation einer Heizung und eines Heizungsreglers bieten diese Aufgaben eine breite Palette von Herausforderungen, die es zu bewältigen gilt.
Die Programmieraufgaben decken verschiedene Aspekte der Programmierung ab, darunter Datenverarbeitung, Simulation von Systemen und Implementierung von Algorithmen. Sie bieten eine ideale Möglichkeit, das Erlernte anzuwenden und die eigenen Fähigkeiten weiterzuentwickeln.
Zusätzlich zu den praktischen Übungen stehen auch Lösungshinweise zur Verfügung, die bei der Bewältigung komplexer Aufgaben helfen und Einblicke in bewährte Methoden und Techniken bieten.
Inhalt und Lernziele des Kapitels Einführung in die Programmiersprache C und in C-Zeiger.
Anwendungen aus verschiedensten Bereichen, in denen die bisher erlernten Konzepte von C++ eingesetzt werden können, werden als Programmier-Aufgaben formuliert.
Zu Aufgaben, die zu längeren Algorithmen führen, in denen insbesondere Bedingungs-Prüfungen und Alternativen vorkommen, werden einige Lösungshinweise gegeben.
Bedingung, Alternative und Mehrfachalternative sind die Kontrollstrukturen, die man einsetzen kann, um den Ablauf eines Programmes zu steuern. Erklärt wird ihre Syntax in C++ und es werden einige Spitzfindigkeiten diskutiert, die man bei ihrer Verwendung kennen sollte.
Für das Erlernen der Sprache C++ ist dieser Abschnitt zentral: es werden die wichtigsten fundamentalen Datentypen ausführlich vorgestellt, also Zeichen, Boolesche Variable, ganze Zahlen und Gleitkommazahlen. Die Datentypen sind immer verknüpft mit den Operationen, die mit ihnen ausgeführt werden können. Weiter werden die Typumwandlungen (und die damit verbundenen Fehlerquellen) zwischen den fundamentalen Datentypen besprochen.
Aufgrund der Plattformabhängigkeit der fundamentalen Datentypen in C++ ist es für den Programmierer unerlässlich zu wissen, welcher Datentyp wieviel Speicherplatz belegt und insbesondere in welchen Zahlenbereichen die am häufigsten verwendeten Datentypen (wie short, int, float, double) fehlerfrei eingesetzt werden können. Da man sich die Grenzen der Zahlenbereiche vermutlich nicht merken kann, sollte man zumindest wissen, wie man sie leicht feststellen kann. Dazu werden die in Elementare Syntax von C++: Fundamentale Datentypen gestellten Aufgaben gelöst beziehungsweise Lösungshinweise gegeben.
Aufgaben zum Einüben der Arbeitstechniken, die in der strukturierten Programmierung angewendet werden.
Das Wettergeschen kann durch das sochastische Modell einer Markov-Kette simuliert werden. Die Programmieraufgabe beinhaltet, die Eigenschaften einer Markov-Kette zu diskutieren und zu beurteilen, ob das Wettergeschehen damit treffend beschrieben werden kann und wie das Modell durch weiteren Annahmen verbessert werden kann.
Vorgestellt werden mehrere Aufgaben, die als vierwöchige Projektarbeit zu lösen sind. Programmiert werden soll entweder im Sinne der strukturierten Programmierung oder (besser) im Sinne der objekt-orientierten Programmierung.
Die Programmieraufgabe behandelt ein typisches Problem der Datenverarbeitung: Messdaten werden laufend aufgenommen und sollen geeignet ausgewertet werden. Sie können: Erstens direkt angezeigt werden, zweitens sofort in andere relevante Daten umgerechnet und angezeigt werden oder drittens abgespeichert und erst in ihrer Gesamtheit ausgewertet werden. Diese Aufgaben sollen anhand der zu simulierenden Daten, die während einer Fahrradtour anfallen können, eingeübt werden.
Vorgestellt wird ein Problem der Regelungstechnik: Es soll die Umgebung eines Hauses und dessen Heizung simuliert werden. Dabei sollen in konstanten Zeitabständen die Außentemperatur und die Raumtemperatur gemessen werden und ein Algorithmus entwickelt werden, der dafür sorgt, dass die Raumtemperatur der vorgegebenen Soll-Temperatur möglichst nahe kommt.
Matching-Probleme treten dann auf, wenn zwischen zwei Gruppen eine Zuordnung hergestellt werden soll (jedem Bewerber soll eine Stelle vermittelt werden; jedem Gast soll ein Geschenk überreicht werden). Dabei können unterschiedliche Nebenbedingungen hinzutreten (ein Bewerber ist nur für bestimmte Stellen qualifiziert; nicht jedes Geschenk ist für jeden Gast geeignet). Bei kleinen Gruppengrößen können diese Zuordnungen meist direkt gefunden werden; im Allgemeinen versucht man Algorithmen zu formulieren, die die Zuordnungen finden. Matching-Probleme werden in der Graphentheorie behandelt. Die hier vorgestellten Programmieraufgaben sollen einige typische Fragestellungen aufzeigen.
Das Rucksackproblem gehört zur Klasse der Optimierungsprobleme. Dabei sollen aus einer Menge von Gegenständen diejenigen in den Rucksack gepackt werden, die den Wert seines Inhaltes maximieren. Für kleine Anzahlen von Gegenständen kann man die optimale Lösung leicht erraten. Für sehr große Anzahlen kann ein Algorithmus, der alle möglichen Bepackungen durchprobiert, unzumutbare Rechenzeit beanspruchen.
Es wird das Travelling Salesman Problem vorgestellt, für das verschiedene Algorithmen entwickelt werden sollen. Zudem ist eine spezielle Anordnung der Stationen des Handlungsreisenden gegeben, auf die die Algorithmen angewendet werden sollen.
Vorgestellt werden die Design-Prinzipien Komposition und Vererbung, die immer dann eingesetzt werden, wenn Klassen als Datenelemente nicht nur fundamentale Datentypen sondern ihrerseits Klassen enthalten. Dabei werden weitere anspruchsvolle Konzepte von C++ erläutert: Der Polymorphismus (= Vielgestaltigkeit), Zeiger, das Überschreiben von Funktionen (function overriding) und Operatoren, Implementierung einer Baumstruktur.
Mit den drei Zugriffs-Spezifikationen (access modifier) public, protected und private wird festgelegt, welche Klasse auf welche Datenelemente und Methoden zugreifen kann. Mit ihrer Hilfe lässt sich die Datenkapselung realisieren. Die Zugriffs-Spezifikation ist ein Bestandteil der Deklaration von Datenelementen und Methoden; es wird gezeigt, wie man die Deklarationen einer Klasse übersichtlich in einem UML-Diagramm darstellen kann. UML-Diagramme sind somit eines der wichtigsten Hilfsmittel beim Entwurf komplexer Programme.
Ein Konstruktor legt fest, welche Aktionen beim Erzeugen eines Objektes ausgeführt werden und sind daher ein zentraler Bestandteil einer Klasse. Wie Methoden können sie überladen werden. Die Eigenschaften von Konstruktoren (und des Destruktors, der beim Löschen eines Objektes aufgerufen wird), einige spezielle Konstruktoren (Default-Konstruktor, Kopier-Konstruktor) sowie das Delegations-Prinzip werden hier vorgestellt.
Die zentralen Begriffe zum Verständnis der objekt-orientierten Programmierung sind Klassse und Objekt: Die Klasse ist der allgemeine Bauplan für die konkreten Objekte. Gezeigt wird die Syntax in C++, mit der Klassen angelegt werden, ihre Datenelemente und Methoden definiert werden, wie konkrete Objekte erzeugt werden und wie diese in anderen Programmen genutzt werden.
Funktionsaufrufe können in C++ entweder mit call by value oder call by reference realisiert werden; beide werden vorgestellt und diskutiert. Rekursionen ermöglichen oft schlanke Quelltexte, die aber schwerer verständlich sind als die entsprechende Implementierung mit Schleifen; einige Beispiele sollen an die Verwendung von Rekursionen heranführen. Die sogenannten Function Templates werden in der C++-Standard-Bibliothek oft eingesetzt; sie sind in einem gewissen Sinn eine Verallgemeinerung des Überladens von Funktionen.
Strukturierte Programmierung heißt vor allem, dass man wiederkehrende Quelltexte zu Unterprogrammen (Funktionen) zusammenfasst. Dieser Abschnitt zeigt, wie Funktionen in C++ realisiert werden (genauer: wie sie definiert und aufgerufen werden). Die Quelltexte lassen sich besser strukturieren, wenn man die Definition einer Funktion in Deklaration und Implementierung aufteilt. Weiter wird das Überladen von Funktionen besprochen.
Um Beispiele zur strukturierten Programmierung zu zeigen, werden einige Funktionen vorgestellt, die mit den Klassen vector und array aus der Standard-Bibliothek arbeiten. Weiter wird anhand der Beispiele das Konzept des Gültigkeitsbereiches näher erläutert, insbesondere werden Eigenschaften und Einsatz-Möglichkeiten von lokalen Variablen, globalen Variablen und lokalen static-Variablen diskutiert.
Wie im entsprechenden Kapitel zur Einführung in die Programmierung werden hier die kopfgesteuerte Schleife, die fußgesteuerte Schleife und die Schleife mit Zählvariable besprochen und einige Spitzfindigkeiten erklärt, die die C++-Syntax dazu bereithält. Weiter wird anhand der Schleifen das sehr viel weiter reichende Konzept des Gültigkeitsbereiches (scope) einer Variable vorgestellt.
Die Entwicklungsumgebung Code::Blocks bietet mehrere Möglichkeiten, eine neue Datei oder ein neues Projekt anzulegen; die für den Anfänger relevanten Möglichkeiten werden vorgestellt. Zudem kann man sehr viel produktiver arbeiten, wenn man die in der Entwicklungsumgebung enthaltenen Helfer kennt (Syntaxhervorhebung, Syntax-Vervollständigung, Code-Refactoring, Code-Schnipsel).
Für die ersten Programme bietet es sich an, Ausgaben und Einagben über die Konsole zu machen. Die zugehörigen Befehle in C++ werden hier erläutert. Zugleich werden die Programmbeispiele verwendet, um zahlreiche weiterreichende Konzepte zu erklären: Präprozessor-Direktive, Kommentare, Namensräume, die besondere Bedeutung der main()-Methode, der Rückgabewert einer Funktion, Quelltextformatierung.
Um C++-Programme schreiben, compilieren und ausführen zu können, muss man sich eine geeignete Umgebung bereitstellen. Es werden einige Möglichkeiten beschrieben; empfohlen wird die Entwicklungsumgebungen Code::Blocks, die es in einer Version mit integriertem MinGW-Compiler gibt.
Inhaltsverzeichnis und Lernziele des Kapitels C++: Fortgeschrittene Syntax.
Inhalt und Lernziele des Kapitels Einführung in C++.
Einige einfache arithmetische Operationen können in C++ in einer Kurzform geschrieben werden (Inkrement-Operator, Dekrement-Operator, Kurzform-Operatoren). Wenn möglich sollen diese auch eingesetzt werden, da sie schneller ausgeführt werden als die entsprechenden Befehle in der ausführlichen Schreibweise.
Einführung in die Informatik für Ingenieure und Naturwissenschaftler. Kurs zum Selbststudium, der das Grundwissen in Informatik etwa im Umfang einer einsemestrigen Vorlesung zusammenstellt.