Verschachtelte Schleifen

Slides:



Advertisements
Ähnliche Präsentationen
Hochschule Fulda – FB ET Sommersemester 2010
Advertisements

Aufgabe: Wie stellt man eine for-Schleife durch eine while-Schleife dar ?
Funktionen.
Forschungszentrum caesar
Verschachtelte Schleifen
Verzweigung oder bedingte Anweisung Weiter mit PP.
6. Der OpenMP Standard Direktiven-basiertes API zur Programmierung von Parallelrechnern mit gemeinsamem Speicher für FORTRAN, C und C++
Suche in Texten (Stringsuche )
Übung 6.1Turing-Maschine 1.Machen Sie sich mit der Funktionsweise des Busy Beaver-Programms vertraut Vollziehen sie die 11 Schritte der ersten Turing-Tabelle.
Algorithmus. Ein Kochrezept, zum Beispiel: Kartoffelbrei.
SWITCH - Anweisung.
SWITCH - Anweisung.
Dateien. Eine Datei wird in C++ als ein Stream, also als ein Objekt einer bestimmten Klasse dargestellt.
REKURSION + ITERATION. Bemerkung: Die in den folgenden Folien angegebenen "Herleitungen" sind keine exakten Beweise, sondern Plausibilitätsbetrachtungen.
ARRAY oder FELD oder VEKTOR
Schleifen-beobachtung
Dynamischer Speicher und Struktur
Pointer. Grundsätzliches: Im Arbeitsspeicher werden Daten gespeichert. Um auf die Daten eindeutig zugreifen zu können, werden diesen Daten Adressen zugeordnet.
Klassenvariable. Da man für jede Kuh bzw. jede Henne auf dem Markt den gleichen Preis für ein Liter Milch, bzw. den gleichen Preis für ein Ei bekommt,
Konstruktoren.
WHILE - Anweisung.
Polymorphie (Vielgestaltigkeit)
Assoziationen (Beziehungen). Zwischen Objekten kann es eine Beziehung geben.
Polymorphie (Vielgestaltigkeit)
V AdresseWert public static void main(...){ int[] v; v=new int[2]; } Was veranlasst diese Anweisung im Arbeitsspeicher ? Es wird im Arbeitsspeicher.
FOR Anweisung.
Der Präprozessor. Bevor der Compiler das Programm in Maschinencode übersetzt (nur dieser kann von der CPU, dem Herz des Computers, bearbeitet werden)
DO...WHILE Anweisung.
Dynamischer Speicher. In einer Funktion wird z.B. mit der Deklaration int i; Speicher auf dem sogenannten Stack reserviert. Wenn die Funktion verlassen.
1 Vorlesung Informatik 2 Algorithmen und Datenstrukturen (02 – Funktionenklassen) Prof. Dr. Th. Ottmann.
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (02 – Funktionenklassen) Tobias Lauer.
Zusammenfassung Vorwoche
Addierwerke.
Bedingte Wiederholung (Buch S119)
Struktogramme IF-ELSE FOR – Schleife
Einführung in die Programmiersprache C 1

