題目描述 咱們常常須要使用日曆,因此須要一個能生成日曆的程序。 先要求你寫一個程序,只須要輸入年份,就能生成正確的日曆。 輸入 輸入包含多組測試數據。每組輸入一個整數Y(1800<=Y<=2100),表示公元年份。 輸出 對於每組輸入,輸出對應的日立本。選中下面的輸出樣例查看具體的輸出格式,注意空格的輸出。 樣例輸入 2010 樣例輸出 2010 January February March Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa 1 2 1 2 3 4 5 6 1 2 3 4 5 6 3 4 5 6 7 8 9 7 8 9 10 11 12 13 7 8 9 10 11 12 13 10 11 12 13 14 15 16 14 15 16 17 18 19 20 14 15 16 17 18 19 20 17 18 19 20 21 22 23 21 22 23 24 25 26 27 21 22 23 24 25 26 27 24 25 26 27 28 29 30 28 28 29 30 31 31 April May June Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa 1 2 3 1 1 2 3 4 5 4 5 6 7 8 9 10 2 3 4 5 6 7 8 6 7 8 9 10 11 12 11 12 13 14 15 16 17 9 10 11 12 13 14 15 13 14 15 16 17 18 19 18 19 20 21 22 23 24 16 17 18 19 20 21 22 20 21 22 23 24 25 26 25 26 27 28 29 30 23 24 25 26 27 28 29 27 28 29 30 30 31 July August September Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa 1 2 3 1 2 3 4 5 6 7 1 2 3 4 4 5 6 7 8 9 10 8 9 10 11 12 13 14 5 6 7 8 9 10 11 11 12 13 14 15 16 17 15 16 17 18 19 20 21 12 13 14 15 16 17 18 18 19 20 21 22 23 24 22 23 24 25 26 27 28 19 20 21 22 23 24 25 25 26 27 28 29 30 31 29 30 31 26 27 28 29 30 October November December Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa 1 2 1 2 3 4 5 6 1 2 3 4 3 4 5 6 7 8 9 7 8 9 10 11 12 13 5 6 7 8 9 10 11 10 11 12 13 14 15 16 14 15 16 17 18 19 20 12 13 14 15 16 17 18 17 18 19 20 21 22 23 21 22 23 24 25 26 27 19 20 21 22 23 24 25 24 25 26 27 28 29 30 28 29 30 26 27 28 29 30 31 31
這題就是考格式化輸出,大體思路:數組
每次輸出三個月,三個月裏能放日期的位置有:7x6x3=126個,因此開這麼大的一維int數組,所有置零,把每一個月應該的日期寫入相應的位置(一月第一行、二月第一行、三月第一行、一月第二行、二月第二行...),而後輸出,每21個數換行。輸出是依次輸出,寫入是間隔寫入。測試
輸出時注意把以前的0換成空格,每一個數之間有空格,每七個數之間兩個空格。blog
注意閏年的寫入。若是用到全局變量需特別注意修改完後對下次輸入的影響。get
參考代碼:string
#include<stdio.h> #include<string.h> int rili[200];//每三個月全部日期存在這裏 int monthnumber[12]={31,28,31,30,31,30,31,31,30,31,30,31}; char skr[100]="Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa"; int insert(int year,int month); int getweek(int year,int month,int day); int main(){ int year,day,week,number,i; while(scanf("%d",&year)!=EOF){ if(year%4==0&&year%100!=0||year%400==0){//判斷是否閏年 monthnumber[1]=29; } else{ monthnumber[1]=28; } printf(" %d ",year); printf("\n\n"); puts(" January February March "); puts(skr); memset(rili,0,sizeof(rili)); for(i=1;i<=3;i++){ insert(year,i); } for(i=1;i<=126;i++){ rili[i-1]>0?printf("%2d",rili[i-1]):printf(" "); if(i%21==0) putchar(10); else if(i%7==0) printf(" "); else putchar(' '); } puts(" April May June "); puts(skr); memset(rili,0,sizeof(rili)); for(i=4;i<=6;i++){ insert(year,i); } for(i=1;i<=126;i++){ rili[i-1]>0?printf("%2d",rili[i-1]):printf(" "); if(i%21==0) putchar(10); else if(i%7==0) printf(" "); else putchar(' '); } puts(" July August September "); puts(skr); memset(rili,0,sizeof(rili)); for(i=7;i<=9;i++){ insert(year,i); } for(i=1;i<=126;i++){ rili[i-1]>0?printf("%2d",rili[i-1]):printf(" "); if(i%21==0) putchar(10); else if(i%7==0) printf(" "); else putchar(' '); } puts(" October November December "); puts(skr); memset(rili,0,sizeof(rili)); for(i=10;i<=12;i++){ insert(year,i); } for(i=1;i<=126;i++){ rili[i-1]>0?printf("%2d",rili[i-1]):printf(" "); if(i%21==0) putchar(10); else if(i%7==0) printf(" "); else putchar(' '); } } return 0; } int getweek(int year,int month,int day){//蔡勒公式-判斷某天是星期幾 if(month==1||month==2){ year--; month+=12; } int c=year/100; int y=year-c*100; int week=(c/4)-2*c+(y+y/4)+(13*(month+1)/5)+day-1; while(week<0){ week+=7; } week%=7; return week; } int insert(int year,int month){//寫入日期 int number=1; int week,i; week=getweek(year,month,1); for(i=week+((month-1)%3)*7;i<126&&number<=monthnumber[month-1];i++){ if(i%7==0&&i!=week+((month-1)%3)*7) i+=14; rili[i]=number++; } return 0; }