Skip to main content

2006 | Buch

Grundkurs Software-Entwicklung mit C++

Praxisorientierte Einführung mit Beispielen und Aufgaben — Exzellente Didaktik und Übersicht

insite
SUCHEN

Über dieses Buch

Das vorliegende Buch wendet sich an alle, die erstmals programmieren lernen wollen – oder müssen. Insbesondere richtet es sich an Studenten in den unteren Semestern. Aber selbst fortgeschrittene Programmierer in C++ werden noch viele nützliche Hinweise finden. Auch interessierte Schüler, in der beruflichen Bildung Stehende oder Lehramtsanwärter mögen sich angesprochen fühlen, denn das vorlieg- de Konzept wurde entwickelt aufgrund vieler Anregungen von Lern- den. Es erklärt selbst schwierige Sachverhalte auf einfache Weise, ohne zu trivialisieren, geht auf die Probleme von Anfängern ein und gibt Hil- stellung bei einer Vielzahl von vermeidbaren Fehlermöglichkeiten, an - nen gerade der Anfänger „stirbt“. Programmieren bereitet viel Freude, falls man nicht an scheinbaren Kleinigkeiten die Lust verliert. Insofern - be ich auch eigene, langjährige, leidvolle Erfahrungen mit einfließen l- sen. Ein Programmieranfänger sieht sich mit vier verschiedenen Themenkr- sen konfrontiert, die im Verlaufe des Buches zusammengeführt werden: 1 Wie erschließt man methodisch einen technischen oder betriebswi- schaftlichen Sachverhalt, so dass am Ende der Arbeit ein korrektes P- gramm entsteht? Die Methoden zur systematischen Analyse stellt das So- ware-Engineering bereit. Der Teil A des Buches gibt eine Einführung - zu. Wer bereits Programmiererfahrung hat, kann schneller lesen, möge sich aber mit der Fallstudie beschäftigen, auf die in späteren Kapiteln - rückgegriffen wird.

Inhaltsverzeichnis

Frontmatter

Software-Entwicklung

1. Grundlagen der Software-Entwicklung

Will man ein Softwareprogramm entwickeln, geht man üblicherweise in bestimmten Schritten vor. Diese Phasen der Programmentwicklung beleuchten wir zunächst, um später unsere Softwareprojekte danach auszurichten. Mit einem weitverbreiteten, die halbe Nation bewegenden Beispiel führen wir zunächst in die Arbeitsweise ein. Wir werden feststellen, dass nur drei Elemente ausreichen, um eine Lösungsstrategie einer Programmieraufgabe zu beschreiben. Für diese drei Elemente wurde auch eine grafische Darstellung, das Struktogramm, erfunden.

Informationstechnik

2. Die Verarbeituig von Informationen

Im Teil A wurden die hier interessierenden Grundlagen für die Systemanalyse und den Systementwurf gelegt. Das Ergebnis war ein maschinenunabhängiger Entwurf. Der Teil B beschreibt im Kapitel zwei zunächst die für den Programmierer wichtigsten Grundlagen, wie moderne Rechner, beispielsweise der PC, aufgebaut und organisiert sind. Wie Informationen der realen Welt im Rechner abgebildet, intern dargestellt und gespeichert werden, ist Gegenstand der Kapitel drei bis sieben. Viele dieser Informationen sind auch für andere Programmiersysteme wie Java und Excel gültig.

3. Darstellung won Informationen: Einleitung

Während das letzte Kapitel den grundsätzlichen Aufbau und die internen Abläufe zum Gegenstand hatte, beschreiben die folgenden Kapitel die wesentlichen Konzepte der internen Organisation und Speicherung von Daten sowie (aus Prozessorsicht) die Ein- und Ausgabe. Aus Gründen der besseren übersicht wird dieser Themenbereich auf die Kapitel drei bis sieben aufgeteilt. Das Kapitel drei beschreibt dabei die Grundlagen der Zahlensysteme und Codes, Kapitel vier stellt die einfachen Typen von Daten vor, während Kapitel fünf die aus den einfachen Typen zusammengesetzten erläutert. Kapitel sechs systematisiert die Datentypen und bringt ein vergleichendes Beispiel. Schlieβlich behandelt das siebte Kapitel die Eingabe über die Tastatur und Ausgabe auf den Monitor.

