三天打鱼两天晒网(C语言)

【问题描述】
中国有句俗语叫“三天打鱼两天晒网”。某人从2010年1月1日起开始“三天打鱼两天晒网”,问这个人在以后的以后的某一天中是打鱼还是晒网。
基本要求:1.程序风格良好(使用自定义注释模板),提供友好的输入输出。
提高要求:1.输入数据的正确性验证。
2.使用文件进行数据测试。如将日期 20100101 20111214 等数据保存在in.txt文件中,程序读入in.dat文件进行判定,并将结果输出至out.txt文件。
【问题分析与算法设计】
根据题意可以将解题过程分为三步:
1)计算从2010年1月1日开始至指定日期共有多少天;
2)由于“打鱼”和“晒网”的周期为5天,所以将计算出的天数用5去除取余;
3)根据余数判断他是在“打鱼”还是在“晒网”;
若 余数为1,2,3,则他是在“打鱼”
否则 是在“晒网”
因为个人能力问题,我只能完成提高要求中的第一点,因此设计里只有时间判断,没有读取文件。
根据以上的问题分析,可以画出以下流程图:此次问题代码实现的流程图
程序设计实现的源代码如下:

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

#include<stdio.h>
int main()
{
	int year,month,day;
	int y=2010;
	int sum=0;
	int a[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};//建立一个有平年各月份天数的数组
	printf("请按照年月日的顺序输入日期,中间用空格隔开\n");
	scanf("%d""%d""%d",&year,&month,&day);//输入日期
	while((year<2010)||(month<1||month>12)||(month==2&&(year%4!=0||year%400!=0)&&day>=29)||(day>a[month]))
	{
		printf("输入日期错误,请重新输入\n");
		printf("请按照年月日的顺序重新输入日期,中间用空格隔开\n");
		scanf("%d""%d""%d",&year,&month,&day);
	}
	//判断输入日期是否正确
	for(y;y<year;y++)//用此循环加上相差年份所隔的天数。 
	{
		if((year%400==0)||(year%4==0&&year%100!=0))//判断此年份是否是闰年 
		{
			sum+=366;
		}//是闰年,则总天数加上366. 
		else
		{
			sum+=365;
		}//是平年,总天数加上365 
	}
	for(int m=1;m<month;m++)//用此循环加上所隔月份的总天数 
	{
		sum+=a[m];
		if(month==2&&((year%400==0)||(year%4==0&&year%100!=0))) 
		{
			sum+=1;
		}//判断月份是否为闰年2月,若是2月,则总天数加一。
	}
	sum+=day;//总天数加上日 
	if((sum%5==1)||(sum%5==2)||(sum%5==3))//用相隔总天数除以周期5,若余数为1,2,3,则此人打鱼。 
	{
	printf("这个人今天打鱼\n");
	}
	else//否则,这个人晒网
	{
	printf("这个人今天晒网\n"); 
	}
	return 0;
}

调试截图:
在这里插入图片描述这个错误是因为我判断时间错误时用的是连续三个的while语句,它们在我把可能出现的日期错误都输出后无法返回最上一个重新判断,经过重新思考后,我最终使用的只使用了一个while语句,各种判断条件用逻辑运算或连接。
测试截图:

将问题改正后,最终运行结果如上图所示。
此次编程问题总结:
我的编程经验是很不足的,基础太差。以上代码都是我用了很长时间,问了很多同学后才做出来的,这次遇到的问题主要就是在时间判断是否正确上,一个是我之前测试时,遇到无法返回的情况,另外一个是刚开始的时候,我是用的if语句来替代while语句,那样导致输入错一次时间后程序就会退出,经过了我长时间的思考(是真的基础差。。),我选择了while语句,让它不把时间输入正确就一直循环下去,总体来说,我对自己此次的编程还是挺满意的,在编程遇到的问题也几乎都解决了。让我觉得不太满足的地方可能就提高要求文件的那块了 ,我会努力的,以后一定把文件那块的问题给解决掉!

猜你喜欢

转载自blog.csdn.net/qq_44246262/article/details/88072941
今日推荐