Program przyjmuje wartości kątów w tradycyjnym astronomicznym formacie. Konwertuje wartości na radiany, dodaje, normalizuje przedział <-pi, pi> i wyświetla wynik znów w tradycyjnym formacie.
Funkcja printf zaokrągla wynik dlatego konieczny był warunek sprawdzania i dodawania w wyniku do sekund łuku 59.999999 (sześć miejsc po przecinku, bo tyle jest domyślnie wyświetlane) , aby uniknąć wyświetlania 60". Program na zamiennych podwójnej precyzji, więc inne zaokrąglenia wynikające z obliczeń nie są rażące.
#include <stdio.h>
#include <math.h>
int main(void)
{
double rad, sek1, sek2, stopnie, minuty, sekundy;
double st1, st2, m1=60, m2;
char z1, z2;
while (m1 >= 60 || m2 >= 60 || sek1 >= 60 || sek2 >= 60 || (z1 != '+' && z1 != '-') ||
(z2 != '+' && z2 != '-'))
{
printf("nWprowadź wartości kątów ZE ZNAKIEM oddzielone spacjami i naciśnij enter: n");
printf("nPierwszy kąt: ");
scanf(" %c %lf %lf %lf", &z1, &st1, &m1, &sek1);
printf("Drugi kąt: ");
scanf(" %c %lf %lf %lf", &z2, &st2, &m2, &sek2);
}
if (z1 == '-')
{
st1=st1*(-1);
m1=m1*(-1);
sek1=sek1*(-1);
}
if (z2 == '-')
{
st2=st2*(-1);
m2=m2*(-1);
sek2=sek2*(-1);
}
rad = (( st1 + (m1 / 60.0) + (sek1 / 3600.0) + st2 + (m2 / 60.0) + (sek2 / 3600.0) )
* M_PI / 180);
while (rad > M_PI) rad -= 2*M_PI;
while (rad <= -M_PI) rad += 2*M_PI;
stopnie = (rad * 180.0 / M_PI);
if (stopnie < 0)
{
minuty = ( stopnie - ceil(stopnie) ) * 60;
sekundy = ( minuty - ceil(minuty) ) * 60;
if (sekundy <= -59.999999)
{
minuty--;
sekundy+=59.9999999;
}
if (minuty < -59)
{
stopnie--;
minuty+=60;
}
minuty=minuty*(-1);
sekundy=sekundy*(-1);
printf(" = %.0lf260 %.0lf' %lf"nn", ceil(stopnie), floor(minuty), sekundy);
}
else
{
minuty = ( stopnie - floor(stopnie) ) * 60;
sekundy = ( minuty - floor(minuty) ) * 60;
if (sekundy >= 59.999999)
{
minuty++;
sekundy-=59.9999999;
}
if (minuty > 59)
{
stopnie++;
minuty-=60;
}
printf("= %.0lf260 %2.0lf' %lf"nn", floor(stopnie), floor(minuty), sekundy);
}
return 0;
}
