輸入年份如2013,顯示2013年的月曆。
思路:
1.查找每個月1号是星期幾(這裡利用了1990年1月1号是星期一)
計算年份如2013年1月1号到1990年1月1号有Days天,Day%7得到星期索引WeekDay
#include <stdio.h>
#define BOOL int
#define TRUE 1
#define FALSE 0
int GetWeekDay(int year, int month, int day); /* 擷取某一年,某一月,某一天是星期幾 */
void PrintCalendar(int year); /* 列印第year年的月曆 */
BOOL IsLeap(int year); /* 判斷是否為閏年 */
int main()
{
int year;
// char* week[] = {"星期天", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"}; /* 字元指針數組 */
// int WeekDay = GetWeekDay(2000, 1, 1);
// printf("今天是星期:%s\n", week[WeekDay]);
printf("請輸入要查詢的年份:\n");
scanf("%d", &year);
PrintCalendar(year);
return 0;
}
/*-------------------------------------------------------------------------
功能:擷取year年,month月,day天是星期幾 這裡利用了1900年1月1号是星期一
輸入:年份year,月份month日期day
輸出:星期索引
---------------------------------------------------------------------------*/
int GetWeekDay(int year, int month, int day)
{
int count, Week_Index,i;
int Day[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; /* 每月的天數 */
int MonthAdd[12] = {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334}; /* 每月前所有月份的天數之和 */
count = MonthAdd[month - 1]; /* 月份month前面所有月份的天數 */
count = count + (year - 1900) * 365;
count = count + day; /* 與1900年1月1号相差多少天 */
if(month > 2 && IsLeap(year)) /* 月份month超過2月份 且是閏年 */
count ++;
for(i = 1900; i < year; i ++)
{
if(IsLeap(i)) /* 如果是閏年 */
{
count ++;
}
}
Week_Index = count % 7;
return Week_Index;
}
/*------------------------
功能:列印year年的月曆
輸入:year年份
輸出:year年的月曆
--------------------------*/
void PrintCalendar(int year)
{
int i, j, k;
int WeekDay;
int Day[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int MonthDays;
for(i = 1; i < 13; i ++) /* 依次列印每個月份的月曆 */
{
int temp = 1;
MonthDays = Day[i];
if(IsLeap(year) && i == 2) /* 閏年第二個月為29天 */
MonthDays = 29;
WeekDay = GetWeekDay(year, i, 1); /* 擷取每個月1号 星期索引 */
printf("%d月\n", i);
printf("日\t一\t二\t三\t四\t五\t六\n");
for(j = 1; j <= 42; j ++) /* 每個月月曆列印六行 */
{
if(WeekDay != 0)
{
printf("\t");
WeekDay --;
if(j % 7 == 0)
printf("\n");
continue;
}
if(MonthDays > 0) /* 每個月的月曆 */
{
printf("%d\t", temp);
temp ++;
if(j % 7 == 0)
printf("\n");
MonthDays --;
}
else
printf("\t");
}
printf("\n");
}
}
/*--------------------------
功能:判斷year是否為閏年
輸入:年份year
輸出:閏年TRUE平年FALSE
---------------------------*/
BOOL IsLeap(int year)
{
BOOL result;
if(((year % 100 == 0) && (year %400 == 0)) || ((year % 100 != 0) && (year % 4 == 0))) /* 閏年 */
{
result = TRUE;
}
else
result = FALSE;
return result;
}