19
DIPLOMA PRIVATE STAATLICH ANERKANNTE HOCHSCHULE University of Applied Sciences Gsell Anwenderprogrammierung I Studienheft Nr. 399 1. Auflage 02/2016 Leseprobe

Studiengang - Betriebswirtschaft - DIPLOMA · 2017. 3. 23. · Anwenderprogrammierung I i.d.F.v. 15.02.2016 Seite 3 Studienheft Nr. 399 Hinweise zur Arbeit mit diesem Studienheft

  • Upload
    others

  • View
    1

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Studiengang - Betriebswirtschaft - DIPLOMA · 2017. 3. 23. · Anwenderprogrammierung I i.d.F.v. 15.02.2016 Seite 3 Studienheft Nr. 399 Hinweise zur Arbeit mit diesem Studienheft

DIPLOMAPRIVATE STAATLICH ANERKANNTE HOCHSCHULE

U n i v e r s i t y o f A p p l i e d S c i e n c e s

Gsell

Anwenderprogrammierung I

Studienheft Nr. 399

1. Auflage 02/2016

Lese

probe

Page 2: Studiengang - Betriebswirtschaft - DIPLOMA · 2017. 3. 23. · Anwenderprogrammierung I i.d.F.v. 15.02.2016 Seite 3 Studienheft Nr. 399 Hinweise zur Arbeit mit diesem Studienheft

Verfasser

Dr. Heiko Gsell

Dipl.-Ing., Dozent an der Diploma Hochschuledmc 030 GmbH Tätigkeitsschwerpunkte E-Commerce, Projektmanagement

© By DIPLOMA Private Hochschulgesellschaft mbHDas Werk ist urheberrechtlich geschützt. Die dadurch begründeten Rechte, insbesondere das Recht der Vervielfältigung und Verbreitung sowie der Übersetzung und des Nachdrucks, bleiben, auch bei nur auszugsweiser Verwertung, vorbehalten. Kein Teil des Werkes darf in irgendeiner Form ohne schriftliche Genehmigung reproduziert oder unter Verwendung elektronischer Syste-me verarbeitet, vervielfältigt oder verbreitet werden.

Diploma HochschuleUniversity of Applied SciencesAm Hegeberg 237242 Bad Sooden-AllendorfTel. 05652/587770, Fax 05652/5877729

Lese

probe

Page 3: Studiengang - Betriebswirtschaft - DIPLOMA · 2017. 3. 23. · Anwenderprogrammierung I i.d.F.v. 15.02.2016 Seite 3 Studienheft Nr. 399 Hinweise zur Arbeit mit diesem Studienheft

Anwenderprogrammierung I

i.d.F.v. 15.02.2016 Seite 3 Studienheft Nr. 399

Hinweise zur Arbeit mit diesem Studienheft

Der Inhalt dieses Studienheftes unterscheidet sich von einem Lehrbuch dadurch, dass er für das Selbststudium besonders aufgearbeitet ist. Die Bearbeitung eines Studienheftes beginnt in der Regel mit einer Information über den In-halt des Lehrstoffes. Diese Auskunft gibt Ihnen das Inhaltsverzeichnis. Bei dem Vertrautmachen mit neuen Inhalten finden Sie immer Begriffe, die Ihnen bisher un-bekannt sind. Die wichtigsten Fachbegriffe dieses Studienheftes werden Ihnen übersichts-mäßig in einem dem Inhaltsverzeichnis nachgestellten Glossar erläutert. Dem Inhalt dieses Studienheftes bzw. größerer Lernabschnitte sind Lernziele vorangestellt. Sie dienen als Orientierungshilfe und ermöglichen Ihnen nach Durcharbeitung des Materials, Ihren eigenen Lernerfolg zu überprüfen. Setzen Sie sich aktiv mit dem Text auseinander, indem Sie sich wichtiges und weniger wich-tiges mit farbigen Stiften kennzeichnen. Betrachten Sie dieses Studienheft nicht als „schönes Buch“, das nicht verändert werden darf. Es ist ein Arbeitsheft, mit dem und in dem Sie arbei-ten sollen. Zur schnelleren Orientierung haben wir Merksätze bzw. besonders wichtige Aussagen durch Fettdruck und / oder Einzug hervorgehoben. Lassen Sie sich nicht beunruhigen, wenn Sie Sachverhalte finden, die zunächst für Sie noch unverständlich sind. Diese Probleme sind bei einer ersten Begegnung mit einem neuen Stoff ganz normal. Nach jedem größeren Lernabschnitt haben wir Übungsaufgaben, die mit „SK = Selbstkon-trolle“ gekennzeichnet sind, eingearbeitet. Sie sollen der Vertiefung und Festigung der Lerni-nhalte und vor allem der Selbstkontrolle dienen. Versuchen Sie, die ersten Aufgaben zu lösen bzw. die Fragen zu beantworten. Dabei werden Sie teilweise feststellen, dass das dazu erforderliche Wissen nach der ersten Durcharbeit des Lehrstoffes noch nicht vorhanden ist. Gehen Sie nun nochmals diesen Inhalten nach, d. h. durchsuchen Sie das Studienheft gezielt nach den erforderlichen Informationen. Sofort bereits während der Bearbeitung einer Frage sollten Sie die eigene Antwort schriftlich festhalten. Erst nach der vollständigen Beantwortung vergleichen Sie Ihre Lösung mit dem am Ende des Studienheftes angegebenen Lösungsangebot. Stellen Sie dabei fest, dass Ihre eigene Antwort unvollständig oder sogar falsch ist, müssen Sie sich nochmals um die Aufgabe bemühen. Versuchen Sie, jedes Thema dieses Studienhef-tes zu verstehen. Es bringt nichts, Wissenslücken durch Umblättern zu beseitigen. In vie-len Studienfächern baut der spätere Stoff auf vorhergehendem auf. Kleine Lücken in den Grundlagen verursachen deshalb große Lücken in den Anwendungen. Jedes Studienheft ent-hält Literaturhinweise. Sie sollten diese Hinweise als ergänzende und vertiefende Literatur bei Bedarf zur Auseinandersetzung mit der jeweiligen Thematik betrachten. Finden Sie auch

