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; }