#include "stdio.h" #include "math.h" #include "stdlib.h" int main(void) { printf("1.查询对应年份的日历\n2.查询某具体日期的星期\n3.查询对应年份是否为闰年\n"); int num,year,mon,day,a,b,d; printf("**********************\n"); printf("输入查询项目编号\n"); scanf("%d",&num); system("cls");//清屏 if(num==1) { int nums; printf("1.单列输出\n2.双列输出\n"); printf("输入想要表现形式的序号:\n"); scanf("%d",&nums); if(nums==1) { printf("输入年份"); scanf("%d",&year); a=(year%4==0&&year%100!=0||year%400==0); b=((year-1)*365+(year-1)/4-(year-1)/100+(year-1)/400+1)%7;//每年一月一日是周几 if(year!=1582) { for(mon=1;mon<=12;mon++) { switch(mon)//判每月天数 { case 1: day=31; break; case 2: if(a==1) day=29; else day=28; break; case 3: day=31; break; case 4: day=30; break; case 5: day=31; break; case 6: day=30; break; case 7: day=31; break; case 8: day=31; break; case 9: day=30; break; case 10: day=31; break; case 11: day=30; break; case 12: day=31; break; } printf("----------------%d月---------------\n",mon); printf(" 日 一 二 三 四 五 六\n");//一个中文占两个字节 switch(b)//判位置 { case 1: printf("%5c",'\40'); break; case 2: printf("%10c",'\40'); break; case 3: printf("%15c",'\40'); break; case 4: printf("%20c",'\40'); break; case 5: printf("%25c",'\40'); break; case 6: printf("%30c",'\40'); break; } for(int i=1,j=b;i<=day;i++,j++) { printf("%5d",i); if(j%7==6) printf("\n"); } b=(b+day)%7;//下个月的第一天周几 printf("\n"); } } else if(year==1582)//1582的单列输出 { d=((year-1)*365+(year-1)/4-(year-1)/100+(year-1)/400+11)%7; for(mon=1;mon<=12;mon++) { switch(mon) { case 1: day=31; break; case 2: if(a==1) day=29; else day=28; break; case 3: day=31; break; case 4: day=30; break; case 5: day=31; break; case 6: day=30; break; case 7: day=31; break; case 8: day=31; break; case 9: day=30; break; case 10: day=31; break; case 11: day=30; break; case 12: day=31; break; } printf("----------------%d月---------------\n",mon); printf(" 日 一 二 三 四 五 六\n"); switch(d) { case 1: printf("%5c",'\40'); break; case 2: printf("%10c",'\40'); break; case 3: printf("%15c",'\40'); break; case 4: printf("%20c",'\40'); break; case 5: printf("%25c",'\40'); break; case 6: printf("%30c",'\40'); break; } for(int i=1,j=d;i<=day;i++,j++) { if(mon==10) { if(i>4&&i<15) continue; printf("%5d",i); if(i==16||i==23||i==30) { printf("\n"); } } else { printf("%5d",i); if(j%7==6) printf("\n"); } } if(mon==10) { d=(d+day+ 1)%7;//下个月第一天是周几 printf("\n"); } d=(d+day)%7;//下个月第一天是周几 printf("\n"); } } } else if(nums==2)//双列 { printf("输入年份"); scanf("%d",&year); a=(year%4==0&&year%100!=0||year%400==0); b=((year-1)*365+(year-1)/4-(year-1)/100+(year-1)/400+1)%7;//每年一月一日是周几 for(mon=1;mon<=12;mon++) { switch(mon)//判每月天数 { case 1: day=31; break; case 2: if(a==1) day=29; else day=28; break; case 3: day=31; break; case 4: day=30; break; case 5: day=31; break; case 6: day=30; break; case 7: day=31; break; case 8: day=31; break; case 9: day=30; break; case 10: day=31; break; case 11: day=30; break; case 12: day=31; break; } printf("----------------%d月----------------|",mon++); printf("----------------%d月----------------\n",mon); printf(" 日 一 二 三 四 五 六"); printf(" 日 一 二 三 四 五 六\n"); switch(b)//判位置 { case 1: printf("%5c",'\40'); break; case 2: printf("%10c",'\40'); break; case 3: printf("%15c",'\40'); break; case 4: printf("%20c",'\40'); break; case 5: printf("%25c",'\40'); break; case 6: printf("%30c",'\40'); break; } for(int i=1,j=b;i<=day;i++,j++) { printf("%5d",i); if(j%7==6) printf("\n"); } b=(b+day)%7;//下个月的第一天周几 printf("\n"); } } } else if(num==2)//判星期 { int year,mon,day,a,b,c,d,e ; printf("输入想要查询的具体日期\n"); printf("年:\n"); scanf("%d",&year); printf("月:\n"); scanf("%d",&mon); printf("日:\n"); scanf("%d",&day); int arr[13]={0,31,28,31,30,31,30,31,31,30,31,30,31}; if(year==1582) arr[10]=21; a=(year%4==0&&year%100!=0||year%400==0); b=((year-1)*365+(year-1)/4-(year-1)/100+(year-1)/400+1)%7; d=((year-1)*365+(year-1)/4-(year-1)/100+(year-1)/400+11)%7; if(year>1582) { if(a==1) arr[2]=29; for(int i=0;i10) { for(int i=0;i