c++ programmierkurs€¦ · programmierkurs c++ – ws 04/05 christian hagemeier – lehrstuhl...
TRANSCRIPT
1
1
Programmierkurs C++ – WS 04/05 Christian Hagemeier – Lehrstuhl Prof. Dr. Schrader
C++ Programmierkurs
Wintersemester 04 / 05
Christian HagemeierLehrstuhl Prof. Dr. Schrader
Institut für InformatikUniversität zu Köln
mittwochs 17–18:30 UhrHörsaal II der Physikalischen Institute
http://www.zaik.de/AFS/teachings/
2
Programmierkurs C++ – WS 04/05 Christian Hagemeier – Lehrstuhl Prof. Dr. Schrader
Gliederung der Vorlesung
20.10.: Organisatorisches und Einführung27.10.: Einführung und Kontrollstrukturen03.11.: Kontrollstrukturen10.11.: Funktionen17.11.: Vektoren, Zeiger und Strings24.11.: Klassen und Datenabstraktion01.12.: Klassen08.12.: Überladen von Operatoren15.12.: Vererbung22.12.: Polymorphismus12.01.: Stream Ein–/Ausgabe19.01.: Datei Ein–/Ausgabe26.01.: Standard Template Library02.02.: Templates09.02.: Diverse Feinheiten
2
3
Programmierkurs C++ – WS 04/05 Christian Hagemeier – Lehrstuhl Prof. Dr. Schrader
1 // Fig. 1.2: fig01_02.cpp2 // Ein erstes Programm in C++.3 #include <iostream>4 5 // bei Funktion main beginnt Programmausführung6 int main()7 {8 std::cout << “Hello World!“ << std::endl;9 10 return 0; // beendet Programm mit Erfolg11 12 } // beende Funktion main
Hello World!
Der Programmtext „Hello World!“
4
Programmierkurs C++ – WS 04/05 Christian Hagemeier – Lehrstuhl Prof. Dr. Schrader
Modifiziertes “Hello World!”
1 // Fig. 1.4: fig01_04.cpp2 // Eine Ausgabezeile durch mehrere Befehle ausgeben.3 #include <iostream>4 5 // bei Funktion main beginnt Programmausführung6 int main()7 {8 std::cout << “Hello "; 9 std::cout << “World!" << std::endl;10 11 return 0; // beendet Programm mit Erfolg12 13 } // beendet Funktion main
Hello World!
Mehrmalige Verwendung des Ausgabeoperators erzeugt trotzdem nur eine Ausgabezeile.
3
5
Programmierkurs C++ – WS 04/05 Christian Hagemeier – Lehrstuhl Prof. Dr. Schrader
1.5 Addition zweier Zahlen
• Lernziele:– Verständnis von Variablen– Ein– und Ausgabe von ganzen Zahlen– Umgang mit ganzzahligen Variablen– Einfache Rechenoperationen verwenden
• Unwichtig (=„kommt später“):– Wie sieht der genaue Aufbau der neuen Befehle im Detail
aus?– Wie kann ich diese Kombinieren?
à Deitel: 1.22
6
Programmierkurs C++ – WS 04/05 Christian Hagemeier – Lehrstuhl Prof. Dr. Schrader
1. Teil: Addition zweier Zahlen
1 // Fig. 1.6: fig01_06.cpp2 // Addition zweier ganzer Zahlen.3 #include <iostream>4 5 // bei Funktion main beginnt Programmausführung6 int main()7 {8 int zahl1; // erste Zahl, die vom Benutzer eingegeben werden soll9 int zahl2; // zweite Zahl zur Benutzereingabe10 int summe; // Variable, in der die Summe gespeichert werden soll11 12 std::cout << “Gib erste Zahl ein\n"; // Benutzerinteraktion13 std::cin >> zahl1; // lies eine ganze Zahl ein14 15 std::cout << “Gib zweite Zahl ein\n"; // Benutzerinteraktion16 std::cin >> zahl2; // lies eine ganze Zahl ein17 18 summe = zahl1 + zahl2; // weise Ergebnis der Addition der Variablen zu19 20 std::cout << "Summe ist " << summe << std::endl; // gib Summe aus
Definiere ganzzahlige Variablen
Benutze Eingabeoperatormit Standard–Eingabe um Benutzereingabe einzulesen.
Zusammensetzen oder Ver-ketten mit Ausgabeoperator.
Berechne die Summe der beiden Zahlen und speichere sie in der neuen Variable.
Berechnungen können auch direkt im Ausgabebefehl durchge-führt werden. Alternative für Zeilen 18 und 20:std::cout << "Summe ist " << zahl1 + zahl2 << std::endl;
4
7
Programmierkurs C++ – WS 04/05 Christian Hagemeier – Lehrstuhl Prof. Dr. Schrader
2. Teil: Addition zweier Zahlen
2122 return 0; // beendet Funktion mit Erfolg23 24 } // beendet Funktion main
Gib erste Zahl ein45Gib zweite Zahl ein72Summe ist 117
8
Programmierkurs C++ – WS 04/05 Christian Hagemeier – Lehrstuhl Prof. Dr. Schrader
Variablen
• Stelle im Speicher, wo ein Wert von einem bestimmten Datentyp gespeichert werden kann
• Gängige Datentypen:– int – ganze Zahlen– char – Zeichen (Buchstabe, Ziffer, ...)– double – Fließkommazahl (rationale Zahl)
• Variablen müssen vor deren Nutzung mit Name und Datentyp definiert werden:int zahl1;int zahl2;
• mehrere Variablen gleichen Typs in einer Deklaration definieren: Trennung durch Kommataint zahl1, summe;
5
9
Programmierkurs C++ – WS 04/05 Christian Hagemeier – Lehrstuhl Prof. Dr. Schrader
Variablennamen
• Zeichenkette (Buchstaben, Ziffern, Unterstrich „_“)• Dürfen nicht mit Ziffer anfangen• Unterscheidet zwischen Groß– und Kleinschreibung
10
Programmierkurs C++ – WS 04/05 Christian Hagemeier – Lehrstuhl Prof. Dr. Schrader
Stream–Eingabe und Zuweisung
• Stream–Eingabe – wird angesprochen durch std::cin– Wartet auf Benutzereingabe; Abschluß durch Enter–
(Return–) Taste– Eingabeoperator „>>“
• speichert den eingelesenen Wert in der Variablen auf der rechten Seite des Operators
• Falls nötig wird eingegebener Typ in den entsprechenden Typ umgewandelt
• Zuweisungsoperator „=“– Weist einer Variablen einen Wert zu
– binärer Operator (2 Operatoren: Variable und Wert)– Beispiel:
summe = zahl1 + zahl2;
6
11
Programmierkurs C++ – WS 04/05 Christian Hagemeier – Lehrstuhl Prof. Dr. Schrader
Speicherkonzept bei Variablen
• Variablennamen– entsprechen Speicherplatz im Hauptspeicher des Computers– Jede Variable besitzt Name, Typ, Größe und Wert.– Wenn neuer Wert in Variable gespeichert wird, wird alter
Wert überschrieben– Auslesen von Variablen ist nicht destruktiv (Wert bleibt nach
Auslesen erhalten)
à Deitel: 1.23
12
Programmierkurs C++ – WS 04/05 Christian Hagemeier – Lehrstuhl Prof. Dr. Schrader
Speicherkonzept bei Variablen
• std::cin >> zahl1;– Annahme: Benutzer gibt 45 ein
zahl1 45
zahl1 45
zahl2 72
• std::cin >> zahl2;– Annahme: Benutzer gibt 72 ein
zahl1 45
zahl2 72
summe 117
• summe = zahl1 + zahl2;
7
13
Programmierkurs C++ – WS 04/05 Christian Hagemeier – Lehrstuhl Prof. Dr. Schrader
Arithmetische Berechnungen
• *– Multiplikation
• /– Division– Ganzzahlige Division schneidet den nicht ganzzahligen Rest
ab. Beispiel: 7/5 ergibt 1
• %– Modulo–Operation– Liefert Rest der ganzzahligen Division zurück.
Beispiel: 7%5 ergibt 2
à Deitel: 1.24
14
Programmierkurs C++ – WS 04/05 Christian Hagemeier – Lehrstuhl Prof. Dr. Schrader
Arithmetik: Evaluierungsreihenfolge
• Operatoren in Klammern werden als erstes ausgewertet (bei geschachtelter Klammerung innerste zuerst)
• Multiplikation, Division und Modulo als nächstes (von links nach rechts)
• Addition und Subtraktion als letztes (wieder von links nach rechts)
8
15
Programmierkurs C++ – WS 04/05 Christian Hagemeier – Lehrstuhl Prof. Dr. Schrader
1.6 Entscheidungen
• Lernziele:– Verständnis des if–Befehls (Entscheidungen)
– Erste Formulierung von Bedingungen– Gleichheit und relationale Operatoren– Erste Verwendung des Befehls using– Unterscheidung von Fehlerarten
• Unwichtgig (=„kommt später“):– Wie sieht der genaue Aufbau der neuen Befehle aus?
à Deitel: 1.25
16
Programmierkurs C++ – WS 04/05 Christian Hagemeier – Lehrstuhl Prof. Dr. Schrader
Programmtext, 1. Teil
1 // Fig. 1.14: fig01_14.cpp2 // Verwendung des Befehls if und von relationalen Operatoren3 4 #include <iostream>5 6 using std::cout; // Programm benutzt cout7 using std::cin; // Programm benutzt cin8 using std::endl; // Programm benutzt endl9 10 // bei Funktion main startet Programmausführung11 int main()12 {13 int zahl1; // erste vom Benutzer einzugebende Zahl14 int zahl2; // zweite vom Benutzer einzugebende Zahl15 16 cout << “Gib zwei Zahlen ein und ich ermittele “ << endl17 << “deren Relation: ";18 cin >> zahl1 >> zahl2; // lies die beiden ganzen Zahlen ein19 20 if ( zahl1 == zahl2 )21 cout << zahl1 << " ist gleich " << zahl2 << endl;22
using Befehle machen std:: Prefix überflüssig.
Schreibweise cout undcinohne std:: ist nun okay.
Deklariere Variablen.
if Befehl vergleicht Werte von zahl1 und zahl2 um auf Gleichheit zu überprüfen.
Wenn Bedingung wahr ist (d.h. Werte sind gleich), führe diesen Befehl aus.
9
17
Programmierkurs C++ – WS 04/05 Christian Hagemeier – Lehrstuhl Prof. Dr. Schrader
Programmtext, Teil 2
23 if ( zahl1 != zahl2 )24 cout << zahl1 << " ist ungleich " << zahl2 << endl;25 26 if ( zahl1 < zahl2 )27 cout << zahl1 << " ist kleiner als " << zahl2 << endl;28 29 if ( zahl1 > zahl2 )30 cout << zahl1 << " ist größer als " << zahl2 << endl;31 32 if ( zahl1 <= zahl2 )33 cout << zahl1 << " ist kleiner oder gleich "34 << zahl2 << endl;35 36 if ( zahl1 >= zahl2 )37 cout << zahl1 << " ist größer oder gleich "38 << zahl2 << endl;39 40 return 0; // bedeutet, daß das Programm erfolgreich beendet ist41 42 } // beendet Funktion main
if Befehl vergleicht Wert von zahl1 undzahl2 um auf Ungleichheit zu überprüfen.
Wenn Bedingung wahr ist (d.h. Werte sind ungleich), führe diesen Befehl aus.
Befehle können auf mehrere Zeilen aufgeteilt werden.
18
Programmierkurs C++ – WS 04/05 Christian Hagemeier – Lehrstuhl Prof. Dr. Schrader
Beispiele der Programmausführung
Gib zwei Zahlen ein und ich ermittelederen Beziehung: 22 1222 ist ungleich 1222 ist größer als 1222 ist größer oder gleich 12
Gib zwei Zahlen ein und ich ermittelederen Beziehung: 7 77 ist gleich 77 ist kleiner oder gleich 77 ist größer oder gleich 7
10
19
Programmierkurs C++ – WS 04/05 Christian Hagemeier – Lehrstuhl Prof. Dr. Schrader
Der if Befehl
• Der if Befehl– fälle eine Entscheidung auf Grund des Wahrheitsgehalts der
Bedingung– wenn Bedingung erfüllt ist, führe Körper aus– andernfalls wird Körper nicht ausgeführt
• Gleichheit und relationale Operatoren– Solange keine Klammern innerhalb der Ausdrücke ins Spiel
kommen gilt: Die Auswertung erfolgt bei allen diesen Operatoren gleichberechtigt, d.h. von links nach rechts.
20
Programmierkurs C++ – WS 04/05 Christian Hagemeier – Lehrstuhl Prof. Dr. Schrader
Relationale Operatoren
Operator C++--Operator Beispiel einer C++--Bedingung
Bedeutung der C++--Bedingung
Relationale Operatoren
> > x > y x ist größer als y
< < x < y x ist kleiner als y
≥ >= x >= y x ist größer als oder gleich y
≤ <= x <= y x ist kleiner als oder gleich y
Gleichheitsoperatoren
= == x == y x ist gleich y
≠ != x != y x ist nicht gleich y
11
21
Programmierkurs C++ – WS 04/05 Christian Hagemeier – Lehrstuhl Prof. Dr. Schrader
Der Befehl using
• Bei Verwendung braucht Bereichsauflösungsoperator :: mit Namensraum std nicht mehr verwendet zu werden
• using std::cout;– Jetzt kann cout statt std::cout benutzt werden
22
Programmierkurs C++ – WS 04/05 Christian Hagemeier – Lehrstuhl Prof. Dr. Schrader
Fehlerarten
• Syntaxfehler– „Compilerfehler“– tritt dann auf, wenn der Compiler einen Befehl nicht
erkennen kann– Häufigste Ursachen (neben Tippfehlern):
• vergessenes Semikolon am Ende eines Befehls• vergessene Klammern• benutzte Variable nicht definiert
• logische Fehler– Laufzeitfehler– fatale logische Fehler führen zum Programmabbruch
• Beispielsweise Division durch 0– nichtfatale logische Fehler führen nicht zum Programm-
abbruch, resultieren aber meist in fehlerhaften Ergebnissen• häufig bei Verwendung von = an Stelle von ==
12
23
Programmierkurs C++ – WS 04/05 Christian Hagemeier – Lehrstuhl Prof. Dr. Schrader
2. Kontrollstrukturen
2.1 Einführung2.2 Arten von Kontrollstrukturen2.3 if–Auswahlstruktur 2.4 if/else–Auswahlstruktur2.5 while–Wiederholungsstruktur2.6 Zählergesteuerte Wiederholung2.7 Wiederholung mit „Abbruchwert“2.8 Schachtelung von Kontrollstrukturen2.9 Zuweisungen in C++2.10 for–Wiederholungsstruktur2.11 switch–Mehrfachauswahl–Struktur2.12 do/while–Wiederholungsstruktur2.13 break und continue2.14 Logische Operatoren2.15 Zusammenfassung
24
Programmierkurs C++ – WS 04/05 Christian Hagemeier – Lehrstuhl Prof. Dr. Schrader
2.1 Einführung
• Vor Schreiben eines Programmes:– gutes Problemverständnis– Entwicklung eines Lösungsansatzes
• Während des Programmschreibens:– Welche „Programmstrukturen“ sind verfügbar?– Programmierprinzipien umsetzen
13
25
Programmierkurs C++ – WS 04/05 Christian Hagemeier – Lehrstuhl Prof. Dr. Schrader
Algorithmen
• lösen Probleme durch Ausführung von Anweisungen (Befehlen) in einer vordefinierten Reihenfolge
• Vorüberlegungen:– Was muß getan werden?– In welcher Reihenfolge?– Beispiel: Kochrezept
• Kontrollfluß eines Programmes:– Reihenfolge in der die Anweisungen ausgeführt werden
sollen
26
Programmierkurs C++ – WS 04/05 Christian Hagemeier – Lehrstuhl Prof. Dr. Schrader
Pseudocode
• Künstliche, informelle Sprache zum Entwurf von Programmen
• Ähnlich zu gewöhnlichem Deutsch (bzw. Englisch)• Wird nicht vom Computer ausgeführt• dient zum Programmentwurf• Leicht in C++ umzusetzen• Enthält nur „ausführbare“ Befehle (also beispiels-
weise keine Variablendeklarationen)
14
27
Programmierkurs C++ – WS 04/05 Christian Hagemeier – Lehrstuhl Prof. Dr. Schrader
2.2 Arten von Kontrollstrukturen
• Sequentielle Ausführung– Befehle werden in vorgegebener Reihenfolge abgearbeitet
• Kontrollflußsprünge– Nächster ausgeführter Befehl nicht nächster Befehl in
Quelltext
• 3 Kontrollstrukturen:1. sequentielle Struktur
• Programm führt aufeinanderfolgende Befehle in angegebener Reihenfolge aus
2. Auswahlstrukturen• if, if/else, switch
3. Wiederholungsstrukturen• while, do/while, for
28
Programmierkurs C++ – WS 04/05 Christian Hagemeier – Lehrstuhl Prof. Dr. Schrader
Schlüsselwörter in C++
• Dürfen nicht als Funktions-/Variablen-/... namen verwendet werden
auto break case char const continue default do double else enum extern float for goto if int long register return short signed sizeof static struct switch typedef union unsigned void volatile while
asm bool catch class const_cast delete dynamic_cast explicit false friend inline mutable namespace new operator private protected public reinterpret_cast static_cast template this throw true try typeid typename using virtual wchar_t
15
29
Programmierkurs C++ – WS 04/05 Christian Hagemeier – Lehrstuhl Prof. Dr. Schrader
Kontrollflußdiagramme
• graphische Repräsentation eines Algorithmus• spezielle Symbole durch Pfeile (Fluß) verbunden• Beispiel für sequentielle Ausführung:
30
Programmierkurs C++ – WS 04/05 Christian Hagemeier – Lehrstuhl Prof. Dr. Schrader
2.3 if–Auswahlstruktur
• Wähle unter alternativen Ausführungssträngen• Beispiel in Pseudocode:
Wenn Punktzahl größer 60 istAusgabe “Bestanden”
• Wenn Bedingung wahr (true)– Print–Befehl wird ausgeführt, Programm fährt bei nächstem
Befehl fort
• Wenn Bedingung falsch (false)– Print–Befehl wird ignoriert und es wird beim nächsten Befehl
fortgefahren
• Adäquates Einrücken erhöht Programmlesbarkeit– Compiler ignoriert „whitespace“–Zeichen (Leerzeichen,
Tabulator, etc.)
16
31
Programmierkurs C++ – WS 04/05 Christian Hagemeier – Lehrstuhl Prof. Dr. Schrader
C++– und Kontrollflußdiagramm–Umsetzung
• Übersetzung in C++:Wenn Punktzahl größer 60 ist
Ausgabe “Bestanden”
if ( punkte > 60 ) cout << “Bestanden";
• im Kontrollflußdiagramm:– Raute (=Entscheidungssymbol)– Zeigt Entscheidung an, die gefällt werden muß– Enthält Ausdruck, der wahr oder falsch sein kann
• Überprüfe die Bedingung und folge entsprechendem Pfad im Diagramm
32
Programmierkurs C++ – WS 04/05 Christian Hagemeier – Lehrstuhl Prof. Dr. Schrader
Kontrollflußdiagrammumsetzung
Entscheidung kann auf Grund eines jeden Ausdrucks gefällt werden.
Null – falsch (false)
Nichtnull – wahr (true)
Beispiel:
3 - 4 ist wahr (true)
17
33
Programmierkurs C++ – WS 04/05 Christian Hagemeier – Lehrstuhl Prof. Dr. Schrader
if/else–Auswahlstruktur
• if–Befehl– führt Anweisung aus, wenn Bedingung wahr ist
• if/else–Befehl– unterschiedliche Anweisungen, wenn Bedingung wahr oder
falsch ist
• Pseudocode:Wenn Punktzahl größer 60 ist
Ausgabe “Bestanden”sonst
Ausgabe “Durchgefallen”
• C++–Code:if ( punkte > 60 )
cout << “Bestanden";else
cout << “Durchgefallen";
34
Programmierkurs C++ – WS 04/05 Christian Hagemeier – Lehrstuhl Prof. Dr. Schrader
Kontrollflußdiagrammumsetzung
18
35
Programmierkurs C++ – WS 04/05 Christian Hagemeier – Lehrstuhl Prof. Dr. Schrader
Geschachtelte if/else–Befehle
• Zum Testen auf unterschiedliche Fälle• Sobald eine der Bedingungen erfüllt ist, wird
abgebrochenWenn Punktzahl größer 90 ist
Ausgabe “sehr gut”sonst
Wenn Punktzahl größer 80 istAusgabe “gut”sonst
Wenn Punktzahl größer 70 istAusgabe “befriedigend”
sonst Wenn Punktzahl größer 60 ist
Ausgabe “ausreichend”sonst
Ausgabe “mangelhaft”
36
Programmierkurs C++ – WS 04/05 Christian Hagemeier – Lehrstuhl Prof. Dr. Schrader
Geschachtelte if/else–Befehle
• C++–Code:
if ( punkte > 90 ) // über 90cout << “sehr gut";
else if ( punkte > 80 ) // 81-90cout << “gut";
else if ( punkte > 70 ) // 71-80cout << “befriedigend";
else if ( punkte > 60 ) // 61-70cout << “ausreichend";
else // less than 61cout << “mangelhaft";
19
37
Programmierkurs C++ – WS 04/05 Christian Hagemeier – Lehrstuhl Prof. Dr. Schrader
Gruppierung von Befehlen
• durch mehrere Befehle in einem paar geschweifter Klammern:if ( punkte > 60 )
cout << “Bestanden.“ << endl;else {
cout << “Durchgefallen.“ << endl;cout << “Der Kurs muß wiederholt werden.“ << endl;
}• Ohne Klammern würde zweiter Befehl
cout << “Der Kurs muß wiederholt werden.“ << endl;
immer ausgeführt.• Befehlsblock:
– Menge an Befehlen innerhalb von Klammern
38
Programmierkurs C++ – WS 04/05 Christian Hagemeier – Lehrstuhl Prof. Dr. Schrader
2.5 while–Wiederholungsstruktur
• Wiederholungsstruktur:– Aktion wird solange ausgeführt wie Bedingung wahr bleibt– Pseudocode:
Solange noch Gegenstände auf meinem Einkaufszettel stehenKaufe nächsten Gegenstand und streiche ihn von Zettel
– while–Bedingung bricht ab, sobald Bedingung nicht mehr erfüllt ist
• Beispiel in C++:int product = 2;while ( product <= 1000 )
product = 2 * product;
20
39
Programmierkurs C++ – WS 04/05 Christian Hagemeier – Lehrstuhl Prof. Dr. Schrader
Kontrollflußdiagramm while
40
Programmierkurs C++ – WS 04/05 Christian Hagemeier – Lehrstuhl Prof. Dr. Schrader
2.6 Zählergesteuerte Wiederholung
• Schleife wird durchlaufen bis Zähler bestimmten Wert erreicht
• Anzahl an Wiederholungen ist fest vorgegeben
• Beispiel:Eine Kurs mit 10 Studenten hat einen Test geschrieben. Die Punktzahlen (ganze Zahlen zwischen 0 und 100) der Bewertung sind verfügbar. Ermittle die durchschnittliche Punktzahl aller Kursteilnehmer indiesem Test.
21
41
Programmierkurs C++ – WS 04/05 Christian Hagemeier – Lehrstuhl Prof. Dr. Schrader
Pseudocode für „Durchschnittspunktzahl“
Setze Summe auf NullSetze Anzahl auf NullSolange Anzahl kleiner oder gleich Zehn ist
Lies nächste Punktzahl einFüge ihn Summe hinzuZähle Anzahl eins hoch
Setze Kursdurchschnitt auf “Summe” / 10Ausgabe Kursdurchschnitt
42
Programmierkurs C++ – WS 04/05 Christian Hagemeier – Lehrstuhl Prof. Dr. Schrader
C++–Code für „Durchschnittspunktzahl“ (1)
1 // Fig. 2.7: fig02_07.cpp2 // Class average program with counter-controlled repetition.3 #include <iostream>4 5 using std::cout;6 using std::cin;7 using std::endl;8 9 // function main begins program execution10 int main()11 {12 int summe; // Summe der bisher eingegebenen Punktzahlen13 int anzahl; // Nummer der nächsten eingegebenen Punktzahl14 int punkte; // gerade eingegebene Punktzahl15 int durchschnitt; // Durchschnitt der Punktzahlen16 17 // Initialisierungsphase18 summe = 0; // initialisiere Summe19 anzahl = 1; // initialisiere Schleifenzähler20
22
43
Programmierkurs C++ – WS 04/05 Christian Hagemeier – Lehrstuhl Prof. Dr. Schrader
C++–Code für „Durchschnittspunktzahl“ (2)
21 // Verarbeitungsphase22 while ( anzahl <= 10 ) { // 10 Schleifendurchläufe23 cout << “Gibt Punktzahl ein: "; // Eingabeaufforderung24 cin >> punkte; // lies Punkte vom Benutzer25 summe = summe + punkte; // addiere Punkte zu Summe26 anzahl = anzahl + 1; // erhöhe Zähler27 }28 29 // Beendigung30 durchschnitt = summe / 10; // ganzzahlige division31 32 // Ergebnis anzeigen33 cout << “Durchschnittspunktzahl ist " << durchschnitt << endl; 34 35 return 0; // indicate program ended successfully36 37 } // end function main
Der Zähler wird bei jedem Schleifen-durchlauf erhöht. Nach dem 10. Durchlauf beendet er die Schleife.
44
Programmierkurs C++ – WS 04/05 Christian Hagemeier – Lehrstuhl Prof. Dr. Schrader
Ausgabe von „Durchschnittspunktzahl“
Gib Punktzahl ein: 98Gib Punktzahl ein: 76Gib Punktzahl ein: 71Gib Punktzahl ein: 87Gib Punktzahl ein: 83Gib Punktzahl ein: 90Gib Punktzahl ein: 57Gib Punktzahl ein: 79Gib Punktzahl ein: 82Gib Punktzahl ein: 94Durchschnittspunktzahl ist 81
23
45
Programmierkurs C++ – WS 04/05 Christian Hagemeier – Lehrstuhl Prof. Dr. Schrader
2.7 Wiederholung mit „Abbruchwert“
• Sei das Problem nun wie folgt:Entwickle ein Durchschnittsermittlungsprogramm das eine nicht vorher bekannte Menge an Punktzahlen bearbeitet.
• Probleme:– Unbekannte Anzahl an Punktzahlen– Wie soll Programm wissen, wann Ende ist?
• „Abbruchwert“– bedeutet „Ende der Daten“– Schleife bricht nach Eingabe des Abbruchwerts ab
– Abbruchwert muß so gewählt werden, daß er nicht mit regulärer Eingabe verwechselt werden kann!
• Hier z.B. „-1“
46
Programmierkurs C++ – WS 04/05 Christian Hagemeier – Lehrstuhl Prof. Dr. Schrader
Algorithmenentwurf: „Top–Down“
• schrittweise Verfeinerung• Beginne mit Pseudocode für oberste (=ungenaueste)
Ebene:Ermittle den Kursdurchschnitt des Test
• Verfeinere in kleinere Teile:Initialisiere VariablenLies Punkte ein, summiere und zähle sieDurchschnitt berechnen und ausgeben
24
47
Programmierkurs C++ – WS 04/05 Christian Hagemeier – Lehrstuhl Prof. Dr. Schrader
Verfeinerungsschritte
• Verfeinere Initialisierungsphase:Initialisiere Variablen
wird zuInitialisiere Summe auf NullInitialisiere Anzahl auf Null
• Verarbeitungsphase:Lies Punkte ein, summiere und zähle sie
wird zuLies erste Punktzahl ein (evtl. Abbruchwert)Solange Benutzer noch nicht Abbruchwert eingegeben hat
Füge diese Zahl in Gesamtsumme einZähle eins zur Anzahl hinzuLies nächste Punktzahl ein (evtl. Abbruchwert)
48
Programmierkurs C++ – WS 04/05 Christian Hagemeier – Lehrstuhl Prof. Dr. Schrader
Verfeinerungsschritte
• BeendigungDurchschnitt berechnen und ausgeben
wird zuWenn der Zähler nicht Null ist
Setze Durchschnitt auf Punktzahl / AnzahlAusgabe Durchschnitt
SonstAusgabe „Es wurden keine Punktzahlen eingegeben!“
25
49
Programmierkurs C++ – WS 04/05 Christian Hagemeier – Lehrstuhl Prof. Dr. Schrader
Quellcode „Durchschnittsberechnung 2“ (1)
1 // Fig. 2.9: fig02_09.cpp2 // Class average program with sentinel-controlled repetition.3 #include <iostream>4 5 using std::cout;6 using std::cin;7 using std::endl;8 using std::fixed; // Fließkommaausgabe im Format 88.009 10 #include <iomanip> // Stream-Manipulatoren11 12 using std::setprecision; // Setzt numerische Ausgabeprzision 13 14 // function main begins program execution15 int main()16 {17 int summe; // Summe der Punkte18 int anzahl; // Anzahl eingegebener Punktezahlen19 int punkte; // aktuelle Punktzahl20 21 double durchschnitt; // Fließkommazahl zur Durchschnittsberechnung22
Datentyp double zum Speichern von Dezimalzahlen.
50
Programmierkurs C++ – WS 04/05 Christian Hagemeier – Lehrstuhl Prof. Dr. Schrader
Quellcode „Durchschnittsberechnung 2“ (2)
23 // Initialisierungsphase24 summe = 0; // initialisiere Summe25 anzahl = 0; // initialisiere Anzahl26 27 // Verarbeitungsphase28 // lies erste Zahl vom Benutzer ein29 cout << “Gib Punkte ein, -1 zum Beenden: "; // Eingabeaufforderung30 cin >> punkte; // Lies Punkte vom Benutzer31 32 // wiederhole solange Abbruchwert nicht eingegeben33 while ( punkte != -1 ) { 34 summe = summe + punkte; // füge Punkte zur Summe hinzu35 anzahl = anzahl + 1; // erhöhe Zähler36 37 cout << “Gib Punkte ein, -1 zum Beenden: "; // Eingabeaufforderung38 cin >> punkte; // Lies Punkte vom Benutzer39 40 } // end while41
26
51
Programmierkurs C++ – WS 04/05 Christian Hagemeier – Lehrstuhl Prof. Dr. Schrader
Quellcode „Durchschnittsberechnung 2“ (3)
42 // Beendigung43 // Wenn Benutzer mindestens eine Punktzahl eingegeben hat ...44 if ( anzahl > 0 ) {45 46 // berechne Durchschnitt aller eingegebenen Punktzahlen47 durchschnitt = static_cast<double>( summe ) / anzahl;4849 // zeige Durchschnitt mit zwei Nachkommastellen Genauigkeit an50 cout << “Durchschnittspunktzahl ist " << setprecision( 2 )51 << fixed << durchschnitt << endl;52
53 } // end if part of if/else54 55 else // wenn keine Punktzahlen eingegeben wurden gib entspr. aus56 cout << “Es wurden keine Punktzahlen eingegeben!" << endl;57 58 return 0; // indicate program ended successfully59 60 } // end function main
52
Programmierkurs C++ – WS 04/05 Christian Hagemeier – Lehrstuhl Prof. Dr. Schrader
Quellcode „Durchschnittsberechnung 2“ (3)
42 // Beendigung43 // Wenn Benutzer mindestens eine Punktzahl eingegeben hat ...44 if ( anzahl > 0 ) {45 46 // berechne Durchschnitt aller eingegebenen Punktzahlen47 durchschnitt = static_cast<double>( summe ) / anzahl;4849 // zeige Durchschnitt mit zwei Nachkommastellen Genauigkeit an50 cout << “Durchschnittspunktzahl ist " << setprecision( 2 )51 << fixed << durchschnitt << endl;52
53 } // end if part of if/else54 55 else // wenn keine Punktzahlen eingegeben wurden gib entspr. aus56 cout << “Es wurden keine Punktzahlen eingegeben!" << endl;57 58 return 0; // indicate program ended successfully59 60 } // end function main
static_cast<double>() behandelt summetemporär als double (casting).Benötigt, da ganzzahlige Division Rest abschneidet.
setprecision(2)gibt zwei Ziffern nach Dezimalpunkt aus (entsprechend gerundet).
Zur Benutzung <iomanip> einbinden.fixed zwingt zur Ausgabe im “fixed point” Format für Dezimalzahlen (nicht wissenschaftliches Format).
<iostream> einbinden.
27
53
Programmierkurs C++ – WS 04/05 Christian Hagemeier – Lehrstuhl Prof. Dr. Schrader
Ausgabe „Durchschnittsberechnung 2“
Gib Punkte ein, -1 zum Beenden: 75Gib Punkte ein, -1 zum Beenden: 94Gib Punkte ein, -1 zum Beenden: 97Gib Punkte ein, -1 zum Beenden: 88Gib Punkte ein, -1 zum Beenden: 70Gib Punkte ein, -1 zum Beenden: 64Gib Punkte ein, -1 zum Beenden: 83Gib Punkte ein, -1 zum Beenden: 89Gib Punkte ein, -1 zum Beenden: -1Durchschnittspunktzahl ist 82.50