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