Upload
tranbao
View
212
Download
0
Embed Size (px)
Citation preview
FB InformatikProf. Dr. R.Nitsch
Programmieren 1 - Grundlagen
Reiner Nitsch
Homepage mit Skript und Materialien zu PG1:www.fbi.h-da.de/~r.nitsch
24.03.2011 C++ Grundlagen 2
FB InformatikProf. Dr. R.Nitsch
Was geschieht beim Ausführen eines Programms
Ein Programm ist eine Datei, die Befehle enthält, die der Computer ausführen kann. Wird eine ausführbare Datei (.exe) gestartet,
wird sie zunächst von der Festplatte in den Hauptspeicher geladen. Nur dort kann das Programm gestartet werden.
werden die Befehle vom Prozessor (CPU) abgearbeitet. Ein gestartetes Programm nennt man Prozess. Die CPU besitzt einen Programmzeiger der auf die Stelle zeigt, die als Nächstes bearbeitet
wird. Beim Starten des Prozesses wird dieser Zeiger auf den ersten Befehl des Programms gesetzt.
Jeder Befehl weist die CPU an, Datenwerte aus dem Speicher zu lesen zu schreiben oder zu berechnen. Datenwerte in Speicherstellen zu vergleichen und in Abhängigkeit davon mit der Abarbeitung an einer
anderen Stelle fortzufahren. Die Befehle, die von der CPU derart interpretiert werden, bilden den Befehlssatz der
Maschinensprache dieser CPU. Der Hauptspeicher enthält sowohl die Befehle als auch die Daten
Die Befehle und die Datenwerte sind binär kodiert Die verschiedenen Prozessoren unterscheiden sich im Umfang ihrer Befehlssätze und in den
Binärcodes für die einzelnen Befehle. Deshalb laufen Programme auch nur auf dem Prozessor, dessen Befehlssatz bei der Erstellung des
Programms verwendet wurde.
24.03.2011 C++ Grundlagen 3
FB InformatikProf. Dr. R.Nitsch
Programmiersprachen - Machschinensprachen
Muttersprache des jeweiligen Prozessors Definiert durch sein Hardwaredesign (total maschinenabh.) besteht aus aufeinanderfolgenden Bits Für Menschen schwer nachvollziehbar Für Programmierzwecke völlig ungeeignet Höhere Programmiersprachen sind besser geeignet.
Beispiel:Code KommentarB17D41C3 Lade Wert in Adresse 41C3 in Reg. 1B18D41C7 Lade Wert in Adresse 41C7 in Reg. 24FCA472A Addiere die Registerinhalte und speichere das Ergebnis in Reg. 1DC7E23BA Speichere Inhalt von Register 1 unter der Speicheradresse 23BA
24.03.2011 C++ Grundlagen 4
FB InformatikProf. Dr. R.Nitsch
Programmiersprachen - Assembler-Sprachen
Die "Useability" von Maschinensprache ist gleich Null. Bessere Useability hat die Assemblersprache, die sich 1:1 in Maschinensprache
übersetzen läßt. Das Übersetzungsprogramm wird Assembler genannt. Jeder CPU hat ihre eigene Assemblersprache.
Beispiel:LOAD R1, #41C3h B17D41C3 LOAD R2, #41C7h B18D41C7 ADD R1, R2 4FCA472A STORE R1, #23BAh DC7E23BA
Für Menschen leichter merkbar und lesbar Ideal für zeitkritische Algorithmen durch optimale Ausnutzung des Befehlssatzes Hohe Speicherplatzökonomie Total maschinenabhängig Ungeeignet für größere Softwareprojekte
Assembler
24.03.2011 C++ Grundlagen 5
FB InformatikProf. Dr. R.Nitsch
Programmiersprachen - Hochsprachen
fassen mehrere Maschinenbefehle zu Anweisungen (statements) zusammen benutzen Elemente der Alltagssprache und bekannte mathematische Notationen
Beispiel:int number1, number2, sum;sum = number1 + number2;
Anweisungen werden von Compilern bzw. Interpretern in Maschinencode übersetzt.
Für Menschen leicht versteh- und anwendbar Maschinenunabhängig Weit verbreitete Hochsprachen sind (C, C++, Java, Fortran, Cobol, ...)
Anweisung 1Anweisung 2
24.03.2011 C++ Grundlagen 6
FB InformatikProf. Dr. R.Nitsch
Der Algorithmus
Anders als ein Mensch hat ein Computer keine Fantasie und keine Erfahrungen. Die Programmbefehle müssen ihm zwingend vorschreiben, was er tun soll, und
dabei keine Missverständnisse zulassen. Alle Voraussetzungen müssen ausformuliert werden. Eine solche Verfahrensbeschreibung nennt man einen Algorithmus Es ist schwieriger als man denkt, ein Verfahren so zu beschreiben, dass der
Ausführende zwingend zu einem bestimmten Ergebnis kommt.Beispiel: Kochrezept für ein 3-Minuten-Ei:
Lege ein Ei für 3 Minuten in kochendes Wasser.Wie lautet die Befehlsfolge für einen Computer oder Menschen ohne Erfahrung und
Fantasie?
24.03.2011 C++ Grundlagen 7
FB InformatikProf. Dr. R.Nitsch
Algorithmus für 3 min Ei
nehme ein Ei. nehme einen Kochtopf mit 23 cm Durchmesser und Höhe 12 cm. nehme einen Wasserhahn nehme eine Herdplatte und schalte sie auf Stufe 3 nehme 1 l Wasser aus dem Wasserhahn und fülle damit den Kochtopf. Stelle den Kochtopf auf die Herdplatte. solange Wassertemperatur im Kochtopf kleiner 100° tue nichts. lege Ei in Kochtopf. merke dir die aktuelle Zeit als Startzeit. solange aktuelle Zeit kleiner Startzeit plus 3 min tue nichts. schalte Herdplatte aus. Nimm Ei heraus.
24.03.2011 C++ Grundlagen 8
FB InformatikProf. Dr. R.Nitsch
Das erste Programm: Simulation der Arbeitslosigkeit /31-43/
Jedes C++ Programm muss genau eine Funktion 'main' enthalten Beim Programmstart sucht der Computer die Funktion 'main' und beginnt dort mit der
Ausführung.
int main(){
// Keine Anweisungen, d.h. arbeitslos!}
Es bedeuten: int Platzhalter für ganze Zahl zur Ergebnis-Rückgabe main C++ Schlüsselwort für Hauptprogramm ( ) Innerhalb dieser Klammern können dem Hauptprogramm
Informationen mitgegeben werden. { } Block (enthält die Anweisungen an den Rechner) /*...*/ Kommentar, der über mehrere Zeilen gehen kann //... Kommentar bis Zeilenende
24.03.2011 C++ Grundlagen 9
FB InformatikProf. Dr. R.Nitsch
Der C++ Klassiker: Die Begrüßung
// File: HelloStudis.cpp#include <iostream> // Macht dem Computer die Ein- und Ausgabefunktionen zugänglich
// iostream: Name einer C++ Header-Datei
using namespace std; // Diese Zeile zunächst immer hinter die #include-Zeilen schreiben.// Erklärung folgt später.
// This program outputs the message "Hallo Studis!" to the monitorint main() // All C++ programs start by executing the function main{
cout << "Hallo Studis!\n"; // output "Hallo Studis!" (ohne "")
return 0;}
// Ausgabe: cout (Abkürzung für "character out") ist die Standardausgabe zum Monitor.// Der Doppelpfeil deutet an, dass alles, was rechts davon steht, zur Ausgabe cout gesendet wird.
Zeichenkette (string literal). Die Begrenzerzeichen (") werden nicht ausgegeben.
Steuerzeichen für "neue Zeile" (später mehr)
Unser Programm läuft einwandfrei; es gibt daher 0 zurück. Diese Anweisung kann fehlen, dann wird automatisch 0 zurückgegeben.
// Ein ';' schliesst jede Anweisung (statement) und jede Definition ab
24.03.2011 C++ Grundlagen 10
FB InformatikProf. Dr. R.Nitsch
Vom Quellcode zum Objektcode /31/
C++ ist eine Compilersprache: d.h. zuerst muss ein C++ Compiler den Programmcode in für den Computer ver-
ständliche Sprache übersetzen.
Quellcode (.cpp) Compiler Objektcode (.obj)
g++ -c HelloStudis.cpp compilieren (HelloStudis.obj wird erzeugt) (bzw. HelloStudis.o bei anderen Compilern)
24.03.2011 C++ Grundlagen 11
FB InformatikProf. Dr. R.Nitsch
Vom Objektcode zum ausführbaren Programm
Ein Programm besteht meist aus mehreren Teilen (translation units) Beispiel: "Hallo Studis!" besteht aus Hauptprogramm "main" und dem Header "iostream"
Jedes Teil wird separat compiliert Die verschiedenen Objectcode-Dateien müssen durch ein weiteres Programm, den Linker,
miteinander zum ausführbaren Programm verknüpft werden.
Beispiel:g++.exe -o hellostudis.exe hellostudis.o lib1.o ... binden.
Das Programm wird durch Eintippen von hellostudis.exe gestartet
Linker
HelloStudis.o
Libraries (.o)
HelloStudis.exe
24.03.2011 C++ Grundlagen 12
FB InformatikProf. Dr. R.Nitsch
Integrated Development Environment (IDE) /37/
RAM
Übersetzen in Maschinencode
Binden derObjektdateien
Objektcode (.obj)
Compiler
Präprozessor
Standard-Bibliothek
Bibliotheken
Inte
gri
ert
e E
ntw
icklu
ng
sum
geb
un
g (
IDE) Header (.h)Quellcode (.cpp)
Editor
Linker
LoaderDebugger
Ausführbare Datei (.exe)
Schnelleinstieg inMicrosoft Visual C++ Express 2008
siehe Anhang
24.03.2011 C++ Grundlagen 13
FB InformatikProf. Dr. R.Nitsch
Der Präprozessor und der Compiler und der Fehlerteufel
Beispiele für häufige Fehler: #include fehlt Tippfehler (z.B. im Namen der Include-Datei) Fehlendes " im String-Literal integer statt int < statt << oder = statt == ' statt " ...
Präprozessor bereitet den Quellcode für den Compiler vor wird u.a. gesteuert durch Präprozessor-Anweisungen die mit '#' beginnen Die Anweisung #include <EineDatei> bzw. #include "EineDatei" fordert den
Präprozessor auf, diese Anweisung durch den Inhalt der Datei mit Namen EineDatei zu ersetzen.
Entfernt Kommentare aus Quellcode Der Compiler
achtet auf korrekte Syntax und Grammatik ist dabei sehr pingelig, beschwert sich selbst über kleinste Details, hat aber immer Recht.
24.03.2011 C++ Grundlagen 14
FB InformatikProf. Dr. R.Nitsch
Systematische Programmentwicklung
Wie werden Programme entwickelt? Schritt 1: Analysis Schritt 2: Design Schritt 3: Implementation
Schritt 1: Analysis - Formulierung der Aufgabe (aus Benutzersicht) -> OOAD Beispiel: Addition zweier Zahlen1. Das Programm fordert den Benutzer auf, 2 Zahlen einzugeben2. Benutzer gibt 2 Zahlen auf der Tastatur ein3. Das Programm liest die Zahlen und berechnet die Summe4. Das Programm gibt die Summe auf dem Bildschirm aus
Schritt 2: Design - Zerlegung der Aufgabe in Teilaufgaben -> OOADBeispiel: Addition zweier ZahlenAusgabe des Prompts "Gib 2 Zahlen ein: "Lies 2 Zahlen in 2 Variablen summand1 und summand2 einDie Summe beider Zahlen berechnen und in Variable summe speichernsumme auf dem Monitor ausgeben: "Summe = <Ergebnis>"
24.03.2011 C++ Grundlagen 15
FB InformatikProf. Dr. R.Nitsch
Systematische Programmentwicklung
Schritt 3: Implementation - Umsetzen der Teilaufgaben in C++ Code Die Kommentare bleiben zur Dokumentation erhalten
// Datei: summe.cpp // Die erste Zeile dokumentiert den zugehörigen Dateinamen.#include <iostream> using namespace std;
int main(){
// Addition zweier Zahlenint summe; int summand1; int summand2;
// Ausgabe des Prompts "Gib 2 Zahlen ein: "cout << "Gib 2 Zahlen ein: ";
// Definition von Variablen: Weist den Compiler an, // (1) Speicherplatz zu reservieren, // (2) diesem Speicherplatz einen Namen (z.B. summe) zu geben.
// Benutzeraufforderung (prompt)
// Variablennamen sind symbolische Adressen für Speicherbereiche
// Zeichenkette mit Anführungszeichen als Anfangs- und Ende-Kennung
24.03.2011 C++ Grundlagen 16
FB InformatikProf. Dr. R.Nitsch
Systematische Programmentwicklung
// Lies 2 Zahlen in 2 Variablen summand1 und summand2 eincin >> summand1;cin >> summand2;
// Die Summe beider Zahlen berechnen und in Variable summe speichernsumme = summand1 + summand2;
// summe auf dem Monitor ausgeben: "Summe = <Ergebnis>"
cout << "Summe= " << summe;
return 0; }
// Eingabe: Der Doppelpfeil zeigt hier in Richtung des Objekts, das ja von der Tastatur einen neuen// Wert auf nehmen soll. Die Information fließt von der Eingabe cin zum Objekt a beziehungsweise b.
// Zuweisung: Das Ergebnis der Addition auf der rechten Seite wird der Variablen auf der linken // Seite des Gleichheitszeichens zugewiesen, d.h. das Ergebnis wird in den Speicherplatz // "summe" kopiert.
// Unser Programm läuft einwandfrei; es gibt daher 0 zurück. // Diese Anweisung kann fehlen, dann wird automatisch 0 zurückgegeben.
Hier werden zwei Werte von der Tastatur eingelesen!
24.03.2011 C++ Grundlagen 17
FB InformatikProf. Dr. R.Nitsch
Genauer hingeschaut: Speicherkonzept bei Variablen
Variablen (Speicherbereiche für Werte) müssen vor erster Benutzung definiert werden sind u.a. gekennzeichnet durch Namen (symbolische Adresse), Datentyp (type), Adresse
im Speicher und Wert (value) ihre Adresse referenziert das erste Byte des Speicherbereichs für den Wert schreibender Zugriff überschreibt (löscht) den bisherigen Wert
cin >> summand1; // Angenommen Benutzer gibt 5 eincin >> summand2; // Angenommen Benutzer gibt 6 einsumme = summand1 + summand2; // Addition und Zuweisung
Lesender Zugriff verändert den aktuellen Wert nichtcout << summe;
???
Adresse Name Wert
10123 summand110124 summand210125 summe
5611
24.03.2011 C++ Grundlagen 18
FB InformatikProf. Dr. R.Nitsch
C++ Namenskonventionen
Funktions-, Variablen- und andere Namen (Bezeichner) unterliegen der folgenden Konvention: Ein Bezeichner besteht aus einer Folge von Buchstaben, Ziffern und Unterstrich (_). beginnt stets mit einem Buchstaben oder einem Unterstrich. dürfen nicht mit den vordefinierten Schlüsselwörtern /673/ übereinstimmen (zum Beispiel
for, int, main...). kann prinzipiell beliebig lang sein. In den Compilern ist die Länge jedoch begrenzt, zum
Beispiel auf 31 oder 255 Zeichen. sollte unbedingt selbsterklärend sein. sollte nicht mit '_' oder '__' beginnen (wird systemintern benutzt)
Achtung: C++ unterscheidet zwischen Groß- und Kleinschreibung (ist case-sensitive)
Beispieleint 1_summand; falsch! (Ziffer am Anfang) int summand 1; falsch! (Name enthält Leerzeichen) int summand1; richtig! AndereMöglichkeit: int summand_1; richtig!
24.03.2011 C++ Grundlagen 19
FB InformatikProf. Dr. R.Nitsch
Syntaxgraph für Bezeichner
Syntaxgraphen erlauben eine sehr kompakte Darstellung der Syntaxregeln. Die Regeln werden eingehalten solange man den Linien in Pfeilrichtung folgt. Dabei stößt man auf
ovale oder kreisförmige Felder, sogenannte Terminale. Diese sind elementar, d.h. sie können nicht weiter verfeinert werden.
rechteckige Felder, sogenannte Nichtterminale. Diese Syntaxbestandteile bedürfen noch der näheren Beschreibung, z.B auch durch einen Syntaxgraphen oder im Text.
Beispiel: Syntaxdiagramm für Namen
Buchstabe
_ Buchstabe
Ziffer
_
a
b
z
A
B
Z
1
2
9
0
:
:
:
Syntaxdiagramm für NamenSyntaxdiagramme für Ziffer und Buchstabe
24.03.2011 C++ Grundlagen 20
FB InformatikProf. Dr. R.Nitsch
Nocheinmal: Programm "Addition zweier Zahlen"
Diskussion: Was geschieht bei Eingabefehlern? Eingabe: 1 2.0 Ausgabe 3
Eingabe: 1 3.9 Ausgabe 4 Eingabe: 2.5 2 Ausgabe 4206638
Eingabe: eins zwei Ausgabe 2028688046
Wie ist dieses Verhalten zu erklären? Erklärung folgt!
24.03.2011 C++ Grundlagen 21
FB InformatikProf. Dr. R.Nitsch
Eingabe und Typ
int summand1=0;int summand2=0;std::cin >> summand1;std::cin >> summand2;
1 2\n 1
1
2 3
01.0 2\n 1
R1 und R2a
int-Variable bestehen nur aus Ziffern. R2b: Lesen stoppt bei '.' ".0 2\n" bleibt im Puffer
Eingabe summand1 summand2 Ausgabe Kommentar
00summand1:
summand2:
int:
Eigenschaften des Eingabeoperators >> Die Eingabeoperation >> ("get from") ist type-sensitiv R1: Führende Zwischenraumzeichen (ZRZ; engl. whitespace) werden ignoriert.
Zwischenraumzeichen sind Leerzeichen ' ', Tabulatorzeichen '\t', Zeilensprung '\v', Seitenvorschub '\f' und Zeilenendekennung '\n'.
Andere Zeichen werden entsprechend dem Ziel-Datentyp interpretiert. R2: Die Entnahme von Zeichen endet
R2a: mit dem ersten ZRZ (ZRZ = Endekennung der Eingabe = Normalfall) bzw. R2b: mit dem ersten nicht "passenden" Zeichen
24.03.2011 C++ Grundlagen 22
FB InformatikProf. Dr. R.Nitsch
Was lernen wir daraus?
Erkenntnis 1: Variable sollten initialisiert werden.Erkenntnis 2: Ein Tool zum schrittweisen Ausführen des Programms erleichert die
Fehlersuche -> DebuggerBedienung des Debuggers: siehe Anlage
Erkenntnis 3: Das Verhalten des Operators '>>' ist typ-sensitivErkenntnis 4: Programme/Algorithmen stellen Vorbedingungen an den Input, damit
sie richtig funktionieren. Diese Preconditions (PRE) sollten vom Programm überprüft werden oder zumindest in einem Kommentardokumentiert sein.
24.03.2011 C++ Grundlagen 23
FB InformatikProf. Dr. R.Nitsch
Wiederholung der wichtigsten Begriffe
Begriffe: Objekt: Ein Speicherbereich zum Ablegen von Datenwerten (eines bestimmten Typs) Typ: legt fest welche Art von Information im Objekt abgelegt werden kann und
legt fest was mit dem Objekt gemacht werden kann.Beispiel: Ganzzahlen (2, 7) können multipliziert werden, Zeichenketten ("Hallo","Welt") nicht.
Datenwert: Menge von Bits, die entsprechend dem Typ interpretiert werden. Variable: ist ein benamtes Objekt Variablen-Deklaration: Anweisung, die dem Compiler den Namen eines Objekts und den
Typ dieses Objekts bekannt macht.. Variablen-Definition: Weist den Compiler an, Speicherplatz für ein Objekt vorzusehen.
Eine Definition schliesst die Deklaration mit ein.
Beispiele: Zeichenketten werden in string-Variablen abgelegt. Ganzzahlen werden in int-Variablen abgelegt. Gleitkommazahlen werden in float-Variablen abgelegt.
42 age:int:
Objekt vom Typ int mit Namen age, das den Ganzzahl-Wert 42 enthält!
Adresse:10123
24.03.2011 C++ Grundlagen 24
FB InformatikProf. Dr. R.Nitsch
C++ Standarddatentypen für Variablen
int:int summand1; ? summand1: Ganzahl-Variable ohne Anfangswert
int summand2 = 100; 100 summand2: int:
Ganzahl-Variable mit Anfangswert
string name = "Annemarie"; Annemarie name: :string:
Zeichenketten-Variable mit Anfangswert
C++ ist typsicher, d.h. Variable akzeptieren keine Werte vom falschen Typ:
string name = 30; // Fehler: 39 ist kein stringint summand1 = "Annemarie"; // Fehler: "Annemarie" ist kein int
C++ stellt viele Datentypen bereit. Die wichtigsten sindint number_of_steps = 30; // int für Ganzzahlendouble flying_time = 3.5; // double für Gleitkommazahlenchar decimal_point = '.'; // char für Zeichenstring name = "Annemarie"; // string für Zeichenkettenbool is_even = true; // bool für logische Variable
Gleitkommazahlen approximieren das mathematische Konzept reeller Zahlen!
Literale: jeder Typ hat seinen eigenen Stil!
Später mehrdazu!
24.03.2011 C++ Grundlagen 25
FB InformatikProf. Dr. R.Nitsch
Übungsaufgabe: Rechteckfläche berechnen
Implementieren Sie ein Programm RectangleArea.cpp, das den Benutzer Länge und Breite eines Rechtecks eingeben lässt und das daraus die Fläche berechnet und auf dem Monitor ausgibt. Hinweis: Benutzen Sie summe.cpp als Ausgangspunkt und passen Sie den Code an.
24.03.2011 C++ Grundlagen 28
FB InformatikProf. Dr. R.Nitsch
Ausgabe-Formatierung mit Escape Sequenzen /54/
Escape Zeichen '\' kündigt Steuerzeichen für Ausgabe an. \n positioniert Cursor am Anfang der nächsten Zeile (newline) \t bewegt Cursor zum nächsten Tabstop \r Cursor zum Zeilenanfang ohne Zeilenvorschub \a erzeugt Hinweiston \\ gibt backslash '\' aus \" gibt Anführungszeichen aus … es gibt noch mehr
cout << "Hallo Studis\n";
cout << "Diese Zeichenkette enthaelt \"Anfuehrungsstriche\"."
Diese Zeichenkette enthaelt "Anfuehrungsstriche".erzeugt diese Ausgabe auf Bildschirm:
24.03.2011 C++ Grundlagen 29
FB InformatikProf. Dr. R.Nitsch
Formatierte Ausgabe mit Manipulatoren /373-376/
Der Operator << wandelt automatisch die internen Datenformate in eine Textdarstellung um und gibt diese formatiert auf dem Bildschirm aus.
Die Formatsteuerung übernehmen Flags in cout. Ein Flag ist ein Merkmal, das entweder vorhanden ist ( Flag ist gesetzt) oder nicht
vorhanden ist ( Flag ist nicht gesetzt) . Die voreingestellten Formatierungsregeln (linksbündig, Feldweite 0, +-Zeichen
unterdrückt, 10er Zahlenbasis) können angepasst werden, indem sog. Manipulatoren in den Ein-/Ausgabestrom eingefügt werden (z.B. << hex).
cout << showpos << 166 <<endl; // Ausgabe +166cout << noshowpos << 166 endl; // Ausgabe 166cout << hex << 166 << endl; // Ausgabe a6cout << uppercase << 166 << endl; // Ausgabe A6 cout << 166 << endl; // Ausgabe A6 Wirkung persistent (=anhaltend)cout << nouppercase << dec << 166 << endl; // Ausgabe 166
Beispiele zur Formatierung von Ganzzahlen
Formatierte Ausgabe von Gleitpunkzahlen
1_07 - OutputFormatting1_07 - OutputFormatting
24.03.2011 C++ Grundlagen 30
FB InformatikProf. Dr. R.Nitsch
Formatierte Ausgabe mit Manipulatoren
Beispiele zur Formatierung von Gleitkommazahlen
cout << 4./3 << endl; // Ausgabe 1.33333 (Voreingestellte Genauigkeit: 6 Stellen)cout << 3./2 << endl; // Ausgabe 1.5 (Überflüssige Nullen unterdrückt)cout << setprecision(3); // Genauigkeit 3 Ziffern (#include <iomanip>)cout << 4./3 << endl; // Ausgabe 1.33 (Beachte: Keine 3 Nachkommastellencout << 3./2 << endl; // Ausgabe 1.5 (Überflüssige Nullen unterdrückt)cout << 4./2 << endl; // Ausgabe 2cout << showpoint ; // Dezimalpunkt mit abschließenden Nullen erzwingencout << 4./2 << endl; // Ausgabe 2.00cout << 3./2 << endl; // Ausgabe 1.50cout << noshowpoint;cout << 3./2 << endl; // Ausgabe 1.5cout << 333. << endl; // Anzeige 333cout << 3333. << endl; // Anzeige 3.33e+003 (Stellenzahl zu groß -> autom. Exponentialschreibweise)
// Dieses "Autom. mixed Format" ist Standardeinstellungcout << fixed; // Nie Ausgabe in Exponentialschreibweise.
// Eingestellte Genauigkeit bestimmt die Zahl der Nachpunktstellencout << 4./3 << endl; // Ausgabe 1.333cout << 3./2 << endl; // Ausgabe 1.500cout << 6.1234567e17 << endl; // Ausgabe 612345670000000000.000cout << scientific; // Immer Ausgabe in Exponentialschreibweisecout << 4./3 << endl; // Ausgabe 1.333e+000cout << 3./2 << endl; // Ausgabe 1.500e+000
cout.unsetf(ios::floatfield); // wieder autom. mixed Format (geht nicht anders!)Steuerung der Feldbreite, Ausrichtung und Füllzeichen
24.03.2011 C++ Grundlagen 31
FB InformatikProf. Dr. R.Nitsch
Formatierte Ausgabe mit Manipulatoren
cout << 166 << endl; // Ausgabe 166cout << 1 << setw(5) // Setzt Feldbreite einmalig (nicht anhaltend) auf 5
<< 166 << endl; // Ausgabe 1 166 (Voreinstellung: rechtsbündig)cout << 1 << 166 << endl; // Ausgabe 1166 Jetzt wieder Feldbreite 0 (Standard)cout << left << 1 << setw(5)
<< 166 << endl; // Ausgabe 1166 (linksbündig)cout << setfill('*') // '*' als Füllzeichen setzen (Voreinstellung: ' ')
<< setw(5) << 166 << endl; // Ausgabe 166**cout << right // wieder rechtsbündig
<< setw(5) << 166 << endl; // Ausgabe **166cout << internal // setzt Vorzeichen linksbündig und Wert rechtsbündig
<< setfill('0') << showpos<< setw(5) << 166 << endl; // Ausgabe +0166
cout.unsetf(ios::adjustfield); // internal zurücknehmen (geht nicht anders!)
cout << setw(5) << 166 << endl; // Ausgabe 0+166cout << setfill(' ') // wieder voreingestelltes Füllzeichen
<< setw(5) << 166 << endl; // Ausgabe +166
Beispiele für die Steuerung der Feldbreite, Ausrichtung und Füllzeichen
Formatierte Eingabe von Zahlen
24.03.2011 C++ Grundlagen 32
FB InformatikProf. Dr. R.Nitsch
Hausaufgabe
Schreiben Sie ein C++ Programm, das die folgende Ausgabe erzeugt
Grad rad sin(x) cos(x)--------------------------------
0.0 0.0 +0.000 +1.00030.0 0.5 +0.500 +0.86660.0 1.0 +0.866 +0.50090.0 1.6 +1.000 +0.000
120.0 2.1 +0.866 -0.500
Tipps Sie müssen die Headerdatei <cmath> includieren. Bei http://www.cplusplus.com/reference/ wird die Anwendung der
trigonometrischen Funktionen beschrieben!
24.03.2011 C++ Grundlagen 33
FB InformatikProf. Dr. R.Nitsch
Einfache Datentypen und Operatoren
Ausdruck /44/ Ein Ausdruck besteht aus einem oder mehreren Operanden, die mit einander durch
Operatoren verknüpft sind. Die Auswertung eines Ausdrucks resultiert in einem Wert, der an die Stelle
desAusdrucks tritt. Ganzzahlen und ihre Operatoren /44-48/
Gleitkommazahlen und ihre Operatoren /48-52/ Konstante /52/ Zeichen /53-56/ logischer Datentyp bool /56/ Referenzen /57/
24.03.2011 C++ Grundlagen 34
FB InformatikProf. Dr. R.Nitsch
Ausgesuchte Operatoren
bool char int double stringZuweisung = = = = =Addition
+ +Verkettung +Subtraktion - -Multiplikation * *Division / /Modulo (Rest) %Inkrement um 1 ++ ++Dekrement um 1 -- --Inkrement um n +=n +=nAnhängen +=Dekrement um n -=n -=nMultiplizieren und zuweisen *= *=Dividieren und zuweisen /= /=Modulo und zuweisen %=Von s in x einlesen s>>x s>>x s>>x s>>x s>>xVon x nach s schreiben s<<x s<<x s<<x s<<x s<<xGleich == == == == ==Nicht gleich != != != != !=Größer als > > > > >Größer als oder gleich >= >= >= >= >=Kleiner als < < < < <Kleiner als oder gleich <= <= <= <= <=
24.03.2011 C++ Grundlagen 35
FB InformatikProf. Dr. R.Nitsch
Implizite Typumwandlung ("casting") in den größeren Typ
5/2.0 und 5.5/2 sind ohne expliziten cast immerGleitkommadivisionen.
Begründung: C++ macht bei gemischten Ausdrücken automatisch einen Cast in den jeweils größeren Typ (s. Hierarchie der Typen).
Beispiele:
double x = 5/3 //danach x = 1.0int int
int double
5 / 2.0int double
double
Explizite Typkonvertierung
Hierarchie der Typenlong double
double
float
long
int
Aufzählungen char short bool
Hierarchie der Typenlong double
double
float
long
int
Aufzählungen char short bool'a'>'A' // Ergebnis: true weil 'a' 97 und 'A' 65 (ASCII)
// Ergebnis: 22*( 'a'>'A' )
true (1)2 * 1 2
int
int i;i = '5'-'0'; // Ergebnis: 5
24.03.2011 C++ Grundlagen 36
FB InformatikProf. Dr. R.Nitsch
Implizites Casten in kleineren Typ bei Zuweisung
implizit in kleineren Typ bei Zuweisungen
int i;float x =3e9;i = 3.0 / 2;
double intint
// Compiler-Warnung: Verkürzung// von const double in int
i = x; // 3e9 ist zu groß für int, Ergebnis undefiniert
Explizite Typkonvertierung
Hierarchie der Typenlong double
double
float
long
int
char short bool
Hierarchie der Typenlong double
double
float
long
int
char short bool
bool b = 3;int bool
double float
24.03.2011 C++ Grundlagen 37
FB InformatikProf. Dr. R.Nitsch
Reelle Zahlen - Ungenauigkeitsprobleme /49/
Numerische Auslöschung: Die Differenz zweier fast gleich großer Werte wird 0, weil sich die signifikanten Ziffern aufheben.
Überlauf (overflow) bei Division durch zu kleine Werte
Unterschreitung (underflow), wenn Ergebnis zu klein ist.
Ergebnisse können von der Reihenfolge der Berechnungen abhängen
d = 1e23f / 1e-16fcout << d << endl; Ausgabe: 1.#INF
d = 1e-23f/1e23f cout << d << endl; Ausgabe: 0
float k = 7.654321e-7, e = 1.0f,s1,s2;
s1 = k+e;s1 = s1-e; // =k+e-es2 = k+e-e;cout << s1 << endl
<< s2 << endl;
Ausgabe:7.15256e-0077.65432e-007
AchtungBei sicherheitskritischen Berechnungen
immer auf Genauigkeit achten.
float f = 1e8f, d;d = f + 4.0f;cout << d - f << endl; Ausgabe: 0
24.03.2011 C++ Grundlagen 38
FB InformatikProf. Dr. R.Nitsch
Wichtiger Unterschied: Zuweisung und Initialisierung
a = 3; '=' ist der Zuweisungsoperator
das Objekt a existiert hier schon, d.h. an anderer Stelle wurde für a Speicherplatz reserviert und es hat bereits einen Wert.
Der vorhandene Wert muss erst gelöscht werden, bevor der neue Wert geschrieben wird.
Dies geschieht bei der Ausführung (zur Laufzeit) des Programms
int a = 3; '=' ist keine Zuweisung sondern eine
Definitionsanweisung Das Objekt existiert bis hierher noch
nicht. Hier wird der Compiler angewiesen eine int-Variable zu erzeugen, also Speicherplatz für ein Ganzzahlobjekt zu reservieren und diesem den Namen a zu geben.
Es ist noch kein Wert vorhanden, da der Speicherplatz noch nicht benutzt wurde. '=3' muss also keinen vorhandenen Wert löschen, bevor der neue Wert gesetzt wird.
Die alles erledigt der Compiler, während er den Quellcode compiliert (zur Compilezeit).
24.03.2011 C++ Grundlagen 39
FB InformatikProf. Dr. R.Nitsch
Regeln zum Bilden von Ausdrücken /41/ /59/
a + b * c Punkt vor Strichrechnung
(a + b) * c Klammern werden zuerst ausgewertet(von innen nach aussen)
a + b + c Auswertung von links nach rechts (linksassoziativ)a * b * c
Beispiel:
z = 2 * 3 % 4 + 6 / 2 - 5
1. z = 6 % 4 + 6 / 2 - 5
2. z = 2 + 6 / 2 - 5
3. z = 2 + 3 - 5
4. z = 5 - 5
5. z = 0
6. z = 0 Ergebnis 0 in z speichern
mit Klammern: z = ((((2*3) % 4) + (6/2)) – 5)
Implizite Typkonvertierung
24.03.2011 C++ Grundlagen 40
FB InformatikProf. Dr. R.Nitsch
Vorrangtabelle für C++-Operatoren /862/
Priorität Operator Assoziativität
1. ::2. . -> [ ] ++ ("Postfix") -- ("Prefix") typeid() dynamic_cast<>
static_cast<> const_cast<> reinterpret_cast<> sizeof f() (Fkt-Aufruf) von links3. ! ~ + ("unär") - ("unär") ++ ("Präfix") -- ("Präfix")
& ("Adresse") * ("Verweis") new delete von rechts4. .* ->* von links5. * / % von links6. + ("binär") - ("binär") von links7. << >> von links8. < > <= >= von links9. == != von links10. & ("bitweises UND") von links11. ^ von links12. | von links13. && von links14. || von links15. ? : von rechts16. = += -= *= /= %= &= ^= |= <<= >>= von rechts17. throw von rechts18. , von links
24.03.2011 C++ Grundlagen 41
FB InformatikProf. Dr. R.Nitsch
Der Bedingungsoperator ?: /68/
Ist der einzige Operator mit 3 Operanden ( ternärer Operator)Wählt einen von 2 Ausdrücken abhängig von Bedingung
Beispiele:
Syntaxdiagramm:
min = zahl1 > zahl2 ? zahl2 : zahl1;
max = zahl1 > zahl2 ? zahl1 : zahl2;
betrag = zahl1 >= 0 ? zahl1 : -zahl1;
int zahl1 = -3, zahl2 = 5, min, max, betrag;
Zuweisung
// Ergebnis: min(zahl1,zahl2)
// Ergebnis: max(zahl1,zahl2)
// Ergebnis: abs(zahl1,zahl2)
Bedingung ? Ausdruck1 : Ausdruck2 ;
Falls die Bedingung zutrifft ist der Wert des gesamten Ausdrucks der Wert von Ausdruck1, ansonsten der Wert von Ausdruck2
24.03.2011 C++ Grundlagen 42
FB InformatikProf. Dr. R.Nitsch
Benutzerdefinierte Datentypen /89/
Häufig möchte man logisch zusammengehörige Daten zusammenfassen, die nicht vom selben Typ sind, z.B. die Personendaten Name (string), Alter (int), Gewicht (float) oder die Daten eines Punktes auf dem Monitor: seine x und y Koordinaten, seine Farbe und ob
er sichtbar ist. Für diesen Zweck stellt C++ die Struktur als benutzerdefinierten Typ bereit Eine Struktur setzt sich zusammen aus beliebig vielen Elementen (auch Felder oder
Komponenten genannt) beliebigen Typs. Syntaxdiagramm einer struct-Definition:
struct Typname { Elemente } Variablenliste ;
Beispiel: Struktur Punkt
struct Point {int x;int y;bool isVisible;short colour;
} p;// 1=rot, 2=grün, 3=gelb// p ist ein Punkt-Objekt
Point q;// Zugriff auf Elementep.x = 5; p.y = 10;p.colour = 1;p.isVisible = true;
// q ist auch ein Punkt-Obj.Definition der Struktur Point Anwendung der Struktur Point
Punktoperator "."
24.03.2011 C++ Grundlagen 43
FB InformatikProf. Dr. R.Nitsch
Aufzählungstypen (Enumerations) /80/
sind benutzerdefiniert bieten Unterstützung bei nicht-numerischen WertebereichenBeispiele:
int colour; // rot =0, grün =1, gelb =2int wochentag; // Sonntag=0, Montag =1, usw.
Nachteile:•Kommentar notwendig•nicht eindeutig: 0=rot oder 0=Sonntag•schlechte Lesbarkeit: if(farbe==2) …•Fehleranfällig: if(farbe==5)//Nicht definiert
Klassische Lösung
enum Colour { ROT, GELB, GRUEN };Colour farbe = ROT;enum Wochentag { SONNTAG, MONTAG, DIENSTAG, MITTWOCH,
DONNERSTAG, FREITAG, SAMSTAG } heute, gestern;heute = MONTAG; gestern = SONNTAG;enum { MOFA, LKW, PKW } fahrzeug;
enum Muenzgeld { CENT=1, FUENFER=5, GROSCHEN=10 };
=0 =1 =2 // Werden intern wie int-Objekte gespeichert
// Definition einer Variablen von diesem Typ
// Definition mit Initialisierung
// Typdeklaration
// Typname kann entfallen bei einmaliger// Verwendung des Aufzählungstyps in// Variablendefinition (anonyme Typdef.)
// Abweichende // Bewertungen
Anwendung:
enum Typname { Werteliste } Variablenliste ;
Syntaxdiagramm einer enum-Deklaration
24.03.2011 C++ Grundlagen 44
FB InformatikProf. Dr. R.Nitsch
Aufzählungstypen - Goes&NoGoes
Für enum-Typen ist nur die Zuweisung definiert Für alle anderen Operationen wird vorher in int umgewandelt Beispiele:
Wochentag heute, morgen;int i = sizeof(Wochentag);heute = MONTAG;MONTAG = heute;i = heute;heute = i;
heute = static_cast<Wochentag>(2);morgen = heute+1;
// richtig: Impliziter Cast in höheren Typ ist typsicher, weil Wert sich nicht ändert
// Warum geht das nicht?
Was weiß das Anwendungssystem davon zur Laufzeit?
Für jeden Aufzählungstyp legt der Compiler eine Symboltabelle an, mit der er die Symbole (z.B.ROT, GELB und GRUEN in die zugeordneten Ganzzahlwerte umwandelt. Im Maschinencode erscheinen nur diese Ganzzahlwerte.
// Fehler: MONTAG ist Konstante!
NICHTS!
// i=4
// Fehler: Cast von int nach Wochentag nicht typsicher, da i Werte haben// kann, die Typ Wochentag nicht kennt
// so kann man den cast erzwingen (Pfui!)
24.03.2011 C++ Grundlagen 45
FB InformatikProf. Dr. R.Nitsch
Programmstrukturierung /101 ff/
Große Programme müssen in übersichtliche Teile zerlegt werden C++ stellt dazu mehrere Mechanismen bereit
Funktionen Klassen Modulare Gestaltung (Bibliotheken) Funktionstemplates Namespaces
24.03.2011 C++ Grundlagen 46
FB InformatikProf. Dr. R.Nitsch
Funktionen /102/
Komplexe Aufgaben werden im Alltag nicht von einer Person allein bewältigt, sondern i.d.R. in Teilaufgaben geringerer Komplexität zerlegt und diese zur Lösung an verschiedene Personen delegiert (Prinzip "Teile und herrsche").
Zur Unterstützung dieses Prinzips stellt C++ u.a. Funktionen bereit. Funktionen sind eine Sequenz von Anweisungen (Anweisungsblock), mit eigenem
Namen. Eine Funktion sollte immer nur E I N E abgeschlossende Teilaufgabe erledigen
(Große Kohäsion). Die zur Aufgabenerledigung erforderlichen Daten werden der Funktion beim Aufruf
mitgegegeben (Aktual-Parameter oder Argument). Das Ergebnis der erledigten Aufgabe liefert die Funktion an den Aufrufer
(Auftraggeber) in Form eines Rückgabewertes (return value) zurück. Dieser tritt dann an die Stelle des Aufrufes. Beispiel: y=sin(x);
Die Standard-Bibliothek enthält viele Funktionen, z.B. sqrt(), sin(), ... Daneben gibt es auch benutzerdefinierte Funktionen.
Funktionen können selbst wieder Funktionen aufrufen.
24.03.2011 C++ Grundlagen 47
FB InformatikProf. Dr. R.Nitsch
Globale benutzerdefinierte Funktion ohne Parameter#include <iostream>using namespace std;void main () {
// show menucout << "[1] Eingabe\n";cout << "[2] Ausgabe\n";cout << "[9] Fertig\n";// …
}
#include <iostream>using namespace std;void showMenu();void main() {
showMenu();// …
}
void showMenu(){
cout << "[1] Eingabe\n";cout << "[2] Ausgabe\n";cout << "[9] Fertig\n";return;
}
Wird mehrmals imProgramm verwendet.cut&paste Nachteile?
Funktionsdeklaration oder Funktionsprototyp
Funktionskopf
Funktionsrumpf
Funktions-definition
Funktionsaufruf
Funktionsname
besser mit Funktionsaufruf
• Die Funktionsdeklaration (Fkt-Prototyp) beschreibt das Funktionsinterface. Sie enthält für den Compiler alle erforder-lichen Angaben (Typ, Reihenfolge und Menge der Ein- und Ausgabewerte), um den Funktionsaufruf übersetzen zu können. Merke:
• Eine Funktion muss vor der ersten Benutzung deklariert aber nicht definiert sein.
• Eine Funktion kann überall und beliebig oft deklariert werden.
• Die Definition kann dann am Ende der Datei oder in einer ganz anderen Datei (z.B. Library) stehen.
• Die Funktionsdefinition (Implementierung) legt fest, wie die Funktion ihre Aufgabe erledigt.
• In C++ können Funktionen nicht innerhalb anderer Funktionen definiert werden.
• Eine Funktion darf nur einmal im Programm definiert werden.
void steht für "kein Rückgabewert"
24.03.2011 C++ Grundlagen 48
FB InformatikProf. Dr. R.Nitsch
Globale Funktion mit Parametern und mit/ohne Rückgabewert
#include <iostream>using namespace std;
double calcCircleArea( double );
int main(){
double r = 2.0;cout << calcCircleArea(r) << endl;return 0;
}
double calcCircleArea(double radius ) {
double area;
area = 3.14 * radius * radius;return area;
}Hier Rücksprung zur Aufrufstelle. Eine Kopie von area wird zurück gegeben.Hier Rücksprung zur Aufrufstelle. Eine Kopie von area wird zurück gegeben.
Funktion gibt Wert vom Typ double zurückFunktion gibt Wert vom Typ double zurück
Nach Rücksprung wird hierder Rückgabewert eingesetzt.Nach Rücksprung wird hierder Rückgabewert eingesetzt.
Aufruf der FunktionAufruf der Funktion
Wertübergabe: Der Wert der Variablen r wird in die Variable radius der Funktion kopiert.
Wertübergabe: Der Wert der Variablen r wird in die Variable radius der Funktion kopiert.
Kopie
Funktion benötigt zur Aufgabenerledigung 1 Funktionsparameter vom Typ doubleFunktion benötigt zur Aufgabenerledigung 1 Funktionsparameter vom Typ double
FunktionsdeklarationFunktionsdeklaration
24.03.2011 C++ Grundlagen 49
FB InformatikProf. Dr. R.Nitsch
Ablauf eines Funktionsaufrufs
Reservierung von Speicherplatz auf dem Stapelspeicher (stack) für die Formal-Parameter. Initialisierung der Formal-Parameter mit den Aktual-Parametern (Argumenten).
Speichern der Rücksprungadresse (= Stelle des Funktionsaufrufes im Programm) auf dem Stack und Fortsetzung des Programms am Anfang der aufgerufenen Funktion.
Nach Ausführung der Funktion, Fortsetzung des Programms in der aufrufenden Funktion mit Hilfe der gesicherten Rücksprungadresse. Freigabe des belegten Stacks.
Rücksprungadresse
Rückgabewert
1. Parameter (z.B. radius)
…
letzter Parameter
lokaler Parameter (z.B. area)
…Beim Aufruf
Speicherplatz belegenBeim RücksprungSpeicherplatz wieder freigeben
Stack (Stapelspeicher)oder LIFO (Last In First Out)
Funktionsparameter
hierher wird r kopiert
hierher wird area kopiert
24.03.2011 C++ Grundlagen 50
FB InformatikProf. Dr. R.Nitsch
Benutzung von Bibliotheksfunktionen
#include <iostream>#include <cmath>using namespace std;
int main() {double x=1.5, y=2;y = sqrt(x);y = sin(x); // Argument x im Bogenmassy = sin(2); // auch ok! Typkonversion int → doubley = sin(x+sqrt(2)); // Auch ok! Als Parameterwert darf auch ein beliebiger Ausdruck übergeben y = exp(x); // berechnet "10 hoch x"y = log(x); // natürlicher Logarithmus!y = log10(x);y = pow(x,2); // berechnet "x hoch 2"y = pow(x,"2");y = pow(x+3);return 0;
}
// Hinzufügen aller Funktionsdeklarationen der math-Library
// Aber Anzahl und Typ der Parameter müssen passen!// Fehler: Typumwandlung nicht möglich
Woher weiß der Compiler Anzahl und Typ der erwarteten Parameter ?
// cmath enthält die Deklarationdouble pow( double x, double y );
24.03.2011 C++ Grundlagen 51
FB InformatikProf. Dr. R.Nitsch
Prinzip der Trennung zwischen Schnittstelle und Implementierung
Wie? Nützliche Funktionen werden in einer separaten Datei (*.cpp) zu Bibliotheken
zusammengefasst. Bibliotheken bündeln meist Funktionen eines Anwendungsbereichs (Grafik, Arithmetik, …)
Die Funktionsdeklarationen einer Bibliothek werden in Headerdateien (*.h) zusammengefasst.
Die Headerdateien werden bei Bedarf in die Anwendungen inkludiert. Die compilierten Bibliotheksdatei(en) (*.obj) werden dem Linker bekannt gemacht.
Beispiel folgt!
24.03.2011 C++ Grundlagen 52
FB InformatikProf. Dr. R.Nitsch
#include <iostream>using namespace std;
double calcCircleArea(double radius);
int main(){
double r = 2.0;cout << calcCircleArea(r) << endl;return 0;
}
double calcCircleArea(double radius ) {
double area;
area = 3.14 * radius * radius;return area;
}
Prinzip der Trennung zwischen Schnittstelle und Implementierung
Beispiel
// GeoLib.cpp#include <iostream>using namespace std;
// Implementierungdouble calcCircleArea(double radius){
double area;area = 3.14 * radius * radius;return area;
}
Programm
// GeoLib.h#pragma oncedouble calcCircleArea(double radius);
#include "GeoLib.h"
Enthält alle Funktionsdeklarationenwird includiert
SchnittstelleImplementation
// verhindert Mehrfachinkludierung
24.03.2011 C++ Grundlagen 53
FB InformatikProf. Dr. R.Nitsch
Vorteile der Trennung von Interface und Implementation
Bessere Wiederverwendbarkeit Kein Copy & Paste!
Verbergen von Implementationsdetails (Kapselung) die der Anwender nicht zu kennen braucht, weil für ihn unwichtig die der Anwender nicht sehen soll (Schutz von "Know how", information hiding)
Bessere Pflegbarkeit des Moduls: Implementation kann geändert werden ohne Auswirkung auf rufende Programme
Höhere Zuverlässigkeit der Software Fertige Module sind (hoffentlich) gründlich getestet
Getrennte Übersetzung möglich Module brauchen nur einmal in Objektdateien übersetzt zu werden, da sie sich i.d.R. nicht
mehr ändern Die Objektdateien der Module werden dem Linker bekannt gemacht. Der Programmierer (des rufenden Programmes) braucht sich nicht um die Details der
Implementation zu kümmern.
24.03.2011 C++ Grundlagen 54
FB InformatikProf. Dr. R.Nitsch
Bestandteile eines C++ Programms
Bestandteile eines C++ Programms
Klassen und Funktionen
der Standardbibliothek
Kern von C++Standardtypen
OperatorenKontrollstrukturen
Selbsterstellte Klassen und Funktionen
und weitere Bibliotheken
C++ kennt keine keine spezielle Syntax für Prozeduren.In C++ sind Prozeduren einfach Funktionen ohne Ausgabewert.
24.03.2011 C++ Grundlagen 55
FB InformatikProf. Dr. R.Nitsch
HS-Übung 1
Sie beginnen jetzt eine Geometrie-Bibliothek GeoLib zu erstellen. Sie soll Kreisfläche und Kreisumfang berechnen können. Für ¶ verwenden Sie ein Konstante.
Schreiben Sie eine Anwendung, die den Nutzer zur Eingabe eines Radius auffordert und die Kreisflaeche ausgibt.
Erweitern Sie GeoLib um die Fähigkeit, Flächen von Rechtecken zu berechnen. Die Anwendung fordert den Nutzer jetzt zusätzlich auch zur Eingabe von Länge und
Breite auf und gibt die Rechteckflaeche aus. Auch Punkte sind geometrische Objekte. Ergänzen Sie GeoLib also um die Struktur
Punkt. Für die Farbe verwenden Sie einen Aufzählungstyp mit Farben Rot, Gelb und Grün. Die Anwendung soll ein Punkt-Objekt erzeugen und anschliessend seine Koordinaten und
Farbe ausgeben.
24.03.2011 C++ Grundlagen 56
FB InformatikProf. Dr. R.Nitsch
HS-Übung 2
Finden Sie die Fehler in den folgenden Programmfragmenten und erklären Sie, wie der Fehler behoben werden kann.
a)int g(void) {cout << "in Funktion g\n";int h(void){
cout << "in Funktion h\n";}
}
b) int sum( int x, int y){int result ;result = x+y;
}
c) void f(double a){float a;cout << a << endl;
}
d) void product (void){int a, b, c, ergebnis;cout << "Gib 3 Ganzzahlen ein: ";cin >> a >> b >> c;result = a * b * c;cout << "Ergebnis: << result << endl;return result;
}
24.03.2011 C++ Grundlagen 58
FB InformatikProf. Dr. R.Nitsch
Anweisungen
Programme enthalten Ausdrücke um Werte zu berechnen Programme benötigen zusätzlich die Möglichkeit,
Werte wiederholt zu berechnen unter Alternativen auszuwählen Eingaben entgegenzunehmen und Ausgaben zu erzeugen
Diese Dinge werden in vielen Programmiersprachen durch Anweisungen (Statements) erreicht.
Bisher behandelte Arten von Anweisungen Deklarationsanweisung Ausdruck-Anweisung: Ein Ausdruck, gefolgt von einem Semikolon
Wozu braucht man das Semikolon? Bespiel: a=b ++ b; ist nicht eindeutig!
es kann a=b ++; b; gemeint sein, oder a=b; ++ b;
Auch cin >> i; ist eine Ausdrucksanweisung mit den Wertentrue: wenn Eingabe erfolgreichfalse: wenn Eingabe misslang.
a=b;++b;a=b;++b;
24.03.2011 C++ Grundlagen 59
FB InformatikProf. Dr. R.Nitsch
Strukturen, die den Programmablauf kontrollieren
Kontrollstrukturen geben an in welcher Reihenfolge (Sequenz) ob (Auswahl) und wie oft (Wiederholung)
Anweisungen ausgeführt werden, bzw. ob andere Programme aufgerufen
werden (Aufruf von Funktionen) Lineare Kontrollstrukturen
sind Kontrollstrukturen, die nur Sequenz, Wiederholung, Auswahl und Aufruf verwenden, aber keine Sprünge
Strukturierte Programmierung implementiert einen Algorithmus
durch ausschließliche Verwendung einfacher Anweisungen und linearer Kontrollstrukturen
AnweisungenAnweisungen
einfacheAnweisungen
einfacheAnweisungen KontrollstrukturenKontrollstrukturen
SequenzSequenz
AuswahlAuswahl WiederholungWiederholung
AufrufAufruf
lineare
Zur Erklärung wird neben dem Syntaxdiagramm eine Beschreibung auf höherer Sprachebene gewählt
Struktogramm (DIN 66261)Struktogramm (DIN 66261)
Nassi-Shneiderman on the Web
24.03.2011 C++ Grundlagen 60
FB InformatikProf. Dr. R.Nitsch
Auswahlanweisung if ... else
if Bedingung( AnweisungOderBlock)
else AnweisungOderBlockSyntax-Diagramm
Anweisung
AnweisungOderBlock
{ }AnweisungOderBlock(AOB):
Beispiele:
if(Bedingung) AnweisungOderBlock1
AnweisungOderBlock2
if(Bedingung) AnweisungOderBlock1
AnweisungOderBlock2
AnweisungOderBlock1 wird nur ausgeführt, wennBedingung wahr ist (true oder ungleich 0)AnweisungOderBlock2 wird immer ausgeführt
if(Bedingung) AnweisungOderBlock1
else AnweisungOderBlock2
if(Bedingung) AnweisungOderBlock1
else AnweisungOderBlock2
AnweisungOderBlock1 wird nur ausgeführt, wennBedingung wahr ist (true oder ungleich 0)AnweisungOderBlock2 wird nur ausgeführt wennBedingung falsch ist (false oder gleich 0)
Bwahr falschAOB1
AOB2
Bwahr falschAOB1 AOB2
AOB2
Struktogramm (DIN 66261)oder Nassi-Shneiderman-Diagramm
24.03.2011 C++ Grundlagen 61
FB InformatikProf. Dr. R.Nitsch
Beispiele if ... else
// Gibt maximum von a und b zurückint max( int a, int b ) {
if(a>b)return a;
elsereturn b;
}
Maximum-Funktion
Eingabe mit nachfolgender Fehlerprüfung
int i;cin >> i;if( cin.fail() ) { // prüft Fehlerflag
cout << "Fehler: Eingabe misslungen!\n";exit(1); // Beendet Programm; return value 1
// weist auf Fehler bei Ausführung hin}
Eingabe mit vorausgehender "Reinigung"
if( !cin.good() ) {cin.clear(); // setzt alle Fehlerflags zurückcin.sync(); // löscht alle Zeichen im Eingabepuffer
}int i;cin >> i;
24.03.2011 C++ Grundlagen 62
FB InformatikProf. Dr. R.Nitsch
Mehr als 2 Alternativen
if ... else wählt aus 2 Alternativen eine ausWas, wenn aus mehr als 2 Alternativen zu wählen ist?
1 x>1Beispiel: Die signum-Funktion: sign(x) = 0 x=0
-1 x<0
Lösung: if ... else verschachteln
if(B1)ABO1
else if(B2)ABO2
else if(B3)ABO2
elseABO4
B1w f
ABO1 ABO3
B2w f
ABO2 ABO4
w fB3
C++ Implementierung von sign(x) ?
24.03.2011 C++ Grundlagen 63
FB InformatikProf. Dr. R.Nitsch
Finden Sie die Fehler
if (a=b) {cout << "a ist gleich b";
if (x==1)if (y==1)
cout << "x ist 1 und y ist 1";elsecout << "x ungleich 1";
Die switch-Anweisung wird später behandelt.
24.03.2011 C++ Grundlagen 64
FB InformatikProf. Dr. R.Nitsch
double sqrt( double x ) { // Berechnet Quadratwurzel// PRE: x>=0// POST: Maximaler Fehler kleiner 10-6
if( x>=0 ) { cout<< "Error in sqrt()"; exit(1);
}
// hier folgt der Algorithmus …
assert( abs(y*y-x) < 1e-6 );return y;
}
Programmieren mit Vertrag
Vorbedingung (Precondidion): Der Zustand, in dem das System sein muss, damit die Funktion ihre Leistung erbringen kann.
Nachbedingung (Postcondition): Beschreiben den Zustand, in dem das System sein muss, wenn die Leistung korrekt erbracht wurde.
//Aufrufer für korrekten Aufruf verantwortlich! // Kontrollierter Programmabbruch, wenn Bedingung == false
PRE&POST (mathematisch oder verbal) gehören zur Funktionsbeschreibung
// Kontrollierter Programmabbruch, wenn Bedingung == false// #include <cassert> erforderlich!
Für den Benutzer ist es unverzichtbar, diese Bedingungen zu kennen. Sie gehören verbal in die Funktionsdokumentation (siehe Beispiel unten)
Für die Softwarequalität ist es oft unverzichtbar, die Vorbedingung zu prüfen Code, der Vorbedingung prüft und z.B. Abweichungen meldet (siehe Beispiel unten).
Zumindest während der Testphase ist es unverzichtbar, die Nachbedingung zu prüfen. C++ assertions, die nur während der Debugphase ausgewertet werden (siehe Beispiel unten).
24.03.2011 C++ Grundlagen 65
FB InformatikProf. Dr. R.Nitsch
Wiederholungsanweisung while
Solange die Bedingung wahr (true oder ungleich 0) ist, wird die Anweisung bzw. der Block ausgeführt.
while AnweisungOderBlock( Bedingung )Syntax-Diagrammder while-Schleife
Bedingungerfüllt?
AnweisungoderBlock
janein
Die Bedingung wirdzuerst geprüft. Istsie zu Beginn unwahr,wird die Anweisung garnicht erst ausgeführt abweisende Schleife
Bedingung
AnweisungoderBlock
Struktogramm
while(true) { /*Anweisung(en)*/ }
while(false){ /*Anweisung(en)*/ }
// unendliche Schleife
//Anweisungen werden nie ausgeführt
24.03.2011 C++ Grundlagen 66
FB InformatikProf. Dr. R.Nitsch
Schleifenvariable
Zur Kontrolle der Wiederholungsrunden benötigt man eine Schleifenvariable
Schleifenvariable svinitialisierensolange Ausdruck unter Berücksichtigung von svtrue ( ≠ 0) ist
"Nutzleistung"Veränderung der svRichtung Ziel
Beispiel Summation der Zahlen von 0 bis n
int sum=0, sv=0, n;
while( sv ) {
sum += sv;++sv;
}
Was hier steht, kann erstnach Definition des Veränderungs-schritts festgelegt werden
Veränderungsschritt
Schleife für Grenzfälle prüfen: n = 0 ? n = 1 ?
Wiederholte Eingabe der Summanden durch Benutzer
int sum=0, i=0;
while( cin>>i ) {sum += i;
} cout << sum << endl;
// liefert true wenn Einlesen erfolgreich// Wie soll der Benutzer das Ende der Eingabe signalisieren?
[Ctrl-Z] bedeutet Ende der Eingabe und setzt das "End-of-File"-Flag.cin.eof() gibt das EOF-Flag zurück (true, wenn gesetzt).cin.good() fragt alle Flags ab und ergibt true, wenn keins gesetzt ist.
24.03.2011 C++ Grundlagen 67
FB InformatikProf. Dr. R.Nitsch
Die Anweisungen break und continue
Steuern den Kontrollfluß eines Programmsbreak beendet unmittelbar while-, do-while-, for- und switch-Kontrollstruk-turen. Das
Programm wird unmittelbar hinter diesen Strukturen fortgesetzt.continue in Wiederholungen beendet unmittelbar die Ausführung des zugehörigen
Strukturblocks. Die Anweisungen hinter continue werden übersprungen und die Programm-ausführung mit der Bedingungsprüfung fortgesetzt.
void main() {int x=0;while (++x<10) {
if ( x==5 ) break;cout << x << ' ';++x;
}cout << "Schleife verlassen bei x= "
<< x << endl ;}
Beispiel für breakvoid main() {int x=0;while (++x<10) {
if ( x==5) continue;cout << x << ' ';
}cout << "Ausgabe der Zahl 5 mit"
"continue verhindert!"<< endl ;
}
Beispiel für continue
1 2 3 4Schleife verlassen bei x= 5
1 2 3 4 6 7 8 9Ausgabe der Zahl 5 mit continue verhindert!
24.03.2011 C++ Grundlagen 68
FB InformatikProf. Dr. R.Nitsch
Häufige Programmierfehler in while-Schleifen
Finden und korrigieren Sie die Fehler in den nachfolgenden Programmsegmenten
a) While ( c <= 5) {product +=c;++c;
b) while (z >= 0) sum += z;
c) x=1; while (x <= 10);
x++;
d) Der nachfolgende Programmcode soll die Werte 1…10 ausgeben!
n = 1; while ( n < 10 )
cout << n++ << endl;
e) Die Zahlen 1..100 sollenaddiert werden!
int x=1, total=0;while (x<=100)
total +=x;x++;
f)
while ( y > 0 ) {cout << y << endl;++y;
}
Schleifenanweisungen mit for und do ... while werden später behandelt!
g) int x=0;while (++x<10) {
if ( x==5) continue;cout << x << ' ';
}}
24.03.2011 C++ Grundlagen 69
FB InformatikProf. Dr. R.Nitsch
HS-Übung 4: abweisende Schleife mit while
Schreiben Sie eine Funktion ggt die den größten gemeinsamen Teiler zweierParametern vom Typ int bestimmt und zurück gibt.
Testen Sie die Funktion mit einer Anwendung, die solange 2 Zahlen von der Tastatur einliest und den ggt ausgibt, bis eine der beiden Eingabezahlen 0 ist.
Hinweis: Um 2 Bedingungen gleichzeitig zu testen, können Sie den logischen && -Operator verwenden. Bsp: while ( payIn > 0 && payIn < 100 )
Lösung mit Pseudocode• Vorbedingung? Nachbedingung?• Schleifenvariable ggT mit Minimum beider Zahlen
initialisieren• Prüfen, ob beide Zahlen ohne Rest durch ggT teilbar sind
• Falls nein, ggT um eins vermindern• Falls ja, Schleife verlassen und mit nächster
Anweisung fortfahren
Hausaufgabe
24.03.2011 C++ Grundlagen 70
FB InformatikProf. Dr. R.Nitsch
C++ Standardtyp vector
Im Alltag beschäftigen wir uns oft mit Tabellen: Bundesliga-, Gehalts-, Kalorien-, Noten-, Entfernungstabelle, Kontoauszug, Tilgungsplan, Kassenbon ...
Der Standarddatentyp vector ist einfach eine Reihe von Elementen gleichen Typs. vector<int> v(6); // stellt 6 Elemente vom Typ int bereit, alle mit Anfangswert mit 0 vector<string> personal(5); // 4 Elemente vom Typ string bereit, alle initialisiert mit "" vector<double> vd(1000, -3.5); // vector mit 1000 doubles, alle mit Anfangswert -3.5
Auf die Elemente wird über eine Positionsangabe (Index) zugegriffen, d.h. das 1. Element hat Index 0, das Zweite Index 1 usw.
5v[0]
7v[1]
2v[2]
8v[3]
7v[4]
3v[5]
6size()
v:
v's Elements
v[0]=5; v[1]=7; v[2]=2;v[3]=8; v[4]=7; v[5]=3;
personal[0]="Karczewsky";personal[1]="Hergenroether"personal[2]="Moore";personal[3]="Nitsch";
v[5]="Lange";personal[4]=007;
// Fehler: Ein vector akzeptiert nur den vereinbarten Typ
vd[20000] =4.2; // Laufzeitfehler: Kein Zugriff auf nicht existierende Elemente
24.03.2011 C++ Grundlagen 71
FB InformatikProf. Dr. R.Nitsch
Wachstum ist auch für vector wichtig
vector ist ein dynamischer C++ Datentyp, d.h. er kann an Größe zulegen.
vector<double> v;cout<<v.size();
v.push_back(2.7);cout<<v.size();
v.push_back(5.6);
// Start als leerer vector ohne Elemente// Ausgabe: 0
// 1 Element mit Wert 2.7 ans vector-Ende anhängen// Ausgabe: 1
// 1 zweites Element mit Wert 5.6 hinzufügen// Ausgabe: 2
0size()
v:
1size()
v: 2.7v[0]
5.6v[1]
2size()
v: 2.7v[0]
v.push_back(0.3); // 1 zweites Element mit Wert 5.6 hinzufügen// Ausgabe: 2
5.6v[1]
3size()
v: 2.7v[0]
0.3v[2]
size() und push_back() sind sogenannte Memberfunktionen von vector. Memberfunktionen lassen sich nur auf den Datentyp (hier: vector) anwenden, zu
dem sie gehören. Ihre Definition wird im Zusammenhang mit Klassen behandelt. Ihre Aufrufsyntax unterscheidet sich von der gewöhnlicher Funktionen (siehe
Beispiele oben): Sie werden über den '.'-Operator aufgerufen!
24.03.2011 C++ Grundlagen 72
FB InformatikProf. Dr. R.Nitsch
Entfernen (löschen) des letzten Elementes
v[2] = 0 // hier wird nicht gelöscht, sondern dem Element// mit Index 2 ein neuer Wert zugewiesen
5.6v[1]
3size()
v: 2.7v[0]
0.0v[2]
v.pop_back() // Das letzte Element wird gelöscht. Beachten Sie// dass size() nun um 1 reduziert ist!
0.3v[1]
2size()
v: 2.7v[0]
v.pop_back() ist eine Memberfunktion von vector genauso wie size(). Sie löscht das letzte Element aus dem Container
Wie löscht man die anderen Elemente?
5.6v[1]
3size()
v: 2.7v[0]
0.3v[2]z.B. indem man alle hinter dem Löschelement gespeicherten
Elemente um einen Platz nach vorne kopiert und danach das letzte Element mit pop_back() löscht (siehe rechts)
0.3v[1]
3size()
v: 5.6v[0]
0.3v[2]
0.3v[1]
2size()
v: 5.6v[0]
24.03.2011 C++ Grundlagen 73
FB InformatikProf. Dr. R.Nitsch
Gültigkeits- und Sichtbarkeitsbereich von Variablen
Bisher: Variablen sind gekennzeichnet durch Name (name), Typ (type), Wert (value) und Adresse.
Neu: Zusätzlich sind Variable charakterisiert durch ihren Gültigkeitsbereich ihren Sichtbarkeitsbereich (Visibility)
Gültigkeitsbereich (GB) einer Variablen ist der Programmtextblock, in dem für die Variable ein Speicherplatz reserviert ist.
Der Sichtbarkeitsbereich (SB) einer Variablen ist der Programmtextblock, in dem eine Variable über ihren Namen gelesen oder geändert werden kann.
24.03.2011 C++ Grundlagen 74
FB InformatikProf. Dr. R.Nitsch
Gültigkeits- und Sichtbarkeitsbereich von Namen
#include <iostream>using namespace std;int a=3, b=10;int gib_a() { return a;}int gib_c() { return c; }int main (){
cout << a << endl;auto int a = 10;cout << a << endl;cout << ::a << endl;
{auto int b = 20;int c = 30;cout << b << c << ::b << endl;
}cout << b << endl;cout << c << endl;cout << a << endl;cout << ::a << endl;return 0; }
Beispiel
// externe (globale) Variable (R1: SB=Datei, GB=Programm)
// Fehler: c nicht definiert
// hier beginnt ein Anweisungsblock// Ausgabe 3; globales a (R3)
// lokales a; auto ist voreingestellt und deshalb optional// Ausgabe 10; lokales a (R4)
// Ausgabe 3; globales a
// Gültigkeitsbereich-Auswahloperator
// Subblock beginnt (R3)// lokales b sichtbar; globales b gültig, aber unsichtbar (R4)// lokales c; hier ist auto wie üblich wieder weggelassen
// Ausgabe 20 30 10
// hier endet Gültigkeitsbereich von lok. b und c// Ausgabe 10; globales b wieder sichtbar
// Fehler: c nicht mehr gültig (R2) // Ausgabe 10; lokales a wieder sichtbar (R4)// Ausgabe 3; globales a
// lokales a wird unsichtbar und ungültig
auto gibt explizit die Speicherklasse "Automatisch" an!
24.03.2011 C++ Grundlagen 75
FB InformatikProf. Dr. R.Nitsch
Lokale contra globale Variablen
Das spricht für globale Variablen Sie werden vom Compiler initialisiert (mit 0) Ihr Gültigkeitsbereich ist das ganze Programm Ihr Sichtbarkeitsbereich ist die Datei, in der sie definiert sind Sie können in allen Funktionen benutzt werden Sie können auch bei Verdeckung mit Operator :: sichtbar gemacht werdenDas spricht gegen globale Variable Sie genießen keinen Zugriffsschutz. Jeder kann überall im Programm auf sie
zugreifen. Hat eine globale Variable einen unerwarteten Wert, muss die Ursache im gesamten
Programm gesucht werden. Sie machen Programme unzuverlässig.Gute Programmierer wissen (nach vielen Fehltritten) Schutz der Daten vor unberechtigtem Zugriff ( -> Kapselungsprinzip )
verbessert die Datenintegrität macht Programme zuverlässiger, vereinfacht die Fehlersuche macht Programme besser wartbar und pflegbar.
Deshalb:Globale Variable sollten nur für
read-only (const) Variable verwendet werden.
Deshalb:Globale Variable sollten nur für
read-only (const) Variable verwendet werden.
24.03.2011 C++ Grundlagen 76
FB InformatikProf. Dr. R.Nitsch
namespace std /61/
C++ ermöglicht die Schaffung eigener Sichtbarkeitsbereiche mit Namen (sogenannte Namensräume oder namespaces)
Namensbereiche spielen bei der Benutzung verschiedener Libraries eine Rolle So sind alle Bestandteile der C++-Standardbibliothek im Namensraum std definiert.
Will man Elemente eines Namensraumes benutzen, muss man "qualifizierte Namen" (solche mit vorangestelltem Bezeichner des Namensraums) verwenden, um das Element sichtbar zu machen.
Ausprobieren mitcppbuch/k2/bloecke.cpp
std::cout << name << ", " << age << std::endl;float y = std::sin(x);
Alternativ kann man dem Compiler mit using-Deklarationen mitteilen "Mit coutmeine ich immer std::cout und mit sin immer std::sin"using std::cout; using std::endl; using std::sin;cout << name << ", " << age << endl;float y = sin(x);
Eine noch weitergehende Alternative ist eine using directive. Sie sagt dem Compiler: "Findest Du einen Namen nicht im aktuellen Sichtbarkeitsbereich, dann suche ihn im Namensraum std"using namespace std;cout << name << ", " << age << endl;float y = sin(x);
24.03.2011 C++ Grundlagen 77
FB InformatikProf. Dr. R.Nitsch
Software-Qualitätskriterien
Zuverlässigkeit:= Korrektheit + Robustheit Korrektheit: Aufgaben exakt so erfüllen, wie sie durch Anforderungskatalog bzw.
Spezifikationen definiert sind. Robustheit: Fähigkeit von Softwaresystemen, auch unter außergewöhnlichen
Bedingungen zu funktionieren, die nicht in der Spezifikation ausdrücklich beschrieben sind.
Pflegbarkeit:= Erweiterbarkeit + Wartbarkeit Geringer Aufwand zur Durchführung von Änderungen aufgrund von neuen
Anforderungen (Erweiterbarkeit) oder im Fehlerfall (Wartbarkeit)Wiederverwendbarkeit Eigenschaft von Softwareprodukten, ganz oder teilweise für neue Anwendungen
wiederverwendet werden zu könnenBenutzerfreundlichkeit (Usability) Einfach bei Bedienung, Bereitstellen von Eingabedaten, Auswertung der Ergebnisse
und Wiederaufsetzen nach Benutzungsfehlern Effizienz bzw. Performanz: Geringer Speicherplatzverbrauch, akzeptables Zeitverhalten
24.03.2011 C++ Grundlagen 78
FB InformatikProf. Dr. R.Nitsch
Fundamentale Software-Entwurfsprinzipien
Abstraktion Weglassen von irrelevanten Details, und
Konzentration auf das Wesentliche Ziel: Verbergen von KomplexitätKapselung (information hiding) Zusammengehörige Bestandteile einer
Abstraktion werden zu einem Ganzen zusammengefasst und von anderen abgegrenzt.
Modularisierung Ziel: Programmstrukturierung Gesamtsystem wird in sinnvolle Module
zerlegt. Das Modul dient dabei als Behälter für Funktionen oder Zuständigkeiten des Systems.
Dekomposition Zerlegen der Gesamtaufgabe in möglichst
unabhängige Teilaufgaben (Teile&Hersche) Ziel: Große Kohäsion, kleine KopplungGroße Kohäsion Jeder Programmbaustein, wie. z.B. Funktion,
Klasse , Modul, konzentriert sich auf die Erledigung genau einer Teilaufgabe
Geringe Kopplung Die Programmbausteine benutzen möglichst
wenige andere Programmbausteine zur Aufgabenerfüllung, d.h. geringe Abhängigkeiten zwischen den Programmbausteinen
Trennung von Schnittstelle und Implementierung
Die Implementierung des Programmbausteins umfasst den Code für die Funktionalität
Die Schnittstelle von Programmbausteinen definiert ihre Funktionalität und dient dem Anwender als Benutzungsanleitung.
Zweck: Komplexität vor Anwender verbergenWer mitreden will, muss diese Begriffe kennen!Wer mitreden will, muss diese Begriffe kennen!
24.03.2011 C++ Grundlagen 79
FB InformatikProf. Dr. R.Nitsch
Funktionsabstraktion
Funktionen in Programmiersprachen sind eine Abstraktion in folgendem Sinn wiederkehrende Progammstücke werden zusammengefasst und benannt Ihr Name abstrahiert von dem Programmstück, ihrem Rumpf Jedes Auftreten des Programmstücks wird durch einen Aufruf der Abstraktion ersetzt. Veränderliche Teile des Abstraktionsrumpfes werden zu formalen Parametern gemacht. Beim Aufruf werden aktuelle Parameter für die formalen eingesetzt Einsetzen des Rumpfes mit Substitution der Parameter
Abstraktionen erlauben das Verbergen von Implementierungsdetails Benutzersicht
Was tut eine Abstraktion? Vor- und Nachbedingung, “Effekt”
Implementierersicht Wie ist sie realisiert? Algorithmus, Effizienz, . . .
Abstraktion (lat. abstractus – „abgezogen“, Partizip Perfekt Passiv von abs-trahere– „abziehen, entfernen, trennen“) bezeichnet meist den induktiven Denkprozess des Weglassens von Einzelheiten und des Überführens auf etwas Allgemeineres oder Einfacheres [Wikipedia]
24.03.2011 C++ Grundlagen 80
FB InformatikProf. Dr. R.Nitsch
Abstraktionen in Programmiersprachen
Weitere Abstraktionen in Programmiersprachen sind Funktionsabstraktion Prozedurabstraktion generische Abstraktion
Eine Prozedurabstraktion abstrahiert von einem Befehl Jeder Aufruf wird ausgeführt und verändert den Speicherzustand
Der "kleine" Unterschied Prozeduren abstrahieren von Befehlen (z.B. "sortiere", "gib aus", "lies ein", "speichere",
...) Funktionen abstrahieren von Ausdrücken. Jeder Aufruf liefert einen Wert.
C++ unterstützt mit Funktionen, die nichts zurückgeben (Rückgabetyp void) die Prozedurabstraktion.
24.03.2011 C++ Grundlagen 81
FB InformatikProf. Dr. R.Nitsch
Wozu Prozeduren/Funktionen?
Welche Entwurfsprinzipien werden von Funktionen/Prozeduren unterstützt? Abstraktion? Kapselung Mudularisierung? Dekompisition? Kohäsion? Kopplung? Trennung von Schnittstelle
und Implementierung?
Funktionsabstraktion
Prozedur/Funktion als Black-Box-Abstraktion
?Input
Output
Schnittstelle Implementation
Prozedurabstraktion
?Input
Schnittstelle Implementation