三天打鱼两天晒网问题

一、问题描述

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

二、问题分析和算法分析

1、输入一个年月日,判断输入的年月日是否符合实际。如果输入符合要求,计算从2010年1月1日到所输入日期的总天数。
 总天数的算法:首先计算从2010到所输入年份的所有年的天数之和,(年能被除尽且不能被100除尽或者年能被400除尽是闰年)闰年366天,平年365天;再算所有整月的天数之和;最后将整年天数加上整月天数加上输入的天数之和就是总天数。
2、“三天打鱼两天晒网”,一个周期是5天,将总天数除以5取余数。
3、根据余数判断是“打鱼”还是“晒网”,如果余数是1或2或3,则是打鱼,余数是0或4则是晒网。

三、流程图

在这里插入图片描述

四、源代码

/*中国有句俗语叫“三天打鱼两天晒网”。某人从2010年1月1日起开始“三天打鱼两天晒网”,
问这个人在以后的某一天是“打鱼”还是“晒网”。*/ 
 
#include<stdio.h>
int main()
{
	int year,month,day,sum,sum1,sum2,leap;
	int f_year(int y);                   //定义一个计算整年的天数和的函数 
    int f_month(int m);                  //定义一个计算整月的天数和的函数 
	printf("请输入年月日:");
	scanf("%d%d%d",&year,&month,&day);   //输入想要查询的年月日 
	if((year%4==0&&year%100!=0)||(year%400==0))  //判断输入年份是否是闰年 
	    leap=1;
	else
	    leap=0;
	if((year<2010)||(month<0&&month>12)||(day<0&&day>31)) //判断输入的日期是否符合常理 
	{
		printf("输入的年月日不符合要求!");
	 } 
	 else
	 {
	 	f_year(year);       //调用函数 
	 	f_month(month);
	 	sum=sum1+sum2+day;
	 }
	 if(sum%5==0||sum%5==4)  //天数总和除以5求余数,余数为0或4则这天晒网,否则这天打鱼 
	 {
	 	printf("%d-%d-%d晒网!\n",year,month,day);
	 }
	 else
	 {
	    printf("%d-%d-%d打鱼!\n",year,month,day);	
	 }
 }
 int f_year(int y)
 {
 	int i;
	int sum1=0;
 	for(i=2010;i<y;i++)
 	{
 		if((y%4==0&&y%100!=0)||(y%400==0))
 		{
 			sum1+=366;
		 }
		 else
		    sum1+=365;
	 }
	 return(sum1);
 }
int f_month(int m)
{
	int i,leap,sum2=0;
	int x[12]={31,28,31,30,31,30,31,31,30,31,30,31};
	for(i=0;i<m;i++)
	{
		sum2+=x[i];
	}
	if(m>=2)
	    sum2+=leap;
	return(sum2);
}

五、程序运行结果测试

图一
图二
图三
以上三张运行结果的截图中,图1输入时年月日之间连在一起输入,没有运行结果;图2输入时年月日用空格隔开,运行结果正确;图3输入时年月日用逗号隔开,运行给出的结果不符合预期,则判断此种年份输入方式不可取。

六、总结

在此次作业中,我遇到的难题是如何计算给定日期到输入日期之间的总天数,这其中需要考虑是否有闰年以及如果输入年份那年时闰年,需要判断月份大于二月或是小于二月,我利用if和switch语句的联合使用解决了这一问题。程序完成之后,需要调试程序,其中需要检测给定年份到输入年份之间的总天数计算是否正确,我在本次作业中没有解决这一个问题,下去之后我会继续研究。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值