4. Darstellung won Informationen: Einfache Datentypen

Der letzte Abschnitt hat allgemeine Zusammenhänge vorgestellt, ohne konkret auf die technische Darstellung und ihre möglichen Probleme einzugehen. Die folgenden zwei Kapitel zeigen, wie die

externe Welt

in Form von Daten

in

einem

Rechner abgebildet

werden.

5. Darstellung won Informationen: Zusammengesetzte Datentypen

Bis jetzt haben wir ganze Zahlen und reelle Zahlen unterschiedlicher Gröβe und Genauigkeit sowie Wahrheitswerte kennengelernt. Sie sind so bedeutsam, dass sie bereits eingebaut sind. Eine Vielzahl von Objekten unserer Umwelt lässt sich auf diese Weise in einem Rechner abbilden, eine groβe Zahl von Objekten allerdings kann man mit den bisherigen Mitteln nicht

zweckmäβig

darstellen, zumal sie von Anwendungsfall zu Anwendungsfall sehr unterschiedliche Ausprägungen haben.

6. Darstellung won Informationen; Zusammenstellung

Bisher haben wir die Datentypen einzeln mit ihren Eigenschaften beschrieben. Es ist jedoch nützlich, sich einmal einen überblick zu verschaffen, nach welchem Schema man die Datentypen gruppieren kann. Auβerdem wollen wir an einem Beispiel untersuchen, wie die verschiedenen Datentypen zur Lösung ein- und derselben Aufgabe eingesetzt werden können. Der Vergleich der verschiedenen Möglichkeiten zeigt schnell, dass es oft zweckmäβige und unzweckmäβige Ansätze gibt.

7. Darstellung won Informationen: Ein- und Ausgabe

Ein Programm erhält Daten über die Tastatur oder aus Dateien, wenn wir die beiden Formen beispielhaft für jede Art der Ein-/Ausgabe wählen. In beiden Fällen sollte ein Programmierer die grundsätzlichen Konzepte kennen, die wir jetzt vorstellen wollen.

Klassische Grundlagen von C++

8. Sprachregeln

Um die vielfältigen Aufgaben, die Anlass zur Programmierung sind, als Computerprogramm zu formulieren, bedient man sich einer künstlichen Sprache, die der natürlichen — meist englischen — angelehnt ist. Eine natürliche Sprache dient der Kommunikation zwischen Menschen, um reale oder abstrakte Dinge zu beschreiben. Dazu schafft sich der Mensch eine Begriffswelt (z.B. Baum, Liebe) und formale Regeln, wie Begriffe miteinander verbunden werden. Ein einfacher Aussagesatz folgt dem Satzaufbau Subjekt-Prädikat-Objekt. Diese Regeln werden durch die ▹Syntax (Lehre vom Satzaufbau als Teilgebiet der Grammatik) definiert. Rechtschreibfehler kennzeichnen daher Abweichungen von den Regeln, z.B. „Ick liebe dir“. Während wir Menschen recht großzügig mit solchen Regelverstößen umgehen, zeigt eine Maschine wenig Toleranz. Regelverstöße werden unnachgiebig angezeigt — dessen sollten Sie sich von Anbeginn an bewusst sein!

9. Einführendes Programmbeispiel

In diesem Abschnitt erhalten Sie nun ein erstes Programmbeispiel, das zunächst einmal ein Gefühl für die Programmiersprache C++ vermitteln soll. Manches wird Ihnen bereits bekannt vorkommen. Es ist im Augenblick jedoch nicht notwendig, dass Sie

alles

verstehen. Denn anhand dieses Programms werden wir die Sprachbestandteile von C++ erarbeiten.

10. Sprachbestandteile von C++

Dieses Kapitel behandelt einige

formale Aspekte

der Programmiersprache und entfaltet einen geringen Charme. Bedenken Sie bitte, das Ziel ist,

fehlerfreie

Programme zu schreiben und dabei die Zeit der

unvermeidlichen Fehlersuche

