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换成空格,每个数之间有空格,每七个数之间两个空格。

注意闰年的写入。如果用到全局变量需特别注意修改完后对下次输入的影响。

参考代码:

#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;
}

  

 

posted @ 2018-11-19 21:31  omegablank  阅读(486)  评论(0编辑  收藏  举报