ACM:日曆本

題目描述
咱們常常須要使用日曆,因此須要一個能生成日曆的程序。
先要求你寫一個程序,只須要輸入年份,就能生成正確的日曆。
輸入
輸入包含多組測試數據。每組輸入一個整數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;
}
相關文章
相關標籤/搜索