UIT2024_Calendar/stu2024/软件2404班钟浩峻.cpp
2024-12-07 16:23:34 +08:00

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");
}
}