【问题描述】已知:公元1年1月1日是星期一,根据输入的年份和月份来输出该年月的日历。
每个星期几占5个字节,右对齐,由于简写显示本身就占3个字节,所以只需要在简写前面多输出两个空格就好了。每个日期数字占5个字节,也是右对齐,这样能使输出的日历上下对齐。
步骤:
1、定义函数leapYear:判断闰年;
2、定义函数whatDay:计算某年某月的1号是星期几;
3、定义函数printMonth:按要求的格式打印某年某月的日历。
#include<iostream>
using namespace std;
int leapYear(int y) //判断是否闰年
//闰年能被4整除且不被100整除或者被400整除
{
if(y%4==0&&y%100!=0||y%400==0)
return 1;
return 0;
}
int whatDay(int year,int month) //计算某年某月的一号是星期几
{
int dyear=0,nd=0,w,lyear=0;//lyear表示闰年,dyear为非闰年,nd为一共多少天
if (year == 1)nd=0;
else{
for (int i=1;i<year;i++){
if(leapYear(i))lyear+=1;//调用判断是否为闰年的函数
else dyear +=1;
}
nd=dyear*365+lyear*366;}//先计算从公元1年到现在这些年有多少天
if(month==1)nd += 1;
else{
int month1[]={1,31,0,31,30,31,30,31,31,30,31,30,31};
for (int j=0;j<=month-1;j++)//month-1,表示计算今年从1月1到所求的月份的一号之前已经过了多少天
{
nd+= month1[j];
}
if (leapYear(year)&&month >=3)nd+=29;//再次判断是否闰年,2月的天数不同
if (leapYear(year)==0&&month >=3)nd+=28;
}
w=0;
w+=nd;
w=w%7;//得到的总天数除7,余下的天数为所求的月份第一天是星期几
if(w==0)w=7;
return w;
}
void printMonth(int year, int month) //打印
{
int day=whatDay(year,month);//得到这个月一号是星期几
int month1[]={1,31,0,31,30,31,30,31,31,30,31,30,31};
if(leapYear(year)) month1[2]=29;
else month1[2]=28;
cout<<" Mon Tue Wed Thu Fri Sat Sun "<<endl;
for(int i=1;i <=month1[month];i++)//i表示这个月的几号
{
if(i==1)
{
for(int j=1;j<day;j++){ //在这个月一号是星期几前均为空格
cout<<" ";
}
}
if(i <10) cout<<" "<< i <<" ";
else cout <<" "<< i <<" "; //10之后的数比10之前的数多一位,所以少一个空格
if ((i+day-1)%7==0) cout <<endl;//七天换一次行,包括纯空格
}
cout <<endl;
}
int main()
{
int year,month;
cout <<"Please enter the year and month:"<<endl;
cin>>year>>month;
printMonth(year,month);
return 0;
}