免费注册 查看新帖 |

Chinaunix

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

[原创] 关于日期夹剪啊, 过了几天是几号啊啊。。。。 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2003-07-02 15:11 |只看该作者 |倒序浏览
// 我保证超级的准确, 哈哈

#include <iostream>;
using namespace std;

bool isleap(int y)
{ return y%4==0&&y%100!=0 || y%400==0;
}

bool is_correct_date(int d, int m, int y)
{
   if(
      (y<1||m<1||m>;12||d<1||d>;31) ||
      ((m==4||m==6||m==9||m==11)&&d>;30) ||
      (m==2 && isleap(y) && d>;29) ||
      (m==2 && !isleap(y) && d>;28 )
     )
   return false;
   return true;
}

void swap(int& a,int& b)
{
   int temp;
   temp = a;
   a = b;
   b = temp;
}

//input a date and increase by one day
void increase_one_day(int& d, int& m, int& y)
{
   
       d++;
       if(
             (((m==1||m==3||m==5||m==7||m==8||m==10)&&d==32))
             || ((m==4||m==6||m==9||m==11)&&d==31)
             || (m==2 && isleap(y) && d==30)
             || (m==2 && !isleap(y) && d==29)
         )
       {
             m++;                                            
             d=1;                                            
       }
       else if(m==12&&d==32)                             
       {
         y++;                                            
         m=1;                                            
         d=1;                                            
       }
}  

//input : day, month, year and the days increased
void after_n_days(int& d, int& m, int& y, int n_days)      
{
   while(n_days>;0)
   {
        increase_one_day(d, m, y);
        n_days--;
   }
}

//return the days between two date
int days_between_two_date(int d1, int m1, int y1,
                          int d2, int m2, int y2)
{
    int days = 0;
    if(y1<y2 || (y1==y2&&m1<m2) || (y1==y2&&m1==m2&&d1<d2))
    {     
        swap(y1, y2);
        swap(m1, m2);
        swap(d1, d2);
    }        
    while(y2!=y1 || m2!=m1 || d2!=d1)
    {
       increase_one_day(d2, m2, y2);
       days++;
    }   
    return days;
}   

int main()
{
  
  int d1, m1, y1, d2, m2, y2;
  cout<<"Enter date_1(day month year): ";
  cin>;>;d1>;>;m1>;>;y1;
  cout<<"Enter date_2(day month year): ";
  cin>;>;d2>;>;m2>;>;y2;
  cout<<endl;
  
  if(!is_correct_date(d2,m2,y2)||!is_correct_date(d1,m1,y1))
     cout<<"Error Date Exist!"<<endl;                                      
  else
  {
  
      cout<<"There are "<<days_between_two_date(d1, m1, y1, d2, m2, y2)
      <<" days between this two date."<<endl;   cout<<endl;
      
      int days;
      cout<<"Enter the days you need to increase:";
      cin>;>;days;
      after_n_days(d1, m1, y1, days);
      cout<<"date_1 after "<<days<<" days is "<<d1<<" "<<m1<<" "<<y1<<" "<<endl;
  }
}

论坛徽章:
0
2 [报告]
发表于 2003-07-02 15:27 |只看该作者

[原创] 关于日期夹剪啊, 过了几天是几号啊啊。。。。

蓝色键盘, 无双, gadfly, JohnBull ,   给个精华把,原创精华 :)

给个精华把, 什么都考虑了, 什么闰年啊, 31, 28啊, 什么的啊, 我保证没有一电点错。

那位大侠能找了一个错例吗???????

论坛徽章:
0
3 [报告]
发表于 2003-07-02 16:19 |只看该作者

[原创] 关于日期夹剪啊, 过了几天是几号啊啊。。。。

关键是。。。。
没有必要啊
练习一下思维的缜密倒还是有帮助。

论坛徽章:
0
4 [报告]
发表于 2003-07-02 17:45 |只看该作者

[原创] 关于日期夹剪啊, 过了几天是几号啊啊。。。。

! 代码没对齐
2 没有注释 别人要先看懂你的代码才知道你要实现什么功能 从软件工程角度来看重写一遍都可以了

3 有必要那么麻烦吗 使用localtime 得到的时间加上 N天对应的秒数 再使用tm 得到日期就OK了

4 能把自己想法写出来还是不错的
希望大家能这样写出自己想法
鼓励一个
下次写得很好的话再加精华
同样各位代码写得很好的话也会加精华的

