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

编程入门 行业动态 更新时间:2024-10-11 03:15:05

用Java解决“三天打渔<a href=https://www.elefans.com/category/jswz/34/1733467.html style=两天晒网的问题”(2)"/>

用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;//初始化天数总和为0static 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:在输出数据到文件中时,只有当缓冲区用完和关闭了输入输出流时才会将数据输出到目标文件中。)


调试及测试截屏






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

更多推荐

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

本文发布于:2024-03-13 07:29:06,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1733466.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:两天晒网   打渔   Java

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!