/*
  Autor  : Lampacher Martin
  Datum  : 13/10/05
  Arbeit : Erstelle ein Programm welches mit Hilfe der Intervall-
	   halbierungsmethode den Zinssatz berechnet, von welchem
	   das Kapital (Zielkapital), die Laufzeit und die
	   jaehrliche Einzahlung gegeben sind
*/
#include <stdio.h>
#include <conio.h>
#include <math.h>

/* Toleranz bei der Nullstellenberechnung - Epsilon */
#define EPS 0.001

/*
  liest mit das Zielkapital, die jaehrliche Einzahlung
  und die Laufzeit ein.
*/
void einlesen (float *pkapital, float *pannuitaet, int *pjahre) {
  printf ("Kapital   : ");
  scanf  ("%f",pkapital);
  printf ("Annuitaet : ");
  scanf  ("%f",pannuitaet);
  printf ("Laufzeit  : ");
  scanf  ("%d",pjahre);
}

/*
  Berechnet den Funktionswert der umgeformten Rentenansparformel
  an der stelle 'wert'
*/
float f (float wert, float k, float a, int j) {
  float temp;
  temp = a*(pow(wert,j)) - k*(wert) - a + k;
  return temp;
}

/*
float myabs (float wert) {
  if (wert < 0) {
    return (wert * (-1));
  } else {
    return wert;
  }
} */

/*
  Rekursive Funktion welche immer wieder die Intervalle halbiert,
  bis die Toleranz von EPS erreicht wird (die Genauigkeit der
  Nullstelle)
*/
float halbierung (float unten, float oben, float k, float a, int j) {
  /* Nullstelle gefunden mit der Toleranz EPS */
  if ((abs(f((oben + unten) / 2,k,a,j))) <= EPS) {
    return (unten + oben) / 2;
  } else {
    /*
    if ((f((unten + oben) / 2,k,a,j) * f(unten,k,a,j)) > 0) {
      return halbierung ((unten + oben) / 2,oben,k,a,j);
    } else {
      return halbierung (unten,(unten + oben),k,a,j);
    } */

    if (f((unten + oben) / 2,k,a,j) < 0) {
      return halbierung ((unten + oben) / 2,oben,k,a,j);
    } else {
	if (f((unten + oben) / 2,k,a,j) > 0) {
	  return halbierung (unten,(unten + oben) / 2,k,a,j);
	}
    }

  }
}

main () {
  float kapital,annuitaet,nullstelle;
  int jahre;

  clrscr();
  printf ("Berechnung des Zinssatzes\n\n");
  einlesen (&kapital,&annuitaet,&jahre);
  if ((f(1+EPS,kapital,annuitaet,jahre) <= 0) &&
      (f(2,kapital,annuitaet,jahre) >= 0)) {
    nullstelle = halbierung(1+EPS,2,kapital,annuitaet,jahre);
    printf ("\nDer Zinssatz betraegt %8.3f %%",(nullstelle-1)*100);
  } else {
    printf ("\nNicht moeglich!");
  }
  getch();
}
