Problem:
Ein Programm soll die Anzahl der Leitungen ermitteln, die nötig sind um n Häuser mit jeweils einer Leitung direkt miteinander zu verbinden.
Problem-Analyse:
Graphik | Problemgröße | Lösung |
---|---|---|
n = 1 | 0 Leitungen | |
n = 2 | 1 Leitung | |
n = 3 | 3 Leitungen | |
n = 4 | Wenn das 4. Haus ins Spiel kommt, muss es mit den restlichen drei Häusern verbunden werden. Hierzu werden drei weitere Leitungen benötigt: Bisher 3 plus 3 = 6 Leitungen |
|
n = 5 | Beim 5. Haus braucht man schon 0+1+2+3+4 = 10 Leitungen.
D.h. das n-te Haus wird mit n-1 Leitungen an die vorhandenen Häuser angeschlossen. (0+1+2+3)+4 = 10 |
|
n | Um das Problem für beliebige n lösen zu können brauchen wir ein Programm das die Summe
0+1+2+..+n-1 ausrechnet, die Summe der Zahlen von 0 bis n-1. |
Wie würde man so eine Summe von "Hand" ausrechnen? 0+1=1; 1+2=3; 3+3=6; 6+4=10 usw. bis summe + n-1 = Leitungen. Man bräuchte etwas, das die Zahlen von 0 bis n-1 hochzählt: |
|||||||
For-Schleife (i hochzählen)for (i = 0; i < n; i = i+1) Verarbeitung |
i = 0 ist die Initialisierung der Zählvariablen i.
i < n ist die Schleifen-Invariante, solange diese Bedingung gilt, wird weitergezählt. i = i+1 ist die Schrittweite, sie gibt an, wie die Zählvariable bei jedem Schleifendurchlauf erhöht wird. |
||||||
Fehlt nur noch die Verarbeitung in der Schleife, die Zahlen aufsummieren:
summe = summe + i; // bei jedem Durchlauf ist i um eins erhöht und wird zum bisherigen Ergebnis addiert
C++: Die ganze Lösung
Struktogrammlokale Variablen n,summe,i :Integer |
Quelltextint n,summe,i; cout << "Wieviele Haueser sollen verbunden werden ? "; cin >> n; // Eingabe n summe = 0; // summe initialisieren for (i=0;i<n;i=i+1){ // fuer i <- 0 bis n-1 summe = summe + i; } // -fuer i <- 0 bis n-1 cout << "\nEs werden " << summe << " Leitungen gebraucht\n"; |
|||
Java: Die ganze Lösung
Struktogrammlokale Variablen n,summe,i :Integer |
Quelltextint n,summe,i; Eingabe n; // Hier entsprechende Java-Methoden verwenden summe = 0; // summe initialisieren for (i=0;i<n;i=i+1){ // fuer i <- 0 bis n-1 summe = summe + i; } // -fuer i <- 0 bis n-1 Ausgabe summe; // Hier entsprechende Java-Methoden verwenden |
|||
Job: Implementieren und testen Sie die Lösung!
Typische For-Schleife
for (zaehlvar = startwert;zaehlvar <= endwert;zaehlvar++) VerarbeitungHinweis: zaehlvar++ ist die Abkürzung für zaehlvar = zaehlvar + 1 |
||||
Wenn man eine einfache Schleife braucht die von einem Startwert zu einem Endwert zählt bietet sich die For-Schleife an.
Ist die Schrittweite der Zählvariablen eins, braucht sie im Struktogramm nicht unbedingt angegeben werden. |
||||
Verarbeitung
Es gibt drei Möglichkeiten für Verarbeitung innerhalb der For-Schleife:
Beispiel | leere Anweisung | eine Anweisung | Block von Anweisungen |
---|---|---|---|
for(...) Verarbeitung |
for(...); |
for (...) Anweisung; |
for(...){ Anweisung 1 Anweisung 2 ... Anweisung n } |
Allgemeine For-Schleife
for (Initialisierung;Bedingung;Schrittweite) Verarbeitung // Rumpf der Schleife |
Reihenfolge der BearbeitungBeim Eintritt in die Schleife wird die Initialisierung ausgeführt. Dann wird die Bedingung ausgewertet, ist sie erfüllt, wird der Rumpf der Schleife verarbeitet. Nach Verarbeitung des Rumpfes kommt die Schrittweite im Schleifen-Kopf, z.B. das Inkrement. Nun wird wieder die Bedingung überprüft, ist sie immer noch erfüllt, geht es wieder in den Rumpf. Der Kreislauf dauert solange bis die Bedingung nicht mehr erfüllt ist, die Schleife wird verlassen. |
||||
BedingungDie Bedingung gibt vor wie lange die Schleife ausgeführt wird. SchrittweiteDieser Abschnitt wird nach der Verarbeitung des Schleifen-Rumpfes ausgeführt. Eine Erhöhung einer Zählvariablen nennt man Inkrement z.B. i++ oder i = i +2 Eine Erniedrigung einer Zählvariablen nennt man Dekrement z.B. i-- oder i = i -10 |
|||||
Initialisierung
Es besteht die Möglichkeit im Initialisierungs-Abschnitt Variablen auch zu Definieren, diese Variablen gelten dann nur innerhalb der For-Schleife:
|
||||||||||
Werden Variablen innerhalb eine For-Schleife definiert überdecken sie gleichnamige Variablen aus der Umgebung der Schleife, sie sind lokal innerhalb der Schleife.
Nach dem Schleifenende sind diese lokalen Variablen verschwunden, die überdeckten Variablen kommen wieder zum Vorschein. |
||||||||||
Einfache Lösung des Problems ohne SchleifeFrüher hat man Schüler zum Üben der Addition die Aufgabe gegeben, die Summe der Zahlen bis 100 zu bilden. Eine mords Arbeit... Da gab es einen Schüler namens Gauß, dem das zu langweilig war, er hat sich Gedanken gemacht, wie man diese Summen schneller bilden kann. |
||||||||||
|
||||||||||
Mit etwas Umformen erkennt man leicht, das die Lösung für beide Fälle identisch ist! | ||||||||||
Summe von i = 0 bis n über i | ||||||||||
Fragen
Wozu braucht man For-Schleifen?
Was versteht man unter Initialisierung bei einer For-Schleife?
Wo befindet sich der Schrittweiten-Abschnitt einer For-Schleife, wann wird er ausgeführt?
Wie sieht eine typische For-Schleife aus, erklären Sie den Aufbau und die Wirkungsweise anhand eines Beispiels (Struktogramm und Quelltext).
In welchem Fall kann man im Struktogramm einer For-Schleife das Inkrement weglassen?
Welche Auswirkungen haben Definition von Variablen im Initialisierungs-Abschnitt einer For-Schleife?