INE1 Wiederholungen while, do...while, for

Ähnliche Dokumente
Wiederholungen / Schleifen

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

FACHHOCHSCHULE AUGSBURG Hochschule für Technik, Wirtschaft und Gestaltung

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

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

3. Anweisungen und Kontrollstrukturen

Schleifen in C/C++/Java

Programmiertechnik Kontrollstrukturen

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

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

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

Schachtelung der 2. Variante (Bedingungs-Kaskade): if (B1) A1 else if (B2) A2 else if (B3) A3 else if (B4) A4 else A

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

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

Kontrollstrukturen (1)

Algorithmen & Programmierung. Steuerstrukturen im Detail Selektion und Iteration

Kontrollstrukturen -- Schleifen und Wiederholungen

Java Anweisungen und Ablaufsteuerung

2.5 Programmstrukturen Entscheidung / Alternative

Schleifen in C/C++/Java

Einstieg in die Informatik mit Java

Objektorientierte Programmierung

Kontrollstrukturen Blöcke / Schleifen / Bedingungen

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

C- Kurs 04 Anweisungen

Einführung in die Programmierung II. 3. Kontrollstrukturen

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

Schleifenanweisungen

Einführung in die Programmierung Wintersemester 2011/12

Kompaktkurs Einführung in die Programmierung. 4. Kontrollstrukturen

Kapitel 3: Anweisungen

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

Grundlagen der Programmiersprache C für Studierende der Naturwissenschaften

Einführung in die Programmierung

Wenn... dann... if (condition) statement. if (kontostand < 0) System.out.println("Oops..."); false. condition. true. statement

2 Teil 2: Nassi-Schneiderman

Einstieg in die Informatik mit Java

6. Iteration (Schleifenanweisungen)

10 Wiederholungsanweisungen

Grundlagen der Programmierung in C++ Kontrollstrukturen

Grundlagen der Programmierung

Martin Unold INFORMATIK. Geoinformatik und Vermessung

Tag 3 Repetitorium Informatik (Java)

Kontrollstrukturen und Logik

Anweisungen und Kontrollstrukturen

Elementare Konzepte von

