“三天打鱼两天晒网"问题

中国有句俗语叫“三天打鱼两天晒网”。某人从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
//CSDN https://blog.csdn.net/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)键盘输入
keyboard_input
2)文件输入
in.txt
document_function
out.txt

【2】程序调试过程

1) 键盘输入调试 在这里插入图片描述
2) 文件输出调试
在这里插入图片描述
3) 天数计算调试
在这里插入图片描述
4) 文件输出调试
在这里插入图片描述
5) 键盘输入后输出调试
在这里插入图片描述

5.心得体会

程序在进行时使用了较多的if语句,而且对于输入日期的合法性没有做详细而周密的检测,个人感觉日期的检测可以运用数组的方法来检测,希望在下次的题目中可以做到这次的不足。

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值