Präsentation C Tutorium von Daniel J. Nowak Folie 1 C Tutorium.
Einführung in die Programmierung Wintersemester 2013/14 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Parallel Matrix Multiplication
Technische Informatik Reihungen – Felder - Arrays.
Arrays / Felder Themen: Arrays / Felder / Vektoren Was soll das eigentlich? Erstellen von Arrays Arrays auslesen. Wie sie verwaltet werden.
1 Tagesüberblick 2 Lösung Hausaufgabe/Fragen Datei- ein- und ausgabe Schleifen Vergleiche Wahrheit.
Java-Kurs - 4. Übung Hausaufgabe Weitere Kontrollstrukturen
Java-Kurs - 4. Übung Hausaufgabe Weitere Kontrollstrukturen
Vertiefungsstoff zum Thema „Darstellung von Zahlen“
Funktionen. Aufgabe : Eingabe zweier Zahlen ---> Minimum bestimmen Dann nochmals Eingabe zweier Zahlen ---> Minimum bestimmen.
Verzweigung oder bedingte Anweisung. Aufgabe: Ein Autofahrer tankt sein Auto voll und schreibt den Kilometerstand auf (drei- stelliger Tageszähler).Wenn.
Pointer. Grundsätzliches: Im Arbeitsspeicher werden Daten gespeichert. Um auf die Daten eindeutig zugreifen zu können, werden diesen Daten Adressen zugeordnet.
Funktionen, Felder und Parameter- übergabe. Funktionsaufruf mit Feld als Parameter: Parameter = Name des Feldes.
TRUE und FALSE in C Der Wert 0 steht für FALSE Jeder von 0 verschiedene Wert steht für TRUE FALSE wird als 0 dargestellt TRUE wird als 1 dargestellt.
FOR Anweisung. Aufgabe : Ausgabe aller ganzen Zahlen von 0 bis 100 auf dem Bildschirm.
Das ABC der Statistik DIE HÄUFIGKEITSTABELLEN
Konstruktoren.
Laufzeitverhalten beim Sortieren
Algorithmen.
Durchschnitt (verbal)
Tutorium Programmieren I.
Java-Kurs - 2. Übung primitive Datentypen, Konstanten
Hexadezimale Darstellung von Zahlen
Unterschiedliche Kontrollstrukturen
Arrays in Java Ein Array ist eine Variable, die aus einer An-zahl von Elementen des gleichen Datentyps besteht, die aufeinanderfolgend im Speicher liegen.
Schleifen mit der Turtle
Algorithmen.
Arrays in C Ein Array ist eine Variable, die aus einer Anzahl von Elementen des gleichen Datentyps besteht, die aufeinanderfolgend im Speicher liegen.
REKURSION + ITERATION.
Zufallszahlen in C erzeugen
3. Die Datenstruktur Graph 3.2 Repräsentation von Graphen
Datentyp- umwandlung.
Schleifen Datenfelder (Arrays) Verzweigungen
 Präsentation transkript:

Verschachtelte Schleifen

Aufgabe: Schreiben Sie ein Programm, das die folgende, hellblau gekennzeichnete Multiplikationstabelle erstellt.

Die oberste Zeile wird jeweils multipliziert mit: * 1 2 3 4 ... 10 6 8 20 9 12 30 16 40 100 1 2 3 4 10

Programmier-Idee:

... ausgabe_zeile_ 1 das bedeutet konkret die Ausgabe: 1·1, 1·2, 1·3,..., 1·10 ausgabe_zeile_ 2 das bedeutet konkret die Ausgabe: 2·1, 2·2, 2·3,..., 2·10 Wie kann man dies mit welcher Anweisung durch ein Struktogramm auch noch kompakter (kürzer) darstellen ? ... ausgabe_zeile_ 10 das bedeutet konkret die Ausgabe: 10·1, 10·2, 10·3,..., 10·10

das bedeutet konkret die Ausgabe: i·1, i·2, i·3,..., i·10 for(i=1; i<=10; i++) ausgabe_zeile_ i das bedeutet konkret die Ausgabe: i·1, i·2, i·3,..., i·10 zeilenumbruch Oder anders dargestellt:

for(i=1; i<=10; i++) ausgabe(i·1), ausgabe(i·2), ausgabe(i·3), ..., zeilenumbruch Wie kann man diese Anweisungen mit welcher Anweisung durch ein Struktogramm auch noch kompakter (kürzer) darstellen ?

for(i=1; i<=10; i++) for(j=1; j<=10; j++) ausgabe(i*j) zeilenumbruch

umgesetzt in C ergibt dies:

