/* Loesung der Aufgabe 1-39 (1-37)
   Funktion: Schnittpunkt von zwei Geraden berechnen
*/

#include <stdio.h>
#include <math.h>

/* Um den Schnittpunkt zu berechnen benoetigt die Funktion die Kennwerte
   der beiden Geraden, es sind dies jeweils die Steigung k und der Achsen-
   abschnitt d. Diese Werte sind Eingangsparameter, d.h. wir uebergeben sie
   der Funktion mit dem by value Uebergabemechanismus.
   Die Funktion soll zwei Zahlen berechnen x und y. Dies sind Ausgabeparameter,
   wir muessen den by ref Mechanismus verwenden, also mit Zeigern arbeiten.
   Den Fehlercode liefert die Funktion als Resultat:
   0 wenn der Schnittpunkt berechnet werden kann
   1 wenn die Geraden parallel sind
   2 wenn die Geraden ident sind (uebereinander liegen)
*/

#define eps 1E-3  /* Genauigkeit */

int schnittpunkt (
   double k1, double d1, double k2, double d2, /* y = k*x + d  */
   double *px, double *py)                     /* Schnittpunkt */
{
  double x;

  if (fabs (k1 - k2) < eps && fabs (d1 - d2) < eps)
    return 2;  /* die Geraden sind ident */
  if (fabs (k1 - k2) < eps)
    return 1;  /* die Geraden sind (fast) parallel */

  x = (d2 - d1) / (k1 - k2);

  /* fuer die Berechnung des Schnittpunktes verwenden wir die Geraden-
     gleichung der flacheren Gerade */

  if (fabs(k1) < fabs(k2))
    *py = k1 * x + d1;
  else
    *py = k2 * x + d2;

  *px = x;
  return 0;
}


int main(void)
{
  double k1, d1;   /* Gerade 1 */
  double k2, d2;   /* Gerade 2 */
  double x, y;     /* Schnittpunkt */
  int r;           /* fuer das Resultat der Funktion (Fehlercode) */
  char fertig[10];

  do {
    printf("Gerade 1: k  d  ? ");
    scanf("%lf %lf", &k1, &d1);
    printf("Gerade 2: k  d  ? ");
    scanf("%lf %lf", &k2, &d2);
    r = schnittpunkt(k1, d1, k2, d2, &x, &y);
    /*               <- by value ->, by ref    */
    if (r == 1)
      printf("Die beiden Geraden sind paralell und schneiden sich nicht!\n");
    else if (r == 2)
      printf ("Die beiden Geraden sind identisch!\n");
    else
      printf("Der Schnittpunkt ist bei %8.2f, %8.2f\n", x, y);

    printf("weitere Rechnung ( j[a] | n[ein] ) ? ");
    scanf("%s", fertig);
  } while (fertig[0] == 'j' || fertig[0] == 'J');

  return 0;
}