Lese

probe

Page 4: Studiengang - Betriebswirtschaft - DIPLOMA · 2017. 3. 23. · Anwenderprogrammierung I i.d.F.v. 15.02.2016 Seite 3 Studienheft Nr. 399 Hinweise zur Arbeit mit diesem Studienheft

Anwenderprogrammierung I

i.d.F.v. 15.02.2016 Seite 4 Studienheft Nr. 399

nach intensiver Durcharbeit keinen Weg zu befriedigenden Antworten auf Ihre Fragen, geben Sie nicht auf. In diesen Fällen wenden Sie sich schriftlich oder fernmündlich an uns. Wir stehen Ihnen mit Ratschlägen und fachlicher Anleitung stets zur Seite. Wenn Sie ohne Zeitdruck studieren, sind Ihre Erfolge größer. Lassen Sie sich also nicht un-ter Zeitdruck setzen. Pausen sind wichtig für Ihren Lernfortschritt. Kein Mensch ist in der Lage, stundenlang ohne Pause konzentriert und nutzbringend zu arbeiten. Machen Sie also auch mal Pause! Es kann eine Kurzpause mit einer Tasse Kaffee sein, eventuell aber auch ein Spaziergang in frischer Luft, der Ihnen erst einmal wieder etwas Abstand von Ihren Stu-dienthemen bringt. Wir wünschen Ihnen viel Erfolg bei der Bearbeitung dieses Studienheftes. Ihre DIPLOMA Private Hochschulgesellschaft mbH

Lese

probe

Page 5: Studiengang - Betriebswirtschaft - DIPLOMA · 2017. 3. 23. · Anwenderprogrammierung I i.d.F.v. 15.02.2016 Seite 3 Studienheft Nr. 399 Hinweise zur Arbeit mit diesem Studienheft

Anwenderprogrammierung I

i.d.F.v. 15.02.2016 Seite 6 Studienheft Nr. 399

5.1. Grafische Notation von Kontrollstrukturen – Struktogramm und Programmablaufplan 50

5.2. Blöcke _________________________________________________________________ 52

5.3. Verzweigungen (if-/else-Anweisung) _________________________________________ 54

5.4. Mehrwegauswahl (switch-/case-Anweisung) __________________________________ 55

5.5. Der Zählzyklus (for-Schleife) ________________________________________________ 56

5.6. Abweisender Zyklus (while-Schleife) _________________________________________ 58

5.7. Nichtabweisender Zyklus (do-/while-Schleife) _________________________________ 59

5.8. Anweisung zur unbedingten Steuerungsübergabe (break- und continue-Anweisung) _ 60

6. Funktionen ____________________________________________________________ 64

6.1. Definition und Deklaration von Funktionen ___________________________________ 64

6.1.1. Parameterübergabe ___________________________________________________________ 65

6.1.2. Rückgabewerte von Funktionen__________________________________________________ 66

6.2. Deklarationen und Headerdateien __________________________________________ 67

6.3. Das Hauptprogramm in C++ ________________________________________________ 68

6.4. Rekursive Funktionen _____________________________________________________ 70

7. Lösung der Übungsaufgaben LÖ ___________________________________________ 73

8. Literaturempfehlungen und Quellenverzeichnis ______________________________ 86

8.1. Literaturempfehlungen ___________________________________________________ 86

8.2. Verzeichnis der verwendeten Quellen ________________________________________ 86

Lese

probe

Page 6: Studiengang - Betriebswirtschaft - DIPLOMA · 2017. 3. 23. · Anwenderprogrammierung I i.d.F.v. 15.02.2016 Seite 3 Studienheft Nr. 399 Hinweise zur Arbeit mit diesem Studienheft

Anwenderprogrammierung I

i.d.F.v. 15.02.2016 Seite 7 Studienheft Nr. 399

Glossar

Bibliothek Eine Bibliothek bezeichnet in der Programmierung eine Sammlung

von Unterprogrammen bzw. Routinen, welche Lösungswege für thematisch zusammengehörende Problemstellungen anbieten. Biblio-theken sind nicht eigenständig lauffähig; sie enthalten Hilfsmodule, die von Programmen angefordert werden.

C99-Standard Der C99-Standard ist der Kurzname für den Standard ISO/EC 9899:1999 und bezeichnet den aktuellen Standard der Programmier-sprache C. Er erweitert seine Vorläuferversion C90 um neue Funkti-onen der Sprache und eine Standardbibliothek. Dabei unterstützt er die verbesserte Nutzung der verfügbaren Computerhardware, bspw. die IEEE 754-1985-Arithmetik und die Compilertechnologie.

Compiler Ein Compiler stellt ein Computerprogramm dar, das Quellcode einer bestimmten Programmiersprache in eine Form übersetzt, die von ei-nem Rechner direkt ausgeführt werden kann.

Escape-Sequenz Die Ausgabe von nicht-druckbaren Zeichen, bspw. eines Zeilenvor-schubs oder eines Tabulators, erfolgt mittels unterschiedlicher Steu-eranweisungen, den sog. Escape-Sequenzen. Escape-Sequenzen wer-den an beliebigen Stellen in einem String oder als einzelnes Zeichen in eine cout-Anweisung geschrieben. Sie beginnen immer mit dem Backslash-Zeichen \ gefolgt von einem ASCII-Zeichen, welches die auszuführende 'Operation' beschreibt. \n repräsentiert bspw. die Es-cape-Sequenz für den Zeilenvorschub.

