三天打鱼两天晒网(C语言)
题目:中国有句俗语叫“三天打鱼两天晒网”。某人从2010年1月1日起开始“三天打鱼两天晒网”,问这个人在以后的某一天中是“打鱼”还是“晒网”。用C
或C++语言/java/python实现程序解决问题。
基本要求:1.程序风格良好(使用自定义注释模板),提供友好的输入输出。
提高要求:1.输入数据的正确性验证。
2.使用文件进行数据测试。如将日期 20100101 20111214 等数据保存在in.txt文件中,程序读入in.dat文件进行判定,并将结果输
出至out.txt文件。*/
流程图如下:
/*关于"三天打鱼两天晒网" 赵茹平
创建于2019年2月17日 最后一次修改日期2019年3月1日
中国有句俗语叫“三天打鱼两天晒网”。某人从2010年1月1日起开始“三天打鱼两天晒网”,问这个人在以后的某一天中是“打鱼”还是“晒网”。用C
或C++语言/java/python实现程序解决问题。
基本要求:1.程序风格良好(使用自定义注释模板),提供友好的输入输出。
提高要求:1.输入数据的正确性验证。
2.使用文件进行数据测试。如将日期 20100101 20111214 等数据保存在in.txt文件中,程序读入in.dat文件进行判定,并将结果输
出至out.txt文件。*/
#include<stdio.h>
int action(int a)
{
if(a%4==0&&a%100!=0||a%400==0)/*闰年判定条件*/
return 1;/*是闰年返回1*/
else
return 0;/*不是闰年返回0*/
}
int number(int year,int month,int day)/*自定义number函数计算输入日期距2010年1月1日的天数*/
{
int sum=0,i,j,k;
int a[12]={31,29,31,30,31,30,31,31,30,31,30,31};/*数组a存放闰年每月的天数*/
int b[12]={31,28,31,30,31,30,31,31,30,31,30,31};/*数组b存放平年每月的天数*/
for(j=2010;j<year;j++)/*加年的天数*/
{
if(action(j)==1)/*若是闰年加366天*/
sum+=366;
else/*若是平年加365天*/
sum+=365;
}
/*加月的天数*/
if(action(year)==1)/*是闰年,累加数组a前month-1个月份的天数*/
for(i=0;i<month-1;i++)
sum+=a[i];
else/*是平年,累加数组b前month-1个月份的天数*/
for(i=0;i<month-1;i++)
sum+=b[i];
/*加日的天数*/
sum+=day;
return sum;/*返回输入日期距2010年1月1日的天数*/
}
/*void save(number *Num)//文件
{
number *N=Num;
FILE*fp;
char filename[LEN+1];
printf("请输入文件名:\n");
scanf("%s",filename);
fp=fopen(filename,"w");
while(N)
{
fprintf(fp,"%d%d%d\n",year,month,day);
N = N->next1;
}
printf("保存成功!\n");
fclose(fp);
system("pause");
}
void open(number *Num)
{
number *N=Num;
char filename[LEN+1];
FILE*fp;
printf("请输入已有文件名:\n");
scanf("%s",filename);
if((fp=fopen(filename,"r"))==NULL)
{
printf("打开文件%s出错!",filename);
system("pause");
return;
while(fscanf(fp,""%d%d%d\n",year,month,day)==3)
{
if(N->next1==NULL)
{
break;
}
else N = N->next1;
}
}
else
{
printf("读入完毕!");
printf("输出如下:\n");
while(N)
{
printf("%d%d%d\n",year,month,day);
N = N->next1;
}
}
fclose(fp);
system("pause");
}*/
int main()
{
//number *Num;
int year,month,day,num;/*定义年月日*/
printf("请输入年月日(中间用空格隔开)\n");
scanf("%d%d%d",&year,&month,&day);/*输入年月日*/
num=number(year,month,day);/*调用number函数*/
if(year<2010||month>12||day>31)/*判断输入日期是否合法*/
printf("请输入正确时间");
else/*日期合法*/
{
if((num%5)>0&&(num%5)<4)/*余数为1,2,3,则打鱼,反之,晒网*/
printf("%d %d %d该人当天在打鱼\n",year,month,day);
else
printf("%d %d %d该人当天在晒网\n",year,month,day);
}
}
总结
第一眼看到这个题目还心里觉得应该不难,天数除以5所得的余数就可判断出是打鱼还是晒网,开始着手设计的时候才意识到了这个天数要怎么计算,平年闰年如何判定,每个月份天数不一样怎么弄,我看了老师的提示,也百度了一下最后用if(a%40&&a%100!=0||a%4000)来判定是否是闰年,然后用两个数组分别表示平年和闰年12个月的天数,最后年月日加在一起得到天数,从而判断出是打鱼还是晒网。
程序改到最后还是存在缺陷,比如2月份输入30天也不会报错,自己敲代码之前看了好多别人编的,最后根据自己习惯完成了这个程序,也不断修改了一些Bug,能力有限,但我会继续改进。