论坛徽章:
0
5 [报告]
发表于 2003-07-02 20:47 |只看该作者

[原创] 关于日期夹剪啊, 过了几天是几号啊啊。。。。

原帖由 "无双" 发表:


3 有必要那么麻烦吗 使用localtime 得到的时间加上 N天对应的秒数 再使用tm 得到日期就OK了



不用localtime, tm , 你写的出来吗, 3小时之内?

论坛徽章:
0
6 [报告]
发表于 2003-07-02 20:50 |只看该作者

[原创] 关于日期夹剪啊, 过了几天是几号啊啊。。。。

可以

论坛徽章:
0
7 [报告]
发表于 2003-07-02 20:59 |只看该作者

[原创] 关于日期夹剪啊, 过了几天是几号啊啊。。。。

但是使用localtime
tm是最简单的方法

因为你的是一天一天推进的
所以性能并不高
如果是负数就是要后退几天的话
那么能不能实现

论坛徽章:
0
8 [报告]
发表于 2003-07-02 21:52 |只看该作者

[原创] 关于日期夹剪啊, 过了几天是几号啊啊。。。。



  1. struct day_info{
  2.         unsigned int year;        //年份
  3.         unsigned int month;           //1-12
  4.         unsigned int day;        //1-31
  5. };

  6. //修正年
  7. //两上参数都是输入旧值 返回新值
  8. void advance_year(day_info &newdayinfo,int& advance_num)
  9. {       
  10.         newdayinfo.year        +=4*(advance_num/(365*4+1));        //看看要前进多少年
  11.         advance_num        %=365*4+1;                //整理一年内的天数

  12.         if(new_day<0){
  13.                 newdayinfo.year        -=4;
  14.                 advance_num        +=365*4+1;
  15.         }

  16.         while(advance_num<366){
  17.                 if((newdayinfo.year%4==0&& ewdayinfo.year%100!=0)
  18.                                 ||(newdayinfo.year%400==0)){
  19.                         if(advance_num<367)
  20.                                 return ;
  21.                         advance_num-=366;
  22.                 }else{
  23.                         advance_num-=365;
  24.                 }
  25.         }
  26. }

  27. //修正月
  28. //两个参数都是输入旧值返回新值
  29. void advance_month(day_info &newdayinfo,int& advance_num)
  30. {
  31.    newdayinfo.day+=advance_num;
  32.    while(newdayinfo.day>;28){
  33.       switch(newdayinfo.month){
  34.          case 1:
  35.          case 3:
  36.          case 5:
  37.          case 7:
  38.          case 8:
  39.          case 10:
  40.          case 12:
  41.             if(newdayinfo.day<=31)
  42.                return ;
  43.             newdayinfo.day-=31;
  44.             break;

  45.          case 2:
  46.             if((newdayinfo.year%4==0&& ewdayinfo.year%100!=0)
  47.                   ||(newdayinfo.year%400==0)){
  48.                if(newdayinfo.day==29)
  49.                   return ;
  50.                newdayinfo.day--;
  51.             }
  52.             newdayinfo.day-=28;
  53.             break;
  54.             
  55.          default:
  56.             newdayinfo.day-=30;
  57.             break;
  58.       }
  59.       newdayinfo.month++;
  60.       if(newdayinfo.month>;12){
  61.         newdayinfo.month-=12;
  62.         newdayinfo.year++;
  63.       }
  64.    }
  65. }

  66. //可以前进或是后退
  67. //        day[inout]        输入今天 返回advance_num后的天数
  68. //        advance_num        要推进的天数,如果<0那么表示要后退的天数
  69. //        返回                today的值
  70. day_info & day_advance(day_info &today,int advance_num)
  71. {
  72.         advance_num         +=today.day-1;
  73.         today.day        =1;
  74.        
  75.         advance_year(&newdayinfo, advance_num);
  76.         advance_month(day_info &newdayinfo,int& advance_num);
  77. }

复制代码


先写完
等会测试

论坛徽章:
0
9 [报告]
发表于 2003-07-02 22:53 |只看该作者

