继给定两个日子计算相差天数和给定某个日子,返回在一周的第几天,接下来还有一个给定某年某月,输出该月日历;
其实思想很简单,都是与1900-1-1相减,这样得到每月的第一天星期几,这样便于输出第一行;
如:
日 一 二 三 四 五 六
1 2 3 4
接下来对下面的进行一行一行的输出就简单了,主要思想呢,就是这样;
printf( 日 一 二 三 四 五 六
);
if(temp < 6) //把该月的第一行输出
{
temp++;
while(temp--)
{
printf( ); //输出前面的空格
}
temp = 7 - days - 1;
i = 1;
while(i <= temp)
{
printf( %d , i++); //输出这月的头temp天
}
printf(
);
}
上述是将第一行输出,当然,如果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(
);
temp++;
}
由于5号与10号占据的位置不一样,所以,对于小于10号的与10后及以后的日子输出的格式差一个空格;
另外,每过七天就输出换行;
如2013年12月:


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


由于时间原因,代码有点乱,欢迎交流:
/********** * 2013-12-31 * _Luffy * http://blog.csdn.net/xjm199 ***********/ #includeint 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( 日 一 二 三 四 五 六 ); if(temp < 6) //把该月的第一行输出 { temp++; while(temp--) { printf( ); } temp = 7 - days - 1; i = 1; while(i <= temp) { printf( %d , i++); } printf( ); } 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( ); 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; }