Programmablaufplan PAP Ein Programmablaufplan (PAP) bezeichnet ein Ablaufdiagramm für ein Computerprogramm, welches auch Flussdiagramm oder Pro-grammstrukturplan genannt wird. Der Programmablaufplan stellt die Umsetzung eines Algorithmus in einem Programm graphisch dar und beschreibt die erforderliche Folge von Operationen zur Lösung einer Aufgabe. Die Symbole für Programmablaufpläne sind in der DIN 66001 genormt.

Shell Als Shell wird die Software bezeichnet, welche einen Benutzer mit dem Computer verbindet. Sie ermöglicht bspw. die Nutzung von Diensten des Betriebssystemkerns, die Information über Systemkom-ponenten oder die Bedienung dieser Systemkomponenten. Die Shell beschreibt eine Oberfläche zwischen dem Anwender und dem Inne-ren (den Kernel-Komponenten) eines Rechnersystems. Betriebssyste-me implementieren zwei Arten von Shells, nämlich die Kommando-zeile und die grafische Benutzeroberfläche. Umgangssprachlich wird i.d.R. der Kommandozeileninterpreter Shell genannt.

Stack Ein Stack, auch Stapelspeicher, bezeichnet eine häufig eingesetzte Datenstruktur, die von den meisten Mikroprozessoren in der Hardware direkt unterstützt wird. Ein Stack kann theoretisch beliebig viele, in der Praxis jedoch nur eine begrenzte Menge von Objekten aufnehmen. Diese Elemente können nur oben auf den Stapel gelegt und nur von dort wieder gelesen werden. Sie werden übereinander gestapelt und in umgekehrter Reihenfolge vom Stapel genommen (Last-in-First-out-Prinzip).

Lese

probe

Page 7: Studiengang - Betriebswirtschaft - DIPLOMA · 2017. 3. 23. · Anwenderprogrammierung I i.d.F.v. 15.02.2016 Seite 3 Studienheft Nr. 399 Hinweise zur Arbeit mit diesem Studienheft

Anwenderprogrammierung I

i.d.F.v. 15.02.2016 Seite 8 Studienheft Nr. 399

Struktogramm Ein Struktogramm bzw. Nassi-Shneiderman-Diagramm ist ein Dia-grammtyp zur Darstellung von Programmentwürfen im Rahmen der Methode der strukturierten Programmierung. Es wurde 1972/73 von Isaac Nassi und Ben Shneiderman entwickelt und ist in der DIN 66261 genormt. Die Methode zerlegt ein Gesamtproblem, das mit einem gewünschten Algorithmus gelöst werden soll, in immer kleinere Teilprobleme bis elementare Grundstrukturen wie Sequenzen und Kontrollstrukturen zur Lösung des Problems übrig bleiben. Diese können dann durch das Struktogramm oder einen Programmablauf-plan (PAP) visualisiert werden.

Lese

probe

Page 8: Studiengang - Betriebswirtschaft - DIPLOMA · 2017. 3. 23. · Anwenderprogrammierung I i.d.F.v. 15.02.2016 Seite 3 Studienheft Nr. 399 Hinweise zur Arbeit mit diesem Studienheft

Anwenderprogrammierung I

i.d.F.v. 15.02.2016 Seite 9 Studienheft Nr. 399

1. Einführung

Lernziele: Nach dem Studium dieses Kapitels Wissen Sie

welche Bedeutung Mikroprozessoren für Geräte, Maschinen und Anlagen haben und wie sich die internen Abläufe in Mikroprozessoren gestalten,

welche Aufgaben Compiler, Linker sowie Debugger wahrnehmen,

was eine integrierte Entwicklungsumgebung ist und wie Sie diese für die Entwicklung von Pro-grammen nutzen,

was Objekte und Klassen sind und welche Bedeutung diese für die Programmierung haben und

wie das Programm „Hello World“ in C++ aussieht aus welchen Programmelementen es besteht.

1.1. Mikrocontroller – Funktion und Arbeitsweise Moderne technische Geräte und Systeme wie bspw. Haushaltsgeräte, Unterhaltungselektronik, Kraftfahrzeuge oder komplexe Produktionsanlagen beinhalten elektronische Steuerungsfunktionen, welche mittels Mikrocontrollern ausgeführt werden. Für diese Steuerungsfunktionen implementieren Mikrocontroller Softwareprogramme, welche die Ausführung der jeweiligen Funktionen umsetzen. Eine wesentliche Anforderung an derartige Programme ist deren Zuverlässigkeit und Qualität. Diese Programme werden in einer Serienproduktion in den Geräten, Maschinen und Anlagen installiert.

Definition: Bei Mikrocontrollern handelt es sich um leistungsfähige programmierbare Rechner-

systeme für die Lösung von Spezialaufgaben. I.d.R. integrieren sie auf einem Chip die Funktionseinheiten Mikroprozessor, Festwert- und Arbeitsspeicher, Schnittstel-len für Peripheriegeräte, Zeitgeber sowie Analog/Digital- und Digital/Analog-Wand-ler. Sie arbeiten in einem eigenen System, ihre Funktionen liegen bspw. in der Auf-nahme von Messwerten, der Erfassung von Daten oder der Durchführung von ein-fachen Verarbeitungsaufgaben [IT Wissen 2015].

