计算某日是星期几
//主程序;
//----------------------------------------------+------------------------------------------------*/
//v1;计算星期;
//--计算某个日期是星期几,[可先判断某年1月1号是星期几;]
//----------------------------------------------+------------------------------------------------*/
//主程序;
//---------------------------------------------*/
//引用库;
#include <iostream>
using namespace std;
//声明本地函数;
int cWeek(int y, int m, int d); //计算某日星期;
//---------------------------------------------*/
//v1;20210201;主函数;--计算星期;
int main()
{
//定义字符窗口;
system("title 计算星期"); //设置cmd窗口标题;
system("mode con cols=33 lines=10"); //设置cmd窗口宽高=字符数;
//键盘输入;
int year, month, day;
cout <<"请输入: 年 月 日" <<endl;
cin >>year >>month >>day;
//计算及屏幕输出;
int iweek = cWeek(year,month,day); //定义星期的整数iweek;[=0~6;]
cout <<"星期";
const char cnw[15] = "日一二三四五六"; //包括串尾符'\0';[即2*7+1;]
//cout <<cnw[iweek*2]<<cnw[iweek*2+1] <<endl; //下标索引;
char *p = &cnw[0] +iweek*2; //指针索引;--定义指针并赋值;
cout <<*p<<*(p+1) <<endl; //一个汉字由左右两部分点阵合成;
system("pause");
return 0;
}
//---------------------------------------------*/
/*/v0;20210127;主函数;
int main()
{
//定义字符窗口;
system("title 计算星期"); //设置cmd窗口标题;
system("mode con cols=33 lines=10"); //设置cmd窗口宽高=字符数;
//键盘输入;
int year, month, day;
cout << "请输入: 年 月 日" <<endl;
cin >>year >>month >>day;
//计算及屏幕输出;
int iweek=cWeek(year,month,day); //星期的整数iweek=0~6;
const char cnw[15]="一二三四五六日"; //包括串尾符'\0';[即2*7+1;]
//cout <<"星期" <<cnw[iweek*2]<<cnw[iweek*2+1] <<endl;
char *p=&cnw[0]+iweek*2; //定义指针并赋值;
cout <<"星期" <<*p<<*(p+1) <<endl; //一个汉字由左右两部分点阵合成;
system("pause");
return 0;
}
//----------------------------------------------+------------------------------------------------*/
//定义本地函数;
//---------------------------------------------*/
/*/公式说明;
1.使用基姆拉尔森公式计算星期: [星期1到7对应余数0到6;]
Wk= (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400) mod 7;
2.按习惯修正基姆拉尔森公式;[星期日到六对应余数0到6;]
Wk= (d+1+2*m+3*(m+1)/5+y+y/4-y/100+y/400) %7;
公式中d表示日, m表示月, y表示年;
设公元0年1月1日为星期日,以3月1日星期3为计算起点;
公式包括四个部分;其中:
d+1是星期日修正;[星期日到六对应余数0到6;]
+2*m+3*(m+1)/5是月差计算;
+y是年差;[因平年365%7=1;故每年+1;]
+y/4-y/100+y/400是闰年计算;
其中重点是月差计算:
因平年2月为28天,其月差为0;则小月月差为2;大月月差为3;
设该年月份为3~14月,包括下年1~2月;
[其目的是将2月闰年放到当年最后,以便简化计算公式;]
3.特别注意:
在公式中把1月和2月看成是上一年的13月和14月;
即语句 if (m==1 || m==2){ m+=12; y--;}
例如:2021-1-27看成 2020-13-27来代入公式计算;
//---------------------------------------------*/
//v1;20210201;计算星期cWeek;[=Calculate Week;基姆拉尔森公式;]
int cWeek(int y, int m, int d) //计算某日星期;
{
if(m==1 ||m==2){ m+=12; y--; }
int wk=(d + 2*m+3*(m+1)/5 + y + y/4-y/100+y/400) %7;
return (wk+1)%7; //修正映射;[星期日对应0;]
}
//---------------------------------------------*/
/*/v0;20210127;计算星期cWeek;[=Calculate Week;基姆拉尔森公式;]
int cWeek(int y, int m, int d) //计算某日星期;
{
if(m==1||m==2){ m+=12; y--; }
int wk=(d + 2*m+3*(m+1)/5 + y + y/4-y/100+y/400) %7;
return wk; //原映射;[星期日对应6;]
}
//----------------------------------------------+------------------------------------------------*/
//----------------------------------------------+------------------------------------------------*/