问题描述
中国有句俗语:“三天打鱼两天晒网”,某人从1990年1月1日起开始“三天打鱼两天晒网”。问这个人在以后的某一天是在“打鱼”还是在“晒网”?
分析问题
输入部分:
很明显,该题目需要我们输入需要判断打鱼还是晒网的年,月,日。
那么,我们至少需要三个整型变量:year, month, day。
输出部分:
题目只要求判断这个人是在打鱼还是晒网。
由此,我们可知该题目可以通过得出总的时间跨度,然后判断我们输入的日期在打鱼期还是晒网期。
功能实现:
首先我们需要计算总的时间跨度,然后利用求余判断输入的日期所在的阶段。
所以,我们还需要一个存放总体时间跨度的整型变量:time。
而年份有闰年平年,月份有30, 28, 29, 31天,所以需要分情况讨论:闰年/平年,月份。
综上,问题解决框架已经清晰,开始编写代码:
#includemain() { int year, month, day, time, i; int each_month[12] = {31, 29, 31, 30, 31, 30 ,31, 31, 30, 31, 30, 31}; scanf("%d-%d-%d", &year, &month, &day); time = 0; for(i = 1990; i < year; i++) { if((i % 400 == 0) || (i % 4 == 0) && (i % 100 != 0)) { time += 366; } else { time += 365; } } if((year % 400 == 0) || (year % 4 == 0) && (year % 100 != 0)) { if(month > 2) { for(i = 0; i < (month - 1) ; i++) { time += each_month[i]; } time += day; } else if(month < 2) { time += day; } else { time = time + 31 + day; } } else { each_month[1] = 28; if(month > 2) { for(i = 0; i < (month - 1) ; i++) { time += each_month[i]; } time += day; } else if(month < 2) { time += day; } else { time = time + 31 + day; } } if(0 < (time % 5) && (time % 5) < 4) printf("他在打鱼"); else printf("他在晒网"); }
需注意在我的代码中所编写的输入格式
运行结果截图
结束(改进建议)
该代码还是有些麻烦,不难发现在闰年部分和平年部分的天数计算是重复的,可以把该部分代码用自定义函数来实现,该函数可以用来计算输入的日期在该年已经经过的天数,然后直接加上整年数同样可得出经过的时间跨度。
当然,工具是死的,人是灵活的,肯定还有不同的解法,我的肯定也不是最优解,希望各位多交流,共同进步。谢谢。



