【问题标题】:Converting Julian Date to Gregorian Date - C programming将儒略日期转换为公历日期 - C 编程
【发布时间】:2018-02-06 14:38:14
【问题描述】:

我被困在 C 的分配上,我必须转换用户输入的儒略日期并将其转换为公历。当我运行它并为 Julian 日期输入一个数字时,它打印出来的月、日和年都是 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;
}

【问题讨论】:

  • 编译器应该在为函数中的指针分配数字而尖叫。注意你的编译器;它比你更了解 C。没错!
  • 代码有这么多问题。从编译器获取帮助以消除一些警告/错误 - 然后返回代码。
  • 写一点代码。测试一下。调试它。重复。
  • @Jones:请不要在事后编辑代码。它会使已发布的任何答案无效,并使未来的访问者感到困惑。
  • @Jones:您更改了指针分配,这是代码的主要问题之一。这使得 cmets 和对后来阅读问题的人的回答变得毫无意义。

标签: c


【解决方案1】:

当您分配日、月或年时,您应该按以下方式进行:

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

           month[0] = E - 1;

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

该程序实际上没有做任何事情,因为输出值基本上被设置为乱码。

【讨论】:

  • 嗯,这是一种有趣的方式。有用。使用*day*month 会更常见。
【解决方案2】:

除了将整数分配给指针(例如month = newVal;)之外,您的某些条件测试始终为真。

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

这会将14 || 15(即1)的值分配给E,然后测试E是否非零,当然,它总是如此。

这个测试(和另一个类似的测试)应该是:

if (E == 14 || E == 15) {
    *month = newVal;
    newVal = E - 13;
}

请注意,newVal 整数分配给month 指向的整数(通过使用*month),而不是实际的指针变量month。这种补救措施也应该应用于dayyear 指针的赋值。

【讨论】:

    猜你喜欢
    • 2013-07-21
    • 1970-01-01
    • 2012-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多