万年历【C语言】

想做个年历,根据年份,自动排出该年的年历


思路

  • 获得一个合法的年份
  • 计算该年份每个月1号所属星期
  • 挨月排列打印(显示)出来

一些准备工作

  • 根据日期(年月日)得到星期的公式:w = (d + 1 + 2*m + 3*(m+1)/5 + y + y/4 - y/100 + y/400) % 7
  • 判断是闰年的条件: 能被4整除且不能被100整除,或者能被400整除
  • IDE: VC++6.0

开始写代码

  • 预处理指令:
# include <stdio.h>
  • 主函数:
int main(void)
{
    int days[12] = {31,28,31,30,31,30,31,31,30,31,30,31};   //每月天数,0到12月
    int first_day[12] = {0};    //每月第一天是星期几,0到6
    int year = 0;               //年份
    int i = 0;
 
    while(1)
    {
        //获取年份
        printf("Year: ");
        scanf("%d", &year);

        //检查所给年份的合理性
        if ( ! isAvailable(year) )
            break;
    }

    //获取该年每月所属星期
    getDay(first_day, year);

    //如果年份为闰年,修改2月的天数
    if ((year%4==0 && year%100!=0) || (year%400==0))
            days[1] = 29;

    //画日历
    drawCalendar(days, first_day);

    return 0;
}
  • 自定义函数(isAvailable(),getDay(),drawCalendar()):
int isAvailable(int year)
{
    if (year > 0)
        return 0;
    return 1;
}
void getDay(int first_day[], int y)
{
    int m = 0;
    int d = 1;
    int w = 0;

    for (m=3; m<=12; m++)
    {
        w = (d + 1 + 2*m + 3*(m+1)/5 + y + y/4 - y/100 + y/400) % 7;
        first_day[m-1] = w;
    }

    y -= 1;
    for (m=13; m<=14; m++)
    {
        w = (d + 1 + 2*m + 3*(m+1)/5 + y + y/4 - y/100 + y/400) % 7;
        first_day[m-13] = w;
    }
}
void drawCalendar(int days[], int first_day[])
{
    int space = 0;
    int d = 0, i=0, j = 0;

    for (i=0; i<12; i++)
    {
        space = first_day[i];

        //画表头和月份
        printf("                 %2d 月  \n", i+1);
        printf("|----------------------|\n");
        printf("| 日 一 二 三 四 五 六 |\n");
        printf("|----------------------|\n|");

        //画1号前的空格
        for (j=0; j<space; j++)
            printf("   ");

        //开始画号数
        for (d=1; d<=days[i]; d++)
        {
            printf(" %2d", d);
            if ((d+space)%7==0)
                printf(" |\n|");
        }

        //画完号数,填补空格
        space = 7 - (d-1+space)%7;
        for (j=0; j<space; j++)
            printf("   ");

        //画表尾
        printf(" |\n|----------------------|\n");
    }
}

如果把此函数写在main函数后面,记得在main函数前面某行处,加上函数声明!

编译链接运行

运行结果
在这里插入图片描述

另外

  • 用到“根据日期得到星期的公式”的使用条件year > 0,以及如果是求1月2月的1号所属星期需要做的变化y -= 1for (m=13; m<=14; m++)
  • 注意到闰年2月天数的变化
  • 每月日历的排版,包括:1号前的空格、号数、月底之后的空格
  • 怎样实现:多月横排显示(如3行4列的排版)?
    2018年年历

最后

水平不高,可能还有做得不够好的地方,
希望能和大家交流学习,
转载请注明出处。

  • 5
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值