Mikrocontroller verfügen über lediglich eingeschränkte Möglichkeiten der Datenverarbeitung und Datenübertragung. Zudem weisen die Systeme keine direkte Bedien- oder Programmierschnittstel-le auf, sodass die implementierten Programme extern erstellt und mittels einer Datenschnittstelle auf das System übertragen werden müssen. Die Entwicklung derartiger Systeme schließt die Entwicklung der erforderlichen Software ein, die in einem konventionellen Software-Engineering-Prozess vorge-nommen wird und u.a. die Phasen Entwurf und Test einschließt. Die prinzipielle Arbeitsweise eines Mikrocontrollers wird entlang des nachfolgenden Beispiels erläu-tert [Hülsemann 2009, S. 2]. Darin werden auch die wesentlichen Funktionselemente, die der Mikro-controller bei der Aufgabenausführung einsetzt, vorgestellt. So addiert der nachfolgende C++-Programmcode zwei ganze Zahlen (Datentyp INTEGER) und speichert die Summe dieser Zahlen ab:

Lese

probe

Page 9: Studiengang - Betriebswirtschaft - DIPLOMA · 2017. 3. 23. · Anwenderprogrammierung I i.d.F.v. 15.02.2016 Seite 3 Studienheft Nr. 399 Hinweise zur Arbeit mit diesem Studienheft

Anwenderprogrammierung I

i.d.F.v. 15.02.2016 Seite 13 Studienheft Nr. 399

auch Elemente einer „klassischen“ prozeduralen Programmierung. Es handelt sich um eine erweiter-bare Programmiersprache, in welcher sich neue Typen definieren lassen, die sich wie vordefinierte Typen als Teil der Programmiersprache verhalten. C++ ist somit für komplexere Programmieraufga-ben geeignet [Tschabitscher 2005, S. 1] Für die Durchführung der Aufgaben eines Mikroprozessors oder Rechners kann die Definition und Beschreibung von Objekten erforderlich sein, die mittels der höheren Programmiersprache C++ ab-gebildet und mittels bestimmter Methoden zueinander in Beziehung gesetzt werden. Es werden also Objekte der realen Welt durch ihre Abbildung im Rechner simuliert, wobei die Abbildung selbst wie-der Objekt heißt. Objekte im Sinne der Objektorientierten Programmierung sind wiederum Abstrakti-onen von Dingen der realen Welt [Breymann 2003, S. 9]. Die Definition der in der objektorientierten Programmierung genutzten Elemente stellt sich wie folgt dar [Tutorialspoint 2015, S. 6]:

Objekte haben Zustände und ein Verhalten. Bspw. stellen die Farbe, der Name und die Rasse eines Hundes seinen Zustand dar, sein Verhalten liegt im Laufen, Bellen oder Essen. Ein Objekt bildet die Instanz einer Klasse.

Eine Klasse lässt sich definieren als Entwurf beschreiben, welcher die Zustände und das Verhalten von Objekten ihres Typen unterstützen.

Eine Methode stellt grundsätzlich ein Verhalten dar. Eine Klasse kann viele Methoden umfassen. In Methoden werden Logiken festgelegt, Daten manipuliert und alle Aktionen ausgeführt.

Jedes Objekt verfügt über einen einzigartigen Satz von aktuellen Variablen. Der Zustand eines Objekts wird durch die Werte, welche diesen aktuellen Variablen zugeordnet sind, beschrieben.

1.5. Das „Hello World“-Programm in C++ Das erste Programm, mit dem eine neue Programmiersprache eingeführt wird, ist i.d.R. das „Hello-World“-Programm. Dies wird im vorliegenden Studienheft ebenso gehandhabt. Daher nachfolgend das „Hello-World“-Programm in C++:

Die Ausführung des vorangehend dargestellten Programms führt zu nachfolgender Ausgabe auf den Bildschirm:

Lese

probe

Page 10: Studiengang - Betriebswirtschaft - DIPLOMA · 2017. 3. 23. · Anwenderprogrammierung I i.d.F.v. 15.02.2016 Seite 3 Studienheft Nr. 399 Hinweise zur Arbeit mit diesem Studienheft

Anwenderprogrammierung I

i.d.F.v. 15.02.2016 Seite 17 Studienheft Nr. 399

C++ beim Programmieren ein höheres Abstraktionsniveau; dies bedeutet, dass der Programmierer sich bei der Programmierung nicht um jedes – möglicherweise fehleranfällige – informatische Detail kümmern muss, dies aber sehr wohl tun kann, sofern dies nötig ist. Die höhere Geschwindigkeit von Programmen, die in C++ erzielt werden, resultiert aus dem Faktor, dass es sich bei C++ um eine Compilersprache und nicht um eine Interpretersprache handelt. Die benötigten Compiler sind für alle gängigen Betriebssysteme eines Computersystems, insbesondere für Linux, Windows und Mac-OS, kostenlos verfügbar. Darüber hinaus existieren kostenlose Programmierentwicklungsumgebun-gen wie bspw. CodeBlocks2. Aufgrund seiner Unterstützung mehrerer Programmierparadigmen von C++ lassen sich die Programmiertechniken anderer Spitzensprachen mit C++ ebenfalls realisieren. Mit seinen umfassenden Bibliotheken ist C++ sehr gut dokumentiert. Auch wird die Programmiersprache kontinuierlich weiterentwickelt, um auch weiterhin die modernsten Anforderungen an eine Program-miersprache zu erfüllen.

2.2. Aufbau von C++-Programmen Die nachfolgende Abbildung 2 zeigt die grundlegende Struktur eines C++-Programms. Wie bereits in Abschnitt 1.5 dargestellt, beginnt das Programm mit einem Compiler-Instruktor, mit dem die Biblio-theken aufgerufen werden, die in dem jeweiligen Programm genutzt werden sollen. So muss an dieser Stelle die Bibliothek iostream eingebunden werden, um die C++-Ein-/Ausgabe nutzen zu können [Buch 2012, S. 21]. Diese Einbindung erfolgt mittels des Aufrufs #include <iostream>.

Abbildung 2: Struktur eines C++-Programms [Breymann 2003, S. 18] Im Anschluss an den Aufruf der Bibliothek iostream müssen dem Programm die Befehle aus die-sem Aufruf bekannt gegeben werden, da sie sich in einem speziellen Namensraum befinden.

