免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1512 | 回复: 8
打印 上一主题 下一主题

[C++] 请高手帮下忙哈 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-04-15 13:43 |只看该作者 |倒序浏览
要求输入两个日期,比如2005 2 15,2006 2 15.然后计算出两个日期中间有多少天。写完了,但是结果这个汗啊。好像算法有点问题,后面的循环我输入0想退出,却总是不行。还有反复几次输入之后,无论输入什么日期,总是出错。请高手帮忙指正。

#include <iostream.h>
int year1,year2,month1,month2,day1,day2;
const int Month[12]={31,28,31,30,31,30,31,31,30,31,30,31};
void swap(){
int yeartmp,monthtmp,daytmp;
  yeartmp=year1;
  monthtmp=month1;
  daytmp=day1;
  year1=year2;
  month1=month2;
  day1=day2;
  year2=yeartmp;
  month2=monthtmp;
  day2=daytmp;
}
int checkLeap(int year)
{
int remain=year%4;
if(remain!=0)
return 0;
else if(year%100==0&&year%400!=0)
return 0;
else
return 1;
}
int checkDate(int year,int month,int day){
if(year<1000||year>3000||month<1||month>12||day<1) return 0;
if(month!=2){
  if (day>Month[month-1]) return 0;
  else return 1;}
else {
  if (checkLeap(year)==1) {
   if (day>Month[1]+1) return 0;
   else return 1;}
else {
   if (day>Month[1]) return 0;
   else return 1;}
  }
    }

void  input(){

cout<<"Please enter your first date(yyyy mm dd):";
cin>>year1>>month1>>day1;
if(checkDate(year1,month1,day1)==0) {
  cout<<"Your input is wrong.Please input again."<<endl;
  input();}
cout<<"Please enter your second date(yyyy mm dd):";
cin>>year2>>month2>>day2;
if(checkDate(year2,month2,day2)==0) {
  cout<<"Your input is wrong.Please input again."<<endl;
  input();}

}
int calc(int year,int month,int day){
int num=day;
for(int i=1;i<month;i++) num=num+Month[i-1];
if (month>2&&checkLeap(year)==1) num++;
return num;
}
int main(){
    int sel;
do{
  cout<<"To calculate how many days are there between two dates."<<endl;
input();
if(year1>year2) swap();
else {if (month1>month2) swap();
else {if (day1>day2) swap();
}
}
int tmp,tmp1,result;
if (checkLeap(year1)==1) tmp=366-calc(year1,month1,day1);
else tmp=365-calc(year1,month1,day1);
tmp1=calc(year2,month2,day2);
int leapnum;
leapnum=(year2-year1)/4;
result=tmp+tmp1+365*(year2-year1-1)+leapnum;
cout<<"There are "<<result<<" days between the two dates."<<endl;
cout<<"To go on, press 1"<<endl<<"To quit, press 0"<<endl<<"Please enter your choice:";
cin>>sel;
} while (sel=1);

}

论坛徽章:
0
2 [报告]
发表于 2009-04-15 13:50 |只看该作者
兄弟,你这个写的太累了,把2个日期都转换成秒,一减就可以得出多少天了

论坛徽章:
0
3 [报告]
发表于 2009-04-15 13:57 |只看该作者
原帖由 jinmiaobis 于 2009-4-14 21:50 发表
兄弟,你这个写的太累了,把2个日期都转换成秒,一减就可以得出多少天了


正解。
man mktime

论坛徽章:
0
4 [报告]
发表于 2009-04-15 14:12 |只看该作者
给你个程序参考把
#include <stdio.h>
#include <time.h>

int main()
{
    time_t max_se;
    time_t min_se;
    struct tm t;
    char cyear[5];
    char cmonth[3];
    char cday[3];
    int  day_num;

    memset(cyear, 0x00, sizeof(cyear));
    memset(cmonth, 0x00, sizeof(cmonth));
    memset(cday, 0x00, sizeof(cday));

    strcpy(cyear, "2005");
    strcpy(cmonth, "02");
    strcpy(cday, "15");

    t.tm_year = atol(cyear) - 1900;
    t.tm_mon = atol(cmonth) - 1;
    t.tm_mday = atol(cday);
    t.tm_hour = 0;
    t.tm_min = 0;
    t.tm_sec = 0;
    t.tm_isdst = 0;
    min_se = mktime(&t);
   
    memset(cyear, 0x00, sizeof(cyear));
    memset(cmonth, 0x00, sizeof(cmonth));
    memset(cday, 0x00, sizeof(cday));

    strcpy(cyear, "2006");
    strcpy(cmonth, "02");
    strcpy(cday, "15");

    t.tm_year = atol(cyear) - 1900;
    t.tm_mon = atol(cmonth) - 1;
    t.tm_mday = atol(cday);
    t.tm_hour = 0;
    t.tm_min = 0;
    t.tm_sec = 0;
    t.tm_isdst = 0;
    max_se = mktime(&t);
   
    day_num = (max_se-min_se)/(24 *60*60);
             
    printf("day_num = [%d]\n", day_num);
    return 0;
}

论坛徽章:
0
5 [报告]
发表于 2009-04-15 15:28 |只看该作者

回复 #2 jinmiaobis 的帖子

十分感谢啊。

论坛徽章:
0
6 [报告]
发表于 2009-04-15 15:33 |只看该作者

十分感谢

谢谢各位啊

论坛徽章:
0
7 [报告]
发表于 2009-04-15 23:01 |只看该作者
原帖由 jinmiaobis 于 2009-4-15 13:50 发表
兄弟,你这个写的太累了,把2个日期都转换成秒,一减就可以得出多少天了

简单易用,好

论坛徽章:
0
8 [报告]
发表于 2009-04-15 23:09 |只看该作者
#include <iostream>
int t[] = {0,31,59,90,120,151,181,212,243,273,304,334,365};
int cal(int y, int m, int d) {
    return (y-1)*365 + (y-1)/4 - (y-1)/100 + (y-1)/400 + t[m-1] + d + (m>2 && (y % 4 == 0 && y % 100 != 0 || y % 400 == 0));
}
int y1,m1,d1,y2,m2,d2;
int main() {
    while(std::cin >> y1 >> m1 >> d1 >> y2 >> m2 >> d2)
        std::cout << cal(y2,m2,d2) - cal(y1,m1,d1) << std::endl;
}

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:53:172015亚冠之水原三星
日期:2015-06-02 16:34:202015年亚冠纪念徽章
日期:2015-10-19 18:13:37程序设计版块每日发帖之星
日期:2015-11-08 06:20:00
9 [报告]
发表于 2009-04-15 23:15 |只看该作者
原帖由 jinmiaobis 于 2009-4-15 13:50 发表
兄弟,你这个写的太累了,把2个日期都转换成秒,一减就可以得出多少天了


nod,按照计算机的思维来思考
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP