作者:A.y.
日期:2019/2/28
运行环境:Visual C++ 6.0
问题描述:某人从2010/1/1日起,开始"三天打鱼两天晒网",问这个人在之后的某一天中是"打鱼"还是"晒网",要求输入日期正确性验证,同时将输入数据保存到in.txt文件,将结果保存到out.txt文件。
算法设计思路:首先通过问题可以知道需要输入的有三个变量year,month,day;因此可以定义一个结构体包含这三个变量便于操作;还需计算所求日期到2010/1/1日之间的总天数用来对5取余数,以此判断该人是 ”打鱼"还是"晒网",计算日期时还需要判断该年是闰年还是平年,对于日期的正确性验证需要判断输入日期的合理性和,最后就只剩下对文件的写入操作了。
算法设计流程图:
代码实现:
#include<stdio.h>
#include<stdlib.h>
struct date //定义结构体表示所求日期
{ int year; int month; int day;};
//计算所求日期与2010/1/1之间每一年的天数的函数
int temp(struct date D)
{ int i,symbol=0; //symbol是闰年的标记,symbol为0是平年,symbol为1是闰年
int number[2][13]= {{31,28,31,30,31,30,31,31,30,31,30,31},{31,29,31,30,31,30,31,31,30,31,30,31}};//闰年与平年每个月的天数
if((D.year%4== 0)&&(D.year%100!= 0)||(D.year%100== 0)) //判断是否为闰年
symbol=1;
for(i=1;i<D.month;i++)
D.day=D.day+number[symbol][i];
return D.day;
}
//输入所求日期同时判断输入日期是否合理的函数
bool display(struct date D)
{ FILE *fp1; //定义in.txt文件指针
fp1=fopen("in.txt","at"); //设置打开文件方式为正常打开并可添加数据
if(fp1== NULL)
{ printf("File cannot open!");
exit(0);
}
int m,symbol=0; //symbol是闰年的标记,symbol为0是平年,symbol为1是闰年
printf("\tPlease enter a query date(year/month/day):" );
m=scanf("%d/%d/%d",&D.year,&D.month,&D.day); //输入所求日期
fprintf(fp1,"%d/%d/%d\n",D.year,D.month,D.day); //向文件中添加数据
fclose(fp1);
int number[2][13]={{31,28,31,30,31,30,31,31,30,31,30,31},{31,29,31,30,31,30,31,31,30,31,30,31}}; //闰年与平年每个月的天数
if((D.year%4== 0)&&(D.year%100!= 0)||(D.year%100== 0)) //判断是否为闰年
symbol=1;
if(m!=3||D.year<2010||D.month>12||D.day>number[symbol][D.month-1]) //判断输入是否合理
{ m=1;
return false;
}
return true;
}
int main()
{ int i,a,sum; //sum为所求日期到2010/1/1日之间的天数
sum=0;
struct date D1,D2;
FILE *fp2; //定义out.txt文件指针
fp2=fopen("out.txt","at+"); //设置打开文件方式是正常打开并可添加数据
if(fp2==NULL)
{ printf("File cannot open!");
exit(0);
}
while(!display(D1)) //判断日期是否输入正确
{ printf("\n\tEnter error!Please enter again!\n");
fprintf(fp2,"Enter error!\n");
}
for(i=2010;i<D1.year;i++) //计算所求日期到2010/1/1之间的天数
{ D2.year=i;
sum=sum+temp(D2);
}
sum=sum+temp(D1);
a=sum%5; //求余,若余数大于0小于4,则该人当天在捕鱼,否则在晒网
if(a>0&&a<4)
{ printf("\n\tThe man is fishing.");
fprintf(fp2,"The man is fishing\n");
}
else
{ printf("\n\tThe man is relaxing.\n"); //将所求结果显示出来
fprintf(fp2,"The man is relaxing\n");
}
fclose(fp2);
return 0
}
运行截图:
心得:通过实际操作了解对代码的注释有了深入的了解,对于文件的读写等操作也熟悉,但有个缺陷就是通过.dat文件进行判定这个操作仍未能实现,网上查阅了很久也没能找到,希望之后能在图书馆找到相关的操作。