中易网

定义一个方法, 方法里面定义一个起始日期, 再定义一个终止日期.计算这两个日期之间相差多少天.

答案:1  悬赏:30  
解决时间 2021-02-18 17:15
定义一个方法, 方法里面定义一个起始日期, 再定义一个终止日期.计算这两个日期之间相差多少天.
最佳答案
#include

//日期结构体
struct Date
{
int year;//年
int month;//月
int day;//日
};

int M1[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};//平年月份
int M2[13]={0,31,29,31,30,31,30,31,31,30,31,30,31};//闰年月份

//闰年判断
int Isleapyear(int year)
{
return (((year%4==0 && year%100!=0) || year%400==0)?1:0);
}

//日期合法检查
int Isvalid(struct Date *p)
{
if(p->year < 0)
{
printf("年份小于0\n");
return 0;
}
if(p->month < 0 || p->month > 12)
{
printf("月份小于0或大于12\n");
return 0;
}

if(Isleapyear(p->year))//是闰年
if(p->month == 2)
{
if(p->day < 0 ||p->day > M2[p->month])
{
printf("天不合法\n");
return 0;
}
}
else
{
if(p->day < 0 ||p->day > M1[p->month])
{
printf("天不合法\n");
return 0;
}
}
else
{
if(p->day < 0 ||p->day > M1[p->month])
{
printf("天不合法\n");
return 0;
}
}
return 1;
}

int Days(struct Date *sdate,struct Date *edate)
{
int d,d1,d2,d3;
int i,j;

if(!Isvalid(sdate))
return -1;
if(!Isvalid(edate))
return -1;

if(sdate->year > edate->year)
{
printf("开始年份大于结束年份\n");
return -1;
}
else if(sdate->year == edate->year)//年份相同,比对月份和天
{
if(sdate->month > edate->month)
{
printf("相同年份下,开始月大于结束月\n");
return -1;
}
else if(sdate->month == edate->month)//月份相同
{
if(sdate->day > edate->day)
{
printf("相同年份和月份下,开始天大于结束天\n");
return -1;
}

d=edate->day - sdate->day;

}
else//月份不同,分三段计算
{
if(Isleapyear(sdate->year))//年份是闰年,用M2计算天数
{
d1=M2[sdate->month] - sdate->day;//计算开始的天到开始月底有多少天数
for(d2=0,i=sdate->month+1;imonth;i++)
d2 +=M2[i];//计算从开始月的下一个月到结束月(不含结束月)之间的天数

}
else//不是闰年,用M1计算天数
{
d1=M1[sdate->month] - sdate->day;//计算开始的天到开始月底有多少天数
for(d2=0,i=sdate->month+1;imonth;i++)
d2 +=M1[i];//计算从开始月的下一个月到结束月(不含结束月)之间的天数
}

//d1+d2+结束月的天数
d=d1 + d2 + edate->day;
}
}
else //年份不同,分段计算
{
//从开始天数到当年的12月31日,计算多少天
if(Isleapyear(sdate->year))//开始年份是闰年,用M2计算天数
{
d1=M2[sdate->month] - sdate->day;//计算开始的天到开始月底有多少天数
for(i=sdate->month+1;i<=12;i++)//计算开始月的下一个月到年底12月(含12月)天数
d1 += M2[i];
}
else//开始年份是平年,用M1计算天数
{
d1=M1[sdate->month] - sdate->day;//计算开始的天到开始月底有多少天数
for(i=sdate->month+1;i<=12;i++)//计算开始月的下一个月到年底12月(含12月)天数
d1 += M1[i];
}

//计算从开始年的下一年到结束年(不含结束年)之间的天数
for(d2=0,i=sdate->year+1;iyear;i++)
if(Isleapyear(i))//如果是闰年,按366天
for(j=1;j<=12;j++)
d2 += M2[j];
else //平年,按365天
for(j=1;j<=12;j++)
d2 += M1[j];

//计算结束年当年的天数(从1月1日到结束天)
if(Isleapyear(edate->year))//结束年是闰年,用M2计算
for(d3=0,i=1;imonth-1;i++)//从1月到结束月(不含结束月)的天数
d3 += M2[i];
else//结束年是平年,用M1计算
for(d3=0,i=1;imonth-1;i++)//从1月到结束月(不含结束月)的天数
d3 += M1[i];

d3 +=edate->day;//累加当前天

d=d1 + d2 + d3;

}
return d;
}
int main(void)
{
struct Date sdate,edate;
int days;
int sel;

while(1)
{
printf("输入开始日期年 月 日,用空格隔开:");
scanf("%d%d%d",&sdate.year,&sdate.month,&sdate.day);

printf("输入结束日期年 月 日,用空格隔开:");
scanf("%d%d%d",&edate.year,&edate.month,&edate.day);

days=Days(&sdate,&edate);
if(days < 0)
printf("天数有误\n");
else
printf("相差%d天\n",days);

printf("是否继续?1-是,其余-否:");
if(scanf("%d",&sel)!=1 || sel!=1)
return 0;
}
return 0;
}
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
=鹿婊=鹿晗姐姐怎么这么漂亮
东明县公安局人民来访接待室在什么地方啊,我
宝宝头上的奶痂能洗吗
荣耀V9和华为mate9哪个好 / 区别对比评测
如果办理中国工商银行借记卡需要什么证件和手
扑楞蛾子是飞蛾吗?
解密游戏开头是个保险柜,非常精致,需要用一
田莉格拉条我想知道这个在什么地方
是一首韩国歌手的歌,歌词音译过来大概是阿拉
我现在古筝已经7级了用英文怎么说?
龙岩国际美食城1号地下停车场在哪里啊,我有
CF12月12日踢腿狙补偿什么时候开始
吉林省延吉市的【都市乡村羊排店】的位置在哪
从课外摘抄30个暗喻
我的电脑插上U盘就黑屏是怎么回事拜托各位大
推荐资讯
朱家坝地址在什么地方,想过去办事
盐池滩羊肉地址在什么地方,想过去办事
怎样证明f(x T)=-f(x) 的周期是2T?
兰州市电信局家属院怎么去啊,有知道地址的么
南周家庄村这个地址在什么地方,我要处理点事
敬业路/海尔路(路口)地址有知道的么?有点事
昭通市安全生产监督管理局在什么地方啊,我要
生活如此美好,请你我尽情享受 用英语怎么说啊
古蔺县有什么好—点的学校?
露台上铺了一层很厚的水泥负荷有问题吗
有其父必有其子 观点正确吗?为什么?
制作胶水,添加甲醛应该注意那些哪些问题?
手机登qq时,显示手机磁盘不足,清理后重新登
刺客的套装怎么选啊?