首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

来看上咯

2012-09-19 
来看下咯// 思想// 依据据1900年1月1日为星期一// 而平年一年为365天,闰年年为366天// 又根据365%71// 36

来看下咯
// 思想
// 依据据1900年1月1日为星期一
// 而平年一年为365天,闰年年为366天
// 又根据365%7=1
// 366%7=2
// 所以,若是1901年,为平年,
// 则可知,1901年的第一天要比1900年的第一天晚一天,即为星期二
// 也就是说,在1900年之后的每一年,若是平年,则比上一年的星期晚一天,
// 若是闰年的话就晚二天
// 比如1905年1月1日为星期几?
// 先把所有的之前的年以平年来算,可知有
// 1901 1902 1903 1904四个年,每年多一天,就多了四天,
// 而我们也要注意到,1905是闰年,还要多加一天,也就是五天,
// 而1900年的1月1日为星期一,推后五天的话
// 1905年的1月1日就是星期六了
// 计算1905年的三月呢?
// 依此类推,先看下三月这前的天数,就可知三月之前有二个月,
// 在当前的1905年1月1日加上前二个月的天数就可知1905年3月星期了

#include <iostream>
#include<cstdio>
#include <iomanip>

using std::cin;
using std::cout;
using std::endl;
using std::setw;

int MONTH[12]={31,28,31,30,31,30,31,31,30,31,30,31}; //平年的月份天数

//1900年1月1日为星期一
//年份大于等于1900
//月份为1--12
class Calendar
{
public:
  Calendar();
  bool isLeapYear(int y); //判断是否是闰年
  void displayCalendar(); //显示日期
  void setYear(int yy); //设置年份
  void setMonth(int mm); //设置月份
  int getYear(); //得到年份,此函数暂时没有用到
  int coutLeapYear(); //计算从1900到现在yy年之间的闰年的个数
private:
  int yy;
  int mm;
};

Calendar::Calendar()
{

}


void Calendar::displayCalendar() 
{
  int day=0; //1900年1月1日到当年相差的天数,平年加1天,闰年加2天
  int fristDay=0; //此年的第一天的星期数(0--6)
  int tempDay=0; //此月的第一天距此年的第一天的天数
  int dayMonth=0; //当月的天数
  int totalDay=0; //总的相距天数
  int line=0; //换行符,每7个数就换一次行

  day=(yy-1900)+coutLeapYear(); //此相距的天数为相距年数加上闰年年数

  //当年的第一天星期几(0--6)为
  fristDay=day%7;

  //当月到当年第一天的年数为
  for (int i=1;i<mm;i++)
  {
  tempDay+=MONTH[i-1];
  }

  //若是闰年并且月份大于2,则当年的天数再加一天
  if (isLeapYear(this->yy)&&mm>2)
  {
  tempDay=tempDay+1;
  }

  dayMonth=MONTH[mm-1]; //初始记为数组的值,即平年的天数
   
  //若为闰年,且为2月,则为29天,单独列出来
  if (isLeapYear(this->yy)&&mm==2)
  {
  dayMonth=29;
  }

  //从星期一开始输出
  cout<<"year:"<<yy<<" "<<"month:"<<mm<<endl;
  cout<<"mon tue wed thu fri sat sun"<<endl;

  cout<<endl;

  //总的相距天数为
  totalDay=fristDay+tempDay;

  for (i=0;i<totalDay%7;i++)
  {
  //设置为5个字符宽
  cout<<setw(5)<<" ";
  line++; //每输出一个数就统计
  if (0==line%7) //若是到了7个数就换行
  {
  cout<<endl;
  }
  }
   
  for (i=1;i<=dayMonth;i++)
  {
  cout<<setw(5)<<i;  
  line++;
  if (0==line%7) //若是到了7个数就换行
  {
  cout<<endl;
  }
  }

  cout<<endl;
}

int Calendar::coutLeapYear()
{

  int count=0; //统计闰年数目
  for (int i=1900;i<yy;i++) //1900到yy年这间
  {
  if (isLeapYear(i)) //若是闰年则加1
  {
  count++;
  }
  }

  return count;
}

int Calendar::getYear()
{
  return yy;
}

// 根据国际上的标准
// 年数若是能被400整除的就为闰年
// 若是不能被400整除,但能被100整除,则不为闰年
// 若是不能被100整除,但能被4整除,则是闰年


// 简单来说400年中有三个能被4整除的不是闰年
// 如0到400之间,有100 200 300 这三个年不是闰年
// 像1900 也不是闰年
bool Calendar::isLeapYear(int y)
{
  if (0==y%400) //能被400整除为闰年
  {
  return true;
  } 
  else if((0!=y%400)&&(0==y%100)) //不能被400整除,但能被100整除,为平年
  {
  return false;
  }
  else if(0==y%4) //剩下能被4整除就为闰年
  {
  return true;
  }
  else
  {
  return false; //不能被4整除的就是平年
  }
}

void Calendar::setMonth(int mm)
{
  this->mm=mm; //设置月份
}

void Calendar::setYear(int yy)
{
  this->yy=yy; //设置年份
}

int main()
{
  Calendar cal;
  int year;
  int month;

  while(1)
  {
  cout<<"input year(year>=1900):";
  cin>>year;

  while(year<1900) //规定年份必须大于1900
  {
  cout<<"input year(year>=1900):";
  cin>>year;
  }

  cout<<"input month(month>=1&&month<=12):";
  cin>>month;

  while(month>12||month<1) //月份必须在1到12之间
  {
  cout<<"input month:(month>=1&&month<=12)";
  cin>>month;
  }

  cal.setYear(year);
  cal.setMonth(month);

  cal.displayCalendar(); //显示出来

  }

  return 1;
}


分享一下咯

[解决办法]
有什么问题?
[解决办法]
呵呵!

热点排行