Alter Ego hat geschrieben:Warum wird nicht von 1-30 gezählt? Warum diese Abhängigkeiten?
Wie gesagt, du setzt bei der inneren Schleife als Startzahl die aktuelle zahl der äußeren Variable ein, deshalb diese Abhängigkeit.
Hier nochmal an einem kleinen Beispiel:
Code: Alles auswählen
For aussen=1 To 5
For innen=aussen To 10
Debug Str(aussen)+" - "+Str(innen)
Next
Next
Wie das Abarbeiten funktioniert, hast du ja schon verstanden, gut!
Hier hat die Variable aussen beim ersten Durchlauf den Wert 1. Danach wird die innere Schleife aufgerufen und zwar 10 Mal, denn die Schleife zäählt ja von aussen bis 10 bzw. 1 bis 10.
Wenn die innere Schleife fertig ist, und zum zweiten Mal durchläuft, hat aussen den Wert 2. Danach wird die innere Schleife abermals ausgeführt, aber nur noch 9 Mal, nämlich hat die Variable innen danach die Werte 2, 3, 4, ..., 9 und 10.
Im Debugger sieht das dann so aus:
Code: Alles auswählen
1 - 1
1 - 2
1 - 3
1 - 4
1 - 5
1 - 6
1 - 7
1 - 8
1 - 9
1 - 10
2 - 2
2 - 3
2 - 4
2 - 5
2 - 6
2 - 7
2 - 8
2 - 9
2 - 10
3 - 3
3 - 4
3 - 5
3 - 6
3 - 7
3 - 8
3 - 9
3 - 10
4 - 4
4 - 5
4 - 6
4 - 7
4 - 8
4 - 9
4 - 10
5 - 5
5 - 6
5 - 7
5 - 8
5 - 9
5 - 10
Zu deiner Aufgabenstellung:
Du brauchst eine äußere Variable nicht in eine der inneren Schleifen einsetzen. Das ist ein Denkfehler bei deinem ersten Code.
Jede Person kann ja laut Aufgabe 1-27 Jahre alt sein: Wenn sie 0 wär (gerade geboren), dann wäre das Produkt stets 0. Geht schon mal nicht.
Jede Person kann aber max. 27 Jahre alt sein, denn wenn eine Person älter ist, würde die Summe größer als 30 werden. Somit kannst du ganz nebenbei dein Programm optimieren und dir unnötige Schleifendurchläufe sparen und deinen Dozenten beeindrucken!
Ist aber auch egal, denn schließlich hat der Computer ja die Rechenarbeit und nicht du.
Im übrigen würde ich dir zum Experimentieren nur die Ausgabe per Debugger raten, das ist am einfachsten und du brauchst dich nicht um die Konsole bemühen. Wenn du nur 1 Zahl ausgeben willst, brauchst du diese auch nicht mal umwandeln!
Das nur so am Rande für ein schnelleres Experimentieren.
Der Programmcode lautet also:
Code: Alles auswählen
For a=1 To 27
For b=1 To 27
For c=1 To 27
For d=1 To 27
If a+b+c+d = 30 And a*b*c*d = 1536
Debug Str(a)+"-"+Str(b)+"-"+Str(c)+"-"+Str(d)
EndIf
Next
Next
Next
Next
Tipp: Immer schön einrücken, am besten mit Tab! habe mich anfangs auch immer dagegen gestellt aber damit kommt man nicht weit... Diese Einrückung hilft gerade bei verschachtelten Codes wie diesen!
Der Debugger spuckt dann folgende Lösungen aus
Code: Alles auswählen
2-8-8-12
2-8-12-8
2-12-8-8
4-4-6-16
4-4-16-6
4-6-4-16
4-6-16-4
4-16-4-6
4-16-6-4
6-4-4-16
6-4-16-4
6-16-4-4
8-2-8-12
8-2-12-8
8-8-2-12
8-8-12-2
8-12-2-8
8-12-8-2
12-2-8-8
12-8-2-8
12-8-8-2
16-4-4-6
16-4-6-4
16-6-4-4
Und wenn ich jetzt doppelte Lösungen herausnehme, bleibt nach meinem Verständnis folgendes übrig (aufsteigend sortiert):
Theoretisch kann nur das erste Ergebnis richtig sein, denn wie du schon richtig sagtest, kann nur ein Kind das jüngste sein.
Meiner persönlichen Meinung nach sind jedoch beide Ergebnisse korrekt, da aus der Aufgabenstellung nicht hervorgeht, dass nur hinsichtlich der Anzahl der Jahre ein Kind das jüngste sein kann.
Wir rechnen ja hier nur mit Jahren, nicht etwa noch mit Tagen.
Kann doch sein, dass ein Kind 4,5 Jahre alt ist und das andere Kind 4,75 Jahre, oder?
Somit wäre das jüngste Kind runde 4 Jahre alt und dieses Ergebnis aufgabenkonform.
Ich hoffe, ich konnte dir weiterhelfen.