您的位置:首页 > 编程语言

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

2013-12-31 10:52 197 查看
给定两个日子计算相差天数给定某个日子,返回在一周的第几天,接下来还有一个给定某年某月,输出该月日历;

其实思想很简单,都是与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欢迎大牛指点...
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