程序设计方法学作业(一)——捕鱼与晒网

中国有句俗语叫“三天打鱼两天晒网”。某人从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还不知如何使用,只用到了读入流和写入流

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值