标题:关于日期的一道简单的编程题
只看楼主
colsummaneye
Rank: 1
等 级:新手上路
帖 子:37
专家分:0
注 册:2006-6-29
 问题点数:0 回复次数:10 
关于日期的一道简单的编程题
编程求任给2个日期相差的天数?(比如1998年4月9号和2080年8月5号)

我想想看看大家的思路,我自己是这样想的:先判断出起始年和结尾年的日期是当年的第几天,然后再求之间相差的天数(当然要判断闰年拉)当然就是365OR366-起始年所在的第几天+之间相差的天数+结尾年所在天数的第几天

菜鸟求助
搜索更多相关主题的帖子: 天数 结尾 闰年 思路 
2006-10-16 23:04
wuseRaosir
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2006-10-17
得分:0 
/* 慢慢看下,看怎么样! 可能有的地方不全,还请高手指点!!*/
#include<iostream>
#include<math.h>
using namespace std;
int IsLeapYear(int y)
{ int leap=0;
if(y%4==0&&y%100!=0||y%400==0)
leap=1;
return leap;
}
int DayOfYear(int y,int m,int d)
{
int day=0,i,n;
for(i=1;i<m;i++)
{
switch(i)
{ case 1:case 3:case 5:case 7:case 8:case 10:case 12:n=31;break;
case 4:case 6:case 9:case 11:n=30; break;
case 2:
{ if(IsLeapYear(y)) n=29;
else n=28;
break;
}
default: cout<<"输入的日期错误。\n"<<endl;
}
day+=n;
}
day+=d;
return day;
}
int InputCheckup(int year,int month,int day)
{ int flag=1;
switch(month)
{
case 1:case 3:case 5:case 7:case 8:case 10:case 12:
if(day>31||day<1)
{ flag=0; break; }
case 4: case 6: case 9: case 11:
if(day>30||day<1)
{ flag=0; break; }
case 2:
{
flag=!((year%4==0&&year%100!=0||year%400==0)?(day>29||day<1):(day>28||day<1));
break;
}
default: { flag=0; break; }
}
return flag;
}
int main()
{
int year,year1,year2,month1,month2,day1,day2,days1=0,days2=0,days=0,count=0;
loop1:
cout<<"输入第一个完整的日期(年 月 日):";
cin>>year1>>month1>>day1;
if(!InputCheckup(year1,month1,day1))
{
cout<<"输入的日期错误,请重新输入!\n";
goto loop1;
}
loop2:
cout<<"输入第二个完整的日期(年 月 日):";
cin>>year2>>month2>>day2;
if(!InputCheckup(year2,month2,day2))
{
cout<<"输入的日期错误,请重新输入!\n";
goto loop2;
}
year=abs(year2-year1);
for(year1<year2?year1:year2;year>0;year--)
{
if(IsLeapYear(year1))
{
days++;
}
days+=365;
}
days1=DayOfYear(year1,month1,day1);
days2=DayOfYear(year2,month2,day2);
if(year1<=year2) days=abs(days-days1+days2);
else days=abs(days+days1-days2);
cout<<year1<<"年"<<month1<<"月"<<day1<<"日"<<"是这一年的第"<<days1<<"天!"<<endl;
cout<<year2<<"年"<<month2<<"月"<<day2<<"日"<<"是这一年的第"<<days2<<"天!"<<endl;
cout<<"这两个日期之间的天数为:"<<days<<endl;
return 0;
}
2006-10-17 13:38
好学天才猪头
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2006-10-19
得分:0 
错误好多啊
你自己编译看看啊
2006-10-19 01:09
colsummaneye
Rank: 1
等 级:新手上路
帖 子:37
专家分:0
注 册:2006-6-29
得分:0 

没有什么错的啊!但是还有谁有更好的方法吗?


2006-10-19 07:24
Meixu
Rank: 1
等 级:新手上路
帖 子:42
专家分:0
注 册:2006-10-12
得分:0 
的确没有什么错误VC++6.0通过。

多看、多练、多写
2006-10-19 07:49
colsummaneye
Rank: 1
等 级:新手上路
帖 子:37
专家分:0
注 册:2006-6-29
得分:0 

怎么只有一个人写答案啊?


