关于求两个日期之间相距的天数,C/C++

我的程序达不到预期的效果,麻烦大家帮我看一下了,谢谢!#include<iostream>usingnamespacestd;structDay{intyear;intm... 我的程序达不到预期的效果,麻烦大家帮我看一下了,谢谢!

#include<iostream>
using namespace std;
struct Day
{
int year;
int month;
int day;
}x,y;
void Ready()
{
cout<<"请输入一个日期:"<<endl;
cin>>x.year>>x.month>>x.day;
cout<<"请输入一个日期:"<<endl;
cin>>y.year>>y.month>>y.day;
}
double SW(int month,double days)
{
switch(month)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:days+=31;break;
case 4:
case 6:
case 9:
case 11:days+=30;break;
case 2:days+=28;break;
default:cout<<"Error!"<<endl;break;
}
return days;
}
double Days(Day x,Day y)
{

int i;
double days=y.day;
days-=x.day;
if((x.year==y.year)&&(x.month==y.month)&&(x.day==y.day))
return 0;
if(x.year>y.year||((x.year==y.year)&&(x.month>y.month))||((x.year==y.year)&&(x.month==y.month)&&(x.day>y.day)))
{
if((x.year%400==0||(x.year%100!=0&&x.year%4==0))&&x.month<=2)
days++;
for(i=x.month;i<=12;i++)
days=SW(i,days);
if(x.year-y.year>1)
for(i=x.year+1;i<y.year;i++)
if(i%400==0||(i%100!=0&&i%4==0))
days+=366;
else
days+=365;
return days;
}
else
return Days(y,x);
}
void Show(double n)
{
cout<<n<<endl;
}
void main()
{
Ready();
Show(Days(x,y));
}
展开
 我来答
zla_0723
推荐于2016-12-02 · 超过81用户采纳过TA的回答
知道小有建树答主
回答量:305
采纳率:0%
帮助的人:0
展开全部
改四个地方:
1)
double days=y.day;
days-=x.day;
改成
double days=x.day;
days-=y.day;

2)
if((x.year%400==0||(x.year%100!=0&&x.year%4==0))&&x.month<=2)
改成
if((x.year%400==0||(x.year%100!=0&&x.year%4==0))&&x.month>2)

3)
for(i=x.month;i<=12;i++)
改成
for(i=y.month;i<x.month;i++)

4)
if(x.year-y.year>1)
for(i=x.year+1;i<y.year;i++)
改成
if(x.year-y.year>=1)
for(i=y.year;i<x.year;i++)
这是我找出来的错误,估计别的地方还有错误。

附修改后的完整代码
#include<iostream>
using namespace std;
struct Day
{
int year;
int month;
int day;
}x,y;
void Ready()
{
cout<<"请输入一个日期:"<<endl;
cin>>x.year>>x.month>>x.day;
cout<<"请输入一个日期:"<<endl;
cin>>y.year>>y.month>>y.day;
}
double SW(int month,double days)
{
switch(month)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:days+=31;break;
case 4:
case 6:
case 9:
case 11:days+=30;break;
case 2:days+=28;break;
default:cout<<"Error!"<<endl;break;
}
return days;
}
double Days(Day x,Day y)
{

int i;
double days=x.day;
days-=y.day;
if((x.year==y.year)&&(x.month==y.month)&&(x.day==y.day))
return 0;
if(x.year>y.year||((x.year==y.year)&&(x.month>y.month))||((x.year==y.year)&&(x.month==y.month)&&(x.day>y.day)))
{
if((x.year%400==0||(x.year%100!=0&&x.year%4==0))&&x.month>2)
days++;
for(i=y.month;i<x.month;i++)
days=SW(i,days);
if(x.year-y.year>=1)
{
for(i=y.year;i<x.year;i++)
{
if(i%400==0||(i%100!=0&&i%4==0))
days+=366;
else
days+=365;
}
}
return days;
}
else
return Days(y,x);
}
void Show(double n)
{
cout<<n<<endl;
}
void main()
{
Ready();
Show(Days(x,y));
}
zubyzuby
2007-09-24 · TA获得超过1539个赞
知道小有建树答主
回答量:1118
采纳率:100%
帮助的人:1201万
展开全部
int f(int y, int m)
{
if (m<3) return y-1;
return y;
}

int g(int m)
{
if (m<3) return m+13;
return m+1;
}

N=1461*f(y,m)/4+153*g(m)/5+d

计算两个日期相隔多少天:
N1=1461*f(y1,m1)/4+153*g(m1)/5+d1
N2=1461*f(y2,m2)/4+153*g(m2)/5+d2

N2-N1 就是相隔天数

计算y年m月d日星期几:

N=1461*f(y,m)/4+153*g(m)/5+d
(N-621049)%7 就是星期
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
厉经浩星27
2007-09-24 · TA获得超过439个赞
知道小有建树答主
回答量:451
采纳率:0%
帮助的人:409万
展开全部
算法是错误的。
我试验的数据数据是 2007 05 31 和 2007 06 02
测试结果是243天。

你主要的计算是通过days(x,y);其中x 要比 y的时间大(晚)。

“for(i=x.month;i<=12;i++)
days=SW(i,days);

在我的测试数据中,这段 计算没有道理,或者你的条件划分还不够清晰。(汗,没看懂你的意图~~~)

总:这个算法感觉不够清晰。
提供一条思路。系统内的时间有专门的函数,你可以先把你的时间转换为系统标准的格式,然后再进行计算差距,再转换回来你需要的格式。仅供参考。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
lsaunter
2007-09-24 · TA获得超过1188个赞
知道小有建树答主
回答量:753
采纳率:0%
帮助的人:603万
展开全部
有个函数有问题,你追加50悬赏分,我给你改出来
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式