Logo des digitalen Schulbuchs inf-schule.de. Schriftzug in Zustandsübergangsdiagramm eines endlichen Automaten.

Beispiel - Schätzungen zur Weizenkornlegende

Die Weizenkornlegende

Schachbrett

"Der indische Herrscher Shihram tyrannisierte seine Untertanen und stürzte sein Land in Not und Elend. Um die Aufmerksamkeit des Königs, ohne seinen Zorn zu entfachen, auf seine Fehler zu lenken, schuf der weise Brahmane Sissa, Dahers Sohn, ein Spiel, in dem die wichtigste Figur, der König, ohne Hilfe anderer Figuren und Bauern nichts ausrichten kann. Der Unterricht im Schachspiel machte auf Shihram einen starken Eindruck. Er wurde milder und ließ das Schachspiel verbreiten, damit alle davon Kenntnis nähmen. Um sich für die anschauliche Lehre von Lebensweisheit und zugleich Unterhaltung zu bedanken, gewährte er dem Brahmanen einen freien Wunsch. Dieser wünschte sich Weizenkörner: Auf das erste Feld eines Schachbretts wollte er ein Korn, auf das zweite Feld die doppelte Menge, also zwei, auf das dritte wiederum doppelt so viele, also vier und so weiter. Der König lachte und war gleichzeitig erbost ob der vermeintlichen Bescheidenheit des Brahmanen." (Quelle: Wikipedia-Weizenkornlegende)

Zielsetzung: Programm zur Schätzung der Weizenkörner

Ziel ist es, ein Programm zu erstellen, mit dem Schätzungen zum Gewicht der Weizenkörner auf den jeweiligen Feldern ausgewertet werden. Das Programm soll folgendes Verhalten zeigen:

Eingabe:

Der Benutzer gibt die Feldnummer (zwischen 1 und 64) ein sowie das von ihm geschätzte Gewicht der Weizenkörner auf diesem Feld.

Ausgabe:

Das Programm gibt das tatsächliche Gewicht der Körner auf dem betreffenden Feld aus. Zusätzlich informiert es den Benutzer, wie viel er zu viel bzw. zu wenig geschätzt hat.

Beispiel 1:

>>> 
Nummer des Feldes: 10
Geschaetztes Gewicht der Weizenkoerner auf diesem Feld (in kg) : 0.05
Das tatsaechliche Gewicht betraegt (in kg): 0.0256
Du hast so viel zu viel geschaetzt (in kg): 0.0244

Beispiel 2:

>>> 
Nummer des Feldes: 10
Geschaetztes Gewicht der Weizenkoerner auf diesem Feld (in kg) : 0.01
Das tatsaechliche Gewicht betraegt (in kg): 0.0256
Du hast so viel zu wenig geschaetzt (in kg): 0.0156

Aufgabe 1

(a) Führe die Berechnungen zu den beiden gezeigten Beispielen selbst durch.

(b) Die Berechnungen unterscheiden sich in einem Detail. Worin besteht dieser Unterschied?

Ablaufmodellierung

Bevor das Programm geschrieben wird, sollte man erst einmal Vorüberlegungen anstellen.

Der Ablauf der Eingaben, Berechnungen und Ausgaben lässt sich sehr gut mit einem Flussdiagramm verdeutlichen.

Flussdiagramm

Mit einem Struktogramm lässt sich die Ablaufstruktur weiter präzisieren.

Struktogramm

Aufgabe 2

Erkläre anhand der Diagramme, dass zur Ablaufmodellierung im vorliegenden Beispiel eine Fallunterscheidung erforderlich ist.

Implementierung des Verfahrens

Das beschriebene Verfahren wird jetzt in ein Python-Programm übersetzt.

# Eingabe
nummer  = int(input('Nummer des Feldes: '))
gewichtSchaetzung  = float(input('Geschaetztes Gewicht der Weizenkoerner auf diesem Feld (in kg) : '))
# Verarbeitung
anzahlKoerner = 2 ** (nummer-1)
gewichtKoerner = anzahlKoerner * 0.00005
if gewichtSchaetzung >= gewichtKoerner:
    zuVielGeschaetzt = True
    differenzGewichte = gewichtSchaetzung - gewichtKoerner
else:
    zuVielGeschaetzt = False
    differenzGewichte = gewichtKoerner - gewichtSchaetzung
# Ausgabe
print('Das tatsaechliche Gewicht betraegt (in kg):', gewichtKoerner)
# ...

Aufgabe 3

(a) Teste zunächst das gezeigte Programm. Welcher Teil des Struktogramms wird hier implementiert?

(b) Ergänze den noch fehlenden Teil. Achte ganz genau auf Doppelpunkte und die Einrückungen (um 4 Einheiten).

Aufgabe 4

Das folgende Programm zeigt eine Variante zum oben gezeigten Verfahren.

# Eingabe
nummer  = int(input('Nummer des Feldes: '))
gewichtSchaetzung  = float(input('Geschaetztes Gewicht der Weizenkoerner auf diesem Feld (in kg) : '))
# Verarbeitung
anzahlKoerner = 2 ** (nummer-1)
gewichtKoerner = anzahlKoerner * 0.00005
differenzGewichte = gewichtSchaetzung - gewichtKoerner
zuVielGeschaetzt = True
if differenzGewichte < 0:
    zuVielGeschaetzt = False
    differenzGewichte = -differenzGewichte
# Ausgabe
print('Das tatsaechliche Gewicht betraegt (in kg):', gewichtKoerner)
# ...

(a) Teste das Programm. Leistet es dasselbe wie das Programm oben?

(b) Kannst du die Ablauflogik dieses Programms mit einem Flussdiagramm beschreiben?

Aufgabe 5

Das folgende Struktogramm zeigt eine weitere Variante zum oben gezeigten Verfahren.

Struktogramm

(a) Worin besteht der Unterschied zum oben gezeigten Vefahren?

(b) Entwickle ein Programm passend zu diesem Struktogramm.

Aufgabe 6

Entwickle noch eine Variante zum oben gezeigten Vefahren.

Eingabe:

Der Benutzer gibt die Feldnummer (zwischen 1 und 64) ein sowie das von ihm geschätzte Gewicht der Weizenkörner auf diesem Feld.

Ausgabe:

Das Programm gibt das tatsächliche Gewicht der Körner auf dem betreffenden Feld aus. Zusätzlich informiert es den Benutzer, wie gut er geschätzt hat. Wenn die Schätzung um weniger als 10% (bzw. 25% / bzw. 50%) vom tatsächlichen Gewicht abweicht, dann ist die Schätzung gut (zufriedenstellend / schlecht). Ansonsten ist sie miserabel.

Beispiel:

>>>
Nummer des Feldes: 15
Geschaetztes Gewicht der Weizenkoerner auf diesem Feld (in kg) : 1
Das tatsaechliche Gewicht betraegt (in kg): 0.8192
Die prozentuale Abweichung betraegt (in %): 22.0703125
Die Schaetzung ist zufriedenstellend. 
X

Fehler melden

X

Suche