int main(){ int i,j, erg; for(i=1;i<=10;i++){ for(j=1;j<=10;j++){ erg=i*j; printf("%d ",erg); } printf("\n");

Wir gehen das Programm Schritt für Schritt durch Wir gehen das Programm Schritt für Schritt durch... Um uns nicht zu langweilen und nicht zu viel Zeit zu verbrauchen, werden wir i und j nicht bis 10, sondern nur jeweils bis 2 hochzählen. Die Bildschirmausgabe wird mit gelber Farbe angezeigt

int main(){ wahr int i,j, erg; for(i=1;i<=2;i++){ for(j=1;j<=2;j++){ erg=i*j; printf("%d ",erg); } printf("\n"); wahr 1 1 erg ? ? i ? 1 j ? ?

int main(){ wahr int i,j, erg; for(i=1;i<=2;i++){ for(j=1;j<=2;j++){ erg=i*j; printf("%d ",erg); } printf("\n"); wahr 1 1 erg ? ? ? i ? 1 1 j ? ? 1

int main(){ int i,j, erg; for(i=1;i<=2;i++){ for(j=1;j<=2;j++){ erg=i*j; printf("%d ",erg); } printf("\n"); erg ? ? ? 1 i ? 1 1 1 j ? ? 1 1

int main(){ int i,j, erg; for(i=1;i<=2;i++){ for(j=1;j<=2;j++){ erg=i*j; printf("%d ",erg); } printf("\n"); 1 erg ? ? ? 1 i ? 1 1 1 j ? ? 1 1

int main(){ wahr int i,j, erg; for(i=1;i<=2;i++){ for(j=1;j<=2;j++){ erg=i*j; printf("%d ",erg); } printf("\n"); wahr 2 2 1 erg ? ? ? 1 1 i ? 1 1 1 1 j ? ? 1 1 2

int main(){ int i,j, erg; for(i=1;i<=2;i++){ for(j=1;j<=2;j++){ erg=i*j; printf("%d ",erg); } printf("\n"); 1 erg ? ? ? 1 1 2 i ? 1 1 1 1 1 j ? ? 1 1 2 2

int main(){ int i,j, erg; for(i=1;i<=2;i++){ for(j=1;j<=2;j++){ erg=i*j; printf("%d ",erg); } printf("\n"); 1 2 erg ? ? ? 1 1 2 i ? 1 1 1 1 1 j ? ? 1 1 2 2

int main(){ falsch int i,j, erg; for(i=1;i<=2;i++){ for(j=1;j<=2;j++){ erg=i*j; printf("%d ",erg); } printf("\n"); falsch 3 3 1 2 erg ? ? ? 1 1 2 2 i ? 1 1 1 1 1 1 j ? ? 1 1 2 2 3

int main(){ int i,j, erg; for(i=1;i<=2;i++){ for(j=1;j<=2;j++){ erg=i*j; printf("%d ",erg); } printf("\n"); veranlaßt Zeilenumbruch: Kursor steht jetzt hier! 1 2 erg ? ? ? 1 1 2 2 i ? 1 1 1 1 1 1 j ? ? 1 1 2 2 3

int main(){ wahr int i,j, erg; for(i=1;i<=2;i++){ for(j=1;j<=2;j++){ erg=i*j; printf("%d ",erg); } printf("\n"); 2 wahr 2 1 2 erg ? ? ? 1 1 2 2 2 i ? 1 1 1 1 1 1 2 j ? ? 1 1 2 2 3 3

int main(){ int i,j, erg; for(i=1;i<=2;i++){ for(j=1;j<=2;j++){ erg=i*j; printf("%d ",erg); } printf("\n"); int main(){ int i,j, erg; for(i=1;i<=2;i++){ for(j=1;j<=2;j++){ erg=i*j; printf("%d ",erg); } printf("\n"); wahr 1 1 1 2 erg ? ? ? 1 1 2 2 2 2 i ? 1 1 1 1 1 1 2 2 j ? ? 1 1 2 2 3 3 1

int main(){ int i,j, erg; for(i=1;i<=2;i++){ for(j=1;j<=2;j++){ erg=i*j; printf("%d ",erg); } printf("\n"); 1 2 erg ? ? ? 1 1 2 2 2 2 2 i ? 1 1 1 1 1 1 2 2 2 j ? ? 1 1 2 2 3 3 1 1

int main(){ int i,j, erg; for(i=1;i<=2;i++){ for(j=1;j<=2;j++){ erg=i*j; printf("%d ",erg); } printf("\n"); 1 2 2 erg ? ? ? 1 1 2 2 2 2 2 i ? 1 1 1 1 1 1 2 2 2 j ? ? 1 1 2 2 3 3 1 1

int main(){ wahr int i,j, erg; for(i=1;i<=2;i++){ for(j=1;j<=2;j++){ erg=i*j; printf("%d ",erg); } printf("\n"); wahr 2 2 1 2 2 erg ? ? ? 1 1 2 2 2 2 2 2 i ? 1 1 1 1 1 1 2 2 2 2 j ? ? 1 1 2 2 3 3 1 1 2

int main(){ int i,j, erg; for(i=1;i<=2;i++){ for(j=1;j<=2;j++){ erg=i*j; printf("%d ",erg); } printf("\n"); 1 2 2 erg ? ? ? 1 1 2 2 2 2 2 2 4 i ? 1 1 1 1 1 1 2 2 2 2 2 j ? ? 1 1 2 2 3 3 1 1 2 2

int main(){ int i,j, erg; for(i=1;i<=2;i++){ for(j=1;j<=2;j++){ erg=i*j; printf("%d ",erg); } printf("\n"); int main(){ int i,j, erg; for(i=1;i<=2;i++){ for(j=1;j<=2;j++){ erg=i*j; printf("%d ",erg); } printf("\n"); 1 2 2 4 erg ? ? ? 1 1 2 2 2 2 2 2 4 i ? 1 1 1 1 1 1 2 2 2 2 2 j ? ? 1 1 2 2 3 3 1 1 2 2

int main(){ falsch int i,j, erg; for(i=1;i<=2;i++){ for(j=1;j<=2;j++){ erg=i*j; printf("%d ",erg); } printf("\n"); falsch 3 3 1 2 2 4 erg ? ? ? 1 1 2 2 2 2 2 2 4 4 i ? 1 1 1 1 1 1 2 2 2 2 2 2 j ? ? 1 1 2 2 3 3 1 1 2 2 3

int main(){ int i,j, erg; for(i=1;i<=2;i++){ for(j=1;j<=2;j++){ erg=i*j; printf("%d ",erg); } printf("\n"); veranlaßt Zeilenumbruch: Kursor steht jetzt hier! 1 2 2 4 erg ? ? ? 1 1 2 2 2 2 2 2 4 4 i ? 1 1 1 1 1 1 2 2 2 2 2 2 j ? ? 1 1 2 2 3 3 1 1 2 2 3

int main(){ falsch int i,j, erg; for(i=1;i<=2;i++){ for(j=1;j<=2;j++){ erg=i*j; printf("%d ",erg); } printf("\n"); 3 falsch 3 1 2 2 4 erg ? ? ? 1 1 2 2 2 2 2 2 4 4 4 i ? 1 1 1 1 1 1 2 2 2 2 2 2 3 j ? ? 1 1 2 2 3 3 1 1 2 3 3 3

int main(){ int i,j, erg; for(i=1;i<=2;i++){ for(j=1;j<=2;j++){ erg=i*j; printf("%d ",erg); } printf("\n"); aus Platzgründen fehlt hier noch das return, das das Programm beendet. 1 2 2 4 erg ? ? ? 1 1 2 2 2 2 2 2 4 4 4 i ? 1 1 1 1 1 1 2 2 2 2 2 2 3 j ? ? 1 1 2 2 3 3 1 1 2 3 3 3

Aufgabe: Erstellen Sie ein Programm, das die Zahlen von 0 bis 999 in der Form (siehe rechts) auf dem Bildschirm ausgibt: 0#0#0 0#0#1 0#0#2 ... 9#9#7 9#9#8 9#9#9

Vorbemerkungen:

ausgabe_zeile_i#j#k ist Abkürzung für die Ausgabe der Zeile, die an der 1. Spalte den Wert i, an der 2. Spalte den Wert j und an der 3. Spalte den Wert k hat, also: i#j#k

Beispiel: ausgabe_zeile_6#3#8

ausgabe_zeile_i#j ist Abkürzung für die Ausgabe aller Zeilen, die an der 1. Spalte den Wert i und der 2. Spalte den Wert j haben, also:

i#j#0 i#j#1 ... i#j#8 i#j#9

Beispiel: ausgabe_zeile_5#7 5#7#0 5#7#1 5#7#2 ... 5#7#8 5#7#9

ausgabe_zeile_i ist Abkürzung für die Ausgabe aller Zeilen, die an der 1. Spalte den Wert i haben, also:

i#0#0 i#0#1 ... i#9#8 i#9#9

Beispiel: ausgabe_zeile_3 3#0#0 3#0#1 3#0#2 ... 3#9#8 3#9#9

Programmier-Idee

ausgabe_zeile_0 ausgabe_zeile_1 ausgabe_zeile_2 ausgabe_zeile_3 Wie kann man dies mit welcher Anweisung durch ein Struktogramm auch noch kompakter (kürzer) darstellen ? ausgabe_zeile_1 ausgabe_zeile_2 ausgabe_zeile_3 ausgabe_zeile_4 ausgabe_zeile_5 ausgabe_zeile_6 ausgabe_zeile_7 ausgabe_zeile_8 ausgabe_zeile_9

das bedeutet konkret die Ausgabe: for(i=0; i<10; i++) ausgabe_zeile_ i das bedeutet konkret die Ausgabe: i#0#0 i#0#1 i#0#2 ... i#9#8 i#9#9 oder systematischer dargestellt:

for(i=0; i<10; i++) i#0#0 i#0#1 i#0#2 ... i#0#7 i#0#8 i#0#9 i#1#0 Wie kann man dies mit welcher Anweisung durch ein Struktogramm auch noch kompakter (kürzer) darstellen ? Jeder Block kommt jeweils untereinander (aus Platzgründen hier nebeneinander dargestellt)

for(i=0; i<10; i++) ausgabe_zeile_i#0 ausgabe_zeile_i#1 ausgabe_zeile_i#2 ... ausgabe_zeile_i#8 ausgabe_zeile_i#9

for(i=0; i<10; i++) for(j=0; j<10; j++) ausgabe_zeile_i#j Oder anders dargestellt:

for(i=0; i<10; i++) for(j=0; j<10; j++)

for(i=0; i<10; i++) for(j=0; j<10; j++) ausgabe_zeile_i#j#0 ... ausgabe_zeile_i#j#9 Wie kann man dies mit welcher Anweisung durch ein Struktogramm auch noch kompakter (kürzer) darstellen ?

for(i=0; i<10; i++) for(j=0; j<10; j++)

for(i=0; i<10; i++) for(j=0; j<10; j++) for(k=0; k<10; k++) ausgabe_zeile_i#j#k

umgesetzt in C ergibt dies:

int main(){ int i,j,k; for(i=0;i<10;i++){ for(j=0;j<10;j++){ for(k=0;k<10;k++){ printf("%d#%d# %d\n",i,j,k); }

Wichtige Bemerkung: In der innersten Schleife durchläuft die Zahlenkombination i, j, k alle möglichen Werte, also

i j k durchläuft alle Werte von 0 bis 9 also:

von:

bis: 9 9 9

Angenommen, man fasst das Gebilde unten als einen 3-stelligen Tachometer auf, der aus den 3 Rädchen i, j und k besteht. Welches Rad dreht sich am schnellsten, welches am langsamsten ? i j k k dreht sich am schnellsten, j dreht sich etwas langsamer und i drehst sich am langsamsten.

Wie kann man die Anzahl der Schleifendurchgänge berechnen ?

Werte für i 10*10*10 Werte für j Werte für k 10*10 10*10 10*10 .. 1 9 10 10 10 10 10 10 .. .. .. ... 9 9 9 ... 9 .. 9 ... 9 .. ... ... 9 ... 9 ... ... 9

Aufgabe (Zahlenrätsel): gleiche Buchstaben - gleiche Ziffern, verschiedene Buchstaben - verschiedene Ziffern send + more ------ money

send + more ------ money Wie versuchen durch "Probieren" eine Lösung zu bekommen ... Ist diese Lösung korrekt? 1 2 3 4 Nein, denn ... 5 6 7 2 1234 + 5672  56328 5 6 3 2 8

Hinweis zur Lösung: Systematisch alle möglichen Zahlenkombinationen von s, e, n, d, m, o, r, y ausprobieren und jeweils nachprüfen, ob gilt: send + more = money

Frage: Durch welches Konstrukt bekommt man systematisch alle möglichen Zahlenkombinationen von s, e, n, d, m, o, r, y

Antwort: Durch eine 8-fach verschachtelte Schleife !

for(s=0; s<10; s++) for(e=0; e<10; e++) for(n=0; n<10; n++) for(d=0; d<10; d++) was heißt das genau ? for(m=0; m<10; m++) for(o=0; o<10; o++) for(r=0; r<10; r++) for(y=0; y<10;y++) erg1=s*1000+e*100+n*10+d*1 + m*1000+o*100+ r*10+e*1 erg2=m*10000+o*1000+n*100+e*10+y*1 erg1==erg2 f w Buchst. verschieden f w Ausgabe(s, e, n, d, m, o, r, y)

Die Werte der Variablen: s, e, n, d, m, o, r, y sind alle verschieden Die Werte der Variablen: s, e, n, d, m, o, r, y sind alle verschieden. Dies bedeutet konkret:

se  sn  sd  sm  so sr  sy  en  ed  em  eo er  ey  nd  nm  no nr  ny  dm  do dr  dy  mo mr  my  or  oy  ry

umgesetzt in C ergibt dies:

int main(){ int s,e,n,d,m,o,r,y; int erg1, erg2, erg3; for (s=0; s<=9; s++){ for (e=0; e<=9; e++){ for (n=0; n<=9; n++){ for (d=0; d<=9; d++){ for (m=0; m<=9; m++){ for (o=0; o<=9; o++){ for (r=0; r<=9; r++){ for (y=0; y<=9; y++){ erg1=s*1000+e*100+n*10+d*1+m*1000+o*100+r*10+e*1; erg2 = m*10000 + o*1000 + n*100 + e*10 + y*1; if(erg1 == erg2){ erg3=s!=e && s!=n && s!=d && s!=m && s!=o && s!=r && s!=y && e!=n && e!=d && e!=m && e!=o && e!=r && e!=y && n!=d && n!=m && n!=o && n!=r && n!=y && d!=m && d!=o && d!=r && d!=y && m!=o && m!=r && m!=y && o!=r && o!=y && r!=y; if(erg3!=0){ printf(" %d %d %d %d\n",s,e,n,d); printf(" %d %d %d %d\n",m,o,r,e); printf("%d %d %d %d %d\n\n",m,o,n,e,y); schliessende Klammern mussten aus Platzgründen leider weggelassen werden

Frage (Rechenzeit): Wieviel Zahlenkombinationen der Variablen s, e, n, d, m, o, r, y gibt es ?

durchläuft jeweils alle Werte von 0 bis 9 m o r y Anzahl der Zahlenkombinationen ist also (siehe vorher): 108

Frage: Wie viele Möglichkeiten kann es maximal bei dieser Art von Zahlenrätseln geben?

Wie viele verschiedene Buchstaben kann es in so einem Zahlenrätsel maximal geben?

Nur 10, weil es ja nur 10 verschiedene Ziffern geben kann.

Also kann es maximal nur 1010 verschiedene Möglichkeiten geben.

Überlegungen zur Rechenzeit

Annahme: best case, d.h. wir nehmen den besten Fall an:

2 Ghz Taktfrequenz - Eine Berechnung pro Takt - Alle Daten befinden sich im Prozessorcache (L1-Cache). Es muß also nicht über einen (langsamen) Bus auf den Arbeitsspeicher zugegriffen werden, sondern die Daten können mit dem vollen Prozessortakt angesprochen werden.

Was bedeutet 2 Ghz Taktfrequenz?

2 * 109 Takte pro Sekunde Wie viel Zeit braucht er dann für einen Takt?

1 T = ------------ s 2 * 109 Wie viel Zeit braucht er dann für 1010 Rechnungen (bei den o.g. Voraussetzungen)?

t = T * 1010 1 = ----------- s * 1010 2 * 109 1010 = ----------- s = 5 s 2 * 109

In dieser best-case-Modellrechnung braucht der Prozessor also 5 Sekunden. Die Modellrechnung setzt kein paralleles Rechnen voraus.

Die Methode sämtliche Möglichkeiten zu testen, nennt man auch Die Methode sämtliche Möglichkeiten zu testen, nennt man auch. Brute Force

Wo wird Brute Force noch benutzt ?

Programme, die Passwörter ermitteln sollen