一、题目: 中国有句俗语叫“三天打鱼两天晒网”。某人从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
撒花撒花~~~~