Dr. Johannes Mayer Abteilung Angewandte Informationsverarbeitung 18. Oktober 2005
Axel Blumenstock Blatt 1
Christian Ehrhardt


Uni Logo



Allgemeine Informatik III / Systemnahe Software I (WS 2005/2006)


Abgabetermin: 25. Oktober 2005

Über die Geheimnisse der Kapitalbildung (10 Punkte)

Seit einigen Jahren ist es ja nun hip, sich über seine Altersvorsorge Gedanken zu machen. Nehmen wir einmal an, Ihre Bank hat Ihnen folgendes Angebot unterbreitet:

Zahlen Sie jährlich einen Betrag von 1000 Euro ein.
Nach Ablauf von 40 Jahren erhalten Sie 200$\thinspace$000 Euro ausbezahlt.
Natürlich interessiert Sie, ob das ein gutes Angebot ist. Da Sie es gewohnt sind, in Zinssätzen zu denken, wollen Sie nun den Zinssatz ermitteln, den ein Sparbuch bieten müsste, um bei einer jährlichen Einzahlung von 1000 Euro nach 40 Jahren ebenfalls 200$\thinspace$000 Euro wert zu sein.

  1. (4 Punkte) Schreiben Sie zunächst eine Funktion
      double kapital(double rate, double zinssatz, int laufzeit)
    
    die für das am Ende angesammelte Kapital ermittelt.

    Definieren Sie sich dann in der main()-Funktion Ihres Programms Konstanten für die Sparrate und Laufzeit (Sie müssen diese Parameter nicht von der Standardeingabe einlesen) und geben Sie unter Verwendung obiger Funktion die Auszahlung für ganze Prozente von null bis zehn aus. Die Ausgabe könnte etwa folgendermaßen aussehen:

      Ein Zinssatz von  0% ergibt   40000.00 Euro
      Ein Zinssatz von  1% ergibt   49375.24 Euro
      Ein Zinssatz von  2% ergibt   61610.02 Euro
      Ein Zinssatz von  3% ergibt   77663.30 Euro
      (... usw ...)
    

  2. (4 Punkte) Implementieren Sie nun in einem zweiten Programm das Bisektionsverfahren1, um den genauen Zinssatz für eine Auszahlung von 200$\thinspace$000 Euro bei einer Jahresrate von 1000 Euro zu ermitteln. Sie können davon ausgehen, dass der Zinssatz in einem Intervall zwischen null und 100 Prozent liegt. Wählen Sie dann probehalber als Zinssatz die Intervallmitte $m$, errechnen dafür (wieder unter Zuhilfenahme der Funktion kapital()) den Endbetrag nach 40 Jahren und ersetzen dann die entweder die obere oder die untere Grenze durch $m$, so dass der gesuchte Zinssatz stets innerhalb des Intervalls bleibt. Brechen Sie ab, wenn der Fehler vernachlässigbar klein ist ($10^{-6}$) und geben Sie das Ergebnis aus.

  3. (2 Punkte) Auch wenn Sie all das (natürlich ;-)) fehlerfrei runterprogrammiert haben, möchten Sie sich den Bisektionsvorgang noch ein wenig genauer anschauen und dazu ein paar Zwischenergebnisse - etwa die sich in jedem Schritt ergebende Auszahlung - ausgeben. Natürlich könnten Sie einfach direkt ein paar weitere printf-Anweisungen einfügen. Eleganter aber ist, für Debug-Ausgaben ein Makro zu verwenden, um sie an zentraler Stelle ein- und abschalten zu können.

    In den Beispielprogrammen sehen Sie, wie die #define-Direktive verwendet werden kann. Legen Sie sich in ähnlicher Weise ein Makro

      DEBUG_PRINT_DOUBLE(text, variable)
    
    an, das mit Hilfe von printf den gegebenen Text und den Wert der double-Variable ausgibt. Haben Sie beispielsweise eine Variable ,,auszahlung``, soll die Programmzeile
      DEBUG_PRINT_DOUBLE("auszahlung", auszahlung);
    
    einen Text wie
      auszahlung == 77663.30
    
    schreiben.

  4. (2 Zusatzpunkte, die für die 100 % nicht erforderlich sind) Versuchen Sie, dieselbe Ausgabe von Variablenname und Variablenwert durch eine Programmzeile wie
      DEBUG_PRINT_DOUBLE(auszahlung);
    
    zu erzeugen.

Viel Erfolg!



Fußnoten

... Bisektionsverfahren1
auch als Intervallhalbierung bekannt


Axel Blumenstock 2005-10-18