[原创] 关于日期夹剪啊, 过了几天是几号啊啊。。。。

  1. #include <stdio.h>;
  2. struct day_info{
  3.     unsigned int year;        //年份
  4.     unsigned int month;           //1-12
  5.     unsigned int day;        //1-31
  6. };

  7. //修正年 ,根据advance_num日期修改年份
  8. //两上参数都是输入旧值 返回新值
  9. static void advance_year(day_info &newdayinfo,int& advance_num)
  10. {
  11.     day_info olddayinfo = newdayinfo;
  12.     newdayinfo.year        +=4*(advance_num/(365*4+1));        //看看要前进多少年
  13.     advance_num        %=365*4+1;                //整理一年内的天数

  14.     if(advance_num<0){
  15.         newdayinfo.year        -=4;
  16.         advance_num        +=365*4+1;
  17.     }

  18.     while(advance_num>;365){
  19.         if((newdayinfo.year%4==0&& newdayinfo.year%100!=0)
  20.                 ||(newdayinfo.year%400==0)){
  21.             if(advance_num<367)
  22.                 break ;

  23.             advance_num--;
  24.         }

  25.         advance_num-=365;
  26.         newdayinfo.year+=1;
  27.     }
  28. }

  29. //修正月 ,根据advance_num日期修改月份,可能会进一年
  30. //两个参数都是输入旧值返回新值
  31. static void advance_month(day_info &newdayinfo,int& advance_num)
  32. {
  33.     newdayinfo.day+=advance_num;
  34.     while(newdayinfo.day>;28){
  35.         switch(newdayinfo.month){
  36.             case 1:
  37.             case 3:
  38.             case 5:
  39.             case 7:
  40.             case 8:
  41.             case 10:
  42.             case 12:
  43.                 if(newdayinfo.day<=31)
  44.                     return ;
  45.                 newdayinfo.day-=31;
  46.                 break;

  47.             case 2:
  48.                 if((newdayinfo.year%4==0&& newdayinfo.year%100!=0)
  49.                         ||(newdayinfo.year%400==0)){
  50.                     if(newdayinfo.day==29)
  51.                         return ;
  52.                     newdayinfo.day--;
  53.                 }
  54.                 newdayinfo.day-=28;
  55.                 break;

  56.             default:
  57.                 newdayinfo.day-=30;
  58.                 break;
  59.         }
  60.         newdayinfo.month++;
  61.         if(newdayinfo.month>;12){
  62.             newdayinfo.month-=12;
  63.             newdayinfo.year++;
  64.         }
  65.     }
  66. }

  67. static convert2firstday(day_info &today,int &advance_num)
  68. {
  69.     advance_num         +=today.day-1;
  70.     today.day        =1;

  71.     while(today.month>;1){
  72.         today.month--;
  73.         switch(today.month){
  74.             case 1:
  75.             case 3:
  76.             case 5:
  77.             case 7:
  78.             case 8:
  79.             case 10:
  80.             case 12:
  81.                 advance_num+=31;
  82.                 break;

  83.             case 2:
  84.                 if((today.year%4==0&& today.year%100!=0)
  85.                         ||(today.year%400==0)){
  86.                     advance_num++;
  87.                 }
  88.                 advance_num+=28;
  89.                 break;

  90.             default:
  91.                 advance_num+=30;
  92.                 break;
  93.         }
  94.     }
  95. }

  96. //可以前进或是后退
  97. //        day[inout]        输入今天 返回advance_num后的天数
  98. //        advance_num        要推进的天数,如果<0那么表示要后退的天数
  99. //        返回                today的值
  100. day_info & day_advance(day_info &today,int advance_num)
  101. {
  102.     convert2firstday (today, advance_num);
  103.     advance_year(today, advance_num);
  104.     advance_month(today,advance_num);
  105. }


  106. main()
  107. {
  108.     day_info newday;
  109.     day_info today={2000,3,13};

  110.     int advance_num;
  111.     newday=today;
  112.     while(1){
  113.         printf("new day is :%4d\%2d\%2d\n",
  114.                 newday.year,newday.month,newday.day);
  115.         printf("please input advancenum:\n");
  116.         scanf("%d",&advance_num);

  117.         day_advance(newday,advance_num);
  118.     }
  119. }
复制代码


安装了个BCB
然后调试了一下

论坛徽章:
0
10 [报告]
发表于 2003-07-03 07:10 |只看该作者

[原创] 关于日期夹剪啊, 过了几天是几号啊啊。。。。

好, 已经不错了

10000 天, 没什么误差
100000 天, 误差2天
1000000 天, 误差二十几天

效率比我高点, 算法比我差点, 就算不相上下把 :)

我忘了用 CODE 功能了, 对的不齐, 我从帖在下面把 
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP