158 lines
3.2 KiB
C++
158 lines
3.2 KiB
C++
#include<stdio.h>
|
|
//判断闰年还是平年
|
|
int isleapyear(int year){
|
|
if(year%400==0&&year%4==0&&year%100!=0)
|
|
return 0;//闰年
|
|
else
|
|
return 1;//平年
|
|
}
|
|
//表示指定日期对应的星期几,蔡乐公式
|
|
int getDayOfweek(int year,int month,int day){
|
|
if(month<3){
|
|
year--;
|
|
month+=12;}
|
|
int k = year % 100;
|
|
int j = year / 100;
|
|
int h = (j/ 4 - 2 * j + k + k / 4 + 13 * (month + 1) / 5 + day - 1);
|
|
h= h % 7;
|
|
if (h < 0)
|
|
h += 7;
|
|
return h;
|
|
}
|
|
//单列输出
|
|
//表示输出指定年的日历
|
|
void sureyearcarlender(int year,int isdoubleline){
|
|
int monthday[]={31,31,28+isleapyear(year),31,30,31,30,31,30,31,30,31,30};
|
|
printf("这是%d年的日历\n",year);
|
|
for(int month=1;month<=12;month++){
|
|
|
|
printf("\n%d月\n",month);
|
|
printf(" 日 一 二 三 四 五 六\n");
|
|
//判断月的1号是周几
|
|
int empty,dateweek=getDayOfweek(year,month,1);
|
|
|
|
//1号以前的空格输出
|
|
for(empty=0;empty<dateweek;empty++){
|
|
printf(" ");
|
|
|
|
}// 对后面日期的输出
|
|
|
|
for(int datenum=1;datenum<=monthday[month];datenum++){
|
|
printf("%3d",datenum);
|
|
if((datenum+dateweek)%7==0)//考虑换行时机
|
|
printf("\n");
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
}
|
|
void onedoublelineture(int year){
|
|
int monthday[]={31,31,28+isleapyear(year),31,30,31,30,31,30,31,30,31,30};
|
|
for(int month=1;month<=12;month+=2){
|
|
|
|
printf("\n%d月\n",month);
|
|
printf(" 日 一 二 三 四 五 六\n");
|
|
//判断月的1号是周几
|
|
int empty,dateweek=getDayOfweek(year,month,1);
|
|
|
|
//1号以前的空格输出
|
|
for(empty=0;empty<dateweek;empty++){
|
|
printf(" ");
|
|
}// 对后面日期的输出
|
|
|
|
for(int datenum=1;datenum<=monthday[month];datenum++){
|
|
printf("%3d",datenum);
|
|
if((datenum+dateweek)%7==0)//考虑换行时机
|
|
printf("\n");}
|
|
|
|
}
|
|
}
|
|
void twodoublelineture(int year)
|
|
{
|
|
int monthday[]={31,31,28+isleapyear(year),31,30,31,30,31,30,31,30,31,30};
|
|
for(int month=2;month<=12;month+=2){
|
|
|
|
printf("\n%d月\n",month);
|
|
printf(" 日 一 二 三 四 五 六\n");
|
|
//判断月的1号是周几
|
|
int empty,dateweek=getDayOfweek(year,month,1);
|
|
|
|
//1号以前的空格输出
|
|
for(empty=0;empty<dateweek;empty++){
|
|
printf(" ");
|
|
|
|
}// 对后面日期的输出
|
|
if(month%2==0);
|
|
for(int datenum=1;datenum<=monthday[month];datenum++){
|
|
printf("%3d",datenum);
|
|
if((datenum+dateweek)%7==0)//考虑换行时机
|
|
printf("\n");}
|
|
}
|
|
}
|
|
|
|
void definewhatyearanddate(int year,int month,int day)
|
|
{
|
|
int c=getDayOfweek(year,month,day);
|
|
if(isleapyear(year))
|
|
{printf("\n%d年%d月%d日为闰年\n",year,month,day);}
|
|
else
|
|
{printf("\n%d年%d月%d日为平年\n",year,month,day);}
|
|
printf("%d年%d月%d日为周%d\n",year,month,day,c);
|
|
|
|
}
|
|
int main(){
|
|
int s,year,month,day,m;
|
|
printf("\n1.查询某月某日时周几(空隔)\n");
|
|
printf("\n2.查询某一年的日历(单列输出)\n");
|
|
printf("\n3.查询某一年的日历(双列输出)\n");
|
|
printf("\n4.退出\n");
|
|
scanf("%d",&s);
|
|
if(s!=1&&s!=2&&s!=3&&s!=4)
|
|
{
|
|
printf("\n选项错误,请重新输入\n");
|
|
return m=main();}
|
|
//根据s进行菜单选择
|
|
int c;
|
|
if(s==1)
|
|
{
|
|
c=scanf("%d %d %d",&year,&month,&day);
|
|
if(!day)
|
|
;
|
|
{
|
|
printf("\n输入错误,请重新输入\n");
|
|
return c;}
|
|
definewhatyearanddate(year,month,day);
|
|
|
|
}
|
|
if(s==2)
|
|
{
|
|
scanf("%d",&year);
|
|
sureyearcarlender(year,1);//单列
|
|
|
|
}
|
|
if(s==3)
|
|
{
|
|
scanf("%d",&year);
|
|
onedoublelineture(year);
|
|
printf(" \n");
|
|
twodoublelineture(year);
|
|
//双列
|
|
|
|
}
|
|
|
|
if(s==4)
|
|
|
|
{
|
|
printf("\n已退出\n\n");
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|