78
FB Informatik Prof. Dr. R.Nitsch Programmieren 1 - Grundlagen Reiner Nitsch Homepage mit Skript und Materialien zu PG1: www.fbi.h-da.de/~r.nitsch

Reiner Nitsch Homepage mit Skript und Materialien zu PG1 ... · FB Informatik Prof. Dr. R.Nitsch Programmieren 1 - Grundlagen Reiner Nitsch Homepage mit Skript und Materialien zu

  • 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