Bunte Bits

9. Programmieren

9.1 Unsere erste Programmieraufgabe


9.1.1 Testen des Algorithmus

Nachdem man sich einen Algorithmus für die Lösung seines Problems überlegt hat, probiert man ihn erst mal aus! Überlegen wir also, was unser Computer machen würde, wenn wir uns die Teiler der Zahl 6 berechnen lassen wollen:
(Rechts zum Vergleichen noch einmal das Programm aus Abschnitt 9.1)

  1. Eingabe der Zahl 6, Dividend = 6
  2. Divisor = 2
  3. Dividend durch Divisor teilen:
    6 : 2 = 3, Rest = 0
  4. Rest = 0, also Divisor 2 als Teiler ausgeben
  5. Divisor inkrementieren:
    2 + 1 = 3
  6. Ist Divisor ungleich Dividend?
    3 ist ungleich 6, also zu Schritt 3 gehen
  1. Dividend durch Divisor teilen:
    6/3 = 2, Rest = 0
  2. Rest = 0, also wird der Divisor 3 als Teiler ausgegeben
  3. Divisor inkrementieren:
    3 + 1 = 4
  4. Ist Divisor ungleich Dividend?
    4 ist ungleich 6, also zu Schritt 3 gehen
  1. Dividend durch Divisor teilen:
    6/4 = 1, Rest = 2
  2. Rest ungleich Null, keine Ausgabe eines Teilers
  3. Divisor inkrementieren:
    4 + 1 = 5
  4. Ist Divisor ungleich Dividend?
    5 ist ungleich 6, also zu Schritt 3 gehen
  1. Dividend durch Divisor teilen
    6 : 5 = 1, Rest = 1
  2. Rest ungleich Null, keine Ausgabe eines Teilers
  3. Divisor inkrementieren:
    5 + 1 = 6
  4. Ist Divisor ungleich Dividend?
    Divisor = Dividend, Programm beendet.
  1. Dividend eingeben und speichern
  2. Divisor auf 2 setzen
  3. Rest der Division Dividend durch Divisor berechnen
  4. Falls der Rest Null ist, Divisor als Teiler ausgeben
  5. Divisor um 1 vergrößern (das nennt man auch inkrementieren)
  6. Prüfen ob der Divisor gleich dem Dividenden ist,
    falls ja, Programm beenden
    falls nein zu Schritt 3 zurückgehen.

Unser Programm hat für den Dividenden 6 die Teiler 2 und 3 ausgegeben! Für dieses Beispiel funktioniert es also! Müssen wir den Algorithmus jetzt für alle Zahlen ausprobieren? Nein! Aber es macht durchaus Sinn, sich neben "normalen" Eingabewerten Extremfälle zu überlegen, bei denen es zu Schwierigkeiten kommen kann.

Überlege dir, was passiert, wenn wir als Dividenden 999.999.999 eingeben! Kann im Programmablauf irgendein Problem auftreten? Außer dass unser Rechner viel länger rechnet als bei 6 eigentlich nicht.

Was passiert, wenn wir 1 als Dividenden eingeben? Überlege einmal selbst bevor du weiterliest! Gehe den Algorithmus auf die selbe Weise schrittweise durch, wie wir das oben gemacht haben!

Wir würden erwarten, dass der Rechner bei einer so kleinen Eingabe sehr schnell fertig ist! Aber das Gegenteil ist der Fall: Er rechnet, und rechnet und rechnet und rechnet und rechnet und rechnet und rechnet und rechnet und rechnet und rechnet und rechnet und rechnet und rechnet ....

Warum?

Unser Programm wird nur dann beendet, wenn der Divisor nach dem Erhöhen (Inkrementieren) gleich dem Dividenden ist. Der kleinste Divisor, den wir verwenden, ist 2! Damit ist er schon größer als der eingegebene Dividend. Nachdem diese Festlegung Divisor = 2 in Schritt Nummer 2 getroffen worden ist, wird der Divisor in unserem Programm immer nur noch größer (Schritt 5); er kann also niemals mehr den gleichen Wert annehmen wie der Dividend und deshalb endet das Programm nie!

Dürfen wir denn 2 als Dividend eingeben? Probiere den Algorithmus aus, um zu verstehen, warum auch das zu einem niemals endenden Programm führt: Wir erhöhen den Divisor, bevor wir ihn mit dem Dividenden vergleichen! Beim ersten Vergleich ist der Divisor in diesem Fall also auch schon größer als der Dividend!

3 ist die kleinste Zahl, die wir als Dividend eingeben dürfen!

Lass uns noch mehr komische Fälle untersuchen!

Was passiert mit unserem Algorithmus, wenn wir 2,8 als Dividenden eingeben? Als erstes ist natürlich klar, dass der Anwender, der eine Kommazahl auf ganzzahlige Teiler untersuchen lassen will, nicht viel Ahnung von Mathematik hat, aber man muss beim Programmieren wirklich jede Eventualität einkalkulieren; es könnte sich ja auch um einen Tippfehler handeln, und wenn unser Programm damit nicht umgehen kann, wäre das ja ärgerlich.

Was passiert ist wieder folgendes: Der Divisor ist in unserem Programm immer eine ganze Zahl weil wir bei 2 beginnen und nie etwas anderes tun als 1 dazuzuzählen. Infolgedessen kann der Divisor nie gleich dem Dividenden sein, der ja keine ganze Zahl ist und im Programm auch nie verändert wird. Unser Programm wird wieder endlos laufen!

Was können wir dagegen tun? Ganz einfach: Wir fügen nach der Eingabe des Dividenden eine Prüfabfrage ein:

1.Dividend eingeben und speichern
1a.Wenn der Dividend kleiner ist als 3 oder wenn es sich nicht um eine ganze Zahl handelt, Fehlermeldung ausgeben und zurück zu Schritt 1.
2.Divisor auf 2 setzen
3....

Mit dieser Ergänzung funktioniert unser Programm erst mal zufriedenstellend!

Bist du enttäuscht, dass wir den Computer unser Problem durch Ausprobieren lösen lassen? Denke an Kapitel 3! Die Aufgaben, die ein Computer lösen können sollte, mussten ganz einfach sein. Dafür kann er davon dann ganz viele in ganz kurzer Zeit lösen. Das wird dir beim Programmieren immer wieder begegenen, dass du die eigentliche Aufgabe in ganz viele ganz kleine und einfache Teilaufgaben zerlegen musst.



9.1 Unsere erste Programmieraufgabe Inhaltsverzeichnis
Index
9.1.2 Verbessern des Algorithmus