中国有句俗语叫“三天打鱼两天晒网”。某人从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);
*/
}
}
运行结果