再来问一道 算日期的 问题

youlingsxcn 2008-09-25 11:42:00
试题二(共15分)
阅读以下说明和C语言函数,将应填入 (n) 处的字句写在答题纸的对应栏内。
[说明]
已知1900年1月1日是星期一,下面的函数count_5_13(int year)用于计算给定的年份year中有几个“黑色星期五”。“黑色星期五”指既是13日又是星期五的日期。
函数count_5_13(int year)首先算出年份year的1月13日是星期几,然后依次计算每个月的13日是星期几,若是星期五,则计数。
程序中使用了函数isLeapYear(int year),其功能是判断给定年份是否为闰年,返回值为1(或0)分别表示year是(或不是)闰年。
[C语言函数]
int count_5_13(int year)
{
int date; /* date为0表示星期日,为1~6分别表示星期一至星期六 */
long days = 0; /* days记录天数 */
int m, y, c = 0; /* c用于表示黑色星期五的个数 */

if (year < 1900) return -1;

/*计算从1900年1月1日起,至给定年份year的1月13日间隔的天数*/
days = 12;
for (y = 1900; y < year; y++) {
days += 365;
if (isLeapYear(y)) (1) ;
}
date = ((days % 7) + 1) % 7; /* 算出给定年份year的1月13日是星期几 */
c = ( (2) ) ? 1 : 0;
for(m = 1; (3) ; m++) {
switch (m) {
case 1: case 3: case 5: case 7: case 8: case 10: case 12:
days = 31; break;
case 4: case 6: case 9: case 11:
days = 30; break;
case 2: days = 28;
if ( (4) ) days = 29;
break;
}/* end of switch*/
date =((days % 7) + (5) ) % 7;
if (date == 5) c++;
} /* end of for*/
return c;
}






我把整个题 贴出来了 。还没有研究完 先问一个 我迷惑的地方 ((1年365天%7)+1)%7 结果等于几 就是礼拜几? 为什么啊?! 那中加的+1 就是加一个礼拜了吧? 假设第一次%7取余以后 是52个礼拜 余1天 +1算怎么个回事 。。。请教大虾 小弟没有开发经验。所以对这些 不太明白~~
...全文
124 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
youlingsxcn 2008-09-29
  • 打赏
  • 举报
回复
楼上这位仁兄 所说既是 马上豁然开朗 呵呵 THKS 各位大虾指教。。 至于5楼所说的那个 M最大值只是11 我是觉得题意思 是程序可以节约一次循环。
因为12和10 是一样的 days=31。 如果不对请指教的~
youlingsxcn 2008-09-26
  • 打赏
  • 举报
回复
看来 days=366 不对。。那个case里改变了days的值
youlingsxcn 2008-09-26
  • 打赏
  • 举报
回复
呵呵 第三个是m<12 m<=12 只给1分 嘿嘿。。。


我第四个写的 days==366 我没仔细看程序 days 是不是 在赋初值 以后 有没有改变答案意思是 years %4==0 判断润年即可。。


我问的那个 %7 再加1 我在想想你说的 呵呵 对日期计算不开窍 呵呵 谢谢~
wdgphc 2008-09-26
  • 打赏
  • 举报
回复
(1) days ++;
(2) date == 5
(3) m<=12
(4) isLeapYear(y)
(5) date

没调试,看着写的.

((1年365天%7)+1)%7 结果等于几 就是礼拜几? 为什么啊?! ---------- 因为题目给了 "1900年1月1日是星期一" ,所以计算出与 1900-1-1的日期差模7后要加1(加上1900-1-1的周一) ,不知能否说明白?
tailzhou 2008-09-26
  • 打赏
  • 举报
回复
date = ((days % 7) + 1) % 7; /* 算出给定年份year的1月13日是星期几 */

days == 从1900年1月1日起,至给定年份year的1月13日间隔的天数;
所以days % 7==0,即差7的倍数的日期是星期1
days % 7==4 的日期是星期5,为了让它==5,所以加上1;

其实只要也可以只计算,date = days % 7; 用if (date == 4) c++; 配对也是可以的;

c = ( (2) ) ? 1 : 0;
这里已经计算了1.13是不是星期5了,所以后面只需要循环11次,计算后面的2-12月的13号;



wdgphc 2008-09-26
  • 打赏
  • 举报
回复
第3个为什么是 m<12 呢?这样只循环了11次啊,你12月怎么办?
第4个明显是if(闰年) 闰年的判断上面给例子了.
youlingsxcn 2008-09-25
  • 打赏
  • 举报
回复
试题二(共15分)
阅读以下说明和C语言函数,将应填入 (n) 处的字句写在答题纸的对应栏内。
[说明]
已知1900年1月1日是星期一,下面的函数count_5_13(int year)用于计算给定的年份year中有几个“黑色星期五”。“黑色星期五”指既是13日又是星期五的日期。
函数count_5_13(int year)首先算出年份year的1月13日是星期几,然后依次计算每个月的13日是星期几,若是星期五,则计数。
程序中使用了函数isLeapYear(int year),其功能是判断给定年份是否为闰年,返回值为1(或0)分别表示year是(或不是)闰年。
[C语言函数]
int count_5_13(int year)
{
int date; /* date为0表示星期日,为1~6分别表示星期一至星期六 */
long days = 0; /* days记录天数 */
int m, y, c = 0; /* c用于表示黑色星期五的个数 */

if (year < 1900) return -1;

/*计算从1900年1月1日起,至给定年份year的1月13日间隔的天数*/
days = 12;
for (y = 1900; y < year; y++) {
days += 365;
if (isLeapYear(y)) (1) ;
}

date = ((days % 7) + 1) % 7; /* 算出给定年份year的1月13日是星期几 */
c = (  (2)  ) ? 1 : 0;
for(m = 1; (3) ; m++) {
switch (m) {
case 1: case 3: case 5: case 7: case 8: case 10: case 12:
days = 31; break;
case 4: case 6: case 9: case 11:
days = 30; break;
case 2: days = 28;
if ( (4) ) days = 29;
break;
}/* end of switch*/
date =((days % 7) + (5) ) % 7;
if (date == 5) c++;
} /* end of for*/
return c;
}


这样是不是会好点?!
修改下~~我把整个题 贴出来了 。还没有研究完 先问一个 我迷惑的地方 ((1年365天%7)+1)%7 结果等于几 就是礼拜几? 为什么啊?! 那中加的+1 就是加一个礼拜了吧? 假设第一次%7取余以后 是52个礼拜 余1天 +1算怎么个回事 。。。请教大虾 小弟没有开发经验。所以对这些 不太明白~~

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