Dodawanie kątów i normalizacja do

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

Dodaj komentarz

Twój adres email nie będzie publikowany.