Definition: Es ist nicht auszuschließen, dass zwei unabhängig voneinander entstandene Quell-

texte die gleichen Namen verwenden. Daher wurde in C++ der Namensraum einge-führt, mittels dessen Deklarationen und Definitionen unter einem Namen zusam-mengefasst werden und gegen andere Namen abgegrenzt werden können [Wille-mer 2005a].

Um die Ein- und Ausgabebefehle nutzen zu können, muss dem Compiler mitgeteilt werden, dass der Namensraum std zu nutzen ist. Dazu wird die Codezeile using namespace std; genutzt. Der Namensraum std bezeichnet den Standard-Namensraum. Die Befehle, welche in diesem Namens-raum definiert sind, gehören zur C++-Standardbibliothek. Wenn bspw. ein Objekt in einem C++-Programm genutzt werden soll, welches im Namensraum std definiert ist, wird diesem Objekt std:: vorangestellt [Buch 2012, S. 21]. Dies ist auch im C++-„Hello World“-Programm in Ab-

Lese

probe

Page 11: Studiengang - Betriebswirtschaft - DIPLOMA · 2017. 3. 23. · Anwenderprogrammierung I i.d.F.v. 15.02.2016 Seite 3 Studienheft Nr. 399 Hinweise zur Arbeit mit diesem Studienheft

Anwenderprogrammierung I

i.d.F.v. 15.02.2016 Seite 18 Studienheft Nr. 399

schnitt 1.5 zu erkennen. Die beiden Doppelpunkte hinter dem Namensraum werden als Bereichsope-rator bezeichnet. Nach der Compiler-Instruktion erfolgt im C++-Programm die Deklaration von globalen Objekten bzw. Variablen. Dabei handelt es sich um Objekte, die außerhalb aller Funktionen definiert wer-den und in allen Funktionen gelten [Willemer 2005b]. Sie werden beim Programmstart erzeugt und initialisiert sowie am Programmende wieder zerstört. Bei ihrer Erzeugung werden die globalen Objek-te automatisch auf 0 gesetzt, dennoch wird empfohlen, globale Objekte zu initialisieren. Im Anschluss an die Initialisierung der globalen Objekte werden die benötigten Funktionen f() des C++-Programms deklariert, d.h. es wird ein Funktionsprototyp angegeben bzw. die Unterpro-grammschnittstelle ausgezeichnet [Buch 2012, S. 85]. Funktionen in C++ können Parameter besitzen oder nicht; sie können weiterhin einen Wert zurückgeben oder nicht. Mit der Angabe des Funktions-prototypen erfolgt die Definition der jeweiligen Typen von Parametern und des jeweiligen Rück-gabewerts des Funktion. So wird eine Funktion mit einem Parameter vom Typ int, die einen int-Wert zurückgibt, mit der Zeichenfolge int f (int x); deklariert. Der durch die jeweilige Funk-tion zurückgegebene Wert kann im C++-Programm weiter genutzt werden. Soll durch eine Funktion kein Wert zurückgegeben werden, lautet der Rückgabetyp formal void. Die Hauptfunktion main() begründet die Implementierung des Lösungsalgorithmus des C++-Programms, also die eigentliche Problemlösung (vgl. Abschnitt 1.5). Diese besteht aus einer Folge von Anweisungen, also Deklarationen und ausführbare Anweisungen, welche das Hauptprogramm bilden. Die Hauptfunktion main() kommt in jedem Programm nur einmal vor. Der Rumpf des Hauptprogramms stellt den lokalen Bereich des C++-Programms dar und alle Anweisungen, welche nicht im lokalen Bereich des Programms stehen, sind im globalen Bereich des Programms zu finden. Zum Abschluss eines C++-Programms wird in der Funktions-Definition schließlich der Unterpro-grammcode erstellt. Die Funktions-Definition umfasst somit auch die Implementierung der Funktion, also den Code, der beim Aufrufen der Funktion ausgeführt werden soll. Beispielhaft wird der nachfol-gende C++-Code erläutert.

Nach dem Compilieren werden die Objektdaten der Funktion zu einem ausführbaren Programm ge-linkt. Dazu benötigt der Linker die Definition der aufzurufenden Funktion, also den Code, der beim

Lese

probe

Page 12: Studiengang - Betriebswirtschaft - DIPLOMA · 2017. 3. 23. · Anwenderprogrammierung I i.d.F.v. 15.02.2016 Seite 3 Studienheft Nr. 399 Hinweise zur Arbeit mit diesem Studienheft

Anwenderprogrammierung I

i.d.F.v. 15.02.2016 Seite 23 Studienheft Nr. 399

Übungsaufgaben zur Selbstkontrolle SK

Aufgabe 2.1: a) Welches sind die wichtigsten Merkmale von C++-Programmen? b) Worin begründet sich die hohe Ausführungsgeschwindigkeit eines C++-Programms? Erläutern

Sie diesen im Vergleich zu Java- und .NET-Programmen. Aufgabe 2.2: a) Wie wird eine Bibliothek in ein C++-Programm eingebunden? b) Wie ist der Namensraum eines C++-Programms definiert? c) Wozu dient die Hauptfunktion eines C++-Programms? d) Welchen Vorteil bieten eine Trennung von Deklaration und Definition einer Funktion? e) Nennen Sie einige generelle Syntaxregeln der Programmiersprache C++. Aufgabe 2.3: a) Was ist eine ausführbare Anweisung? b) Wie muss eine Ausgabe, die auf einem Monitor angezeigt werden soll, codiert werden? c) Was passiert, wenn eine Programmausführung bis zu einer Eingabeanweisung fortgeschritten ist? d) Welche Voraussetzung muss erfüllt werden, um die Ausgabeanweisung cout und die Eingabe-

