中国有句俗语叫“三天打鱼两天晒网”。某人从2010年1月1日起开始“三天打鱼两天晒网”,问这个人在以后的某一天中是“打鱼”还是“晒网”。用C或C++语言/java/python实现程序解决问题。
基本要求:1.程序风格良好(使用自定义注释模板),提供友好的输入输出。
提高要求:1.输入数据的正确性验证。
2.使用文件进行数据测试。如将日期 20100101 20111214 等数据保存在in.txt文件中,程序读入in.dat文件进行判定,并将结果输出至out.txt文件
分析思路:首先根据题意2010/1/1应该在捕鱼,输入的日期不应早于2010年,并且要符合实际。
其次,利用日历模式规定好起始日期和终点日期,将相隔时间换算成毫秒后算出两日期一共相差多少天。
最后,根据题目特征,利用相差天数除以5所得的余数,如果为0 1 2则表示正在打渔,3 4则表示晒网。利用IO流输入输出、
代码实现:
package 程序设计方法学作业一;
import java.util.*;
class Day {
protected int year;//用于记录输入的年月日
protected int month;
protected int day;
}
class JiSuan{
long x;//指定日期与初始日期相差天数
String s;
public void Count(Day days) {
//运用日历字段模式求相差天数
Calendar c1=Calendar.getInstance();
Calendar c2=Calendar.getInstance();
c1.set(2010,0,1);//设置日历起始日期
c2.setLenient(false);//设置为non-lenient模式,当输入日期与实际不符时,程序会自动终止并抛出异常
//不过我在IO流中捕获了该异常,如果出现非闰年2/29这种情况,会将错误提示写到out.txt中
//程序依旧会正常运行,不会报错
c2.set(Calendar.YEAR,days.year);//设置日历终点日期
c2.set(Calendar.MONTH,days.month-1);
c2.set(Calendar.DATE,days.day);
//计算两日期相差天数
x= (c2.getTimeInMillis() - c1.getTimeInMillis()) / (1000 * 60 * 60 * 24);
}
public void Result() {//根据相差天数计算当前活动
if((x%5)>=0&&(x%5)<3)//由于从1号开始打渔,余数为0 1 2时表示打渔三天
s=”正在打渔”;
else
s=”正在晒网”;
}
}
输入输出文本:
package 程序设计方法学作业一;
import java.io.*;
public class Text {
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
Day days=new Day();
JiSuan jisuan=new JiSuan();
//创建字符读取、写入缓冲流
BufferedReader reader=new BufferedReader(new FileReader("D:\\eclipse\\Java\\程序设计方法学作业一\\in.txt"));
BufferedWriter writer=new BufferedWriter(new FileWriter("D:\\eclipse\\Java\\程序设计方法学作业一\\out.txt"));
String date;//date用于读取输入的日期,格式为20100101
while((date=reader.readLine())!=null) {
String a = date.substring(0, 4);//截取date字段前4位作为日历年份
String b = date.substring(4, 6);//截取date字段中间2位作为日历月份
String c = date.substring(6, 8);//截取date字段后2位作为日历天数
Integer year=new Integer(4);
Integer month=new Integer(4);
Integer day=new Integer(4);
days.year=year.valueOf(a);
days.month=month.valueOf(b);
days.day=day.valueOf(c);//将字符型转换成Integer类型,便于日历参数的传入
System.out.println(a+"/"+b+"/"+c);//在窗口中输出in.txt中输入的日期,方便核对
if(days.year<2010) {//判断输入的年份是否早于2010年
writer.write("输入日期超出初始日期范围");
writer.write("\r\n");
}
else {
try {//进行结果的运算和out.txt的写入
jisuan.Count(days);
jisuan.Result();
writer.write(jisuan.s);
}catch(IllegalArgumentException e){//捕获non-lenient模式抛出的异常并自定义错误提示
writer.write("输入的日期与实际不符");
}
writer.write("\r\n");
}
}
reader.close();//关闭读取流
writer.close();//关闭写入流
}
}
作业总结:因为还在初学阶段,in.dat还不知如何使用,只用到了读入流和写入流