中国有句俗语叫“三天打鱼两天晒网”。某人从2010年1月1日起开始“三天打鱼两天晒网”,问这个人在以后的某一天中是“打鱼”还是“晒网”。用C或C++语言/java/python实现程序。
1.程序风格良好(使用自定义注释模板),提供友好的输入输出。
2.输入数据的正确性验证。
3.使用文件进行数据测试。如将日期 20100101 20111214 等数据保存在in.txt文件中,程序读入in.dat文件进行判定,并将结果输出至out.txt文件。
源代码:
#include<stdio.h>
#include<stdlib.h>
int year,x,m,n,z;
int Year,Month,Day,Nyear,Nmonth,Nday;
int Jyear()/*判断年份,若为闰年,则二月为29天,否则为28天*/
{
if((year%4==0&&year%100!=0)||year%400==0)
x=29;
else
x=28;
return x;
}
void main()
{
int sum1=0,sum2=0,days;
FILE *p=fopen("in.txt","r");/*打开in.txt文件*/
FILE *q=fopen("out.txt","w");/*写入out.txt文件*/
fscanf(p,"%d %d %d\n%d %d %d\n",&Year,&Month,&Day,&Nyear,&Nmonth,&Nday);
if((p=fopen("in.txt","r"))==NULL)
{
printf("无法打开该文件!");
exit(1);
}
switch(Nmonth)/*判断日期,若输入的月份为1,3,5,7,8,10,12,则输入日期小于31;为2,则调用函数Jyear,否则,返回值30*/
{
case 4:case 6:case 9:case 11:m=30;break;
case 1:case 3:case 5:case 7:case 8:case 10:case 12:m=31;break;
case 2:m=Jyear();
}
if(Nyear>=Year&&Nmonth>=1&&Nmonth<=12&&Nday>=1&&Nday<=m)/*验证输入日期的正确性*/
{
for(year=Year;year<Nyear;year++)/*计算从2010年到所指定年份之间的天数*/
{
n=Jyear();
sum1=sum1+337+n;
}
int a[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int i;
if((year%4==0&&year%100!=0)||year%400==0)/*判断平年还是闰年*/
a[3]+=1;
else
a[3]+=0;
for(i=0;i<Nmonth;i++)/*计算指定年份到指定月份之间的天数*/
sum2+=a[i];
int day;
days=sum1+sum2+Nday;/*计算2010年1月1日到指定日期之间总天数*/
day=days%5;
printf("***三天打鱼两天晒网***\n\n");
printf("从%d年%d月%d日到%d年%d月%d日共有%d天。\n",Year,Month,Day,Nyear,Nmonth,Nday,days);
printf("(余数得%d)\n",day);
fprintf(q,"%s","***三天打鱼两天晒网***\n\n");
if(day>0&&day<4)
{ printf("这一天他在打渔!\n");
fprintf(q,"%s","这一天他在打渔!\n");
}
else
printf("这一天他在晒网!");
fprintf(q,"%s","这一天他在晒网!\n");
}
else
printf("您输入的日期不合常理,请重新输入!\n");
fclose(p);
fclose(q);
}
心得体会:
通过这次作业的完成,我深刻的体会到只有在实践中才能发现问题所在并能更深刻的解决问题。在完成过程中遇到过总日期计算错误,原来是将初始值放在了循环之内,在验证日期正确性时,用了一个Jyear函数与switch语句解决,在读写文件时遇到很多问题,最终与同学探讨解决。在过程中体会到带着问题查阅资料更有效率,自己独立深入思考以及与同学互相讨论互相探索的重要性。