CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  基础类

关于日期算法问题!求解!

楼主wangmiao926(wangmiao926(我不牛))2004-07-02 02:46:19 在 VC/MFC / 基础类 提问

用C++算法的基本控制结构(顺序,选择,循环)实现以下需求:      
            输入“年,月,日”     后得出当天所对应的“星期数”!      
            我想了几种算法,但都不简洁!      
            待高招!以对比! 问题点数:20、回复次数:10Top

1 楼skyMountain(天山)回复于 2004-07-03 09:41:50 得分 2

最好不要自己写,太复杂,用CTime或者time_t吧。Top

2 楼wangjs720(听雨舟)回复于 2004-07-03 13:07:33 得分 0

知道年月日,算星期几好像有个工式,不记得了Top

3 楼grasshopperliu(老前辈——曾经沧海)回复于 2004-07-03 15:17:20 得分 2

我找了半天,没找到,以前我好像见过一个。你搜索一下以前的帖子,应该还在。Top

4 楼lanphaday(恋花蝶)回复于 2004-07-03 16:01:48 得分 5

我初学C语言的时候自己写了一个,只用了十几行代码,可惜现在已经没有踪影了.  
  应该是先写个数组,保存一年十二个月的天数,然后定义一个标准日,你得知道这个标准日是星期几,然后算出要处理的日期与标准日相差的天数,除以七,得到余数,如果标准日是星期天,余数就是星期几啦,不过没有星期零的,要转化哦....Top

5 楼888atao(阿涛)回复于 2004-07-03 16:15:09 得分 5

以前写的日历程序  
  你看一下  
   
  #include   <iostream>  
  #include   <stdio.h>  
  #include   <iomanip>  
  using   namespace   std;  
   
  class   MyDate  
  {  
  public:  
  MyDate(int   y   =   1900,   int   m   =   1,   int   d   =   1);  
  int   getYear();  
  int   getMonth();  
  int   getDay();  
  int   getWeek();  
  void   setYear(int   y);  
  void   setMonth(int   m);  
  void   setDay(int   d);  
  void   display();  
  bool   isLeapYear();  
  int   daysInMonth();  
  int   numOfDays();  
  int   getMonthFirstWeek();  
   
  private:  
  int   year,   month,   day;  
  };  
   
  MyDate::MyDate(int   y,   int   m,   int   d):year(y),month(m),day(d)  
  {}  
   
  int   MyDate::getYear()  
  {  
  return   year;  
  }  
   
  int   MyDate::getMonth()  
  {  
  return   month;  
  }  
   
  int   MyDate::getDay()  
  {  
  return   day;  
  }  
   
  void   MyDate::setYear(int   y)  
  {  
  year   =   y;  
  }  
   
  void   MyDate::setMonth(int   m)  
  {  
  month   =   m;  
  }  
   
  void   MyDate::setDay(int   d)  
  {  
  day   =   d;  
  }  
   
  //输出当前月份的日历  
  void   MyDate::display()  
  {  
  cout   <<   "       日       一       二       三       四       五       六"   <<   endl;  
  int   monthLength   =   daysInMonth();  
  int   dayValue   =   1;  
  int   day   =   0,   first   =   getMonthFirstWeek();  
   
  while(day   <   first)  
  {  
  cout   <<   setw(5)   <<   "   ";  
  day++;  
  }  
   
  while(dayValue   <=   monthLength)  
  {  
  cout   <<   setw(5)   <<   dayValue;  
  dayValue++;  
  if   (day   ==   6)  
  cout   <<   endl;  
  day   =   (day+1)%7;  
  }  
   
  if   (day   !=   0)  
  cout   <<   endl;  
  }  
   
  //year是否是闰年  
  bool   MyDate::isLeapYear()  
  {  
  if   ((year%400   ==   0)   ||   ((year%100   !=   0)   &&   (year%4   ==   0)))  
  return   true;  
  else  
  return   false;  
  }  
   
  //year年month月有多少天  
  int   MyDate::daysInMonth()  
  {  
  int   md[12]   =   {   31,   28,   31,   30,   31,   30,   31,   31,   30,   31,   30,   31   };  
  if   (isLeapYear())  
  md[1]   =   29;  
  return   md[month-1];  
  }  
   
  //从year年1月1日到year年monty月1日有多少天  
  int   MyDate::numOfDays()  
  {  
  int   num   =   0;  
  for(int   i=1;   i<month;   i++)  
  num   =   num   +   MyDate(year,   i).daysInMonth();  
  return   num;  
  }  
   
  //year年month月的第一天是星期几  
  int   MyDate::getMonthFirstWeek()  
  {  
  int   ret   =   -1;  
  long   days   =   0;  
  int   week   =   2;  
   
  //得到某年的1月1日是星期几  
  if   (year   >=   1980)  
  {  
  for   (int   i=1980   ;   i<=year;   i++)  
  {  
  ret   =   week;  
  if   (MyDate(i).isLeapYear())  
  week   +=   2;  
  else  
  week   +=   1;  
  week   %=   7;  
  }  
  }  
  else  
  {  
  for   (int   i=1979;   i>=year;   i--)  
  {  
  ret   =   week;  
  if   (MyDate(i).isLeapYear())  
  week   -=   2;  
  else  
  week   -=   1;  
  week   %=   7;  
  if   (week   <   0)  
  {  
  week   =   week>0?week:week*(-1);  
  week   =   7-week;  
  }  
  }  
  }  
   
  //得到某月的第一天是星期几  
  ret   =   (numOfDays()+ret)%7;  
  return   ret;  
  }  
   
  //得到当前日期是星期几  
  int   MyDate::getWeek()  
  {  
  return   (day-1+getMonthFirstWeek())%7;  
  }  
   
  int   main()  
  {  
  int   year;  
  cout   <<   "输入年   :";  
  cin   >>   year;  
   
  for   (int   i=1;   i<=12;   i++)  
  {  
  cout   <<   endl;  
  cout   <<   year   <<   "年"   <<   i   <<   "月"   <<   endl;  
  MyDate(year,   i).display();  
  }  
  return   1;  
  }Top