anweisung cin nutzen zu können? e) Welche syntaktische Voraussetzung muss eine Zuweisung erfüllen? f) Worin liegt eine wichtige Bedingung für die Entwicklung zuverlässiger Programme? Wie wird

diese Anforderung genannt?

Lese

probe

Page 13: Studiengang - Betriebswirtschaft - DIPLOMA · 2017. 3. 23. · Anwenderprogrammierung I i.d.F.v. 15.02.2016 Seite 3 Studienheft Nr. 399 Hinweise zur Arbeit mit diesem Studienheft

Anwenderprogrammierung I

i.d.F.v. 15.02.2016 Seite 24 Studienheft Nr. 399

3. Variablen und Datentypen

Lernziele: In diesem Kapiteln lernen Sie die Bedeutung und die Einsatzmöglichkeiten von Variablen kennen. In den einzelnen Abschnitten werden Sie vertraut mit

den Funktionen von Variablen in C++, unterschiedlichen Datentypen, die durch Variablen reprä-sentiert werden sowie Gültigkeitsbereichen für unterschiedliche Arten von Variablen,

unterschiedlichen Typen von Literalen und Konstanten, die in C++-Programmen genutzt werden, sowie

einigen höheren Datentypen zur Vereinfachung des Programmierens in C++.

3.1. Erste Schritte mit Variablen Das nachfolgende Programm zeigt eine Erweiterung des C++-„Hello World“-Programms aus Ab-schnitt 1.5. Dieses Programm gibt neben der Zeile „Hello World“ Werte aus, die vorab eingelesen werden. Dazu werden eine Deklaration der jeweiligen Variablen, das Einlesen der auszugebenden Werte sowie die Deklaration und Definition von Strings vorgenommen.

Lese

probe

Page 14: Studiengang - Betriebswirtschaft - DIPLOMA · 2017. 3. 23. · Anwenderprogrammierung I i.d.F.v. 15.02.2016 Seite 3 Studienheft Nr. 399 Hinweise zur Arbeit mit diesem Studienheft

Anwenderprogrammierung I

i.d.F.v. 15.02.2016 Seite 28 Studienheft Nr. 399

Die Funktion myfunc() arbeitet mit den drei Variablen globvar, statvar und locvar. Diese Variablen werden angezeigt und inkrementiert. Das Hauptprogramm ruft diese Funktion dreimal auf. Anschließend versucht das Hauptprogramm, den Variablen den Wert 8 zuzuweisen. Diese Zuwei-sung wird bei den Variablen locvar und statvar bereits vom Compiler unterbunden, da die beiden Variablen nur innerhalb der Funktion myfunc() sichtbar sind. Abschließend wird die Funktion myfunc() zwei weitere male aufgerufen. Nach Entfernung der beiden Fehler aus dem Pro-gramm kann das Programm gestartet werden. Folgende Ausgabe erscheint dann auf dem Bildschirm:

Lese

probe

Page 15: Studiengang - Betriebswirtschaft - DIPLOMA · 2017. 3. 23. · Anwenderprogrammierung I i.d.F.v. 15.02.2016 Seite 3 Studienheft Nr. 399 Hinweise zur Arbeit mit diesem Studienheft

Anwenderprogrammierung I

i.d.F.v. 15.02.2016 Seite 29 Studienheft Nr. 399

Im obigen Beispiel ist das unterschiedliche Verhalten der drei Variablen globvar, statvar und locvar abgebildet. Dieses lässt sich wie folgt erklären:

Globale Variable: Die globale Variable globvar wird beim Programmstart erzeugt und initiali-siert. Innerhalb der Funktion wird sie inkrementiert und angezeigt. Da es sich um eine globale Va-riable handelt, kann jede Funktion und selbstverständlich auch die Hauptfunktion main() auf diese Variable zugreifen. Dies wird dadurch demonstriert, dass der Wert dieser Variablen inner-halb der Hauptfunktion main() nach dem dritten Funktionsaufruf von myfunc()auf 8 festge-setzt wird. Bei den nächsten Aufrufen arbeitet die Funktion myfunc() mit diesem veränderten Wert weiter.

Statische Variable: Die statische Variable statvar verhält sich teilweise wie eine lokale und teilweise wie eine globale Variable. Einerseits ist diese Variable wie eine lokale Variable gegen Zugriffe von außerhalb der Funktion myfunc() geschützt. Dies bedeutet, dass ihr Wert von au-ßen nicht verändert werden kann. Andererseits verliert die statische Variable beim Verlassen der Funktion ihren jeweils aktuellen Wert nicht. Die Initialisierung wird nur einmal ausgeführt, und zwar beim erstmaligen Aufrufen der Funktion.

Lokale Variable: Das Verhalten der lokalen Variable locvar ist damit zu erklären, dass diese Variable bei jedem Aufrufen der Funktion neu erzeugt und beim Verlassen wieder zerstört wird. Somit wird die Variable bei jedem Funktionsaufruf neu initialisiert und erhält mit jedem Aufruf wieder den Wert 1 zugewiesen. Nach dem Inkrementieren hat sie innerhalb der Funktion den Wert 2, der jedoch beim Beenden der Funktion myfunc() wieder zerstört wird.

3.2.2. Einfache Datentypen Daten in einem Rechner basieren auf dem binären Zahlensystem von Gottfried Wilhelm Leibniz. Demnach können alle ganzen Zahlen durch die Summation von mit 0 oder 1 gewichteten Zweier-potenzen dargestellt werden. So wird bspw. die Dezimalzahl 117 im binären Zahlensystem wie folgt dargestellt:

117(10) = 01110101(2) = 0 * 27 + 1 * 26 + 1 * 25 + 1 * 24 + 0 * 23 + 1 * 22 + 0 * 21 + 1 * 20 Ein bit bildet die grundlegende Informationseinheit in einem Rechner. Diese Informationseinheit kann genau einen der zwei Zustände 0 oder 1 annehmen (nein/ja bzw. false/true). Daraus folgt, dass für die obige Binärdarstellung von 117 genau 8 bit benötigt werden. Diese 8 bit stellen die kleinste Grundeinheit des Datenzugriffs bei heutigen Rechnern dar und repräsentieren ein Byte. Aufbauend auf der Speichereinheit Byte zeigt die nachfolgende Tabelle die grundlegenden Datentypen, welche in C++ von Relevanz sind.

Typ Speicherbedarf in Byte Inhalte Mögliche Werte

char 1 Character-Zeichen ’H’, ’e’, ’\n’

bool 1 Booleanvariable false, true

int

short (int)

long (int)

signed char

4

2

4

1

Ganze Zahlen (Integer

-32768 bis 32767

-32767, -215, -215-1

wie int

-117, 67, -128, 127

float

double

4

8 Gleitkommazahlen

(floating point numbers) 1.1, -1.56e-32

1.1, -1.56e-32, 5,68e+287

unsigned (int)

long long (int)

long double

4

8

12

Natürliche Zahlen

Ganze Zahlen

Gleitkommazahlen

32767, 32769, 0, 232-1

-263, -263-1

5.68e+287, 5.68e+420

Lese

probe

Page 16: Studiengang - Betriebswirtschaft - DIPLOMA · 2017. 3. 23. · Anwenderprogrammierung I i.d.F.v. 15.02.2016 Seite 3 Studienheft Nr. 399 Hinweise zur Arbeit mit diesem Studienheft

Anwenderprogrammierung I

i.d.F.v. 15.02.2016 Seite 30 Studienheft Nr. 399

Die in der vorangehenden Tabelle aufgelisteten Datentypen weisen spezifische Merkmale auf und werden in C++-Programmen auf definierte Weise verwendet. Diese Merkmale und Verwendungen stellen sich für die einzelnen Datentypen wie folgt dar [Schäling 2010]:

Der Datentyp int eignet sich hervorragend zur Speicherung von ganzen Zahlen. Es handelt sich hier um einen intrinsischen Datentyp. Intrinsische Datentypen können ohne vorherige Bekannt-machung in einem C++-Programm genutzt werden. Somit weiß ein C++-Programm automatisch, dass mit dem Datentyp int eine ganze Zahl gespeichert bzw. dargestellt werden soll.

Die Datentypen char, short, long, float, double und bool stellen ebenfalls intrinsische Datentypen dar. All diese Datentypen können ohne Deklaration verwendet werden und werden von einem C++-Programm automatisch erkannt. Die intrinsischen Datentypen unterscheiden sich darin, dass sie jeweils unterschiedlich viel Speicherplatz reservieren (vgl. Spalte 2 der obigen Tabelle für ein 32-bit-System).

Der Datentyp char weist einen Speicherbedarf von 1 Byte auf, d.h. es können bis zu 28 = 256 unterschiedliche Zeichen in einem char gespeichert werden, wobei ein bit das jeweilige Vor-zeichen einer darzustellenden Zahl repräsentiert. Dies bedeutet, dass für die eigentliche Darstel-lung einer Zahl lediglich 7 bit zur Verfügung stehen. Somit verschiebt sich die Bandbreite der darstellbaren Zahlen in den negativen Bereich und, sodass der Datentyp char Zahlen von -128 bis +127 speichern kann. Dies gilt ebenso für die anderen intrinsischen Datentypen.

Beim Datentyp short, der einen Speicherbedarf von 2 Bytes aufweist, ist die Bandbreite der Zeichen, die dieser Datentyp darstellen kann, deutlich größer. Hier stehen 16 bit zur Verfügung, sodass bis zu 65.536 unterschiedliche Zeichen gespeichert werden können, also die Zahlen von - 32.768 bis +32.767. Die Bandbreite der speicherbaren Zeichen liegt dementsprechend beim Da-tentyp int wie auch beim Datentyp long bei 4.294.967.296 Zeichen mit Zahlen zwischen - 2.147.483.648 und +2.147.483.647, da diese beiden Datentypen aus 4 Bytes bestehen.

Wird dem jeweiligen einfachen Datentypen das Schlüsselwort unsigned vorangestellt, lässt sich die Bedeutung des Vorzeichen-bits aufheben. Die Bandbreite der zugehörigen Variablen ver-schiebt sich in den positiven Bereich: Der Datentyp char kann somit Zahlen von 0 bis 255, der short-Datentyp Zahlen von 0 bis 65.535 und der int- sowie der long-Datentyp Zahlen von 0 bis 4.294.967.295 speichern. In der Praxis wird der Befehl unsigned wenig verwendet.

In der Praxis nutzt ein C++-Programmierer, der Zahlen speichern möchte, fast immer den Daten-typ int. Dieser Datentyp bietet eine ausreichende Bandbreite und verursacht i.d.R. keine Probleme. Dass in einer Variablen dieses Datentyps evtl. lediglich kleine Zahlen gespeichert wer-den, die auch in Variablen vom Datentyp short oder char passen würden, und damit Speicher-platz verschwendet wird, ist für einen C++-Programmierer oftmals nicht relevant.

Bei float und double handelt es sich um Datentypen, die Fließkommazahlen speichern kön-nen. Diese beiden Typen unterscheiden sich darin, dass float Kommazahlen mit einfacher und double Kommazahlen mit doppelter Genauigkeit speichert. Die Genauigkeit besagt, dass die Speicherung von Kommazahlen in einen Rechner teilweise nur durch eine Annäherung erfolgen kann, sofern die Genauigkeit des Datentyps die exakte Angabe der Zahl nicht zulässt. Neben den unterschiedlichen Genauigkeit nutzen die genannten Datentypen auch unterschiedliche Bandbrei-ten: So kann float Zahlen von ±3.4 * 1038, double Zahlen von ±1.7 * 10308 aufnehmen.

Der intrinsische Datentyp bool unterscheidet sich von den bisher beschriebenen Datentypen da-hingehend, dass bei diesem Datentyp nicht seine physikalische Speichergröße ausschlaggebend ist, sondern sein logisches Speichervermögen. So kann der Datentyp bool die Werte true und false speichern und damit unterscheidet dieser Datentyp genau zwei Informationszustände. Die Größe des Speichers, die durch den jeweiligen bool-Wert belegt wird, spielt daher eine un-tergeordnete Rolle.

Lese

probe

Page 17: Studiengang - Betriebswirtschaft - DIPLOMA · 2017. 3. 23. · Anwenderprogrammierung I i.d.F.v. 15.02.2016 Seite 3 Studienheft Nr. 399 Hinweise zur Arbeit mit diesem Studienheft

Anwenderprogrammierung I

i.d.F.v. 15.02.2016 Seite 35 Studienheft Nr. 399

In Abgrenzung zu unbenannten Konstanten werden benannte Konstanten prinzipiell wie Variablen definiert [Schröder 2016]. Sie weisen also einen Datentyp und einen Namen aus. Zusätzlich wird vor den Datentypen das Schlüsselwort const gestellt. Da Konstanten ihren Wert während eines Pro-grammlaufs nicht ändern können, müssen sie bei ihrer Definition initialisiert werden.

Datentyp Konstantenname Initialwert

const int NOOFLINES = 24;

const char LINEFEED = ’\n’;

const auto PI = 3.14159f;

const short NOTTHIS ;

In der vorangehenden Tabelle wird die Konstante in der letzten Definition nicht initialisiert. Dies er-zeugt einen Übersetzungsfehler. Für benannte Konstanten gelten die folgenden Regeln:

Die Zuweisung eines Wertes an eine als const deklarierte Variable muss in Form einer Initiali-sierung erfolgen. Eine nachträgliche Änderung ist nicht möglich.

Von dieser Einschränkung abgesehen können const-Variablen wie alle anderen Variablen verwendet werden.

Wird in einer Deklaration einer const-Variablen kein Datentyp angegeben, gilt standardmäßig der Typ int.

Deklarationen von const-Variablen sind in C++ möglich; in reinem C sind derartige Deklaratio-nen jedoch nicht möglich.

Üblicherweise werden Variablen, welche als const deklariert sind, durch die Schreibweise in Großbuchstaben hervorgehoben.

Standardmäßig gelten benannte Konstanten lediglich in der Quellcode-Datei, in welcher sie definiert sind, sie sind also modulglobal. Wenn eine benannte Konstante in mehreren C++-Programmodulen benötigt wird, sollte diese Konstante idealerweise in einer eigenen Header-Datei (.h Datei) angelegt werden. Diese Datei wird in den entsprechenden Modulen mittels #include "xx.h"; eingebun-den.

3.4. Strukturen als einfache Klassen Neben den in den vorangehenden Abschnitten vorgestellten Datentypen definiert die Struktur einen weiteren Datentypen bzw. eine einfache Klasse. Dieser neue Datentyp vereint Komponenten unter-schiedlichen Typs. Die Typendeklaration dieses Datentyps stellt sich wie folgt dar: struct <struct_identifier> { <data_declaration> };

Die Variablen dieses Datentyps werden mit <struct_identifier> <var_identifier>; dekla-riert. Im nachfolgenden Beispiel wird ein Struktur-Datentyp zur Speicherung der persönlichen Daten eines Studierenden deklariert. Dabei werden Name, Vorname, eine laufende Identifikations-nummer sowie die Matrikelnummer, welche jeweils unterschiedliche Datentypen aufweisen, des Stu-dierenden gespeichert. Die jeweiligen Daten sind vorab einzugeben.

Lese

probe

Page 18: Studiengang - Betriebswirtschaft - DIPLOMA · 2017. 3. 23. · Anwenderprogrammierung I i.d.F.v. 15.02.2016 Seite 3 Studienheft Nr. 399 Hinweise zur Arbeit mit diesem Studienheft

Anwenderprogrammierung I

i.d.F.v. 15.02.2016 Seite 36 Studienheft Nr. 399

Das oben dargestellte C++-Programm führt auf folgende Bildschirmausgabe:

Mit der Zuweisung robbi = arni; wird der komplette Datensatz von einer Variablen zur anderen kopiert. Der Zugriff auf die Komponente first_name der Variablen arni, welche den Datentyp Student aufweist, erfolgt über den Ausdruck arni.first_name. Die Daten werden wie folgt abgespeichert:

reg_no skz name first_name

In Abhängigkeit von den Compilereinstellungen bzw. -optionen können kleinere ungenutzte Speicher-lücken zwischen den Komponenten im Speicher auftreten. Dies dient dem Aufbau einer Datenreihung um Speicher, um einen schnelleren Speicherzugriff zu erzielen.

Lese

probe

Page 19: Studiengang - Betriebswirtschaft - DIPLOMA · 2017. 3. 23. · Anwenderprogrammierung I i.d.F.v. 15.02.2016 Seite 3 Studienheft Nr. 399 Hinweise zur Arbeit mit diesem Studienheft

Anwenderprogrammierung I

i.d.F.v. 15.02.2016 Seite 40 Studienheft Nr. 399

sind dieselben Daten ohne erneute Eingabe für den Bankkunden B auszugeben. Die mögliche Bildschirmausgabe ist nachfolgend dargestellt:

Aufgabe 3.5: a) Welches sind die vier wichtigsten höheren Datentypen bzw. Klassen? b) Zwischen welchen Arten von Vektoren wird in der Containerklasse vector<T> unterschieden?

Lese

probe