C++编写日历
- 编写日历要用到蔡勒公式:
蔡勒(Zeller)公式,是一个计算星期的公式,随便给一个日期,就能用这个公式推算出是星期几。
days = (year+year/4+century/4- 2century+26(month+1)/10+day-1)%7 - 其次输出星期数字的时候要注意好空格,确保行列对其!!
- 输出结果:

//输入年份、月份、输出当月日历
/*
1.用户输入年份
2.判断年份输入值是否为0,为0则退出程序
3.判断年份输入值是否小于1582,小于则退出程序
3.用户输入月份
4.判断月份是否正确(1-12),错误则退出程序
5.计算年份是否为闰年,如是闰年则设置二月天数为28天
6.通过蔡勒公式计算当月1号是星期几
7.按顺序排列输出日历
*/
#include <iostream>
//确定蔡勒公式在哪个模板里
using namespace std;
int input_year(); //输入年份
int intput_month(); //输入月份
void output(); //日历输出函数
//声明星期几计算函数
int calc_week(int year,int month,int day);
//声明闰年判断函数
int calc_leap_year(int year);
//声明日历核心函数
void calc_core();
//输入年份
int input_year(){
int year;
cout<<"请输入年份:";
cin>>year;
return year;
}
//输入月份
int input_month(){
int month;
cout<<"请输入月份:";
cin>>month;
return month;
}
//输出日历
void output(int year,int month,int week,int is_leap_year){
char* month_name[12] = {"January","February","March",
"April","May","June","July","August","September","October",
"November","December"};
char* week_name[7] = {"Sun","Mon","Tus","Wed","Thu",
"Fri","Sat"};
int days[12] = {31,28,31,30,31,30,31,31,30,31,30,31};
//当闰年时设置二月为29天
if (is_leap_year){
days[1] = 29;
}
cout<<endl;
//显示年月
cout<<" "<<month_name[month]<<" "<<year<<endl;
//显示星期名
int i=0;
for (i=0; i<7; i++){
cout<<week_name[i]<<" ";
}
cout<<endl;
//显示每月1号前的空白
for(i=0;i<week%7;i++){
cout<<" ";
}
//显示日期
for(i=1;i<=days[month];i++){
if(i<10) cout<<" "<<i<<" ";
else cout<<" "<<i<<" ";
if((i+week)%7==0){
cout<<endl;
}
}
cout<<endl;
}
//蔡勒公式通过年月日计算当天是星期几
int calc_week(int year,int month,int day){
if(month<=2){ //根据蔡勒公式,如果月份小于2,应该按13、14来看
month+=12;
year--;
}
int century = year/100;
year%=100;
int days = (year+year/4+century/4-
2*century+26*(month+1)/10+day-1)%7;
while (days<0){
days+=7;
}
return days;
}
//计算是否为闰年
int calc_leap_year(int year){
if (year%4==0&&year%100!=0||year%400==0){
return 1;
}
return 0;
}
//日历核心函数
void calc_core(){
for(int i=0;;i++){
if(i==1) cout<<"输入0退出日历"<<endl;
int year=input_year();
if(year==0) break;
if(year<=1582){
cout<<"错误!请输入1582年之后的年份"<<endl;
break;
}
int month=input_month();
if(month<=0||month>=13){
cout<<"错误!请输入正确的月份(1-12)"<<endl;
break;
}
int is_leap_year=calc_leap_year(year);
int week=calc_week(year,month,1);
month--; //在output函数中作为数组下标对应起来
output(year,month,week,is_leap_year);
}
}
//主函数
int main(){
calc_core();
return 0;
}