两个日期之间的C程序天数--输出值是否稍高?
我大学课程的这个C程序应该可以找到两个日期之间的天数。它在大多数情况下都有效,但当month1和month2不同时,输出通常会高出几天。此外,具有31天的月份似乎无法识别为31天,当输入“31”作为日期时,会出现“无效的月和日组合”错误消息。我一点也不确定为什么会出现这两个问题。提前感谢你们的帮助两个日期之间的C程序天数--输出值是否稍高?,c,C,我大学课程的这个C程序应该可以找到两个日期之间的天数。它在大多数情况下都有效,但当month1和month2不同时,输出通常会高出几天。此外,具有31天的月份似乎无法识别为31天,当输入“31”作为日期时,会出现“无效的月和日组合”错误消息。我一点也不确定为什么会出现这两个问题。提前感谢你们的帮助 // Calculates the number of calendar days between any two dates in history (beginning with 1/1/1).
// Calculates the number of calendar days between any two dates in history (beginning with 1/1/1).
#include <stdio.h>
#include <stdlib.h>
void date(int *month1, int *day1, int *year1, int *month2, int *day2, int *year2);
void leap(int year1, int year2, int *leap1, int *leap2);
int main(void)
{
int month1, day1, year1, month2, day2, year2, leap1, leap2;
date(&month1, &day1, &year1, &month2, &day2, &year2);
leap(year1, year2, &leap1, &leap2);
if(year1 == year2)
{
int i, total = 0;
if(month1 == month2) // Total days if month1 == month2
{
total = day2 - day1;
printf("There are %d days between the two dates.", total);
}
else
{
if(month1 == 1||3||5||7||8||10) // Days remaining in first month
total = 31 - day1;
else if(month1 == 4||6||9||11)
total = 30 - day1;
else
{
if(leap1 == 1)
total = 29 - day1;
else
total = 28 - day1;
}
for(i = month1 + 1; i < month2; i++) // Days remaining between dates (excluding last month)
{
if(i == 3||5||7||8||10)
total += 31;
else if(i == 4||6||9||11)
total += 30;
else
{
if(leap1 == 1)
total += 29;
else
total += 28;
}
}
total += day2; // Final sum of days between dates (including last month)
printf("There are %d days between the two dates.", total);
}
}
else // If year1 != year2 ...
{
int i, total, century1 = ((year1 / 100) + 1) * 100, falseleap = 0;
if(month1 == 1||3||5||7||8||10||12) // Days remaining in first month
total = 31 - day1;
else if(month1 == 4||6||9||11)
total = 30 - day1;
else
{
if(leap1 == 1)
total = 29 - day1;
else
total = 28 - day1;
}
for(i = month1 + 1; i <= 12; i++) // Day remaining in first year
{
if(i == 3||5||7||8||10||12)
total += 31;
else if(i == 4||6||9||11)
total += 30;
else
{
if(leap1 == 1)
total += 29;
else
total += 28;
}
}
for(i = 1; i < month2; i++) // Days remaining in final year (excluding last month)
{
if(i == 1||3||5||7||8||10)
total += 31;
else if(i == 4||6||9||11)
total += 30;
else
{
if(leap2 == 1)
total += 29;
else
total += 28;
}
}
int leapcount1 = year1 / 4; // Leap years prior to and including first year
int leapcount2 = year2 / 4; // Leap years prior to and NOT including final year
if(year2 % 4 == 0)
leapcount2 -= 1;
int leaptotal = leapcount2 - leapcount1; // Leap years between dates
for(i = century1; i < year2; i += 100) // "False" leap years (divisible by 100 but not 400)
{
if((i % 400) != 0)
falseleap += 1;
}
total += 365 * (year2 - year1 - 1) + day2 + leaptotal - falseleap; // Final calculation
printf("There are %d days between the two dates.", total);
}
return 0;
}
void date(int *month1, int *day1, int *year1, int *month2, int *day2, int *year2)
{
for(;;) // Infinite loop (exited upon valid input)
{
int fail = 0;
printf("Enter first date: ");
scanf("%d/%d/%d", month1, day1, year1);
if(*month1 < 1 || *month1 > 12)
{
printf("Invalid entry for month.\n");
fail += 1;
}
if(*day1 < 1 || *day1 > 31)
{
printf("Invalid entry for day.\n");
fail += 1;
}
if(*year1 < 1)
{
printf("Invalid entry for year.\n");
fail += 1;
}
if((*month1 == 4||6||9||11) && *day1 > 30)
{
printf("Invalid month and day combination.\n");
fail += 1;
}
if(*month1 == 2)
{
if(*year1 % 4 == 0)
{
if(*year1 % 100 == 0)
{
if(*year1 % 400 == 0 && *day1 > 29)
{
printf("Invalid month and day combination.\n");
fail += 1;
}
if(*year1 % 400 != 0 && *day1 > 28)
{
printf("Invalid month and day combination.\n");
fail += 1;
}
}
if(*year1 % 100 != 0 && *day1 > 29)
{
printf("Invalid month and day combination.\n");
fail += 1;
}
}
if(*year1 % 4 != 0 && *day1 > 28)
{
printf("Invalid month and day combination.\n");
fail += 1;
}
}
if(fail > 0)
continue;
else
break;
}
for(;;)
{
int fail = 0;
printf("Enter second date: ");
scanf("%d/%d/%d", month2, day2, year2);
if(*month2 < 1 || *month2 > 12)
{
printf("Invalid entry for month.\n");
fail += 1;
}
if(*day2 < 1 || *day2 > 31)
{
printf("Invalid entry for day.\n");
fail += 1;
}
if(*year2 < 1)
{
printf("Invalid entry for year.\n");
fail += 1;
}
if((*month2 == 4||6||9||11) && *day2 > 30)
{
printf("Invalid month and day combination.\n");
fail += 1;
}
if(*month2 == 2)
{
if(*year2 % 4 == 0)
{
if(*year2 % 100 == 0)
{
if(*year2 % 400 == 0 && *day2 > 29)
{
printf("Invalid month and day combination.\n");
fail += 1;
}
if(*year2 % 400 != 0 && *day2 > 28)
{
printf("Invalid month and day combination.\n");
fail += 1;
}
}
if(*year2 % 100 != 0 && *day2 > 29)
{
printf("Invalid month and day combination.\n");
fail += 1;
}
}
if(*year2 % 4 != 0 && *day2 > 28)
{
printf("Invalid month and day combination.\n");
fail += 1;
}
}
if(fail > 0)
continue;
else
break;
}
}
void leap(int year1, int year2, int *leap1, int *leap2) // Determines if first and final years are leap years
{
if(year1 % 4 == 0)
{
if(year1 % 100 == 0)
{
if(year1 % 400 == 0)
*leap1 = 1;
else
*leap1 = 0;
}
else
*leap1 = 1;
}
else
*leap1 = 0;
if(year2 % 4 == 0)
{
if(year2 % 100 == 0)
{
if(year2 % 400 == 0)
*leap2 = 1;
else
*leap2 = 0;
}
else
*leap2 = 1;
}
else
*leap2 = 0;
}
//计算历史上任意两个日期之间的日历天数(从1/1/1开始)。
#包括
#包括
无效日期(整数*月1日,整数*日1日,整数*年1日,整数*月2日,整数*日2日,整数*年2日);
无效跳跃(int year1、int year2、int*leap1、int*leap2);
内部主(空)
{
int month1,day1,year1,month2,day2,year2,leap1,leap2;
日期(&month1、&day1、&year1、&month2、&day2、&year2);
leap(第1年、第2年、第1年和第2年);
如果(第1年==第2年)
{
int i,总计=0;
if(month1==month2)//如果month1==month2,则总天数
{
总计=第2天-第1天;
printf(“两个日期之间有%d天。”,总计);
}
其他的
{
如果(month1==1 | 3 | 5 | 7 | 8 | 10)//第一个月剩余天数
总计=31-第1天;
如果(月1==4 | 6 | 9 | 11)
总计=30-第1天;
其他的
{
如果(1==1)
总计=29-第1天;
其他的
总计=28-第1天;
}
对于(i=month1+1;i31)
{
printf(“日期的无效条目。\n”);
失败+=1;
}
如果(*1年<1年)
{
printf(“年度的无效条目。\n”);
失败+=1;
}
如果(*month1==4 | | 6 | | 9 | | 11)和&*day1>30)
{
printf(“无效的月和日组合。\n”);
失败+=1;
}
如果(*month1==2)
{
如果(*year1%4==0)
{
如果(*year1%100==0)
{
如果(*year1%400==0&&*day1>29)
{
printf(“无效的月和日组合。\n”);
失败+=1;
}
如果(*year1%400!=0&&*day1>28)
{
printf(“无效的月和日组合。\n”);
失败+=1;
}
}
如果(*year1%100!=0&&*day1>29)
{
printf(“无效的月和日组合。\n”);
失败+=1;
}
}
如果(*year1%4!=0&&*day1>28)
{
printf(“无效的月和日组合。\n”);
失败+=1;
}
}
如果(失败>0)
继续;
其他的
打破
}
对于(;;)
{
int fail=0;
printf(“输入第二个日期:”);
scanf(“%d/%d/%d”,month2,day2,year2);
如果(*月2<1 | |*月2>12)
{
printf(“月份的无效条目。\n”);
失败+=1;
}
如果(*第2天<1 |*2天>31)
{
printf(“日期的无效条目。\n”);
失败+=1;
}
如果(*第2年<1年)
{
printf(“年度的无效条目。\n”);
失败+=1;
}
如果(*month2==4 | | 6 | | | 9 | | 11)和&*day2>30)
{
printf(“无效的月和日组合。\n”);
失败+=1;
}
如果(*month2==2)
{
如果(*year2%4==0)
{
如果(*year2%100==0)
{
如果(*year2%400==0&&*day2>29)
{
printf(“无效的月和日组合。\n”);
失败+=1;
}
如果(*year2%400!=0&&*day2>28)
{
printf(“无效的月和日组合。\n”);
失败+=1;
}
}
如果(*year2%100!=0&&*day2>29)
{
printf(“无效的月和日组合。\n”);
失败+=1;
}
}
如果(*year2%4!=0&&*day2>28)
{
printf(“无效的月和日组合。\n”);
失败+=1;
}
}
如果(失败>0)
继续;
其他的
打破
}
}
void leap(int year1、int year2、int*leap1、int*leap2)//确定第一年和最后一年是否为闰年
{
如果(第1年%4==0)
{
如果(年份1%100==0)
{
如果(年份1%400==0)
*leap1=1;
其他的
*1=0;
}
其他的
*leap1=1;
}
其他的
*1=0;
如果(第2年%4==0)
{
如果(年份2%100==0)
{
如果(年份2%400==0)
*leap2=1;
其他的
*leap2=0;
}
其他的
*leap2=1;
}
其他的
*leap2=0;
}
始终计算为true
,因为它已被解析
if ((month == 1) || 3 || 5 || 7 || 8 || 10)
任何非零整数的计算结果均为
true
。另外,您忘记了十二月。您的代码中有很多这样的构造:
value == 1||3||5||7||8||10||12
这与你认为的C语言不同,你必须这样写:
value == 1 || value == 3 || value == 5 || etc...
在修复并清理代码后,如果问题仍然存在,请返回(尽管提出新问题)
此条件将始终计算为truevalue == 1 || value == 3 || value == 5 || etc...
i == 3||5||7||8||10||12
int daysPerMonth[] = {31,28,31,30 .. };
if (month1 == 1||3||5||7||8||10||12)
if (month1 == 1 || month1 == 3 || month1 == 5 ||
month1 == 7|| month1 == 8|| month1 == 10|| month1 == 12)