C&C++函数实训-这天星期几?
任务描述
本关任务:编写函数 whatDay,计算某年某月的1号是星期几并返回。
相关知识
要知道某一天是星期几,可以用已知的某一天进行推导。
例如已知公元1年1月1日是星期一,公元2年1月1日则是在星期一基础上加上一整年的天数(要考虑闰年,闰年一年366天,非闰年365天),如果不是1月,例如7月,则要加上1到6月的所有天数,这里也要考虑闰年,因为闰年的二月是29天,非闰年是28天。
这样就可以算出从公元1年1月1日到该年月过了多少天,而过了7天星期不变,所以可以用这种方法推导出公元元年之后的任何一天是星期几。
下面的程序可以计算星期一过了 n 天后是星期几:
w = 1; // 从星期一开始
w = w + n; // n天后
w = w % 7; // 得到0-6,其中0为星期天
// 调整星期天
if(w == 0) w = 7;
编程要求
计算输入数据年月份的1号是星期几并返回(周一到周日分别返回整数1到7)。
其中该函数的参数为输入的两个整数数据:年和月。
提示:由于判断是否闰年有多个地方需要用到,故已把该功能单独实现为一个函数。
代码如下(已删去注释):
#include<iostream>
using namespace std;
int leapYear(int y){
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;
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;
}
if (month==1) nd+=1; else {
int monthl[]={1,31,0,31,30,31,30,31,31,30,31,30,31};
for (int j=0;j<=month-1;j++) {
nd+=monthl[j];
}
if (leapYear(year) && month >=3 ) nd+=29;
if (leapYear(year)==0 && month >=3 ) nd+=28;
}
w=0;
w+=nd;
w=w%7;
if (w==0) w=7;
return w;
}
int main()
{
int y , m , xq ;
cin >> y >> m ;
xq=whatDay(y,m);
cout << y << "年" << m << "月1日是星期";
if (xq==7) cout << "日" << endl ;
else cout << xq << endl ;
return 0;
}