/* 问题5: 输入两个日期(年 月 日), 求两个日期之间相隔的天数 */ #include "stdafx.h" #include "stdlib.h" typedef struct Date { int year; int month; int day; }; int getDays(int year, int month) { int count = 0; if(month==1||month==3||month==5||month==7||month==8||month==10||month==12) count += 31; else if(month == 2) count += 28+(year%4==0 && (year%400==0 || year%100!=0)); else count += 30; return count; } int main(int argc, char* argv[]) { int count; Date dt1, dt2, tmp; printf("请输入第一个日期的年月日:"); scanf("%d%d%d", &dt1.year, &dt1.month, &dt1.day); printf("请输入第二个日期的年月日:"); scanf("%d%d%d", &dt2.year, &dt2.month, &dt2.day); /* 判断两个日期的大小关系,整理得出dt1>dt2,便于以后计算 判断方法:首先判断年份, dt1年份 > dt2年份 dt1>dt2 dt1年份 = dt2年份 判断月份 dt1月份 > dt2月份 dt1>dt2 dt1月份 = dt2月份 判断日数 dt1日数 > dt2日数 dt1>dt2 dt1日数 = dt2日数 dt1=dt2 两者相差0天 dt1日数 < dt2日数 dt1<dt2 dt1月份 < dt2月份 dt1<dt2 dt1年份 < dt2年份 dt1<dt2 dt1>dt2的情况不用做任何事,因此忽略 */ /* if(dt1.year == dt2.year) { if(dt1.month == dt2.month) { if(dt1.day == dt2.day) { printf("两者相差0天。"); exit(0); } else if(dt1.day < dt2.day) { 交换! } }else if(dt1.month < dt2.month) { 交换! } }else if(dt1.year < dt2.year) { 交换! } */ /* 从以上代码中可以提取出条件判断语句如下: 第一种情况: 1. dt1.year == dt2.year && dt1.month == dt2.month && dt1.day < dt2.day 2. dt1.year == dt2.year && dt1.month < dt2.month 3. dt1.year < dt2.year 三者任意出现一个,则需要交换dt1和dt2的值。 第二种情况: dt1.year == dt2.year && dt1.month == dt2.month && dt1.day == dt2.day 如果出现完全相同情况,则直接得出结果:相差0天。 写成如下代码: */ if(dt1.year<dt2.year || (dt1.year==dt2.year && ((dt1.month==dt2.month && dt1.day<dt2.day) || dt1.month<dt2.month))) { tmp = dt1; dt1 = dt2; dt2 = tmp; } /* //下一部分的while语句已经包含此功能判断,重复。 if(dt1.year == dt2.year && dt1.month == dt2.month && dt1.day == dt2.day) { printf("两者日期相等,相差0天。"); exit(0); } */ //dt2不断增加直到等于dt1,将累加结果放置到变量中存储 count = 0; for(; !(dt1.year == dt2.year && dt1.month == dt2.month); dt2.month++) { count += getDays(dt2.year, dt2.month); if(dt2.month == 12) { dt2.year++; dt2.month = 0; } } count = count + dt1.day - dt2.day; printf("相差%d天。", count); return 0; }