定义一个方法, 方法里面定义一个起始日期, 再定义一个终止日期.计算这两个日期之间相差多少天. 10
定义一个方法,方法里面定义一个起始日期,再定义一个终止日期.计算这两个日期之间相差多少天.请问这个方法如何实现.绞破脑汁.初学者,能力有限.忘各位好友帮忙解答.谢谢了.注...
定义一个方法, 方法里面定义一个起始日期, 再定义一个终止日期.计算这两个日期之间相差多少天.
请问这个方法如何实现. 绞破脑汁 . 初学者,能力有限. 忘各位好友帮忙解答.谢谢了.
注意 :---- 是要用 分支语句完成. 不能用API 中的函数方法。 展开
请问这个方法如何实现. 绞破脑汁 . 初学者,能力有限. 忘各位好友帮忙解答.谢谢了.
注意 :---- 是要用 分支语句完成. 不能用API 中的函数方法。 展开
展开全部
#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;
}
//日期结构体
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;
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询