#include<iostream>
#include <string>
#include <stdio.h>
#include <iomanip>
int year,month;
using namespace std;
bool isRunYear(int year);
long year2day(int year);
int month2day(int month,int year);
void zhuti();
int main()
{
std::cout<<"\n\n\t\t——尊敬的会员,欢迎您光临普通日历查询系统——"<<std::endl;
//提示输入密码和账号,如果错误则退出
std::string account = "1"; //账号变量
std::string password = "1";//密码变量
//第一步:实现密码的控制,如果输入错误,根据选择继续或者退出
do{
std::cout<<"请输入您的会员账号:";
std::cin>>account;
std::cout<<"请输入您的会员密码:";
std::cin>>password;
std::cout<<"\n-------------------------------------------------------------------------\n";
if(account=="1"&&password=="1")
{
zhuti();//跳出循环执行主体代码
}
else
{
break; //在没有输入正确的时候,做出的择
}
}while(true);
return 0;
}
void zhuti(){
std::cout<<"\n\n\t\t***************欢 迎 使 用 万 年 历***********";
int sumyear = 0,yushu,i,n;
int summonth = 0,zongday,j;
string answer;
//第二步:用循环控制是否继续查询日历
std::cout<<"\n请选择年份: ";
std::cin>>year;
std::cout<<"\n请选择月份: ";
std::cin>>month;
//第三步:判断输入年份是否是闰年
sumyear=year2day(year);//第四步:计算输入的年份之前的天数
for(n=1;n<month;++n){
summonth=summonth+month2day(n,year);
}//第五步:计算输入月份之前的天数
zongday=sumyear+summonth; //第六步:求出距离1900年1月1日的天数
yushu=zongday%7;//第七步:计算输入月份的第一天是星期几
std::cout<<"星期日 星期一 星期二 星期三 星期四 星期五 星期六"<<endl;
for(i=1;i<=month2day(month,year);++i){
if(yushu==6){
if(i%7==0){
cout<<setw(yushu)<<i<<endl;
continue;
}
}
if(yushu==0){
if(i==13||i==20||i==27){
cout<<i<<endl;
continue;
}
if(i==1){
cout<<setw(9)<<1;
cout<<setw(8)<<2;
cout<<setw(8)<<3;
cout<<setw(8)<<4;
cout<<setw(9)<<5;
i+=4;
continue;
}
if(i==6){
cout<<setw(7)<<i<<endl;
continue;
}
}
if(yushu==1){
if(i==19||i==12||i==26){
cout<<i<<endl;
continue;
}
if(i==1){
cout<<setw(17)<<1;
cout<<setw(8)<<2;
cout<<setw(8)<<3;
i+=3;
continue;
}
if(i==5){
cout<<setw(8)<<i<<endl;
continue;
}
}if(yushu==2){
if(i==11||i==18||i==25){
cout<<i<<endl;
continue;
}
if(i==1){
cout<<setw(26)<<1;
cout<<setw(8)<<2;
cout<<setw(8)<<3;
i+=2;
continue;
}
if(i==4){
cout<<setw(8)<<i<<endl;
continue;
}
}if(yushu==3){
if(i==10||i==17||i==24){
cout<<i<<endl;
continue;
}
if(i==1){
cout<<setw(35)<<1;
cout<<setw(8)<<2;
i+=1;
continue;
}
if(i==3){
cout<<setw(8)<<i<<endl;
continue;
}
}if(yushu==4){
if(i==9||i==16||i==23||i==30){
cout<<i<<endl;
continue;
}
if(i==1){
cout<<setw(44)<<1;
i+=0;
continue;
}
if(i==2){
cout<<setw(5)<<i<<endl;
continue;
}
}if(yushu==5){
if(i==8||i==15||i==29||i==22){
cout<<i<<endl;
continue;
}
if(i==1){
cout<<setw(49)<<1<<endl;
continue;
}
}
cout<<setw(yushu)<<i<<'\t';
}
//第八步:打印日历(注意需要打印输入月份第一天之前所对应星期的空格)
cout<<endl;
cout<<"按enter继续"<<endl;
fflush(stdin);
getchar();
zhuti();
}
bool isRunYear(int year){
if((year%4==0&&year%100!=0)||(year%400==0)){
return true;
}else{
return false;
}
}
long year2day(int year){
int i;
long sum=0;
for(i=1900;i<year;i++){
if(isRunYear(i)){
sum+=366;
}else{
sum+=365;
}
}
return sum;
}
int month2day(int month,int year){
int day=0;
switch(month){
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
day=31;
break;
case 4:
case 6:
case 9:
case 11:
day=30;
break;
case 2:
if(isRunYear(year)){
day=29;
}else{
day=28;
}
break;
}
return day;
}
运行结果: