C语言题目:三天打鱼,两天晒网,判断输入日期是在打鱼还是晒网

C语言打鱼晒网问题

问题描述

中国有句俗语:“三天打鱼两天晒网”,某人从1990年1月1日起开始“三天打鱼两天晒网”。问这个人在以后的某一天是在“打鱼”还是在“晒网”?

分析问题

输入部分:

很明显,该题目需要我们输入需要判断打鱼还是晒网的年,月,日。

那么,我们至少需要三个整型变量:year, month, day

输出部分:

题目只要求判断这个人是在打鱼还是晒网。

由此,我们可知该题目可以通过得出总的时间跨度,然后判断我们输入的日期在打鱼期还是晒网期。

功能实现:

首先我们需要计算总的时间跨度,然后利用求余判断输入的日期所在的阶段。

所以,我们还需要一个存放总体时间跨度的整型变量:time。

而年份有闰年平年,月份有30, 28, 29, 31天,所以需要分情况讨论:闰年/平年,月份。

综上,问题解决框架已经清晰,开始编写代码:

#include<stdio.h>
/*兔子骑士叫旺仔原创*/
main()
{
	/*year:年份 month:月份 day:号 time:时间跨度 */
	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;
		}
    }
    
    /*判断闰年,闰年2月有29天,每月的天数不做更改*/
	if((year % 400 == 0) || (year % 4 == 0) && (year % 100 != 0))
	{
		/*月份大于2月,依次加上每个月的天数*/ 
		if(month > 2)
		{
			for(i = 0; i < (month - 1) ; i++)
			{
				time += each_month[i];
			}
			/*加上几号*/ 
			time += day;
		}
		/*月份小于2月,就只有1月,直接加上几号即可*/
		else if(month < 2)
		{
			time += day;
		}
		/*正好2月,加上1月份的31天和2月份的号数*/
		else
		{
			time = time + 31 + day;
		}
	}
	/*平年情况*/
	else
	{
		/*更改平年2月份天数为28天*/
		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("他在晒网");
}

需注意在我的代码中所编写的输入格式

运行结果截图
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
结束(改进建议)

该代码还是有些麻烦,不难发现在闰年部分和平年部分的天数计算是重复的,可以把该部分代码用自定义函数来实现该函数可以用来计算输入的日期在该年已经经过的天数,然后直接加上整年数同样可得出经过的时间跨度。

当然,工具是死的,人是灵活的,肯定还有不同的解法,我的肯定也不是最优解,希望各位多交流,共同进步。谢谢。

  • 19
    点赞
  • 81
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值