/*
1、閏年的算法:
如果某年能被4整除但不能被100整除,
或者能被400整除,
則該年是閏年.
用表達式表示就是
(year %4 == 0 && year%100 != 0) || (year%400 == 0)
2、計算某壹天是星期幾:
已知1900年的1月1號為星期壹,
然後就可以用某壹天和1900年的1月1號相差的天數對7取余來求星期,
本題是用的公元1年的1月1號作為基準
*/
#include <stdio.h>
#include<conio.h>
#include<stdlib.h>
int IsLeapYear(int); //函數定義
void main()
{
int i;
int day;
int year;
int temp;
int temp_i;
long int Year_days = 0;
int Year_Start = 1;
int Per_Year_Days;
int month_day[]={31,28,31,30,31,30,31,31,30,31,30,31,29};
printf("Please enter the year: ");
scanf("%d",&year); //輸入年份
while(Year_Start < year) //從公元1年開始執行while循環, 該年的壹月壹號為星期壹
{
if( IsLeapYear( Year_Start ) )
Per_Year_Days = 366; //如果是閏年, 則壹年有366天
else
Per_Year_Days = 365; //如果不是閏年, 則壹年有365天
Year_days = Year_days + Per_Year_Days; //Year_days為從公元1年到輸入年份的前壹年的天數的總和
Year_Start++;
}
for( temp = 1; temp <=12; temp++ ) //temp從1到12, 對應壹年內12個月
{
switch( temp ) //用switch語句將temp和12個月對應起來
{
case 1:
printf(" January(%d)\n",year); //壹月
break;
case 2:
printf(" February(%d)\n",year); //二月
break;
case 3:
printf(" March(%d)\n",year); //三月
break;
case 4:
printf(" April(%d)\n",year); //四月
break;
case 5:
printf(" May(%d)\n",year); //五月
break;
case 6:
printf(" June(%d)\n",year); //六月
break;
case 7:
printf(" July(%d)\n",year); //七月
break;
case 8:
printf(" August(%d)\n",year); //八月
break;
case 9:
printf(" September(%d)\n",year); //九月
break;
case 10:
printf(" October(%d)\n",year); //十月
break;
case 11:
printf(" November(%d)\n",year); //十壹月
break;
case 12:
printf(" December(%d)\n",year); //十二月
break;
}
i = Year_days % 7; //每個星期有7天, 故用每年的天數對7取余
printf("Mon\tTue\tWed\tThu\tFri\tSat\tSun\n");
if( i != 0 ) //如果余數不為零
for( temp_i = 0; temp_i < i; temp_i++)
printf("\t"); //則打印空格(這裏用\t代替空格, 更加美觀), 空格數為i
day = 1; //初始化day為1, 為下面的while循環做準備
if( IsLeapYear(year) && temp == 2) //如果輸入的年份是閏年, 並且月份為2
while( day <= month_day[12] ) //day為壹循環變量, 取值為1-365(閏年的話為1-366)
{
if( day >1 ) //如果天數大於壹
if( Year_days % 7 == 0 ) //如果是星期日, 則換行
printf("\n");
if( day >= 10 )
printf("%d\t",day); //打印天數+空格
else
printf("%d\t",day);
Year_days++;
day++;
}
else //如果不滿足"輸入的年份是閏年, 並且月份為2"
while (day <= month_day[temp-1])
{
if( day > 1 )
if( Year_days % 7 == 0 )
printf("\n");
if( day >=10 )
printf("%d\t",day);
else
printf("%d\t",day);
Year_days++;
day++;
}
printf("\n");
if( getch() == 'q' ) //如果輸入為q, 則退出程序
exit(0);
}
getch(); //每按壹次鍵, 打印壹個月份
}
int IsLeapYear( int year )
{
//判斷是否是閏年, 是則返回1, 否則返回0
if ((year %4 == 0) && (year % 100 != 0) ||
(year % 400 == 0) )
return 1;
else
return 0;
}