570 likes | 714 Views
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. Programmier-Idee:. ausgabe_zeile_ 1. das bedeutet konkret die Ausgabe:.
E N D
Aufgabe:Schreiben Sie ein Programm, das die folgende, hellblau gekennzeichnete Multiplikationstabelle erstellt.
Die oberste Zeile wird jeweils multipliziert mit: 1 2 3 4 10
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
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), ..., ausgabe(i·10) 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
int main(){ int i,j, erg; for(i=1;i<=10;i++){ for(j=1;j<=10;j++){ erg=i*j; print(erg); } println(); } }
Aufgabe:Erstellen Sie ein Programm, das die Zahlen von 0 bis 999 in der Form (siehe rechts) auf dem Bildschirm ausgibt: 0#0#00#0#10#0#2...9#9#79#9#89#9#9
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
ausgabe_zeile_i#jist 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:
Beispiel:ausgabe_zeile_5#7 5#7#0 5#7#1 5#7#2 ... 5#7#8 5#7#9
ausgabe_zeile_iist Abkürzung für die Ausgabe aller Zeilen, die an der 1. Spalte den Wert i haben, also:
Beispiel:ausgabe_zeile_3 3#0#0 3#0#1 3#0#2 ... 3#9#8 3#9#9
ausgabe_zeile_0 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
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#1#0 i#1#1 i#1#2 ... i#1#7 i#1#8 i#1#9 i#0#0 i#0#1 i#0#2 ... i#0#7 i#0#8 i#0#9 i#2#0 i#2#1 i#2#2 ... i#2#7 i#2#8 i#2#9 i#8#0 i#8#1 i#8#2 ... i#8#7 i#8#8 i#8#9 i#9#0 i#9#1 i#9#2 ... i#9#7 i#9#8 i#9#9 ... 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#1 ... 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
int main(){ int i,j,k; for(i=0;i<10;i++){ for(j=0;j<10;j++){ for(k=0;k<10;k++){ println(i+"#"+j+ "#"+k); } } } }
Wichtige Bemerkung:In der innersten Schleife durchläuft die Zahlenkombination i, j, k alle möglichen Werte, also
durchläuft alle Werte von 0 bis 9 durchläuft alle Werte von 0 bis 9 j i k durchläuft alle Werte von 0 bis 9 also:
von: 0 0 0
bis: 9 9 9
10*10*10 10*10 10*10 10*10 .. 0 1 9 10 10 10 10 10 10 .. .. .. 0 0 ... 9 9 0 9 0 ... 9 .. 0 ... 9 .. 0 0 9 9 ... ... 0 ... 9 ... 0 ... 9
Aufgabe (Zahlenrätsel):gleiche Buchstaben - gleiche Ziffern, verschiedene Buchstaben - verschiedene Ziffernsend+ more------ money
Wie versuchen durch "Probieren" eine Lösung zu bekommen ... send+ more------ money 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, yausprobieren 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
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 w f Buchst. verschieden w f Ausgabe(s, e, n, d, m, o, r, y)
Die Werte der Variablen:s, e, n, d, m, o, r, ysind alle verschieden. Dies bedeutet konkret:
se sn sd sm so sr sy en ed em eo er ey nd nm no nr ny dm do dr dy mo mr my or oy ry
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){ println(" "+s+e+n+d); println(" "+m+o+r+e); println(m+o+n+e+y); schliessende Klammern mussten aus Platzgründen leider weggelassen werden
Frage (Rechenzeit):Wieviel Zahlenkombinationen der Variablens, e, n, d, m, o, r, y gibt es ?
durchläuft jeweils alle Werte von 0 bis 9 s e n d m o r y Anzahl der Zahlenkombinationen ist also (siehe vorher): 108