1.8.5 Wiederholungen. Beispiele Unendliche Schleife: 1.8 Kontrollstrukturen 75. ( Bedingung ) AnweisungOderBlock. ja Anweisung. Bedingung erfüllt?

Ähnliche Dokumente
1.8 Kontrollstrukturen 73. default : ziffer = 0; if (ziffer > 0) { cout << "Ziffer = " << ziffer; else { cout << "keine römische Ziffer!

Kontrollstrukturen -- Schleifen und Wiederholungen

C++ Teil Schleifen. Man kann bestimme Anweisungen in einem Programm mehrfach ausführen lassen. Dazu gibt es in C++ verschiedene Schleifen.

Einführung in die Programmierung Wintersemester 2011/12

Grundlagen der Informatik 5. Kontrollstrukturen II

Wintersemester Maschinenbau und Kunststofftechnik. Informatik. Tobias Wolf Seite 1 von 25

Aufgabe 1.90: Ein Geschäft gibt ihren Kunden unterschiedliche Rabatte. Schreiben ein Programm, das folgende Rabattklassen vorsieht:

3. Grundanweisungen in Java

5. Elementare Befehle und Struktogramme

Schleifen in C/C++/Java

Übung zur Vorlesung Wissenschaftliches Rechnen Sommersemester 2012 Auffrischung zur Programmierung in C++, 1. Teil

Schleifen in C/C++/Java

Programmieren in C/C++ und MATLAB

Programmiersprache 1 (C++) Prof. Dr. Stefan Enderle NTA Isny

Java - Schleifen. Bedingung. wiederhole. Anweisung Anweisung Anweisung. Leibniz Universität IT Services Anja Aue

Vom Problem zum Programm

Programmiertechnik Kontrollstrukturen

JavaScript. Dies ist normales HTML. Hallo Welt! Dies ist JavaScript. Wieder normales HTML.

Schleifen: Immer wieder dasselbe tun

Sprachkonstrukte. Einführung in Java. Folie 1 von Mai Ivo Kronenberg

Einstieg in die Informatik mit Java

Prof. Dr. Oliver Haase Karl Martin Kern Achim Bitzer. Programmiertechnik Kontrollstrukturen

2.5 Programmstrukturen Entscheidung / Alternative

Klassen und Objekte. Klassen sind Vorlagen für Objekte. Objekte haben. Attribute. Konstruktoren. Methoden. Merkblatt

4.2 Gleitkommazahlen. Der Speicherbedarf (in Bits) ist üblicherweise. In vielen Anwendungen benötigt man gebrochene Werte. Physikalische Größen

Funktionales C++ zum Ersten

C++ Teil 2. Sven Groß. 16. Apr IGPM, RWTH Aachen. Sven Groß (IGPM, RWTH Aachen) C++ Teil Apr / 22

Kontrollstrukturen Blöcke / Schleifen / Bedingungen

Einstieg in die Informatik mit Java

C++ - Einführung in die Programmiersprache Schleifen

Operatoren für elementare Datentypen Bedingte Anweisungen Schleifen. Operatoren für elementare Datentypen Bedingte Anweisungen Schleifen

Einführung in die Programmierung II. 3. Kontrollstrukturen

Einstieg in die Informatik mit Java

Unterlagen. CPP-Uebungen-08/

Tag 3 Repetitorium Informatik (Java)

Dr. Monika Meiler. Inhalt

Informatik für Elektrotechnik und Informationstechnik

Javakurs für Anfänger

C- Kurs 04 Anweisungen

FACHHOCHSCHULE AUGSBURG Hochschule für Technik, Wirtschaft und Gestaltung

Java 8. Elmar Fuchs Grundlagen Programmierung. 1. Ausgabe, Oktober 2014 JAV8

Java: Eine kurze Einführung an Beispielen

Modul Entscheidungsunterstützung in der Logistik. Einführung in die Programmierung mit C++ Übung 2

Labor Software-Entwicklung 1

Einführung in die Programmierung

2 Teil 2: Nassi-Schneiderman

Kapitel 3: Variablen

2. Algorithmenbegriff

3. Anweisungen und Kontrollstrukturen

Annehmende Schleife do while

Einführung in den Einsatz von Objekt-Orientierung mit C++ I

Grundlagen von C# - 2

Grundlagen der Informatik 2. Typen

Informationsverarbeitung

2.4 Schleifen. Schleifen unterscheiden sich hinsichtlich des Zeitpunktes der Prüfung der Abbruchbedingung:

Grundlagen der Informatik 4. Kontrollstrukturen I

C++ Teil 4. Sven Groß. 30. Apr IGPM, RWTH Aachen. Sven Groß (IGPM, RWTH Aachen) C++ Teil Apr / 16

9 Anweisungen und Kontrollstrukturen

3 Grundstrukturen eines C++ Programms anhand eines Beispiels

Thomas Gewering Benjamin Koch Dominik Lüke. (geschachtelte Schleifen)

Arbeitsblätter für Algorithmierung und Strukturierung C #

Grundlagen der Programmierung

Algorithmen zur Datenanalyse in C++

Es ist für die Lösung der Programmieraufgabe nicht nötig, den mathematischen Hintergrund zu verstehen, es kann aber beim Verständnis helfen.

4 Schleifen und Dateien

Programmierkurs C++ Lösungen zum Übungsblatt 3. Nils Eissfeldt und Jürgen Gräfe. 2. November Aufgabe 5

Objektorientierte Programmierung

Fachhochschule Südwestfalen Wir geben Impulse. Kontrollstrukturen und Schleifen in Octave

Gestrige Themen. Benutzung des Compilers und Editors. Variablen. Ein- und Ausgabe mit cin, cout (C++) Verzweigungen. Schleifen

Operatoren (1) Operatoren (2)

EINI LW/WiMa. Einführung in die Informatik für Naturwissenschaftler und Ingenieure Vorlesung 2 SWS WS 14/15

C# - Einführung in die Programmiersprache Bedingte Anweisungen und Schleifen

Wo sind wir? Kontrollstrukturen

Kontrollstrukturen. Wo sind wir? Anweisung mit Label. Block. Beispiel. Deklarationsanweisung

Nachname: Vorname: Matr.-Nr.: Punkte: 1. Aufgabe: ( / 25 Pkt.) Gegeben ist das folgende Struktogramm zur Berechnung von sin(x) mit Hilfe einer Reihe.

Angewandte Mathematik und Programmierung

Auswahlen (Selektionen)

Modellierung und Programmierung 1

Klausur: Grundlagen der Informatik I, am 05. Februar 2008 Dirk Seeber, h_da, Fb Informatik. Nachname: Vorname: Matr.-Nr.: Punkte:

S. d. I.: Programieren in C Folie 4-1. im Gegensatz zu Pascal gibt es in C kein Schlüsselwort "then"

Intensivübung zu Algorithmen und Datenstrukturen

Tag 3 Repetitorium Informatik (Java)

float: Fließkommazahl nach IEEE 754 Standard mit 32 bit

Praktikum zur Vorlesung Einführung in die Programmierung WS 14/15 Blatt 3

Schleifenanweisungen

Vorlesung Programmieren

Informatik 1 ( ) D-MAVT F2010. Schleifen, Felder. Yves Brise Übungsstunde 5

7. Einführung in C++ Programmieren / Algorithmen und Datenstrukturen 1 Prof. Dr. Bernhard Humm FB Informatik, Hochschule Darmstadt

BKTM - Programmieren leicht gemacht.

4. Einfache Programmstrukturen in C Einfache Programmstrukturen in C

Arrays. Arrays werden verwendet, wenn viele Variablen benötigt werden. Der Vorteil in Arrays liegt darin, dass man nur eine Variable deklarieren muss

1 Aufgaben 1.1 Objektorientiert: ("extended-hamster") Sammel-Hamster

Funktionen nur wenn dann

Javakurs für Anfänger

Kapitel 5. Programmierkurs. Kontrollstrukturen. Arten von Kontrollstrukturen. Kontrollstrukturen Die if-anweisung Die switch-anweisung

Vorlesung Programmieren

Projekt 3 Variablen und Operatoren

In Java: Schleifen 1. Art: Vorabprüfung: while. Wiederholungen (Kapitel 8) Schleife mit Vorabprüfung. Schleifen 2. Art: Endprüfung: do while

Transkript:

1.8 Kontrollstrukturen 75 1.8.5 Wiederholungen Häufig muss die gleiche Teilaufgabe oft wiederholt werden. Denken Sie nur an die Summation von Tabellenspalten in der Buchführung oder an das Suchen einer bestimmten Textstelle in einem Buch. In C++ gibt es zur Wiederholung von en drei verschiedene Arten von Schleifen. In einer Schleife wird nach Abarbeitung einer Teilaufgabe (zum Beispiel Addition einer Zahl) wieder an den Anfang zurückgekehrt, um die gleiche Aufgabe noch einmal auszuführen (Addition der nächsten Zahl). Durch bestimmte Bedingungen gesteuert, zum Beispiel Ende der Tabelle, bricht irgendwann die Schleife ab. Schleifen mit while Abbildung 1.7 zeigt die Syntax von while-schleifen. OderBlock ist wie auf Seite 67 definiert. Die Bedeutung einer while-schleife ist: Solange die Bedingung wahr ist, die Auswertung also ein Ergebnis ungleich 0 oder true liefert, wird die bzw. der Block ausgeführt. Die Bedingung wird auf jeden Fall zuerst geprüft. Wenn die Bedingung von vornherein unwahr ist, wird die gar nicht erst ausgeführt (siehe Abbildung 1.8). Die oder der Block innerhalb der Schleife heißt Schleifenkörper. Schleifen können wie if-en beliebig geschachtelt werden. while ( Bedingung ) OderBlock Abbildung 1.7: Syntaxdiagramm einer while-schleife while(bedingung1) // geschachtelte Schleifen, ohne und mit geschweiften Klammern while(bedingung2) {... while(bedingung3) {... Bedingung erfüllt? ja while (Bedingung) { nein Abbildung 1.8: Flussdiagramm für eine while- Beispiele Unendliche Schleife: while(true)

76 1 Es geht los! wird nie ausgeführt (unerreichbarer Programmcode): while(false) Summation der Zahlen 1 bis 99: int sum = 0; int n = 1; int grenze = 99; while(n <= grenze) { sum += n++; Berechnung des größten gemeinsamen Teilers ggt(x, y) für zwei natürliche Zahlen x und y nach Euklid. Es gilt: ggt(x, x), also x = y: Das Resultat ist x. ggt(x, y) bleibt unverändert, falls die größere der beiden Zahlen durch die Differenz ersetzt wird, also ggt(x, y) == ggt(x, y-x), falls x < y. Das Ersetzen der Differenz geschieht im folgenden Beispiel iterativ, also durch eine Schleife. Listing 1.14: Beispiel für while-schleife // cppbuch/k1/ggt.cpp Berechnung des größten gemeinsamen Teilers #include <iostream> using namespace std; int main() { unsigned int x; unsigned int y; cout <<"2 Zahlen > 0 eingeben :"; cin >> x >> y; cout << "Der ggt von " << x << " und " << y << " ist "; while( x!= y) { if(x > y) { x -= y; else { y -= x; cout << x << \n ; Innerhalb einer Schleife muss es eine Veränderung derart geben, dass die Bedingung irgendwann einmal unwahr wird, sodass die Schleife abbricht(man sagt auch terminiert). Unbeabsichtigte»unendliche«Schleifen sind ein häufiger Programmierfehler. Im ggt- Beispiel ist leicht erkennbar, dass die Schleife irgendwann beendet sein muss: 1. Bei jedem Durchlauf wird mindestens eine der beiden Zahlen kleiner. 2. Die Zahl 0 kann nicht erreicht werden, da immer eine kleinere von einer größeren Zahl subtrahiert wird. Die while-bedingung schließt die Subtraktion gleich großer Zahlen aus, und nur die könnte 0 ergeben.

1.8 Kontrollstrukturen 77 Daraus allein ergibt sich, dass die Schleife beendet wird, und zwar in weniger als x Schritten, wenn x die anfangs größere Zahl war. Im Allgemeinen sind es erheblich weniger, wie eine genauere Analyse ergibt. Tipp Die en zur Veränderung der Bedingung sollen möglichst an das Ende des Schleifenkörpers gestellt werden, um sie leicht finden zu können. Schleifen mit do while Abbildung 1.9 zeigt die Syntax einer do while-schleife. OderBlock ist wie auf Seite 67 definiert. Die oder der Block einer do while-schleife wird ausgeführt, und erst anschließend wird die Bedingung geprüft. Ist sie wahr, wird die ein weiteres Mal ausgeführt usw. Die wird also mindestens einmal ausgeführt. Im Flussdiagramm ist die ein Block (siehe rechts in der Abbildung 1.10). do while-schleifen eignen sich unter anderem gut zur sicheren Abfrage von Daten, indem die Abfrage so lange wiederholt wird, bis die abgefragten Daten in einem plausiblen Bereich liegen, wie im Primzahlprogramm unten zu sehen ist. do OderBlock while ( Bedingung ) ; Abbildung 1.9: Syntaxdiagramm einer do while-schleife Bedingung erfüllt? ja while (Bedingung); nein Abbildung 1.10: Flussdiagramm für eine do while- Es empfiehlt sich zur besseren Lesbarkeit, do while-schleifen strukturiert zu schreiben. Die schließende geschweifte Klammer soll genau unter dem ersten Zeichen der Zeile stehen, die die öffnende geschweifte Klammer enthält. Dadurch und durch Einrücken des dazwischen stehenden Textes ist sofort der Schleifenkörper erkennbar. en while(bedingung);

78 1 Es geht los! Das direkt hinter die abschließende geschweifte Klammer geschriebene while macht unmittelbar deutlich, dass dieses while zu einem do gehört. Das ist besonders wichtig, wenn der Schleifenkörper in einer Programmliste über die Seitengrenze ragt. Eine do while- Schleife kann stets in eine while-schleife umgeformt werden (und umgekehrt). Listing 1.15: Beispiel für do while-schleifen // cppbuch/k1/primzahl.cpp: Berechnen einer Primzahl, die auf eine gegebene Zahl folgt #include <iostream> #include <cmath> using namespace std; int main() { // Mehrere, durch " getrennte Texte ergeben eine lange Zeile in der Ausgabe. cout << "Berechnung der ersten Primzahl, die >=" " der eingegebenen Zahl ist\n"; long z; // do while-schleife zur Eingabe und Plausibilitätskontrolle // Abfrage, solange z 3 ist cout << "Zahl > 3 eingeben :"; cin >> z; while(z <= 3); if(z % 2 == 0) { // Falls z gerade ist: nächste ungerade Zahl nehmen ++z; bool gefunden {false; // limit = Grenze, bis zu der gerechnet werden muss. // sqrt() arbeitet mit double, daher wird der Typ explizit umgewandelt. long limit {1 + static_cast<long>( sqrt(static_cast<double>(z))); long rest; long teiler {1; // Kandidat z durch alle ungeraden Teiler dividieren teiler += 2; rest = z % teiler; while(rest > 0 && teiler < limit); if(rest > 0 && teiler >= limit) { gefunden = true; else { // sonst nächste ungerade Zahl untersuchen: z += 2; while(!gefunden); cout << "Die nächste Primzahl ist " << z << \n ; Schleifen mit for Die letzte Art von Schleifen ist die for-schleife. Sie wird häufig eingesetzt, wenn die Anzahl der Wiederholungen vorher feststeht, aber das muss durchaus nicht so sein. Abbildung 1.11 zeigt die Syntax einer for-schleife.

1.8 Kontrollstrukturen 79 for ( Initialisierung ; Bedingung ; Veränderung ) OderBlock Abbildung 1.11: Syntaxdiagramm einer for-schleife Der zu wiederholende Teil ( oder Block) wird auch Schleifenkörper genannt. Beispiel: ASCII-Tabelle im Bereich 65... 69 ausgeben for(int i = 65; i <= 69; ++i) { cout << i << " " << static_cast<char>(i) << \n ; Bei der Abarbeitung werden die folgenden Schritte durchlaufen: 1. Durchführung der Initialisierung, zum Beispiel Startwert für eine Laufvariable festlegen. Eine Laufvariable wird wie i in der Beispielschleife als Zähler benutzt. 2. Prüfen der Bedingung. 3. Falls die Bedingung wahr ist, zuerst die und dann die Veränderung ausführen. Die Laufvariable i kann auch außerhalb der runden Klammern deklariert werden, dies gilt aber als schlechter Stil. Der Unterschied besteht darin, dass außerhalb der Klammern deklarierte Laufvariablen noch über die Schleife hinaus gültig sind. int i; for(i = 0; i < 100; ++i) { // Programmcode, i ist hier bekannt // i ist weiterhin bekannt... // nicht empfohlen Im Fall der Deklaration innerhalb der runden Klammern bleibt die Gültigkeit auf den Schleifenkörper beschränkt: for(int i = 0; i < 100; ++i) { // Programmcode, i ist hier bekannt // i ist hier nicht mehr bekannt // empfohlen Die zweite Art erlaubt es, for-schleifen als selbstständige Programmteile hinzuzufügen oder zu entfernen, ohne Deklarationen in anderen Schleifen ändern zu müssen. Derselbe Mechanismus gilt für Deklarationen in den runden Klammern von if-, while- und switch-en. Listing 1.16: Beispiel für for-schleife // cppbuch/k1/fakultaet.cpp #include <iostream> using namespace std; int main() { cout << "Fakultät berechnen. Zahl >= 0? :"; unsigned int n;

80 1 Es geht los! cin >> n; unsigned long fak {1L; for(unsigned int i = 2; i <= n; ++i) { fak *= i; cout << n << "! = " << fak << \n ; Verändern Sie niemals die Laufvariable innerhalb des Schleifenkörpers! Das Auffinden von Fehlern würde durch die Änderung erschwert. for(int i = 65; i < 70; ++i) { // eine Seite Programmcode --i; // irgendwo dazwischen erzeugt eine unendliche Schleife // noch mehr Programmcode Auch wenn der Schleifenkörper nur aus einer besteht, wird empfohlen, ihn in geschweiften Klammern { einzuschließen. Äquivalenz von for und while Eine for-schleife entspricht direkt einer while-schleife, sie ist im Grunde nur eine Umformulierung, solange nicht continue vorkommt(das im folgenden Abschnitt beschrieben wird): for(initialisierung; Bedingung; Veraenderung) ist äquivalent zu: { Initialisierung; while(bedingung) { Veraenderung; Die äußeren Klammern sorgen dafür, dass in der Initialisierung deklarierte Variablen wie bei der for-schleife nach dem Ende nicht mehr gültig sind. kann wie immer auch eine Verbundanweisung (Block) sein, in der mehrere en stehen können, durch geschweifte Klammern begrenzt. Die umformulierte Entsprechung des obigen Beispiels (ASCII-Tabelle von 65... 69 ausgeben) lautet: { int i {65; while(i < 70) { cout << i << " " << static_cast<char>(i) << \n ; ++i; // Initialisierung // Bedingung // // Veränderung