三天打鱼两天晒网

中国有句俗语叫“三天打鱼两天晒网”。某人从2010年1月1日起开始“三天打鱼两天晒网”,问这个人在以后的某一天中是“打鱼”还是“晒网”。用C或C++语言实现程序解决问题。
基本要求:1.程序风格良好(使用自定义注释模板),提供友好的输入输出。
提高要求:1.输入数据的正确性验证。
2.使用文件进行数据测试。如将日期 20100101 20111214 等数据保存在in.txt文件中,程序读入in.dat文件进行判定,并将结果输出至out.txt文件。

    算法分析
    由题意可知,“三天打鱼,两天晒网”是以五天为一个周期,并且是从2010.01.01开始的一个循环。设计时先要考虑要查询的日期与开始日期的差值,然后用差值对5取余,从计算出来的结果可知现在是五天中的第几天。
还要设置一个方法去对输入数据进行验证,确保数据的正确性。然后再创建一个输入流文件和一个输出流文件,读取输入流文件的内容,并将结果呈现在输出流文件上。  

流程图在这里插入图片描述

import java.util.*; 
import java.io.*;

public class FADN {

//闰年的天数	
static final int[] leap_year=   {31,29,31,30,31,30,31,31,30,31,30,31};
//平年的天数
static final int[] common_year= {31,28,31,30,31,30,31,31,30,31,30,31};

//用来判断输入年份的正确性,正确返回1,错误返回0。
public static int input(int year,int month,int day) {
	//判断年份输入是否正确,若输入年份小于2010年,将会报错
	if(year<2010)
		{
		System.out.println("输入年份过小!请重新输入");
		return 0;
		}
	
	//判断月份输入是否正确,若输入月份小于0,或者输入月份大于30,都会报错
	if(month<1||month>12)
		{
		System.out.println("输入月份不存在!请重新输入");
		return 0;
		}
	
	//判断是否为闰年
	if(year%4==0)
	{
		if(year%100==0&&year%400!=0)
		{
			//判断日期是否在月份内,若输入日期小于0,或者大于当前月份所有天数
			//将会报错
			if(day<1||day>common_year[month-1])
				{
				System.out.println("输入日期不存在!请重新输入");
				return 0;
				}
			else
				return 1;
		}
		else
		{
			//判断日期是否在月份内,若输入日期小于0,或者大于当前月份所有天数
			//将会报错
			if(day<1||day>leap_year[month-1])
				{
				System.out.println("输入日期不存在!请重新输入");
				return 0;
				}
				else
					return 1;
		}
	}
	else
	{
		//判断日期是否在月份内,若输入日期小于0,或者大于当前月份所有天数
		//将会报错
		if(day<1||day>common_year[month-1])
			{
			System.out.println("输入日期不存在!请重新输入");
			return 0;
			}
	}
	return 1;
}

//用来计算过了的天数
public static int count(int year,int month,int day) {
	int num_year=0;//统计闰年的数量
	int num_month=0;//统计这一年过了的天数
	
//判断是否为闰年
	for(int i=2010;i<year;i++) {
		if(i%4==0)
		{
			if(i%100==0&&i%400!=0)
				continue;
		//为闰年时,num_year数量加一
		num_year++;
		}	
	}
	
//对当前年度之前月份过的天数计数
	for(int j=1;j<month;j++) {
		if(year%4==0)//判断闰年和平年
		{
			//判断结果若为平年,则增加的天数为平年的天数
			//判断结果若为闰年,则怎加的天数为闰年的天数
			if(year%100==0&&year%400!=0)
				num_month=num_month+common_year[j-1];
			else
				num_month=num_month+leap_year[j-1];
		}
		else
			num_month=num_month+common_year[j-1];
	}
	
	//天数的总和
	int num=day+num_month+num_year*366+(year-num_year-2010)*365;
	return num;
}

//判断打渔或晒网
public static void judge(int num) {
	int x=0;
	x=num%5;
	//用过了的天数对5取余,结果为0或4,则输出晒网
	//若结果为1、2或3,则输出大鱼。
	switch(x) {
	case 0:
		System.out.println("今天晒网");
		break;
	case 1:
	case 2:
	case 3:
		System.out.println("今天打鱼");
		break;
	case 4:
		System.out.println("今天晒网");
		break;
	}
}

public static void main(String[] args)throws Exception {
		// TODO 自动生成的方法存根
		Scanner x =new Scanner(System.in);//输入语句的格式
		//初始界面
		System.out.println("输入要查询的日期:(格式为:年 月 日)");
		System.out.println("例:2020 2 12");
		//输入年月日
		int year=x.nextInt();
		int month=x.nextInt();
		int day=x.nextInt();
		//调用判断方法
		int right=input(year,month,day);
		//对输入年份判断,若输入日期为错误日期,则需重新输入
		for(;right!=1;)
		{
			System.out.println("输入要查询的日期:(格式为:年 月 日)");
			System.out.println("例:2020 2 12");
			year=x.nextInt();
			month=x.nextInt();
			day=x.nextInt();
			right=input(year,month,day);
		}
//调试循环推出没有
//System.out.println("fafa");
		//调用计算方法
		int num=count(year,month,day);
		System.out.println("现在是第"+num+"天。");
		//调用判断方法
		judge(num);
		//创建一个文件字节输入流来读取文件
		FileInputStream in=new FileInputStream("in.txt");
		//创建一个文件输出流对象,并指定输出文件名称
		FileOutputStream out=new FileOutputStream("out.txt");
		//定义一个int类型变量b和一个空字符串a
		int b=0;
		String a="";
		/**
		 * 用来看出输入文件中元素的ASCLL表值
		while((b=in.read())!=-1) {
			System.out.println(b);
		}
		*/
		//建立一个循环去读写in.txt文件并输出在out.txt文件上
		for(;b!=-1;){
			a="";
			//为year赋值,
			while((b=in.read())!=32){
//				System.out.print(b+" ");//用来检测输出成果
				if(b>30)
					a=a+(char)b;
			}
			year=Integer.valueOf(a);
//			System.out.println(year);
		
			a="";
			while((b=in.read())!=32) {
//				System.out.print((char)b+" ");
				a=a+(char)b;
			}
			month=Integer.valueOf(a);
//			System.out.println(month);
		
			a="";
			while((b=in.read())!=13&&b!=-1) {
//				System.out.print((char)b+" ");
				a=a+(char)b;
			}
			day=Integer.valueOf(a);
//			System.out.println(day);
		
		
			if(count(year,month,day)%5==1||count(year,month,day)%5==2||count(year,month,day)%5==3){
				out.write("今天打鱼".getBytes());
				out.write("\r\n".getBytes());
				}
			else {
				out.write("今天晒网".getBytes());
				out.write("\r\n".getBytes());
				}
			}
			in.close();
			out.close();
		/**
	String b="";
	char[]a= {'1','2','3'};
	for(int i=0;i<3;i++) {
		b=b+a[i];
	}
	String d="1212";
	d=d+'1';
	int c=Integer.valueOf(b);
	System.out.println(c);
	*/
}

}

运行结果
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值