计算某天在当年是第几天
2013-10-26 16:41
363 查看
1.先贴我自己的代码
tue用来存放二月的天数,闰年为29天,非闰年为28天。某年为闰年的条件真是不容易记忆,能被4整除但是不能被100整除,或者能被400整除。
算法核心为switch语句,月份为month时,把从1~month-1月的天数全部加起来。利用switch语句中当每个case后面没有break语句时就顺序执行的特点。编译时有好多警告,提示缺少break语句,直接忽略。
2.答案书上有两种方法,我只贴关键的算法:
第一种方法中,有一个思想值得借鉴:先计算闰年和平年相同的部分,两者的2月都有28天,先按2月有28天计算,全部计算完成之后,再把不同的那一天加上去。几乎所有代码都有一些边缘的东西需要处理,像这个例子中的多出的那天,这些问题一般是将这些边缘的东西先搁置不予处理,等处理完一般情况或者共性的情况之后,再把这些边缘的东西加上去。
第二个算法就简洁多了,把每月的天数放到一个数组中来处理。把day_tab定义为13位,day_tab[0]=0,然后day_tab[i]就是第i月的天数,这个也是很值得效仿的。
#include<stdio.h> #include<stdlib.h> int main(){ setbuf(stdout,NULL); typedef struct{ int year; int month; int day; } DATE; int num=0; int tue; DATE date; printf("Input the date:\n"); scanf("%d/%d/%d",&date.year,&date.month,&date.day); if((date.year%4==0&&date.year%100!=0)||(date.year%400==0)) tue=29; else tue=28; switch(date.month-1) { case 11:num+=30; case 10:num+=31; case 9:num+=30; case 8:num+=31; case 7:num+=31; case 6:num+=30; case 5:num+=31; case 4:num+=30; case 3:num+=31; case 2:num+=tue; case 1:num+=31;break; default:printf("error!\n"); } num=num+date.day; printf("%d/%d is the %dth day of %d!\n",date.month,date.day,num,date.year); return 0; }
tue用来存放二月的天数,闰年为29天,非闰年为28天。某年为闰年的条件真是不容易记忆,能被4整除但是不能被100整除,或者能被400整除。
算法核心为switch语句,月份为month时,把从1~month-1月的天数全部加起来。利用switch语句中当每个case后面没有break语句时就顺序执行的特点。编译时有好多警告,提示缺少break语句,直接忽略。
2.答案书上有两种方法,我只贴关键的算法:
switch(date.month) { case 1:num+=date.day;break; case 2:num+=date.day+31;break; case 3:num+=date.day+59;break; case 4:num+=date.day+90;break; case 5:num+=date.day+120;break; case 6:num+=date.day+151;break; case 7:num+=date.day+181;break; case 8:num+=date.day+212;break; case 9:num+=date.day+243;break; case 10:num+=date.day+273;break; case 11:num+=date.day+304;break; case 12:num+=date.day+334;break default:printf("error!\n"); } if(((date.year%4==0&&date.year%100!=0)||(date.year%400==0))&&date.month>=3) num+=1;
第一种方法中,有一个思想值得借鉴:先计算闰年和平年相同的部分,两者的2月都有28天,先按2月有28天计算,全部计算完成之后,再把不同的那一天加上去。几乎所有代码都有一些边缘的东西需要处理,像这个例子中的多出的那天,这些问题一般是将这些边缘的东西先搁置不予处理,等处理完一般情况或者共性的情况之后,再把这些边缘的东西加上去。
int day_tab[13]={0,31,28,31,30,31,30,31,31,30,31,30,31}; for(i=1;i<date.month;i++) num+=day_tab[i]; num+=date.day; if(((date.year%4==0&&date.year%100!=0)||(date.year%400==0))&&date.month>=3) num+=1;
第二个算法就简洁多了,把每月的天数放到一个数组中来处理。把day_tab定义为13位,day_tab[0]=0,然后day_tab[i]就是第i月的天数,这个也是很值得效仿的。
相关文章推荐
- 第12周项目3-计算当年第几天(一)
- 第12周项目4-计算当年第几天(二)
- C语言之计算某天为一年中第几天
- 编写程序计算所输日期是当年的第几天
- 工资计算问题,类似计算某天是一年中的第几天的问题
- 【java学习记录】5.输入年月日,计算其为当年的第几天
- (c语言)结构体方法,计算该日是当年的第几天
- 编写程序计算所输日期是当年的第几天
- 工资计算问题,类似计算某天是一年中的第几天的问题
- JS——计算某天是今年的第几天
- 计算某天是一年中的第几天 很经典
- 计算某天是一年中的第几天 很经典
- 计算当年第几天
- 计算某日期是当年的第几天
- 定义一个结构体类型表示日期(年、月、日)。main中输入一个日期,计算该日期是当年的第几天。
- 计算某天是一年中的第几天 很经典
- C语言计算某天是一年中的第几天(熟练使用状态位flag)
- 编程题:用函数实现,用户输入年月日,来计算出该日期为当年第几天?
- 判断某天为当年第几天的demo