我遇到了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;
}
答案 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
这会将1
(E
)的值分配给if (E == 14 || E == 15) {
*month = newVal;
newVal = E - 13;
}
,然后测试E非零,当然,它总是如此。
这个测试(以及另一个测试)应该是:
newVal
请注意,month
整数分配给*month
指向的整数(使用month
),而不是实际的指针变量day
。此补救措施也应适用于year
和{{1}}指针的分配。