给定某年某月,输出该月日历--【编程珠玑】

给定两个日子计算相差天数给定某个日子,返回在一周的第几天,接下来还有一个给定某年某月,输出该月日历;

其实思想很简单,都是与1900-1-1相减,这样得到每月的第一天星期几,这样便于输出第一行;

如:

 日  一  二  三  四  五  六
             1   2   3   4

接下来对下面的进行一行一行的输出就简单了,主要思想呢,就是这样;

    printf(" 日  一  二  三  四  五  六 \n");
    if(temp < 6)  //把该月的第一行输出
    {
        temp++;
        while(temp--)
        {
            printf("    ");  //输出前面的空格
        }
        temp = 7 - days - 1;
        i = 1;
        while(i <= temp)
        {
            printf(" %d  ", i++);  //输出这月的头temp天
        }
        printf("\n");
    }

上述是将第一行输出,当然,如果1号是星期天的话,我们直接把它当做整的输出了;

如果本月是2月,进行是否是闰年判断:

    if(month == 2)
        mon[1] += isleapyear(years);

最后将本月后面日期输出即可:

    temp = 7 - days;

    while(temp <= mon[month - 1])
    {
        if(temp < 10)
            printf(" %d  ", temp);
        else
            printf(" %d ", temp);

        if((temp + days + 1) % 7 == 0)
            printf("\n");
        temp++;
    }

由于5号与10号占据的位置不一样,所以,对于小于10号的与10后及以后的日子输出的格式差一个空格

另外,每过七天就输出换行;

如2013年12月:


万年历上的由星期一开始的...不过效果是一样的,大家有兴趣,做一个和万年历一样的也可以...

如2012年2月:


由于时间原因,代码有点乱,欢迎交流:

/**********
* 2013-12-31
* _Luffy
* http://blog.csdn.net/xjm199
***********/
#include <stdio.h>

int isleapyear(int year)  //是否是闰年
{
    int temp = 0;

    if((year % 4 == 0 && year % 100 != 0)|| year % 400 == 0)
        temp = 1;

    return temp;
}

int sum(int year, int month, int day)
{
    int mon[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    int sum = (year - 1) * 365;  //自公元1年来的天数
    int i;

    sum += (year - 1) / 4 + 1;  //能被4整除的都加上
    sum -= (year - 1) / 100 + 1;  //其中被100整除的不是闰年
    sum += (year - 1) / 400 + 1;  //实际上能被400整除的即为闰年

    for(i = 0; i < month - 1; ++i)  //将本年的剩下日期加上
        sum += mon[i];

    if(isleapyear(year) == 1 && month > 2)  //本年是否闰2月
        ++sum;

    sum += day;  //本月的日子加上

    return sum;
}

void print(int years, int month, int days)  //days是减去星期一的取余
{
    int mon[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    int temp = days;
    int i;

    if(month == 2)
        mon[1] += isleapyear(years);

    printf(" 日  一  二  三  四  五  六 \n");
    if(temp < 6)  //把该月的第一行输出
    {
        temp++;
        while(temp--)
        {
            printf("    ");
        }
        temp = 7 - days - 1;
        i = 1;
        while(i <= temp)
        {
            printf(" %d  ", i++);
        }
        printf("\n");
    }

    temp = 7 - days;

    while(temp <= mon[month - 1])
    {
        if(temp < 10)
            printf(" %d  ", temp);
        else
            printf(" %d ", temp);

        if((temp + days + 1) % 7 == 0)
            printf("\n");
        temp++;
    }

}

int main()
{
    //一周的第一天是周日,1900年1月1日星期一
    int year = 2013;
    int month = 12;
    int days = sum(year, month, 1) - sum(1900, 1, 1);  //自1900年1月1日后的天数
    days = days % 7;

    print(year, month, days);

    return 0;
}

小工程可见:http://download.csdn.net/detail/xjm199/6791465


o(∩_∩)o欢迎大牛指点...

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值