三天打渔两天晒网(没有用for循环和数组)

三天打鱼两天晒网


#include<stdio.h>
int main()
{
	int year=0;                   //查询的年份
	int month=0;                  //查询的月份
	int day=0;                    //查询的日期
	int allday=0;                 //与2010年1月1日相差的天数
	int ryear=0;                  //与2010年相差的闰年数
	int a=0;                      //回正系数
	int monthday=0;               //差的月份转换成的天数
	int b=0;                      //余数


	//用户输入数据
	printf("请输入年份:");
	scanf("%d",&year);
	if(year<2010)
	{
		printf("您输入的年份不符合要求,必须大于2010,请重新输入年份:");
		scanf("%d",&year);
	}
	printf("\n请输入月份:");
	scanf("%d",&month);
	if(month>12||month<1)
	{
		printf("您输入的月份不对,亲,请您重新输入正确的月份:");
		scanf("%d",&month);
	}
	printf("\n请输入日期:");
	scanf("%d",&day);
	if(day>31||day<1)
	{
		printf("您输入的日期不对,亲,请您重新输入正确的日期:");
		scanf("%d",&day);
	}

    //求中间相差的闰年数
	ryear=(year+2-2010)/4;
	

	//判断输入的年份是否为闰年,再判断月份是否过了2月,然后对回正系数赋值
	if(year%4==0)	
		if(year%100==0)	
			if(year%400==0)	a=1;
			else    a=0;
		else  a=1;
	else  a=0;
	
	if (month<3)	a=0;


	//求取月份转换的天数
	switch(month)
	{
	case'1':monthday=0;break;
	case'2':monthday=31;break;
	case'3':monthday=59;break;
	case'4':monthday=90;break;
	case'5':monthday=120;break;
	case'6':monthday=151;break;
	case'7':monthday=181;break;
	case'8':monthday=212;break;
	case'9':monthday=243;break;
	case'10':monthday=273;break;
	case'11':monthday=304;break;
	case'12':monthday=334;break;
	}

	//求取相差的总天数
	allday=day-1+monthday+(year-2010)*365+ryear+a;
	printf("距离起始日期有%d天",allday);

	//判断输入的年份是否为闰年
	b=(allday+1)%5;
	if(b<4)
		printf("\n这个日子在打渔\n");
	else 
		printf("\n这个日子在晒网\n");
	return 0;
}

整体思路

计算输入日期和起始日期的相差天数,然后除以5求余数,最后判断是打鱼还是晒网

计算部分

我直接用代码实现数学角度的计算
year 输入年份
year_day 因年份相差带来的天数
month_day 因月份相差带来的天数
day 日期就是相差的天数

首先,计算输入的年份与2010年相差的闰年数
闰年数=(year+2-2010)/4
然后计算因为年份相差带来的天数
year_day=(year-2010)*365+闰年数

然后再计算月份相差带来的天数
month_day=
case’1’:monthday=0;break;
case’2’:monthday=31;break;
case’3’:monthday=59;break;
case’4’:monthday=90;break;
case’5’:monthday=120;break;
case’6’:monthday=151;break;
case’7’:monthday=181;break;
case’8’:monthday=212;break;
case’9’:monthday=243;break;
case’10’:monthday=273;break;
case’11’:monthday=304;break;
case’12’:monthday=334;break;

再计算因为日期带来的天数
日期差带来的天数=day

判断当年是否为闰年然后,月数超过三月就加一天,否则加0天,这个判断对a赋值。
该年是闰年且月份大于2,a=1;否则a=0.

allday=year_day+month_day+day+a

最后求余数判断即可

总结

整体感觉这次作业不会很难,但是却也不是刚开始想的那么简单,从整体构思到具体实施,总会遇到一些原先没有想到的问题,最后一个一个解决了。

我的思路很简单,算出输入的日期与2010年1月1日的相差天数,然后再除以5求余数,判断输入的日期是打鱼还是晒网。

刚开始构思时,我直接从数学的角度想办法计算如何相差的天数,从相差多少个闰年,以及相差的月数、日子数。然后直接用代码还原我的数学思路,这样就导致我的代码比别人多了很多行,感觉整体效率也没有那么高。

当我看到别人用2个数组和几个for循环计算输入日期和起始日期相差的天数时,才发现自己的步骤是多么繁琐,为什么自己就没有想到那么简洁的处理方式呢。感觉自己学的还不是很好,应该多看看书,更重要的是多看看别人的代码,以求自己在将来遇到问题是能够快速高效的解决问题。

猜你喜欢

转载自blog.csdn.net/weixin_44365158/article/details/88075079