// degrees.c
//
//  converts Degrees-and-Decimal-Minutes to Decimal-Degrees
//
//  ==>  Program should accept any input format
//         D.M.S or D.M.m or D.d
//         and output the other two formats
//
//  ==>  Decimal Degrees = Degrees + minutes/60 + secondIns/3600
//
//  ==>  gets() a line into lineIn
//  ==>  sscanf() the line into three doubles
//        firstIn, secondIn, thirdIn
//  ==>  sscanf() returns the number of successful conversions
//        1 format D.d
//        2 format D M.m
//        3 format D M S
//  ==>  calculate the empty formats
//  ==>  printf() all three formats
//
//

#include <stdio.h>
#include <math.h>



int main()
{

  char lineIn[80];                  // user input buffer
  int fields;                       // count of numbers entered
  double firstIn = 0.0;               // parsed input numbers
  double secondIn = 0.0;
  double thirdIn = 0.0;
  double decimalDegrees = 0.0;      // format: Decimal Degrees  121.7567
  double decimalDegreesOnly = 0.0;  // format: fraction portion    .7567
  double degrees = 0.0;             // format: Degrees          36
  double decimalMinutes = 0.0;      // format: Decimal Minutes  54.6789
  double decimalMinutesOut = 0.0;   // for printf()
  double minutes = 0.0;             // format: Minutes          45
  double seconds = 0.0;             // format: Seconds          15
  double degreesOnly = 0.0;         // truncated decimalDegrees, integer portion only
  double minutesOnly = 0.0;         // truncated decimalMinutes, integer portion only

  printf("\n\nThis program converts coordinate formats between:\n");
  printf("   -degrees, minutes and seconds \n");
  printf("   -degrees and decimal minutes \n");
  printf("   -decimal degrees  \n");
  do
  {
    printf("\nEnter coordinate, any format ( 0 to quit )\n");
    printf("(D M S / D M.m / D.d): ");
    gets(lineIn);
    printf("\nYou entered: %s ", lineIn);
    fields = sscanf(lineIn, "%lf %lf %lf", &firstIn, &secondIn, &thirdIn);
    //  printf("You entered %d: fields\n", fields);

    //  printf("\nfirstIn: %g\n", firstIn);
    //  printf("\nsecondIn: %g\n", secondIn);
    //  printf("\nthirdIn: %g\n", thirdIn);

    switch(fields)
    {
    case 1:
      {
      printf("Decimal Degrees\n");
      // calc deg dec min
      decimalDegrees = firstIn;
      degrees = firstIn;
      degreesOnly = trunc(degrees);
      decimalMinutes = (degrees - degreesOnly) * 60;
      decimalMinutesOut = decimalMinutes;
      //printf("\n\n in case 1: decimalMinutes = %g \n\n", decimalMinutes);

      // calc deg min sec
      degrees = firstIn;                              // 123.4567
      degreesOnly = trunc(degrees);                 // 123
      decimalMinutes = ( degrees - degreesOnly );   //    .4567
      minutes = (decimalMinutes * 60);              //  27.402
      minutesOnly = trunc(minutes);                 //  27
      seconds = ( minutes - minutesOnly) * 60;      //  24.12
      seconds = lround(seconds);                    //  24

      break;
      }
    case 2:
      {
      printf("Degrees and Decimal Minutes\n");
      // calc dec deg                               // 121 45.67
      degrees = firstIn;                              // 121
      decimalMinutes = secondIn;                      //      45.67
      decimalMinutesOut = decimalMinutes;
      decimalDegreesOnly = decimalMinutes / 60;     //        .7612
      decimalDegrees = degrees + decimalDegreesOnly;// 121.7612

      // calc deg min sec
      degreesOnly = trunc(degrees);                 // 123
      decimalMinutes = secondIn;                        //  45.67

      //    printf("\n\n**in case 2: decimalMinutes = %g **\n", decimalMinutes);

      //    minutes = (decimalMinutes / 60);              //  27.402

      //    printf("\n\n**in case 2: minutes = %g **\n", minutes);

      minutesOnly = trunc(decimalMinutes);                 //  27
      seconds = ( decimalMinutes - minutesOnly) * 60;      //  24.12
      seconds = lround(seconds);

      break;
      }
    case 3:
      {
      printf("Degrees Minutes Seconds\n");
      // calc dec deg
      degrees = firstIn;
      minutes = secondIn;
      seconds = thirdIn;
      decimalDegrees = degrees + minutes/60 + seconds/3600;

      // calc deg dec min
      degreesOnly = firstIn;
      decimalMinutes = minutes + seconds/60;
      decimalMinutesOut = decimalMinutes;

      minutesOnly = secondIn;
      break;
      }
    }

    // Display all formats
    //
    printf("\nDecimal Degrees:             %g\n", decimalDegrees);

    printf("Degrees and Decimal Minutes: %g %g\n", degreesOnly, decimalMinutesOut);

    printf("Degrees Minutes and Seconds: %g %g %g\n", degreesOnly, minutesOnly, seconds);
  } while (firstIn != 0);
  printf("\n\nBye...\n\n");
  return(0);
}