möglichst klein zu halten. Die jetzt investierte Mühe zahlt sich bestimmt aus, verkleinert sie doch erfahrungsgemäβ den Lustverlust beim Programmieren. Bedenken Sie auch: Eine Programmiersprache definiert Regeln,

wie

die Dinge zu erledigen sind. Sie definiert

nicht, was

auf Grund der Regeln gebildet werden soll. Dafür ist der

Programmierer

zuständig. Die Regeln werden uns in den folgenden Kapiteln beschäftigen.

11. Feh1er

Die Entwicklung eines Programms ist ein sehr anspruchsvolles Unterfangen, bei dem unvermeidlich ▸Fehler entstehen. Und nach Murphys Gesetz gilt: „Wenn etwas schiefgehen kann, dann geht es auch schief!“ Ein guter Programmierer versucht daher in Betracht zu ziehen, was schieflaufen könnte, um es dann eigentlich zu vermeiden. Aber: Nur bei einfachen Fragestellungen und erfahrenen Programmierern wird es auf Anhieb gelingen, ein fehlerfreies Programm zu schreiben.

12. Entwicklungsumgebung

Die effizienteste Methode, eine Programmiersprache zu lernen und das Verhalten des Rechners zu begreifen, ist die Verwendung einer Entwicklungsumgebung. Dieses Software-Werkzeug ist für den Fachmann sowieso unerlässlich, um produktiv arbeiten zu können. Eine ▸Entwicklungsumgebung besteht mindestens aus den Komponenten

Editor,

Compiler,

Linker,

Debugger und

Online-Hilfe,

die meist unter einer gemeinsamen Oberfläche erscheinen. Von Borland geprägt wurde der Begriff Integrated Development Environment (IDE), den man oft ohne Erläuterung in Büchern liest. Andere Hersteller versuchen sich tunlichst mit anderen Begriffen (krampfhaft) abzugrenzen.

13. Ein-/Ausgabe

Um ein Programm nicht nur einmal mit festen Werten — so wie es bei der Initialisierung geschah — nutzen zu können, ist es notwendig, Daten in ein Programm ein– und die Ergebnisse auszugeben. Die wichtigsten Ein/Ausgabegeräte haben Sie bereits im Teil B, Kapitel 2.1, kennengelernt. Dateiein– und –ausgabe behandeln wir im Kapitel 22.

Hier

beschränken wir uns auf die Eingabe über die Tastatur und die Ausgabe auf Bildschirm oder Platte. Jetzt werden Sie auch einige Fallstricke der Ein/ Ausgabe kennenlernen.

14. Auswahl

Wir beginnen die Betrachtung der Steuerstrukturen mit der ▹Auswahl. Sie ist so bedeutsam, dass sie in vielen Programmiersprachen eingeführt wurde. Die Auswahl ermöglicht die Abarbeitung von Anweisungen in Abhängigkeit von einer Bedingung. Sie kommt in drei Ausprägungen vor, die in C++ mit folgenden Schlüsselwörtern eingeleitet werden:

15. Wiederholungen

Bei der Fallstudie „Einkommensteuer“ haben wir bemängelt, dass das Programm nach dem Start immer nur einen Durchlauf erlaubte, eine wiederholte Eingabe nicht möglich war. Solch ein Programm entspricht nicht den Anforderungen der Praxis. Wiederholungen (

iterations

) als Softwarekonstrukt sind daher seit den Anfängen der Rechnertechnik eingebaute Funktionalität.

16. Zeiger

Dieses Kapitel beschreibt die wesentlichen Aspekte des Zeiger–Konzepts und erläutert die Zeiger–Arithmetik, die wir im Kapitel 4 ausgespart haben. Dort wurde nur die den Zeigern zugrunde liegende Idee vorgestellt.

17. Arrays

Arrays sind eine wesentliche Erleichterung für den Programmierer und erlauben eine effiziente Datenorganisation. Zunächst beschreiben wir, wie Arrays in klassischer Weise eingesetzt und wie sie sortiert werden können. Ferner sehen wir, dass sich mit Arrays wunderbar rechnen lässt. Unter C sind Arrays nicht unproblematisch, C++ erlaubt bessere, dh. sicherere Konzepte, die wir mit dem Vektor kennenlernen werden.

18. Strukturen

