来看下咯
// 思想
// 依据据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;
}
分享一下咯
[解决办法]
有什么问题?
[解决办法]
呵呵!