Lösung der Aufgabe 1-35:

Winkel eines Punktes (der Winkel der Polarkoordinaten) in einem kartesischen Koordinatensystem mit den 4 Quadranten 1, 2, 3, 4:

Winkel im 3. und 4. Quadranten geben wir im Bereich 0 bis - 180° an (statt im Bereich 180° bis 360°).

/* Lösung der Aufgabe 1-35 (4 Aufl.)
   Eine Funktion soll den Winkel berechnen, den ein Punkt mit der x-Achse einschliesst.
   Das ist ewtas unglÜcklich formuliert. Gemeint ist der Winkel, den eine Gerade vom Ursprung
   durch den Punkt mit der x-Achse einschliesst. 
   Die Bibliothek stellt dafÜr die Funktion atan2 zur VerfÜgung, wir programmieren eine Variante
   dieser Funktion.
*/

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

// winkel berechnet den Winkel zum Punkt (x,y)
// einheit = 1 -> Resultat in Radiant
// einheit = 2 -> Resultat in Grad

double winkel (double x, double y, int einheit)
{
  const double pi = 4.0*atan(1.0);
  double umrechnungsfaktor = 1.0;
  int q;
  double r;

  if (einheit == 2) umrechnungsfaktor = 180.0/pi;

  // Sonderfälle abfangen
  if ( x == 0.0 && y == 0.0 ) return 0.0;

  if ( x == 0.0 ) {
    if ( y > 0.0 ) 
      r = pi/2.0;
    else
      r = -pi/2.0;
    return umrechnungsfaktor*r;
  }

  // Normalfall ( x != 0.0, y/x kann berechnet werden)
  // Quadrant bestimmen
  if      ( x > 0.0 && y >= 0.0 ) q = 1;
  else if ( x < 0.0 && y >= 0.0 ) q = 2;
  else if ( x < 0.0 && y <  0.0 ) q = 3;
  else if ( x > 0.0 && y <  0.0 ) q = 4;  // zwecks Symetrie
  else q = 0;      // wird nicht erreicht

  printf("q = %1i    ", q);
  r = atan(fabs(y/x));
  // switch Anweisung (siehe Kapitel 4)
  switch (q) {
    case 2: 
      r = pi - r;
      break;
    case 3:
      r = -pi + r;
      break;
    case 4:
      r = -r;
      break;
    default:
      ;
  }

  return umrechnungsfaktor*r;
}

// Test der Funktion winkel

int main(void)
{
  double x, y;
  double phirad, phigrad;

  printf("Winkel eines Punktes zur x-Achse (Beenden mit x = 0 und y = 0\n");
  do {
    printf("\nx = ");
    scanf("%lf", &x);
    printf("y = ");
    scanf("%lf", &y);
    phirad = winkel(x, y, 1);
    phigrad = winkel(x, y, 2);
    printf("phi = %8.3f rad = %8.3f Grad\n", phirad, phigrad);
  } while (x != 0.0 || y != 0.0);

  return 0;
}