您的位置:首页 > 编程语言 > C语言/C++

日历查询

2015-09-09 10:02 459 查看
原创!!!之前写了月基数计算公式的修正文章,这里更新日历查询的程序语言,运行环境为vs2010 c++

直接贴上代码:

#include <iostream>
#include <math.h>
#include <iomanip>
using namespace std;

/*
*这些公式只适合于1582年(中国明朝万历十年)10月15日之后的情形!天文学相关规定的。
*计算一年中某一天是星期几的公式:
*
* 1、通用公式:W = [Y-1] + [(Y-1)/4] - [(Y-1)/100] + [(Y-1)/400] + D
* 式中,[]:取整,Y是年份,D是这一天是这年的累计天数,一般考虑每个月的第一天来算,或者是元旦来算。
*
* 2、蔡勒(Zeller)公式:
* w=y+[y/4]+[c/4]-2c+[26(m+1)/10]+d-1
* []:取整,w:星期,y:年,c:世纪,m:月(m>=3,同时1,2月看为13,14)d:日。
*
* 3、基姆拉尔森计算公式:
* W=(d+2*m+3*(m+1)/5+y+y/4-y/100+y/400) % 7
* w:星期,y:年,c:世纪,m:月(m>=3,同时1,2月看为13,14)d:日。
*
*
*
*/

int year,weekday; //全局变量

/*********自己要用的函数***********/
int baseyear(int y); //判断是否是闰年,以便计算年基数,月基数。
int *basemonth(int by); //判断月基数
int whichweek(int y,int m,int d); //计算这天是星期几。
int mywhichweek(int y,int m,int d); //基姆拉尔森计算公式:计算这天是星期几。
void printcalendar(int y);
int bmp[12]={0,3,3,6,1,4,6,2,5,0,3,5}; //平年月基数,365
int bmr[12]={0,3,4,0,2,5,0,3,6,1,4,6}; //闰年月基数,闰年,补回因人为历法规定造成的年度天数与地球实际公转周期的时间差而设立的,2月29天。366

void main()
{
cout<<"(注输入年份为1582年(中国明朝万历十年)10月15日之后,否则出错!)"<<endl;
cout<<"请输入要查询的年份:";
cin>>year;
while(year<1583)
{
cout<<"输入年份错误,请重新输入!"<<endl;
cout<<"(注输入年份为1582年(中国明朝万历十年)10月15日之后,否则出错!)"<<endl;
cout<<"请输入要查询的年份:";
cin>>year;
}
cout<<year<<"年"<<endl;

printcalendar(year);

}

int daysofmonth(int m)
{
switch(m)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
return 31;
case 4:
case 6:
case 9:
case 11:
return 30;
case 2:
if(((year%4==0)&&(year%100!=0))||(year%400==0)) //闰年计算,闰年被4整除且不能被100整除,或者被400整除。
return 29;
else
return 28;
default:
return 0;
}
}

int baseyear(int y) //判断是否是闰年,以便计算年基数,月基数。
{
if(((year%4==0)&&(year%100!=0))||(year%400==0)) //闰年计算,闰年被4整除且不能被100整除,或者被400整除。
return 2; //年基数,闰年返回1
else
return 1; //年基数,平年返回1
}

int *basemonth(int by) //判断月基数,p[12]存月基数。
{
int *base;
if(by==1) //平年
{
base=bmp;
}
if(by==2) //闰年
{
base=bmr;
}
return base;
}

//星期计算公式
//(年+年/4+年/400-年/100-年基数+月基数+日)/7=……余星期几
int whichweek(int y,int m,int d) //计算这天是星期几。
{
int w,by,*bm;
by=baseyear(y);
bm=basemonth(by);
w=(y+y/4+y/400-y/100-by+bm[m-1]+d)%7; //返回星期几,数组下标问题,如10月的月基数存在b[9]中。
return w;
}

int mywhichweek(int y,int m,int d) //基姆拉尔森计算公式:计算这天是星期几。
{
int mt;
if(m==1)
mt=13;
else if(m==2)
mt=14;
else
mt=m;
int w=(d+2*mt+3*(mt+1)/5+y+y/4+y/400-y/100)%7;
return w;
}
void printcalendar(int y)
{
int i,days,firstweekday;
for(i=1;i<=12;i++)
{
cout<<" "<<i<<"月"<<endl;
cout<<setw(5)<<"日"<<setw(5)<<"一"<<setw(5)<<"二"<<setw(5)<<"三"<<setw(5)<<"四"<<setw(5)<<"五"<<setw(5)<<"六"<<endl;
days=daysofmonth(i);
//firstweekday=whichweek(y,i,1); //每个月第一天是星期几 ,ok
firstweekday=mywhichweek(y,i,1); //每个月第一天是星期几,ok
weekday=firstweekday;
for(int k=0;k<weekday;k++)
cout<<setw(5)<<"";
cout<<setw(5)<<1;
for(int i=2;i<=days;i++)
{
weekday=(weekday+1)%7;
if(weekday==0)
cout<<endl;
cout<<setw(5)<<i;
}
cout<<endl;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息