用Java解决“三天打渔两天晒网的问题”(2)

用Java解决“三天打渔两天晒网的问题”

在上一个博客中,处理的也是同一个问题,但在这次的程序里,我加入了文件部分,能够实现从in.txt中读入,并进行数据的处理,再将处理后的数据传入给out.txt文件。


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


对于这个问题我的设计思路是:
1.先定义一个变量存放天数总和,并初始化为0,定义每个月份所对应的天数。
2.定义在控制台中输入数据的输入,计算及处理的函数select Case1。在这个函数里先输入年月日,判断年份是否为闰年,若为闰年,将二月的天数更改为29天,再判断所输入的日期是否正确,若正确,计算此日期是打渔还是晒网,若错误,提示信息,重新输入。
3.定义在in.txt文件中读取数据并计算及输出给out.txt文件的函数。这个函数定义了一个FileReader对象来读取in.txt文件中的数据和一个FileWriter对象来将数据写入out.txt文件中。在算法部分,每次提取一行字符串,利用 String[]arr=str.split(” “);来提取用空格隔开的字符串,将提取出来的日期同样按上一个函数的方法进行计算,最后输出到目标文件中。
4.最后,在主函数main中,用switch-case语句设置一个菜单,由菜单来选择计算的方法是按照在控制台中输入还是在文件中输入。设计结束。


程序流程图为
这里写图片描述


下面是程序源代码

package WorkOne;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
/**
 *@author Ray
 */
import java.util.Scanner;

public class Test {
    static int days=0;//初始化天数总和为0
    static int m[]={31,28,31,30,31,30,31,31,30,31,30,31};//定义每个月份所对应的天数
    int start_year=2010;//设置初始年份
    int start_month=1;//设置初始月份
    int start_day=1;//设置初始天数
    @SuppressWarnings("resource")


    public static void main(String[] args) throws Exception{

        System.out.println("想知道某人何时打渔何时晒网吗?");
        System.out.println("                          ");
        System.out.println("请选择你想要进行计算的方式...");
        System.out.println("                           ");
        System.out.println("1.在控制台中输入日期并显示。 ");
        System.out.println("                            ");
        System.out.println("2.在文件中输入,并显示在另一个文件中。 ");
        int item;
        Scanner in=new Scanner(System.in);
        item=in.nextInt();//输入选择菜单项

        switch(item){
            case 1:
                selectCase1();//选择菜单1,调用selectCase1函数,进行在控制台中输入时间数据并显示结果在此框中
                break;
            case 2:
                selectCase2();//选择菜单2,调用selectCase2函数,读取在in.txt文件中的时间数据,并进行计算,将结果显示在out.txt文件中
                break;
            default:
                System.out.println("输入的选项不合适...");//若输入的菜单项不是上述数字,则返回提示信息
                break;
        }
    }


    //在控制台中输入数据的输入,计算及处理函数
    public static void selectCase1() {

        while(true){
            Scanner input=new Scanner(System.in);
            System.out.println("请输入所要查询日期的年 月 日:(年月日之间用空格隔开)");
            //输入年 月  日
            int year=input.nextInt();
            int month=input.nextInt();
            int day=input.nextInt();
            if(year%4==0&&year%100!=0||year%400==0){
                m[1]=29;//判断年份是否为闰年 若为闰年 将二月的天数更改为29天
            }

            //判断所输入的日期是否正确(若正确 计算此日期的日程 若错误 提示信息 重新输入)
            if((year>=2010)&&(month>=1&&month<=12)&&(day>=1&&(day<=m[month-1]))){
                //累计年
                for(int i=2010;i<year;i++){
                    days=days+365;
                    if(year%4==0&&year%100!=0||year%400==0){
                        days++;//若为闰年 天数加一
                    }
                }   
                //累计月
                for(int i=0;i<month-1;i++){
                    days=days+m[i];
                }
                //累计日
                days=days+day;
                //计算打渔还是晒网
                if(days%5==1||days%5==2||days%5==3){
                    System.out.println("此人在这一天打渔。");
                }//余数为1,2,3 则为打渔
                else{
                    System.out.println("此人在这一天晒网。");
                }//余数为4,0 则为晒网
                break;
            }else{
                System.out.println("输入的日期错误!请重新输入!");
            }       
        }
    }


    //在in.txt文件中读取数据并计算及输出给out.txt文件的函数
    public static void selectCase2() throws Exception{

        //创建一个FileReader对象用来读取文件中的字符
        FileReader reader =new FileReader("D:\\tts9\\work\\程序设计方法学作业1\\Source\\in.txt");
        @SuppressWarnings("resource")
        BufferedReader br=new BufferedReader(reader);
        //创建一个FileWriter对象用于向文件中写入数据
        FileWriter writer=new FileWriter("Source/out.txt", true);
        @SuppressWarnings("resource")
        BufferedWriter bw=new BufferedWriter(writer);
        String str;//定义没读取的一行字符赋给str

        //一次读取一行字符,直到到达末尾
        while ((str=br.readLine())!=null){
             String[]arr=str.split(" ");//提取用空格隔开的字符串
             int[]a = new int[arr.length];//定义a为int类型数组
             for(int i=0;i<arr.length;i++){
                 try {
                   a[i] = Integer.valueOf(arr[i]).intValue();//将String类型的数组转化为int类型数组
                 } catch (NumberFormatException e) {
                     e.printStackTrace();
                 }
             }

             int year=a[0];
             int month=a[1];
             int day=a[2];

             if(year%4==0&&year%100!=0||year%400==0){
                 m[1]=29;//判断年份是否为闰年 若为闰年 将二月的天数更改为29天
             }

             //判断所输入的日期是否正确(若正确 计算此日期的日程 若错误 提示信息 )
             if((year>=2010)&&(month>=1&&month<=12)&&(day>=1&&(day<=m[month-1]))){
                 //累计年
                 for(int j=2010;j<year;j++){
                     days=days+365;
                     if(year%4==0&&year%100!=0||year%400==0){
                         days++;//若为闰年 天数加一
                     }
                 }  
                 //累计月
                 for(int k=0;k<month-1;k++){
                     days=days+m[k];
                 }
                 //累计日
                 days=days+day;

                 //计算打渔还是晒网
                 if(days%5==1||days%5==2||days%5==3){
                     String word="此人在这一天打渔。";
                     bw.write(word);//将字符串“此人在这一天打渔。”输出给out.txt文件
                     bw.write("\r\n");//换行
                 }//余数为1,2,3 则为打渔
                 else{
                     String word="此人在这一天晒网。";
                     bw.write(word);//将字符串“此人在这一天晒网。”输出给out.txt文件
                     bw.write("\r\n");//换行
                 }//余数为4,0 则为晒网

             }else{
                 String word="输入的日期错误。";
                 bw.write(word);//将字符串“输入的的日期错误。”输出给out.txt文件
                 bw.write("\r\n");//换行
             }      

        }   
            br.close();//关闭输入流
            bw.close();//关闭输出流
    }

}

在调试和测试的过程中,出现的主要问题是,选择了以文件的方式时,用文件读取数据,及处理数据的过程都是正确的,但却不在out.txt文件中输出,后来经过调试,得知是在读取和输出的结束没有关闭输入流和输出流,才会导致数据输出不到目标文件中。(PS:在输出数据到文件中时,只有当缓冲区用完和关闭了输入输出流时才会将数据输出到目标文件中。)


调试及测试截屏
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
以上就是我对这个程序的所有总结,若有可以改进的地方,希望大家可以指出,虽然现在在编程上还是一个小白,但总归功夫是不负有心人的,我们一起学习和进步吧。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值