打印指定年份的日历
输入年份,打印出该年的日历:
#include <stdio.h> void PrintEnter(int mod); void PrintSkip(int lastday); void PrintTitle(int year,int month); int JudgeDays(int year, int month); void PrintMonth(int year, int mod, int lastday); int main() { int year; //每一个月的最后一天 int lastday = 1; printf("请输入年份:"); scanf("%d",&year); //判断这一年的第一天为星期几 //公式: (5(year-1)/4-(year-1)/100+(year-1)/400)%7+1 int flag = (5 * (year-1) / 4 - (year-1) / 100+(year-1)/400) % 7+1; //计算开头有几个\t int skip = flag - 1; //判断是否需要换行 判断每月最后一天 int mod = skip; //直接调用PrintMonth函数打印月历 PrintMonth(year,mod,lastday); return 0; } /** * @brief JudgeDays 判断月份的天数 * @param year 判断年份是否为闰年 * @param month 需要判断的月份 * @return 返回值为月份的天数 */ int JudgeDays(int year, int month) { if(month==4||month==6||month==9||month==11) return 30; else if(month==2) { //判断年份是否为闰年 if(year % 400 == 0 || (year % 100 !=0 && year % 4 == 0)) return 29; else return 28; } else return 31; } /** * @brief PrintTitle 打印月份的开头 * @param month 需要打印的月份 */ void PrintTitle(int year, int month) { printf("\n"); printf("%d年%d月\n",year,month); printf("--------------------------------\n"); printf("一 二 三 四 五 六 日\n"); } /** * @brief PrintSkip 解决每一月开头的空格问题 * @param lastday 上一月份的最后一天 */ void PrintSkip(int lastday) { int i; for(i = 0;i < lastday;i++) { printf(" "); } } /** * @brief PrintEnter 判断是否换行 * @param mod 换行的标志(判断是否是七的倍数) */ void PrintEnter(int mod) { if(mod % 7 ==0) printf("\n"); } /** * @brief PrintMonth 打印月历 * @param year 月历的年数 * @param mod 换行的标志 * @param lastday 每个月最后一天的标识 */ void PrintMonth(int year, int mod, int lastday) { //打印月历的头 PrintTitle(year,1); //打印空格 PrintSkip(lastday); //打印一月月历 int i; for(i = 1;i <= 31;i++) { mod++; printf("%-5d",i); //换行 PrintEnter(mod); //判断一月的最后一天 if(i == 31) lastday = mod % 7; } //每打印一个月换一行 printf("\n"); int month; for(month = 2;month < 13;month++) { //打印月历的头 PrintTitle(year,month); //打印空格 PrintSkip(lastday); //打印二月到十二月的日历 int i; for(i = 1;i <= JudgeDays(year, month);i++) { mod++; printf("%-5d",i); //换行问题 PrintEnter(mod); //判断每月的最后一天 if(i == JudgeDays(year, month)) lastday = mod % 7; } //每打印一个月换一行 printf("\n"); } }
作者:陈太浪
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须在文章页面给出原文连接,否则保留追究法律责任的权利。