三天打鱼两天晒网

题目描述

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

算法分析

1、利用函数Leap_year()来判断求得年份是不是闰年
2、利用函数Day()来判断所求的那一天是今年的第几天
3、利用函数Sum_year()来求得距2010年的整数年的天数
代码如下:

#include<stdlib.h>
#include<stdio.h>
#include<math.h>
#define NUM 1000

//判断是不是闰年
int Leap_year(int year)
{
	int m;                            //定义个m用来求余
	m = year % 4;                     //对年数除4取余,如果余数为0,则为闰年,否则为平年;
	return m;                         //返回余数m
}

//计算要求的那一天是今年的第几天
int Day(int m,int month,int day)      
{
	int a[13] = { 0,31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };//平年
	int b[13] = { 0,31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };//闰年
	int sum = 0;                      //定义一个数sum用来计数天数
	if (m != 0)                       //所求为平年的天数计算
	{
		for (int i = 0; i < month; i++)
		{
			sum = sum + a[i];
		}
	}
	else{                             //所求为闰年的天数计算
		for (int i = 0; i < month; i++)
		{
			sum = sum + b[i];
		}
	}
	sum = sum + day;                  
	return sum;                       //返回天数sum
}

//计算距离2010年的整数年的总天数
int Sum_yearDay(int year)
{
	int a=year - 2008;
	int b;
	b = a / 4;
	int sum_yearDay = (365 * (a - 2 - b)) + (366 * b);
	return sum_yearDay;
}
int main()
{
 	int year, month, day;               //定义年、月、日
	//printf("请输入要查询日期(格式为2021 01 01):");

    //打开in.txt、out.txt、in.dat文件
	FILE *fw = fopen("D:\\in.txt", "r"); 
	FILE *fw1 = fopen("D:\\out.txt", "w");
	FILE *fw2 = fopen("D:\\in.dat", "w");

	//定义一个二维数组,用来存放文件中的数据
	int e[NUM][3];
	for (int i = 0; i < NUM; i++)
	{
		for (int j = 0; j < 3; j++)
		{
			fscanf(fw, "%d", &e[i][j]);
		}
	}
	//关闭文件in.txt
	fclose(fw);
//	int d[3];
//	for (int i = 0; i < 3; i++)
//	{
//		fscanf(fw, "%d", &d[i]);
//	}
//	scanf("%d %d %d", &year, &month, &day);  //输入年月日

	//对每一个数据进行判定
	for (int i = 0; i < 1000; i++)
	{
		year = e[i][0];
		month = e[i][1];
		day = e[i][2];
		//	year = d[0];
		//	month = d[1];
		//	day = d[2];
		int m;                              //定义m来接收函数leap_year()返回的值
		m = Leap_year(year);                //判断是闰年还是平年,并将返回的值赋值给m
		//	Correct(m, month, day);
		//	int Correct(int m, int month, int day)
		//	{

		//判断数据输入的合法性
		if (m != 0)
		{
			if (month >= 1 && month <= 12)
			{
				if (month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12)
				{
					if (day<1 || day>31)
					{
						fprintf(fw2, "输入的日期(日)有误");
						system("pause");
						return 0;
					}
					else
					{
						fprintf(fw2, "日期格式正确\n");
					}
					//					else
					//					{
					//						return 1;
					//					}
				}
				else if (month == 2)
				{
					if (day<1 || day>28)
					{
						fprintf(fw2, "输入的日期(日)有误");
						system("pause");
						return 0;
					}
					else
					{
						fprintf(fw2, "日期格式正确\n");
					}
					//					else
					//					{
					//						return 1;
					//					}
				}
				else
				{
					if (day<1 || day>30)
					{
						fprintf(fw2, "输入的日期(日)有误");
						system("pause");
						return 0;
					}
					else
					{
						fprintf(fw2, "日期格式正确\n");
					}
					//					else
					//                 {
					//						return 1;
					//				   }
				}
			}
			else
			{
				printf("输入的月份有误");
				system("pause");
				return 0;
			}
		}
		else
		{
			if (month >= 1 && month <= 12)
			{
				if (month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12)
				{
					if (day<1 || day>31)
					{
						fprintf(fw2, "输入的日期(日)有误");
						system("pause");
						return 0;
					}
					else
					{
						fprintf(fw2, "日期格式正确\n");
					}
					//					else
					//					{
					//						return 1;
					//					}
				}
				else if (month == 2)
				{
					if (day<1 || day>29)
					{
						fprintf(fw2, "输入的日期(日)有误");
						system("pause");
						return 0;
					}
					else
					{
						fprintf(fw2, "日期格式正确\n");
					}
					//					else
					//					{
					//						return 1;
					//					}
				}
				else
				{
					if (day<1 || day>30)
					{
						fprintf(fw2, "输入的日期(日)有误");
						system("pause");
						return 0;
					}
					else
					{
						fprintf(fw2, "日期格式正确\n");
					}
					//					else
					//					{
					//						return 1;
					//					}
				}
			}
			else
			{
				fprintf(fw2, "输入的月份有误");
				system("pause");
				//				return 0;
			}
		}
		//	}
		int sum = 0;                            //定义sum来接收函数Day()返回的值
		sum = Day(m, month, day);               //求今天是这一年中的第几天
		int a = 0;
		int sum_day = 0;
		int sum_year = 0;                      
		sum_year = Sum_yearDay(year);           
		sum_day = sum_year + sum;               //求今天距离2010年01月01日多少天
        //输出这一天距离2010年01月01日多少天
		fprintf(fw2, "距离2010年01月01日%d天\n", --sum_day);
		a = sum_day % 5;                        //五天一循环,求得这天是一循环的第几天
	    //根据余数来判断是在捕鱼还是在晒网
		if (a < 4&&a>0)
		{
			fprintf(fw1, "这位渔夫在%d年%d月%d日在捕鱼。\n", year, month, day);//输出结果
			fprintf(fw1, "\n");
		}
		else{
			fprintf(fw1, "这位渔夫在%d年%d月%d日在晒网。\n", year, month, day);  //输出结果
			fprintf(fw1, "\n");
		}
	}
	//fclose(fw);
	//关闭out.txt和in.dat文件
	fclose(fw1);
	fclose(fw2);
	system("pause");                    //用来判断程序是否运行结束
	return 0;                           //结束
}

概要设计

在这里插入图片描述

测试

在in.txt文件中输入数据
在这里插入图片描述

运行结果
在这里插入图片描述
将判定过程输入在in.dat文件中
在这里插入图片描述

将结果输出在out.txt文件中
在这里插入图片描述

调试

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

遇到的问题

就是在输入多组数据时(将代码中NUM的值定义为1000或更多时)就会出现在读完最后一组数据时程序继续读取,导致最后一组多余的数据出现乱码
运行结果如下:
在这里插入图片描述
在这里插入图片描述
如有好的解决方法,请联系一下我,谢谢

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值