中国有句俗语叫“三天打鱼两天晒网”。某人从2010年1月1日起开始“三天打鱼两天晒网”,问这个人在以后的某一天中是“打鱼”还是“晒网”。用C或C++语言/java/python实现程序解决问题。
基本要求:1.程序风格良好(使用自定义注释模板),提供友好的输入输出。
提高要求:1.输入数据的正确性验证。
2.使用文件进行数据测试。如将日期 20100101 20111214 等数据保存在in.txt文件中,程序读入in.dat文件进行判定,并将结果输出至out.txt文件。
1.问题分析与算法设计
根据题意可以将解题过程分为三步:
1)计算从2010年1月1日开始至指定日期共有多少天;
2)由于“打鱼”和“晒网”的周期为5天,所以将计算出的天数用5去除;
3)根据余数判断他是在“打鱼”还是在“晒网”;
若 余数为1,2,3,则他是在“打鱼”
否则 是在“晒网”
在这三步中,关键是第一步。求从1990年1月1日至指定日期有多少天,要判断经历年份中是否有闰年,二月为29天,平年为28天。闰年的方法可以用伪语句描述如下:
如果 ((年能被4除尽 且 不能被100除尽)或 能被400除尽)
则 该年是闰年;
否则 不是闰年。
2.算法设计思路
3.具体代码
//file stdyltsw.c
//author liuhaokun
//data 2019/2/27
//email 952535450@qq.com
//优快云 https://blog.youkuaiyun.com/qq_42302466
#include<stdio.h>
#include<stdlib.h>
void main()
{
int day,month,year,YEAR,MONTH,ch,flag=0,days=0;
int months[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};//定义月份的天数
printf("请选择输入的方式:\n1.文件输入\n2.键盘输入\n");
scanf("%d",&ch);
if(ch==1)//将in.txt的8位数字转换为年、月、日
{
FILE *in;
int j,i[8];
in=fopen("in.txt","r");
for(j=0;j<8;j++)
{
i[j]=fgetc(in)-48;//字符型的数字需要在减去48后成为整型数字
}
year=i[0]*1000+i[1]*100+i[2]*10+i[3];
month=i[4]*10+i[5];
day=i[6]*10+i[7];
fclose(in);
}
if(ch==2)
{
printf("请输入所需当天的年月日:");
scanf("%d%d%d",&year,&month,&day);
while(year<2010)//测试年份是否正确
{
printf("请输入正确的日期!");
scanf("%d%d%d",&year,&month,&day);
}
}
for(YEAR=2010;YEAR<year;YEAR++)//计算相差年份的天数
{
days+=365;
if((YEAR%4==0&&YEAR%100!=0)||YEAR%400==0)//如果是闰年则多一天
{
days+=1;
}
}
for(MONTH=1;MONTH<month;MONTH++)//计算相差月份的天数
{
if((year%4==0&&year%100!=0)||year%400==0)//如果是闰年则二月份多加一天
{
months[2]=29;
}
else
{
months[2]=28;
}
days+=months[MONTH];
}
days+=day-1;//计算相差的天数
if(ch==1)
{
FILE *out;
char word1[10]="Fishing",word2[10]="Resting";
out=fopen("out.txt","w+");
if(days%5==3||days%5==2||days%5==1)//如果总天数对5求余为1、2、3时,这个人就在打鱼,否则在晒网
{
fputs(word1,out);
}
else
{
fputs(word2,out);
}
fclose(out);
printf("OK\n");
}
if(ch==2)
{
printf("这个人从2010年1月1日到%d年%d月%d日一共经过%d天\n",year,month,day,days);
if(days%5==3||days%5==2||days%5==1)//如果总天数对5求余为1、2、3时,这个人就在打鱼,否则在晒网
{
printf("这一天这个人这天在打鱼。");
}
else
{
printf("这一天这个人这天在晒网。");
}
}
}
4.调试及测试截屏
【1】程序测试部分
1)键盘输入
2)文件输入
【2】程序调试过程
1) 键盘输入调试
2) 文件输出调试
3) 天数计算调试
4) 文件输出调试
5) 键盘输入后输出调试
5.心得体会
程序在进行时使用了较多的if语句,而且对于输入日期的合法性没有做详细而周密的检测,个人感觉日期的检测可以运用数组的方法来检测,希望在下次的题目中可以做到这次的不足。