Im letzten Kapitel haben wir Arrays behandelt. Es ist deutlich geworden, dass diese unter einem Bezeichner immer nur Variablen

eines

Datentyps vereinigen. Eine

Struktur

als Datentyp jedoch kann unter

einem Namen

Komponenten

verschiedener Datentypen

zusammenfassen, weshalb sie auch als Datenverbund bezeichnet wird. Auch an den Begriffen sieht man den Unterschied: (Feld)

Elemente

beim Array und

Komponenten

bei der Struktur. Strukturen fassen zusammen, was inhaltlich zusammengehört. Wir werden auch sehen, wie man seine Daten

nicht

strukturieren sollte.

19. Funktionen

Zur Lösung einer Programmieraufgabe stellt C++ − wie viele andere Programmiersprachen auch — bestimmte Mittel bereit:

Zur Modellierung von Daten haben Sie verschiedene Datentypen kennengelernt.

Zur Gestaltung des internen Informationsflusses dienen die Steuerstrukturen (control structures), zu denen Schleifen und Fallunterscheidungen zählen.

20. Gültigkeitsbereiche von Namen

Wir haben bereits mehrfach festgestellt, dass Variablen nur in bestimmten Speicherbereichen erkannt werden. Dies war mit ein Grund dafür, einen Datentransport zwischen den Speicherbereichen einzurichten. Für die Gestaltung der Variablen und ihre Verwaltung im Speicher ist unzweifelhaft der Programmierer verantwortlich. In dem Projekt zur Einkommensteuer haben Sie bereits gesehen, dass Variablen an verschiedenen Stellen eines Programms definiert werden können: Mal vor den verschiedenen Funktionsprototypen, mal innerhalb der main()–Funktion. Wo im Programm wird welche Variable erkannt? Wann sind Variablen

global

gültig, wann nur

lokal?

Diese Thematik betrachten wir in Abschnitt 20.1. Im Abschnitt 20.2 lernen Sie das Konzept der

Namensräume

in C++ kennen. Diese dienen dazu, Namenskonflikte bei Bezeichnern in groβen Softwareprojekten mit vielen Programmen zu vermeiden.

21. Großprojekte: Grundsätze der Modularisierung

Die bisherige Methode, Funktionen mit ihren Prototypen bekannt zu machen, Hauptprogramm und Funktions-Implementationen in nur

einer

Datei zu speichern, eignet sich für kleine Aufgabenstellungen, wie sie hier in diesem Buch meist vorliegen. In diesem Kapitel befassen wir uns damit, wie Groβprojekte auf mehrere Dateien verteilt werden. Die hier vorgestellten Prinzipien gelten auch und gerade für objektorientierte Programme, auch wenn wir dort nicht mehr auf das Thema eingehen.

22. Dateibearbeitung

Die Fallstudie mit der Einkommensteuer lieferte nur einen einzigen Wert, den zu speichern nicht sinnvoll ist. Das Beispiel mit der Abschreibung erzeugte mehr Daten und wirft die grundsätzliche Frage auf, wie Daten verschiedenster Art dauerhaft in einer Datei gespeichert und wieder rückgelesen werden können. Zunächst stehen auf einer Platte nur Bytes, aber dennoch unterscheiden sich die Dateien in ihrem inneren Aufbau. Dieses Kapitel beschreibt die verschiedenen Dateiarten sowie das Schreiben in und das Lesen aus Dateien.

Objektorientierte Programmierung

23. Einführung in die Konzepte der OOP

Dieses Kapitel erläutert im Überblick die wesentlichen Ideen, die der objektorientierten Programmierung zugrunde liegen — ohne auf Programmiercode einzugehen. Dazu wird zunächst ein Schwachpunkt der prozeduralen Sichtweise dargestellt, um daraus die Verbesserungen abzuleiten. Das Kapitel beschreibt die wesentlichen Begriffe wie Objekt, Klasse, Erbschaft (Vererbung) und Polymorphie.

24. Klassen und Objekle in C++

