三天打鱼两天晒网问题

题目:中国有句俗语叫“三天打鱼两天晒网”。某人从2010年1月1日起开始“三天打鱼两天晒网”,问这个人在以后的某一天中是“打鱼”还是“晒网”。用C或C++语言/java/python实现程序解决问题。
基本要求:1.程序风格良好(使用自定义注释模板),提供友好的输入输出。

问题分析与算法设计
1)计算从2010年1月1日开始至指定日期共有多少天;
2)由于打鱼和晒网的周期为5天,所以可以由天数与5求余的结果得出最终结果(余数为1,2,3为打鱼,4,0为晒网);
那么求其中的总天数是该程序的关键。我们可以分步求输入年月日对应于2010.1.1之间的天数再求和。Sum=sum1+sum2+sum3;其中年份中总天数需要计算出闰年有几个;伪代码如下:
求年份之间所隔天数:判断该年是否为闰年,若为闰年且月份<2,Sum1=(year-2010)*365+(year-2008)/4-1;否则Sum1=(year-2010)*365+(year-2008)/4。其中(year-2008)是计算出输入年份与2010年最近的闰年数之差,再除4就可得期间的闰年数个数。
求月份之间所隔天数:就是输入月份与1月之间月份的总天数。定义一个数组arr[] = { 31,28,31,30,31,30,31,31,30,31,30,31 },month=i,通过for循环实现对天数的累加。Sum2=sum2+arr[i];
求日之间所隔天数:sum3=day;
Sum=sum1+sum2+sum3;
流程图:
在这里插入图片描述
代码如下:

#include<stdio.h>
int main()
{
	int year, month, day, sum1 = 0, sum2 = 0, sum = 0, sum3 = 0,i;
	printf("请输入年月日,中间用连字符-隔开\n");
	scanf("%d-%d-%d", &year, &month, &day);
	i = month;
	int arr[] = { 31,28,31,30,31,30,31,31,30,31,30,31 };
	while (year < 2010)
	{
		printf("年份输入过小,请重新输入: \n");
		scanf("%d-%d-%d", &year, &month, &day);
	}
	if (month < 1 || month>12)
	{
		printf("月份错误,请重新输入:\n");
			scanf("%d-%d-%d", &year, &month, &day);
	}
	if (day>arr[i-1])
	{printf("日期错误,请重新输入:\n");
	scanf("%d-%d-%d", &year, &month, &day);
}

if ((year % 4 == 0 && year % 100 != 0 || year % 400 ==0) && month > 2)//判断输入年份是否为闰年且月份是否>2;
sum1 = (year - 2010) * 365 + ((year - 2008) / 4) + 1;//(year-2008)/4计算出输入年份与2000年之间的闰年数,闰年的话多加一天
else
sum1 = (year - 2010) * 365 + ((year - 2008) / 4);
for (i = 0; i<month - 1; i++)
	{
		sum2 = sum2 + arr[i];
	}
	if (day>1)
	{
		sum3 = day;
	}//如果输入的日期是一号,则不需要加1
	sum = sum1 + sum2 + sum3;
	printf("sum=%d\n", sum);
	if (sum % 5 == 0 || sum % 5 == 4)
	{
		printf("晒网\n");
	}
	else {
		printf("打渔\n");
	}
	return 0;
}

调试截图:
加断点调试:
在这里插入图片描述
在这里插入图片描述

测试结果展示:

``在这里插入图片描述
学习心得:
很久没编了,很多东西在第一开始就没学会,这次在网上查了很多,虽然编程知识还是没学会多少,但毕竟有所收获。从理解别人的代码到修改其中的不足,我觉得我思想上也是有进步的。我畏惧编程,或许从内心抵抗它,但是没办法选了这个专业,还有一年9半的时间,我希望自己可以去学习不同新的知识,无论是编程还是其他方面的知识。(或许这个IT博客不适合写这些,可我还是想要说出自己的想法。)希望自己不要老是害怕,勇敢一些,至少不要挂科。加油!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值