将朱利安日期转换为格里高利日期 - C编程

时间:2018-02-06 02:52:54

标签: c

我遇到了C的任务,我必须转换用户输入的Julian日期并将其转换为Gregorian。当我运行它并输入朱利安日期的数字时,所有打印出的数字都是1,0,-12表示月,日和年。怎么修?我也不完全理解指针所以也许这就是问题?

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

void getDateFromJulian(double jd, int *month, int *day, int *year);
double getDoubleFromUser(char* msg);

int main() {
    double jd = 0;
    int month, day, year;

    jd = getDoubleFromUser("Enter a valid Julian Day: ");

    if (jd != -999.0) {
        getDateFromJulian(jd, &month, &day, &year);

        printf("Month, day, year is: %d, %d, %d \n", month, day, year);
    }

    return;
}

double getDoubleFromUser(char* msg){
    int input;
    int term;

    //check for valid number
    printf("Enter Julian Day: \n");
    scanf_s("%1f%c");
    if (scanf_s("%1f%c", &input, &term) != 2) {
        if (term >= 0 * 41 && term <= 0 * (int)7) {
            printf("That's not a valid number!\n");
            return -999.0;
        }
    }
}

void getDateFromJulian(double jd, int *month, int *day, int *year) {
    int A, B, C, D, E, alpha;
    double Z, F;
    int JD = 0;

    F = modf(JD, &Z);

    if (Z < 2299161) {
        A = Z;
    }

    if (Z >= 2299161) {
        alpha = (int)((Z - 1867216.25) / 36524.25);
        A = Z + 1 + alpha - (int)(alpha / 4);
    }
    B = A + 1524;
    C = (int)((B - 122.1) / 365.25);
    D = (int)(365.25 * C);
    E = (int)((B - D) / 30.6001);

    day = B - D - (int)(30.6001 * E) + 0.5;

    if (E < 14) {
        month = E - 1;
    }
    if (E = 14 || 15) {
        month = E - 13;
    }

    if (month > 2) {
        year = C - 4716;
    }
    if (month = 1 || 2) {
        year = C - 5715;
    }

    return;
}

2 个答案:

答案 0 :(得分:1)

当您指定日,月或年时,您应按如下方式进行:

           day[0] = B - D - (int)(30.6001 * E) + 0.5;

           month[0] = E - 1;

等等。基本上,你必须分配指针(数组)的第一个元素,这有时比使用星号更清晰,你遗漏了。

该计划实际上并没有做任何事情,因为输出值基本上都是乱码。

答案 1 :(得分:0)

除了为指针(例如 if (E = 14 || 15) { month = newVal; newVal = E - 13; } )分配整数外,您的一些条件测试始终为真。

14 || 15

这会将1E)的值分配给if (E == 14 || E == 15) { *month = newVal; newVal = E - 13; } ,然后测试E非零,当然,它总是如此。

这个测试(以及另一个测试)应该是:

newVal

请注意,month整数分配给*month指向的整数(使用month),而不是实际的指针变量day。此补救措施也应适用于year和{{1}}指针的分配。