定义一个方法, 方法里面定义一个起始日期, 再定义一个终止日期.计算这两个日期之间相差多少天.
答案:1 悬赏:30
解决时间 2021-02-18 17:15
- 提问者网友:溺爱和你
- 2021-02-18 13:50
定义一个方法, 方法里面定义一个起始日期, 再定义一个终止日期.计算这两个日期之间相差多少天.
最佳答案
- 二级知识专家网友:归鹤鸣
- 2021-02-18 15:07
#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;
}
//日期结构体
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
d2 +=M2[i];//计算从开始月的下一个月到结束月(不含结束月)之间的天数
}
else//不是闰年,用M1计算天数
{
d1=M1[sdate->month] - sdate->day;//计算开始的天到开始月底有多少天数
for(d2=0,i=sdate->month+1;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
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
d3 += M2[i];
else//结束年是平年,用M1计算
for(d3=0,i=1;i
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;
}
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯
• 手机登qq时,显示手机磁盘不足,清理后重新登 |
• 刺客的套装怎么选啊? |