三天打鱼两天晒网C语言实现

文章目录

  • 一、问题描述
  • 二、问题分析与算法设计
  • 总结

一、问题描述

中国有句俗语叫“三天打鱼两天晒网”。某人从2010年1月1日起开始“三天打鱼两天晒网”,问这个人在以后的以后的某一天中是打鱼还是晒网。用C语言或c++实现。
基本要求:1.程序风格良好(使用自定义注释模板),提供友好的输入输出。
提高要求:1.输入数据的正确性验证。
2.使用文件进行数据测试。如将日期 20100101 20111214 等数据保存在in.txt文件中,程序读入in.dat文件进行判定,并将结果输出至out.txt文件。

二、问题分析与算法设计

1)计算从2010年1月1日至指定日期共多少天。思路为:所隔年份天数加上所隔月份天数,加上日的天数,要分平年和闰年,闰年二月有29天,其他只有28天,闰年的判断用伪代码描述如下:
若能被4除尽 且 不能被100除尽或 能被400除尽 闰年。 否则 平年。
2)打鱼晒网周期为5天,,将总天数用5除,若余数为1,2,3,在打鱼,否则在晒网。

流程图如下:三天打鱼两天晒网C语言实现_第1张图片

程序设计实现源代码如下:

#include
int main()
{
	int year,month,day,x,a;
	int ye=2010;
	int sum=0;
	int i[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};//建立平年各月份天数的数组
	int j[13]={0,31,29,31,30,31,30,31,31,30,31,30,31};//建立闰年各月份天数的数组
	printf("请按照年月日的顺序输入日期\n");
	scanf("%d",&x);//输入日期
	year=x/10000;
	month=(x%10000)/100;
	day=x%100;
	while((year<2010)||(month<1||month>12)||((month==2&&(year%4!=0&&year%400!=0)&&day>28)||(day>j[month])))
	{
		printf("输入日期错误,请重新输入\n");
		printf("请按照年月日的顺序重新输入日期\n");
		scanf("%d",&x);
			year=x/10000;
	        month=(x%10000)/100;
	        day=x%100;
	}//判断输入日期是否正确
	for(ye;ye<year;ye++) //加上所隔年份天数
	{
		if((ye%400==0)||(ye%4==0&&ye%100!=0))//判断此年份是否是闰年 
		{
			sum+=366;//闰年总数加366
		}
		else
		{
			sum+=365;//平年总数加365
		}
	}
	for(a=1;a<month;a++)//加上所隔月份天数
	{
		if((ye%400==0)||(ye%4==0&&ye%100!=0)) 
		{
			sum+=j[a];//闰年月数
		}
		else{
			sum+=i[a];//平年月数
		}
	}
	sum+=day;
	if((sum%5==1)||(sum%5==2)||(sum%5==3))//天数除以5,若余数为1,2,3,则打鱼
	{
	printf("今天打鱼");
	}
	else //否则晒网
	{
	printf("今天晒网"); 
	}
	return 0;
}

调试结果如图:
三天打鱼两天晒网C语言实现_第2张图片
三天打鱼两天晒网C语言实现_第3张图片
测试结果如图:
三天打鱼两天晒网C语言实现_第4张图片

总结

这个题目主要得难度是在天数得计算上,我开始想通过判断闰年就给天数一个366,平年就给一个365,但对于整月份的天数计算,我开始是定义了一个一维数组,然后发现闰年和平年来累加有点不好加,于是我又定义了一个二维数组,将闰年和平年的月份分开,这样虽然可能有点繁琐,但不容易出错。在进行本题的设计过程中,我又重新复习了一遍C语言的相关语法,除了基本的循环结构还有文件读写。本题中最核心的部分莫过于计算指定日期,这个过程也学习到了很多。

你可能感兴趣的:(程序设计,c语言)