一、题目: 中国有句俗语叫“三天打鱼两天晒网”。某人从2010年1月1日起开始“三天打鱼两天晒网”,问这个人在以后的某一天中是“打鱼”还是“晒网”。用C或C++语言/java/python实现程序解决问题。
二、使用语言:C语言
- 算法思路:
- 语言描述:
1)计算从2010年1月1日开始至指定日期共有多少天;
2)由于“打鱼”和“晒网”的周期为5天,所以将计算出的天数用5去除;
3)根据余数判断他是在“打鱼”还是在“晒网”;
若 余数为1,2,3,则他是在“打鱼”
否则 是在“晒网”
2、流程图:
源代码:
/**
*file_name:三天打鱼两天晒网
*author:商嘉鑫
*creation date:2019/2/26
*modification date: 2019/3/2
*OS:Windows
*IDE:Dev-C++
*brief:某人从2010年1月1日起开始“三天打鱼两天晒网”,
问这个人在以后的某一天中是“打鱼”还是“晒网”。
*version:1.0
**/
#include<stdio.h>/*预处理命令*/
#include<stdlib.h>/*预处理命令*/
#define N 10000/*宏定义*/
int main()
{
FILE* fp1;/*申请一个文件指针*/
FILE* fp2;/*申请一个文件指针*/
/*fopen函数,返回就是上面定义的文件指针了,
文件以a模式进行文件添加*/
fp2 = fopen("G://out.txt","a");
fp1 = fopen("G://in.txt","r");
if(fp1 == NULL||fp2==NULL)
{
printf("ERROR!\n");
}
char a,b;/*分隔符*/
int year,month,day,sum,leap,i,j;/*年,月,日,距2010-1-1多少天*/
{
for(j=0;j<N;j++)
{
fscanf(fp1,"%d%c%d%c%d%*[^0-9.]",&year,&a,&month,&b,&day);
}
if(year<2010) /*判断所输入日期在2010-1-1之前还是之后*/
{
fprintf(fp2,"他现在还没有开始打鱼晒网,请重新输入!\n\n");
exit(1);
}
sum=0;
{
switch(month)
{
case 1:sum=0;
if(day>31)
{
fprintf(fp2,"日期错误,请确定1月有这一天吗?\n\n");
exit(1);
}
break;
case 2:sum=31;
if(day>28)
{
fprintf(fp2,"日期错误,请确定2月有这一天吗?\n\n");
exit(1);
}
break;
case 3:sum=59;
if(day>31)
{
fprintf(fp2,"日期错误,请确定三月有这一天吗?\n\n");
exit(1);
}
break;/*平年*/
case 4:sum=90;
if(day>30)
{
fprintf(fp2,"日期错误,请确定4月有这一天吗?\n\n");
exit(1);
}
break;
case 5:sum=120;
if(day>31)
{
fprintf(fp2,"日期错误,请确定5月有这一天吗?\n\n");
exit(1);
}
break;
case 6:sum=151;
if(day>30)
{
fprintf(fp2,"日期错误,请确定6月有这一天吗?\n\n");
exit(1);
}
break;
case 7:sum=181;
if(day>31)
{
fprintf(fp2,"日期错误,请确定7月有这一天吗?\n\n");
exit(1);
}
break;
case 8:sum=212;
if(day>31)
{
fprintf(fp2,"日期错误,请确定8月有这一天吗?\n\n");
exit(1);
}
break;
case 9:sum=243;
if(day>30)
{
fprintf(fp2,"日期错误,请确定9月有这一天吗?\n\n");
exit(1);
}
break;
case 10:sum=273;
if(day>31)
{
fprintf(fp2,"日期错误,请确定10月有这一天吗?\n\n");
exit(1);
}
break;
case 11:sum=304;
if(day>30)
{
fprintf(fp2,"日期错误,请确定11月有这一天吗?\n\n");
exit(1);
}
break;
case 12:sum=334;
if(day>31)
{
fprintf(fp2,"日期错误,请确定12月有这一天吗?\n\n");
exit(1);
}
break;
default:fprintf(fp2,"日期错误,请确定一年有这个月份吗?\n\n");
exit(1);
}
}
sum=sum+day;
if(year%400==0||year%100!=0&&year%4==0) /*判断是否为闰年*/
leap=1;
else
leap=0;
if(leap==1&&month>2&&month<13)
sum=sum++;
i=year-2012;
if(i>0) /*i>0说明已经超过2012年*/
/*以每年为365天,闰年每四年一次,
再加上2010和2011两个过去的年的总天数*/
sum+=365*i+(i-1)/4+1+365*2;
/*单算2010年和2011年*/
else if(year==2010)
sum=sum;
else if(year==2011)
sum+=365;
else if(year==2012)
sum=sum+730;
/*输出结果到out.txt*/
fprintf(fp2,"现在距2010-1-1已经%d天了\n",sum);
if(sum%5==3||sum%5==2||sum%5==1)
fprintf(fp2,"%d-%d-%d他在打鱼++++++++>\n\n",year,month,day);
else
fprintf(fp2,"%d-%d-%d他在晒网-------->\n\n",year,month,day);
}
fclose(fp1);
fclose(fp2);
return 0;
}
三、调试与测试:
- 调试:略。
2、测试截屏:
(1)合法日期2012-2-2
在文件in.txt中输入2012-2-2运行程序,控制台不输出,结果被输出到out.txt
- 不合法日期
- 2010年之前的日期:2009-2-2
在文件in.txt中输入2009-2-2运行程序,控制台不输出,提示语句被输出到out.txt
- 2010年之后的日期:
- 某个月天数不合法:2019-1-32
在文件in.txt中输入2019-1-32运行程序,控制台不输出,提示语句被输出到out.txt
- 月份不合法:2012-13-1
在文件in.txt中输入2012-13-1运行程序,控制台不输出,提示语句被输出到out.txt
撒花撒花~~~~