6 楼888atao(阿涛)回复于 2004-07-03 16:17:28 得分 2

求2002年1月12日是星期几?  
  cout   <<   MyDate(2002,   1,   12).getWeek();  
  Top

7 楼wangmiao926(wangmiao926(我不牛))回复于 2004-07-04 03:28:56 得分 0

我的代码如下,不过运行有:warning   C4700:   local   variable   'n'   used   without   having   been   initialized   还没找到原因!!!!  
  代码:  
  #include<iostream.h>  
  void   main(void)  
          {int   year,month,day,n,m;  
          cout<<"year:"<<"month:"<<"day:"<<endl;  
          cin>>year>>month>>day;  
      if((year%4==0&&year%100!=0)||(year%400==0))//////////////判断是否为闰年  
                switch(month)  
                    {case   1:   n=0;break;  
                    case   2:   n=31;break;  
                    case   3:   n=60;break;//////////////////是闰年则从2月开始每月都多一天  
                    case   4:   n=91;break;    
                    case   5:   n=121;break;  
                    case   6:   n=150;break;  
                    case   7:   n=180;break;  
                    case   8:   n=211;break;  
                    case   9:   n=242;break;  
                    case   10:   n=272;break;  
                    case   11:   n=303;break;  
                    case   12:   n=333;break;  
                    default:   cout<<"there   is   something   wrong!!"<<endl;break;}  
      else   {if(n>31)   n=n-1;   else   n;};//////////////////////不是闰年则从2月开始每月都少一天  
      if(year>=2001)   m=(365*(year-2001)+(n+day))%7;  
      else   m=(365*(2001-year)-(n+day))%7;  
                switch(m)  
                  {case   0   :   cout<<"sunday"<<endl;break;///////////////////能被7整除则我星期日  
                  case   1   :   cout<<"monday"<<endl;break;  
                  case   2   :   cout<<"tuesday"<<endl;break;  
                  case   3   :   cout<<"wednesday"<<endl;break;  
                  case   4   :   cout<<"thursday"<<endl;break;  
                  case   5   :   cout<<"friday"<<endl;break;  
                  case   6   :   cout<<"saturday"<<endl;break;  
                  default:   cout<<"day   out   of   range"<<endl;break;}  
  }  
   
  注:标准日期设定为2001年1月1日     恰好为星期1  
   
  感谢参与讨论!Top

8 楼lanphaday(恋花蝶)回复于 2004-07-04 10:22:45 得分 4

n未被初始化,{if(n>31)   n=n-1;   else   n;};//////////////////////不是闰年则从2月开始每月都少一天  
  执行这一句前n还没有什么值呢。  
   
  所以报错。  
   
  你的编程风格要注意啊,上面那句else n;应该是有些问题的。Top

9 楼wangmiao926(wangmiao926(我不牛))回复于 2004-07-04 14:27:28 得分 0

我觉得就用基本控制语句完全能实现“日历”问题,所以没有考虑数组,函数!Top

10 楼wangmiao926(wangmiao926(我不牛))回复于 2004-07-04 14:52:11 得分 0

"else   n"是有点问题,我的本意是引用上面switch(n)中的n值!Top

相关问题

  • 求解日期算法
  • 算法求解
  • 求解算法
  • 求解算法,急
  • 求解一算法
  • 求解一算法
  • 魔方算法求解?
  • 求解一算法难题!
  • 高分求解算法
  • 求解发牌算法!

关键词

  • 算法
  • mydate
  • year
  • 日期
  • break
  • month
  • 星期几
  • 标准日
  • week
  • day

得分解答快速导航

  • 帖主:wangmiao926
  • skyMountain
  • grasshopperliu
  • lanphaday
  • 888atao
  • 888atao
  • lanphaday

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo