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

定义一个方法,方法里面定义一个起始日期,再定义一个终止日期.计算这两个日期之间相差多少天.请问这个方法如何实现.绞破脑汁.初学者,能力有限.忘各位好友帮忙解答.谢谢了.注... 定义一个方法, 方法里面定义一个起始日期, 再定义一个终止日期.计算这两个日期之间相差多少天.

请问这个方法如何实现. 绞破脑汁 . 初学者,能力有限. 忘各位好友帮忙解答.谢谢了.

注意 :---- 是要用 分支语句完成. 不能用API 中的函数方法。
展开
 我来答
有钱买不起房子
推荐于2020-12-23 · TA获得超过4326个赞
知道大有可为答主
回答量:1249
采纳率:100%
帮助的人:2087万
展开全部
#include <stdio.h>

//日期结构体
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;i<edate->month;i++)
d2 +=M2[i];//计算从开始月的下一个月到结束月(不含结束月)之间的天数

}
else//不是闰年,用M1计算天数
{
d1=M1[sdate->month] - sdate->day;//计算开始的天到开始月底有多少天数
for(d2=0,i=sdate->month+1;i<edate->month;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;i<edate->year;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;i<edate->month-1;i++)//从1月到结束月(不含结束月)的天数
d3 += M2[i];
else//结束年是平年,用M1计算
for(d3=0,i=1;i<edate->month-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;
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式