题目
- 上一次日历的代码优化
输出采用平时的星期日在前的顺序
代码
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> //计算某个日期距离年初多少天 int day_count(int y,int m,int d) { int i,days=0; int a[13]={0,31,28,31,30,31,30,31,31,30,31,30,31}; for(i=0;i<m;i++) { days+=a[i]; } days+=d; if(m>2 && (y%4==0 && y%100!=0 || y%400==0)) { days++; } return days; } //计算每个月的第一天是周几 int weekdays(int y1,int m1) { int d1=1,y2=2018,m2=2,d2=18,i,a,b,c=0,days,flag; a=day_count(y1,m1,d1); b=day_count(y2,m2,d2); if(y1<y2) { for(i=y1;i<y2;i++) { if(i%4==0 && i%100!=0 || i%400==0) { c++; } } days=b-a+(y2-y1)*365+c; }else{ for(i=y2;i<y1;i++) { if(i%4==0 && i%100!=0 || i%400==0) { c++; } } days=a-b+(y1-y2)*365+c; } if(y1<y2 || y1==y2 && m1<m2 || y1==y2 && m1==m2 && d1<d2) { flag=(7-days%7)%7; }else{ flag=days%7; } return flag; } //打印两个并列的月份 void year_print(int y,int m) { int k1,k2,h,flag0=0,flag1=1,i=1,j=1; int a[13]={0,31,28,31,30,31,30,31,31,30,31,30,31}; printf("| %d 日 一 二 三 四 五 六 %3d 日 一 二 三 四 五 六 |\n",m,m+6); k1=weekdays(y,m);k2=weekdays(y,m+6); if(m==2) { flag0=(y%4==0 && y%100!=0 || y%400==0); } printf("| "); for(h=k1;h>0;h--) { printf(" "); } while(i<=a[m] || j<=a[m+6])//while(i<=a[m]+flag0 || j<=a[m+6]) { if(i!=1) { printf("| "); } for(;;i++,k1++) { if(i<=a[m]+flag0) { printf(" %2d",i); }else{ printf(" "); } if(k1!=0 && k1%6==0) { i++; k1=0; break; } } printf(" "); if(flag1) { for(h=k2;h>0;h--) { printf(" "); } flag1=0; } for(;;j++,k2++) { if(j<=a[m+6]) { printf(" %2d",j); }else{ printf(" "); } if(k2!=0 && k2%6==0) { k2++; j++; printf(" |\n"); break; } if(k2==7) { k2=0; } } } } int main() { int year,mon; printf("请输入具体年份:"); while(fflush(stdin),scanf("%d",&year)!=EOF) { mon=1; printf("|------------------------%d年-----------------------|\n",year); while(mon<=6) { year_print(year,mon); mon++; } printf("|-----------------------------------------------------|\n"); printf("请输入具体年份:"); } system("pause"); }
执行结果