Während das letzte Kapitel einen konzeptionellen Überblick über das Wesen der objektorientierten Programmierung gegeben hat, geht dieses Kapitel in die Niederungen der handwerklichen Programmiertechnik. Es beschreibt die Konstruktionvorschriften für Klassen und Objekte. Sie sind so beschaffen, dass sich Klassen nahtlos in das bisher Gelernte einfügen.

25. Dynamische Datenobjekte

Wir haben ▹Arrays eingeführt als Sammlung von Daten identischen Typs unter einem gemeinsamen Bezeichner. Sie haben die bedeutsame Eigenschaft, dass sie in ihrer

Gröβe

vom Programmierer, und damit

zur Zeit des Compiliervorgangs, festgelegt

sind. Wir bezeichnen sie daher als ▹

statische Datenobjekte

. Sie existieren vom Augenblick ihrer Erzeugung, bis die entsprechende Funktion, zB. auch main(), abgebaut wird. Es ist daher

nicht

möglich, dass der Anwender

zur Laufzeit

des Programms durch externe Dateneingabe die Gröβe

verändern

kann. Als Folge dieser Eigenschaft sind Arrays vorsichtshalber regelmäβig über— und seltener bedarfsgerecht dimensioniert. Ein Beispiel dafür war die Abschreibung, die auf den Maximalwert 50 Perioden festgelegt wurde. Bei der Ausreichung von Krediten dagegen können durchaus mehr als 400 Perioden anfallen, manchmal aber auch nur 60. Zu groβ dimensionierte Felder sind einerseits Resourcenvergeudung, andererseits entstehen Probleme, wenn auch nur ein einziges Feldelement zusätzlich benötigt wird. Eine Lösung dieses Problems erlauben ▹

dynamische Datenobjekte

, die

zur Laufzeit bedarfsgerecht dimensioniert

werden können.

26. C++Standard-Container-Klassen

Ein ▹Container ist ein Objekt, das andere Objekte enthält — wie es die Eigenschaft eines

Behälters

so ist. In Anbetracht der Tatsache, dass in der Logistik auch von Containern gesprochen wird und dies zum Alltagsbegriff wurde, ist es nicht sehr sinnvoll, dieses Wort zu übersetzen.

27. String-Klasse

Der Einsatz der bisher dargestellten Zeichenketten, die noch ein Relikt der C–Programmierung sind, ist bei häufigem Programmieren ziemlich mühevoll und fehlerträchtig. Um vieles einfacher und sicherer gestaltet sich die Verwendung von Objekten aus der string-Klasse.

28. Erbschaften

Die Erbschaft ist, neben den Klassen, eines der bedeutendsten und leistungsfähigstenMerkmale objektorientierter Programmierung. Das Erben ist die Bezeichnung für die Erstellung neuer Klassen — die auch abgeleitete Klassen genannt werden — auf der Grundlage von bestehenden Klassen, den Ober– oder auch Basisklassen.

29. Fallstudie

In den letzten Kapiteln haben wir systematisch einige wichtige Eigenschaften an kleineren Beispielen beschrieben. Mit der Fallstudie wollen wir wieder ein gröβeres Projekt angehen, bei dem wir verschiedene Aspekte berücksichtigen und das wir in mehreren Etappen erarbeiten. Wir folgen wieder unserer Systematik, nach der wir den Sachverhalt intensiv aufarbeiten, bevor das eigentliche Programmieren im Vordergrund steht.

30. Ausblick

Sie haben mit diesem Buch eine Einführung in das objektorientierte Programmieren unter Verwendung der doch recht mächtigen Sprache C++ erhalten. Ziel war nicht, den vollständigen Funktionsumfang einer Sprache wie C++ anhand von Softwarepröbchen systematisch darzustellen, sondern den Problemlösungsprozess zu entwickeln und zu fördern. Sie haben nun ein solides Fundament, auf das Sie aufbauen können - wenn Sie mögen. Welche Möglichkeiten eröffnen sich Ihnen jetzt?

31. Lösungen
Backmatter
Metadaten
Titel
Grundkurs Software-Entwicklung mit C++
verfasst von
Dietrich May
Copyright-Jahr
2006
Verlag
Vieweg
Electronic ISBN
978-3-8348-9022-1
Print ISBN
978-3-8348-0125-8
DOI
https://doi.org/10.1007/978-3-8348-9022-1