A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 梦缠绕的时候 于 2020-3-6 09:32 编辑

输入年份,打印出该年的日历:[url=][/url]
#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");    }}[url=][/url]



1 个回复

倒序浏览
有问题联系小优:DKA-2018
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马