编写一个程序,输出当年的月历。
显示效果如:
#include<stdio.h> #include <stdlib.h> #include <string.h> typedef enum bool { false, true }bool; bool isLeapYear(int year)//判断是否闰年 { if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) { return true; } else { return false; } } int getMonthDays(int year, int month)//获得该月天数 { int days = 0; switch (month) { case 1: case 3: case 5: case 7: case 8: case 10: case 12: days = 31; break; case 4: case 6: case 9: case 11: days = 30; break; case 2: if (isLeapYear(year)) { days = 29; } else { days = 28; } break; } return days; } void showMonth(int days, int startday)//输出月历 { const char weeks[][4] = { "SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT" }; for (int i = 0; i < 6; i++) { printf("%s ", weeks[i]); } printf("%s\n", weeks[6]); for (int i = 1; i <= days; i++) { if (i == 1) { for (int j = 0; j < startday; j++) { printf(" "); } printf("%3d ", 1); } else { printf("%3d ", i); } if ((i + startday) % 7 == 0) { putchar('\n'); } } putchar('\n'); } int main(void) { //以1970年1月1日(星期四)为基准 int year, month, monthDays, startday, days; const int startYear = 1970; printf("请输入年月例:2015 8\n"); while (scanf("%d %d", &year, &month) != EOF) { monthDays = getMonthDays(year, month); days = 0; for (int i = startYear; i < year; i++) { if (isLeapYear(i)) { days += 366; } else { days += 365; } } for (int i = 1; i < month; i++) { days += getMonthDays(year, i); } startday = (days + 4) % 7; //printf("%d\n", startday); showMonth(monthDays, startday); printf("请输入年月例:2015 8\n"); } return 0; }
输出:
请输入年月例:2015 8 2005 7 SUN MON TUE WED THU FRI SAT 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 请输入年月例:2015 8
Keep it simple!