#include<iostream>
#include<cstring>
using namespace std;
#include<stdio.h>
#include<conio.h>
#include <windows.h> //可以访问的函数库的目录D:\Microsoft Visual Studio\VC98\Include\WINDOWS.H
//SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_RED);
int month[12]={31,28,31,30,31,30,31,31,30,31,30,31};
void color_set(int i)
{
switch (i)
{
case 1:
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED);
break;
case 2:
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_BLUE);
break;
case 3:
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_GREEN);
break;
default:
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_RED|FOREGROUND_INTENSITY|FOREGROUND_BLUE|FOREGROUND_GREEN);
};
}
void color_month_print(int year,int day)
{
color_set(3);
printf("\n\n=============================================%d年日历=========================================\n\n",year);
int first_day[12]; //每月的第一天所在的星期
int point[4]={1,1,1,1};//记录一个月正确输出在星期几
bool is_runnian;
if((year%4==0&&year%100!=0)||year%400==0)
{
is_runnian=true;
month[1]=29;
}
else
{
month[1]=28;
is_runnian=false;
}
first_day[0]=day%7;
int i;
for(i=1;i<12;i++)
first_day[i]=(first_day[i-1]+month[i-1])%7;
for(int m=0;m<3;m++) //m代表三大行中的每一行
{
for(int j=0;j<4;j++) //月数、星期格式化输出
{
color_set(3);
printf("|");
if(m*4+j+1>=10)
printf(" %d月 ",m*4+j+1);
else
printf(" %d月 ",m*4+j+1);
printf("| ");
}
printf("\n");
for(i=0;i<4;i++)
{
color_set(3);
printf("|");
color_set(1);
printf("日 ");
color_set(4);
printf("一 二 三 四 五 ");
color_set(2);
printf("六 ");
color_set(3);
printf("| ");
}
printf("\n");
for(int k=0;k<6;k++) //k代表每个月中的每一小行(一个月最多六行)
{
for(int j=0;j<4;j++) //j代表每一大行有四列(即四个月)
{
color_set(3);
cout<<"|";
for(i=0;i<7;i++) //每个月的一小行有7天(即7列)
if((i<first_day[j+m*4]&&k==0)||point[j]>month[j+m*4])printf(" ");
else
{
if(i==0)
color_set(1);
else if(i==6)
color_set(2);
else
color_set(4);
if(point[j]<10)
printf("%d ",point[j]);
else
printf("%d ",point[j]);
point[j]++;
}
color_set(3);
cout<<"| ";
}
cout<<endl;
}
point[0]=point[1]=point[2]=point[3]=1;
color_set(3);
cout<<"==============================================================================================="<<endl;
}
}
/*由于公元日历的编排,每400年是一个大周期,在400年中设置97个闰年,于是2001年与1年的1月1日都是星期一,
对于输入的年号y,y年的1月1日是w,其中w = s mod 7 的余数,0 代表周日,那么s的值如何计算呢?
s=y-1+[(y-1)/4]-[(y-1)/100]+[(y-1)/400]+1*/
int num(int y) //计算出每年第一天是星期几
{
int s,n;
s=y-1+(y-1)/4-(y-1)/100+(y-1)/400+1;
n=s%7;//求出星期几
return n;
}
void chakan_rili(void)
{
int i,sign,y,mm,dd,num1;
char m[3],d[3],str[11];
cout<<"\t\t\t请输入你要查看的年份:";
while(gets(str))
{
int l=strlen(str);
int end=0;
y=0;
sign=0;
for(i=0;i<l;i++)
{
if(!(str[i]>=48&&str[i]<=57))
{
sign=1;
break;
}
else
y=y*10+(str[i]-48);
}
if(sign)
{
cout<<"非法输入,请重新输入正确的年份:\n";
continue;
}
else
{
num1=num(y);
color_month_print(y,num1);
color_set(4);
cout<<"\t\t\t请输入你要查看的月份:";
while(gets(m))
{
int lm=strlen(m);
mm=0;
sign=0;
for(i=0;i<lm;i++)
{
if(!(m[i]>=48&&m[i]<=57))
{
sign=1;
break;
}
else
mm=mm*10+(m[i]-48);
}
if(sign||mm>12||mm<1)
{
cout<<"非法输入,请重新输入正确的月份:\n";
continue;
}
else
{
cout<<"\t\t\t请输入你要查看的该月的某一天:";
while(gets(d))
{
int ld=strlen(d);
dd=0;
sign=0;
for(i=0;i<ld;i++)
{
if(!(d[i]>=48&&d[i]<=57))
{
sign=1;
break;
}
else
dd=dd*10+(d[i]-48);
}
if(sign||dd>month[mm-1]||dd<1)
{
cout<<"非法输入,请重新输入正确的某一天:\n";
continue;
}
else
{
int Td=dd;
if((mm>2)&&((!(y%400))||((y%100)&&(!(y%4)))))
month[1]=29;
else
month[1]=28;
for(i=0;i<mm-1;i++)
Td=Td+month[i];
Td=(Td+num1-1)%7;
color_set(1);
cout<<y<<"."<<mm<<"."<<dd<<"是周"<<Td<<endl;
end=1;
color_set(0);
break;
}
}
}
if(end)
break;
}
}
if(end)
break;
}
}
void process(void)
{
int quit=0;
char select;
while(quit==0)
{
cout<<"\t\t\t **********************"<<endl;
cout<<"\t\t\t\t*1.查看日历 *\n\t\t\t\t*2.清 屏 *\n\t\t\t\t*3.退 出 *\n";
cout<<"\t\t\t **********************"<<endl;
cout<<"\t\t\t\t请输入你的选择:";
select=getche();
switch(select)
{
case '1':
{
printf("\n");
chakan_rili();
break;
}
case '2':
system("cls");
break;
case '3':
quit=1;
break;
default:
cout<<"\n\t\t\t\t您的选择有误,请重新输入!"<<endl;
break;
}
}
}
int main()
{
process();
return 0;
}