2006-10-22 11:56
majia775
Rank: 1
等 级:新手上路
威 望:2
帖 子:94
专家分:0
注 册:2006-9-11
得分:0 
[CODE]

//这个程序好久以前就写了,不过没写出来,今天给她搞定了
//另外又goto了一把,暂时还想不到不用goto完美的解决办法
//这是书后一道题,不是楼主的题目,要求是输入一个日期,判断是本年的第几天
//已经考虑闰年问题
#include<iostream>
using namespace std;
int fun(int year,int month,int day); //计算天数函数
struct YEAR
{
int year;
int month;
int day;
}N;

int main()
{
cout<<"输入年月日,程序计算该日在本年中是第几天.";
cout<<"格式:2004 5 28\n";

LOOP:cout<<"输入一个年月日:";
cin>>N.year>>N.month>>N.day;

cout<<N.year<<"年"<<N.month<<"月"<<N.day<<"日,是今年第 "<<fun(N.year,N.month,N.day)<<" 天.\n";

cout<<"继续查询请按Y,退出请按任意键!\n";
if(cin.get()=='Y' || cin.get()=='y') goto LOOP;
return 0;
}


int fun(int year,int month,int day); //计算天数函数
{
int i,sum=0;
int years[12]={31,28,31,30,31,30,31,31,30,31,30,31}; //一年所有月份
int yearr[12]={31,29,31,30,31,30,31,31,30,31,30,31}; //一年所有月份(闰年情况)

if(year%4==0 && year%100!=0 || year%400==0) //如果是闰年...
{
for(i=0;i<(month-1);i++) //month-2才能显示正常:比如2004年366天,不然显示396天
sum=sum+yearr[i];
sum=sum+day; //sum等于该日在今天第多少天
return sum;
}
else //如果不是闰年
{
for(i=0;i<(month-1);i++)
sum=sum+years[i];
sum=sum+day;
return sum;
}

}

[/CODE]

[此贴子已经被作者于2006-11-1 2:27:25编辑过]


我不是随便的人,我随便起来不是人.... http://majia775.
2006-10-23 20:26
wangxiang
Rank: 2
等 级:新手上路
威 望:5
帖 子:376
专家分:0
注 册:2006-3-28
得分:0 

[CODE]#include <iostream>
using namespace std;
int IsLeapYear(int y)
{ int leap=0;
if(y%4==0&&y%100!=0||y%400==0)
leap=1;
return leap;
}
int main()
{
int year1,month1,day1,year2,month2,day2;
int num_month1 = 0;
int num_month2 = 0;
int num_year = 0;
int array[] = {31,28,31,30,31,30,31,31,30,31,30,31};
cout<<"第一次输入年,月,日: ";
cin>>year1>>month1>>day1;
cout<<"第二次输入年,月,日: ";
cin>>year2>>month2>>day2;
int big_year = year1 >= year2 ? year1:year2;
int min_year = year1 <= year2 ? year1:year2;
for(int i = min_year;i < big_year;i++)
{
if(IsLeapYear(i))
num_year += 366;
else
num_year += 365;
}
for(int j = 1;j < month1;j++)
{
if(IsLeapYear(year1)&& 2 == j)
num_month1 += array[1]+1;
else
num_month1 += array[j-1];
}
for(int k = 1;k < month2;k++)
{
if(IsLeapYear(year2)&& 2 == k)
num_month2 += array[1]+1;
else
num_month2 += array[k-1];
}
int month_day_day = num_month2 - num_month1+day2 - day1;
if(month_day_day < 0)
month_day_day = -month_day_day;
cout<<"两个日期相差"<<num_year+month_day_day<<"天。"<<endl;
return 0;
}

[/CODE]


2006-10-23 22:09
colsummaneye
Rank: 1
等 级:新手上路
帖 子:37
专家分:0
注 册:2006-6-29
得分:0 
8楼的你的程序很不错,但是你看下,你的条件控制设置的不好啊!一个月可以输入80号,2月是闰年的话和不是闰年的话,应该有2种情况的。

2006-10-24 12:38
wangxiang
Rank: 2
等 级:新手上路
威 望:5
帖 子:376
专家分:0
注 册:2006-3-28
得分:0 

是不是闰年的二月考虑了

是没有对输入的月日判断,这个判断不难,自己可以修改一下


2006-10-24 13:01



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-96810-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.484840 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved