题目描述
中国有句俗语叫“三天打鱼两天晒网”。某人从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或更多时)就会出现在读完最后一组数据时程序继续读取,导致最后一组多余的数据出现乱码
运行结果如下:
如有好的解决方法,请联系一下我,谢谢