给定某年某月,输出该月日历--【编程珠玑】
2013-12-31 10:52
197 查看
继给定两个日子计算相差天数和给定某个日子,返回在一周的第几天,接下来还有一个给定某年某月,输出该月日历;
其实思想很简单,都是与1900-1-1相减,这样得到每月的第一天星期几,这样便于输出第一行;
如:
接下来对下面的进行一行一行的输出就简单了,主要思想呢,就是这样;
上述是将第一行输出,当然,如果1号是星期天的话,我们直接把它当做整的输出了;
如果本月是2月,进行是否是闰年判断:
最后将本月后面日期输出即可:
由于5号与10号占据的位置不一样,所以,对于小于10号的与10后及以后的日子输出的格式差一个空格;
另外,每过七天就输出换行;
如2013年12月:
万年历上的由星期一开始的...不过效果是一样的,大家有兴趣,做一个和万年历一样的也可以...
如2012年2月:
由于时间原因,代码有点乱,欢迎交流:
小工程可见:http://download.csdn.net/detail/xjm199/6791465
o(∩_∩)o欢迎大牛指点...
其实思想很简单,都是与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欢迎大牛指点...
相关文章推荐
- 给定某年某月,输出十天后是几年几月几日
- 万年历(实现从键盘输入1900年之后的任意的某年、某月,输出该月的日历)
- 按如下函数原型用函数编程解决如下的日期转换问题(要求考虑闰年的问题): 输入某年某月某日,计算并输出它是这一年的第几天。 /* 函数功能: 对给定的某年某月某日,计算它是这一年的第几天 函数参数:
- 输入某年某月(包括闰年),编程输出该年的该月拥有的天数
- 给定某年日期及该年第一天是星期几然后显示该年的日历
- 编程珠玑:给定一个包含4300000000个32位证书的顺序文件,求出一个至少包含两次的整数
- 给定日子,返回是一周的第几天--【编程珠玑】
- 显示某年某月日历表(客户程序)
- [Java]输出某年某月末日有多少天
- 编程珠玑: 12章 取样问题 12.1程序的输入包含两个整数m和n,其中m<n。输出是0~n-1范围内m个随机整数的有序列表,不允许重复。 优化解法-------解题总结
- 给定任意俩组字符串S1和S2,请编程输出他们间的最大相同子串。
- 给定一字符串S,请编程输出最长的连续数字串。(此题有坑)
- 编程珠玑: 12章 取样问题 12.3设计空间,程序的输入包含两个整数m和n,其中m<n。输出是0~n-1范围内m个随机整数的有序列表,不允许重复。 -------解题总结
- c#编程:给定一个正整数求出是几位数并逆序输出
- C语言编程题,给定一个日期,输出这个日期是该年的第几天
- 每天学习一点编程(3)(输出给定字串的全部连续子串)
- 已知某年某月,请输出这个月共有多少天(if语句)
- 编程珠玑: 12章 取样问题 12.3设计空间,程序的输入包含两个整数m和n,其中m<n。输出是0~n-1范围内m个随机整数的有序列表,不允许重复。 解法2-------解题总结
- 已知某年某月,请输出这个月共有多少天(switch语句)
- 给定某年某日,将其转化为这一年的第几天并输出。