if ( Logischer Operator ) { } else { Anweisungen false

6. Iteration (Schleifenanweisungen)

Webbasierte Programmierung

3. Grundanweisungen in Java

Grundlagen der Programmierung in C++ Kontrollstrukturen

Operatoren für elementare Datentypen Bedingte Anweisungen Schleifen. Programmieren I. Martin Schultheiß. Hochschule Darmstadt Wintersemester 2010/2011

EINI WiMa. Einführung in die Informatik für Naturwissenschaftler und Ingenieure. Vorlesung 2 SWS WS 11/12

Java Ablaufsteuerung (Beispiele)

4.4 Imperative Algorithmen Verzweigung und Iteration

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

4. Ablaufsteuerung (Kontrollstrukturen)

2. Programmierung in C

Arbeitsblätter für Algorithmierung und Strukturierung

Programmiertechnik 1 FOR-SCHLEIFEN

Schleifen Datenfelder (Arrays) Verzweigungen

Arbeitsblätter für Algorithmierung und Strukturierung C #

Programmiertechnik 1 FOR-SCHLEIFEN

Vorlesung Programmieren

Einstieg in die Informatik mit Java

Übersicht. C Ein-/Ausgabe und Kontrollanweisungen. I/O-Funktionen aus stdio. printf() Ein-/Ausgabe. Kontrollanweisungen.

Grundlagen der Programmierung Teil1 Einheit III Okt. 2010

Einstieg in die Informatik mit Java

4. Einfache Programmstrukturen in C Einfache Programmstrukturen in C

C++ - Einführung in die Programmiersprache Schleifen

Informatik für Ingenieure (InfIng)

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

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

Imperative Programmierung in Java: Kontrollfluß II

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

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

Vorlesung Programmieren

Grundlagen der Programmierung

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

Javakurs für Anfänger

Transkript:

INE1 Wiederholungen while, do...while, for Schleife mit Goto Schleife mit Anfangsprüfung Schleife mit Endprüfung Schleifen mit Zähler: for Mehr zum Thema Schleifen 1

Wiederholungen Oft wollen wir gleiche oder ähnliche Anweisungen mehrmals hintereinander ausführen Bis jetzt: Code für solche Anweisungen mehrfach kopieren Beispiel: printf("zeile %d\n", 1); printf("zeile %d\n", 2); printf("zeile %d\n", 3); printf("zeile %d\n", 4); printf("zeile %d\n", 5);... 2 von 55

So nicht: Schleife mit goto... Im Prinzip würde eine Sprunganweisung genügen: int i = 1; start: if ( i < 10 ) { printf("zeile %d\n", i); i ++; goto start; 3 von 55

Goto: Spagetti-Code Beispiel: unstrukturiertes Programm mit GOTOs (Spagetti-Code) unübersichtlich schlecht wartbar 4 von 55

strukturierte Programmierung ohne GOTOs! Beispiel: strukturiertes Programm ohne GOTOs I.m. Nur 3 Konstrukte (Blöcke), die aneinander gereiht oder auch verschachtelt werden können: Sequenz Entscheidung Wiederholung übersichtlich gut wartbar 5 von 55

goto Mit goto (Sprüngen) können ein paar wenige sinnvolle Dinge gemacht, aber auch viele Probleme herbeigeführt werden Neuere Sprachen wie Java/C# bieten in der Regel nur noch eingeschränktes goto-statement an Goto Goto Statement Statement Considered Considered Harmful Harmful Auch in C vermeiden Go To Statement Considered Harmful, von Edsger W. Dijkstra, Communications of the ACM, Vol. 11, No. 3, March 1968, pp. 147-148. 6 von 55

Schleifenarten 8 von 55

Die 3 Schleifenarten Eigentlich würde eine Schleifenart genügen Aus Bequemlichkeitsgründen hat man jedoch 3 definiert. 1. Prüfung vor dem eigentliche Verabeitungsblock 2. Prüfung nach dem eigentlichen Verabeitungsblock 3. Feste Anzahl Durchgänge Meist ist anhand Situation klar, welche Schleifenart zu wählen ist 1. Vor 2. Nach 3. Feste Anzahl Zähler initialisieren. Bed? Ja Block Nein Ja Block Bed? Nein Ja Endwert? Nein Block Zähler aufdatieren 9 von 55

1. Vorabprüfung 10 von 55

Arten von Schleifen - 1. While mit Vorabprüfung Schleife mit Vorabprüfung ("while") Der Block wird solange wiederholt, wie die Bedingung gilt Ist die Bedingung bereits am Anfang nicht erfüllt, wird der Block nie ausgeführt while Bedingung do Block end while Ja Bed.? Nein while Bedingung Block Block Pseudocode 11 von 55

While mit Vorabprüfung while ( Ausdruck ) Block Ausdruck: logischer Ausdruck, der wahr oder falsch ist Block wird solange ausgeführt, wie die Bedingung erfüllt ist (evtl. gar nicht) Block kann auch leer sein! 12 von 55

Beispiel: while Wir zeichnen eine Reihe Sternchen : int counter = 0; while (counter < 8) { printf("*"); counter = counter + 1; Wie viele Sternchen werden gezeichnet? Wieso? Kein so gutes Beispiel für eine while-schleife! Für eine feste Anzahl von Wiederholungen sehen wir gleich einen besser geeigneten Schleifentyp 13 von 55

Beispiel: while (Forts.) Wie ist es, wenn wir die Bedingung ersetzen durch: counter <= 8 counter > 8 counter == 8 9 mal 0 mal counter!= 8 int counter = 0; while (... ) { printf("*"); counter = counter + 1; 14 von 55

while-schleife: Beispiel 2 Was macht das Programm? int i = 1; while (i < 100) { printf("%d\n", i); i = i * 2; 15 von 55

Programmierstil Zur Erinnerung: Konsequent konsistente Einhaltung der Darstellung und Einrückung von Blocks bool done; while (! done) { printf("processing...\n"); done = next_entry(); 16 von 55

Fallstricke Sind die im Test und im Schleifenblock verwendeten Variablen richtig initialisiert? Ist sichergestellt, dass der Bedingungsteil irgendwann logisch falsch wird? D.h.: Erreicht die Schleife je die Abbruchbedingung? 17 von 55

Endlosschleifen Überlegen Sie sich, wie Sie eine Endlosschleife programmieren können Wieso würden Sie so etwas programmieren wollen? Wie viele Sterne werden ausgegeben? int counter = 0; while (counter < 8){ printf("*"); A int counter = 0; while (counter < 8);{ printf("*"); counter = counter + 1; B 18 von 55

2. Endprüfung 19 von 55

Arten von Schleifen - While mit Endprüfung Schleife mit Endprüfung ("do..while") Der Block wird mindestens einmal ausgeführt Er wird dann wiederholt, solange die Bedingung erfüllt ist do Block; while Bedingung Ja Block Block Bed.? while Bedingung Pseudocode Nein 20 von 55

While mit Endprüfung Ausdruck: logischer Ausdruck, der wahr oder falsch ist Anweisung wird mindestens einmal ausgeführt Anweisung wird danach solange ausgeführt, wie die Bedingung erfüllt ist (evtl. kein weiteres mal) EBNF: do-anweisung ::= "do" anweisung "while" "(" ausdruck ")" 21 von 55

Beispiel: do..while Wir würfeln: int wurf = 0; int versuch = 0; time_t t; /* Intializes random number generator */ srand((unsigned) time(&t)); do { wurf = rand()%6 + 1; versuch += 1; printf("versuch %d : %d\n",versuch, wurf); while (wurf!= 6); http://www.tutorialspoint.com/cprogramming/ 22 von 55

3. Fixe Anzahl Wiederholungen 23 von 55

Arten von Schleifen - 3. Schleife mit Zähler Schleife mit fixer Anzahl Wiederholungen ("for"-schleife) Der Block soll eine vorbestimmte Anzahl mal ausgeführt werden Zähler initialisieren for i=n to m do Block; end for Zähler aufdatieren Block for i=n to m Block Pseudocode Ja End wert Nein 24 von 55

Schleifen mit Zähler: for Die for-schleife ist primär dazu gedacht, einen Block eine fixe Anzahl mal zu wiederholen EBNF: for-anweisung ::= "for" "(" initialisierung ";" bedingung ";" aufdatierung ")" anweisung 25 von 55

3. Schleife mit Zähler Was macht der Compiler aus einer for-anweisung? int i; for (i = 2 ; i <= n ; i++) Anweisung; i = 2; i <= n? Nein Ja Anweisung i++ 26 von 55

. Schleife mit Zähler einen Block eine fixe Anzahl mal zu wiederholen ist die for-scheife primär dazu gedacht, EBNF: for ( [ Initialisierung ] ; [ Bedingung ] ; [ Aufdatierung ] ) Block Initialisierung: wird GENAU ein Mal, vor dem ersten Durchlauf der Schleife ausgeführt. Kann auch Deklarationen enthalten (nur innerhalb der Schleife sichtbar) Laufvariable dort zu deklarieren ist guter Stil Bedingung: muss logischer Ausdruck sein Bedingung wird VOR jedem Schleifendurchlauf getestet Aufdatierung: kann Zuweisungen enthalten, keine Deklarationen Wird am ENDE des Schleifendurchlaufs ausgeführt Ja Zähler Zähler initialisieren. initialisieren. Endwer Endwer t? t? Block Block Nein Zähler Zähler aufdatieren aufdatieren 27 von 55

Schleifen mit Zähler: for Altes Beispiel mit while int counter = 0; while( counter < 8 ) { printf("*"); counter += 1; Jetzt mit for int counter; for (counter = 0; counter < 8; counter++ ) { printf("*"); 28 von 55

Fallstricke Ändern Sie die Laufvariable in der Schleife nicht (es geht!) Verwechseln Sie nicht Laufvariablen Nicht einmal zu viel oder zu wenig durchlaufen (0... n-1 oder 1...n?) First First new new roller roller coaster coaster test test ride ride with with dummies dummies Die Schleifenvariable sollte vom Typ int sein double/float können zu Ungenauigkeiten beim Aufaddieren führen, so dass die Schleife einmal mehr als erwartet durchlaufen wird. 29 von 55

Programmierstil // Summe von 1 bis 10 const int n = 10; int sum = 0, i; for (i = 1; i <= n; i++) { sum += i; Don't Don't try try be be clever clever // kürzere Version aber unleserlich const int n = 10; int i, sum; for (i = 1, sum = 0; i <= n; sum += i++); 30 von 55

Wie oft wird der Schleifenkörper durchlaufen Quizfrage double k; double step = 1; for (k = 0; k < 10.0; k += step){ printf("%.1f\n",k); A double k; double step = 0.1; for (k = 0; k < 10.0; k += step){ printf("%.1f\n",k); B 31 von 55

Mehr zum Thema Schleifen 32 von 55

Verwendung der Arten Verwenden Sie je nach Anforderung die passende Schleifenart Meist ergibt sich die passende Art anhand folgender Bedingungen wenn die Anzahl der Wiederholungen bekannt -> for Schleife wenn die Anzahl nicht bekannt ist (durch eine Bedingung geprüft wird) do-while wenn der Schleifenrumpf mindestens einmal ausgeführt werden soll while in allen andern Fällen 33 von 55

Welche Schleifenart? Es sollen alle Monate des Jahres ausgegeben werden Es soll so lange gewürfelt werden, bis ein 6 kommt Es sollen so lange eine Zahl eingelesen werden, bis sie eine Primzahl ist Es soll ein Intervall halbiert werden, bis die verbleibende Strecke < EPS ist Alle Grossbuchstaben sollen zu Kleinbuchstaben umgewandelt werden 34 von 55

Vorzeitiger Abbruch 35 von 55

break Mit break kann eine Schleife vorzeitig beendet werden: Aus einer Schleife heraus springen Bitte verwenden Sie dieses Konstrukt sparsam! Beispiel: int found = 0; for( i = 0; i < length; i++ ) { if( liste[i] == meinevar ) { found = 1; break; int found = 0; for( i = 0; i < length &&! found; i++ ) { if( liste[i] == meinevar ) { found = 1; 36 von 55

continue Mit continue kann der Rest eines Schleifenkörpers übersprungen werden Bitte verwenden Sie dieses Konstrukt sparsam! Beispiel: for( int i = 0; i < length; i++ ) { if( liste[i]!= meinevar ) continue; // sonst machen wir etwas Komplexes, // was viele Zeilen Code lang ist 37 von 55

Geschachtelte Schleifen 38 von 55

Zeilen voller Sterne Neue Aufgabe: Es sollen mehrere Zeilen voller Sterne ausgegeben werden Für eine Zeile haben wir das Problem bereits gelöst: int counter; for(counter = 1; counter <= 8; counter++ ) { printf("*"); printf("\n"); 39 von 55

Zeilen voller Sterne Wie zeichnen wir nun drei Zeilen voller Sterne? Eine Möglichkeit: int counter; for(counter = 1; counter <= 8; counter++ ) { printf("*"); printf("\n"); for(counter = 1; counter <= 8; counter++ ) { printf("*"); printf("\n"); for(counter = 1; counter <= 8; counter++ ) { printf("*"); printf("\n"); 40 von 55

Noch eine Variante Gleiches Ergebnis Unübersichtlich! int zaehler = 0; while ( zaehler < 24 ) { printf("*"); zaehler++; if ( zaehler % 8 == 0 ) { printf("\n"); 41 von 55

Verschachtelte Schleifen Eigentlich wollen wir in 2 Dimensionen wiederholen: Wir wollen x Sternchen auf einer Zeile darstellen Wir wollen y solche Zeilen untereinander darstellen Wie könnte also eine elegantere Lösung aussehen? Rückblick: for-schleife for ( [ Initialisierung ] ; [ Bedingung ] ; [ Aufdatierung ] ) Block 42 von 55

Verschachtelte Schleifen for (rows = 0; rows < 3; rows++ ) { // Eine Reihe Sterne ausgeben for(counter = 0; counter < 8; counter++ ) { printf("*"); printf("\n"); Zeichnet 3 Reihen à 8 Sternchen Die Zweidimensionalität drückt sich in zwei verschachtelten Schleifen aus 43 von 55

Darstellung Ja Zähler init. Endwe rt? Nein for i=n to m for j =n to m Block Zähler init. Zähler aufdat. Zähler aufdat. Endwe rt? Nein Block Ja for i=n to m do for j=n to m do Block; end for end for 44 von 55

Verschachtelte Schleifen for (i = 0; i < 20; i++) {... // do something nice..... for (j = 0; j < 20; j++) { // do even more for (j = 0; j < 5; j ++) { // another loop... //more code 45 von 55

Verschachtelte Schleifen Nicht nur for-schleifen können verschachtelt werden Auch while und do..while enthalten einen Block, der weitere Schleifen enthalten kann int i = 0; int step = 1; while (i < 10) { printf("i:%d\n", i); int j = 0; while (j < 10) { printf("j:%d\n", j); j += step; i += step; 46 von 55

Rückblick Wir haben in diesem Kapitel behandelt: Das Konzept einer Wiederholschleife Drei Arten von Schleifen Die Verschachtelung von Schleifen und anderen Ablaufstrukturen Der situationsgerechte Einsatz von Schleifen Die grafische Darstellung von Schleifen 47 von 55

Noch Fragen? 48 von 55

Syntaxbeschreibung: EBNF, Syntaxdiagramme 49 von 55

EBNF Problem: Wie kann man möglichst kompakt und vollständig beschreiben, was eine gültiges Programm-Codestück ist? Möglichkeit, die Grammatik einer Programmiersprache exakt und kompakt zu beschreiben bietet EBNF (Erweiterte Backus-Naur-Form) Eine EBNF-Grammatikregel hat folgende allgemeine Form: Name ::= Grammatikregel in EBNF 50 von 55

EBNF Metasymbole [ ], {,, und ( ) mit folgender Bedeutung: [a] {a a b (a b) c a optional a kann 0, 1, oder mehrmals vorkommen a oder b kann vorkommen, aber nicht beide a c oder a c kann vorkommen Weitere Konventionen Wlemente, die genau so im Programmcode vorkommen, werden in Anführungszeichen "..." oder '...' eingeschlossen (= Terminalsymbole) 51 von 55

EBNF while-anweisung (teilw.) while-anweisung ::= "while" "(" ausdruck ")" anweisung anweisung ::= block-anweisung while-anweisung return-anweisung... block-anweisung::= "{" vereinbarungsliste anweisungsliste "" 52 von 55

Syntaxdiagramm Syntaxdiagramme sind eine grafische Alternative zu EBNF-Regeln Man folgt den Pfeilen, um korrekte Kombinationen zu erhalten Terminalsymbole in Kreisen oder Ellipsen Elemente in Rechtecken werden in weiteren Diagrammen beschrieben 53 von 55

Rückblick: if-anweisung if-anweisung ::= "if" "(" ausdruck ")" anweisung [ "else" anweisung ] 54 von 55

Rückblick: switch-anweisung switch-anweisung ::= "switch" "(" ausdruck ")" "{" case { case "" case ::= "case" konstanter-ausdruck ":" { ausdruck "default" ":" { ausdruck 55 von 55