三天打鱼两天晒网
利用java写的判断打鱼还是晒网的一段代码,具有良好的输入输出,,支持文件的输入与写出,对输入的数据以及文件可以较好的判断其正确性
源代码:
public class tsetFish {
public static void main(String[] args) throws Exception {
boolean legal = false;// *设置关键字,标示输入日期是否合法*
String time1 = "2010-1-1";
tsetFish test = new tsetFish();// *实例化该类的一个对象*
while (true) {//*使用户循环查询,当用户不需要时,break退出循环*
System.out.println("选择输入或文件,1输入日期,2输入文件,输入3结束使用");
try{
Scanner sc = new Scanner(System.in);//*实例化Scanner类从键盘接收输入*
int op = sc.nextInt();//*从键盘接收*
if (op == 1) {//*接收1时,则单独从键盘接收,并判断*
inPutDate(test);
} else if (op == 2) {//*接收2时,则单独从文件输入*
System.out.println("请输入文件地址,输入文件中每行只有一条日期");
System.out.println(" 日期格式为2013-2-4 输出结果将在e:/out.txt文件中");
Scanner x = new Scanner(System.in);
String input= x.nextLine();//*接收输入文件地址*
test.receivefile(input);//*将文件地传给*
} else if(op==3){//*选择退出查询*
System.out.println("欢迎您下次使用");
break;
}
else {
System.out.println("您的输入不正确,请重新输入");
}
}catch(Exception e){
System.out.println("你的输入格式不正确,请重新输入");
}
}
}
/*
* 从键盘接收字符串的函数
*/
public static void inPutDate(tsetFish test) throws Exception {//当用户选择1时,调用此函数
System.out.println("请输入在2010-1-1以后的时间查询,比如2010-5-21");
Scanner sc = new Scanner(System.in);
String date= sc.nextLine();//*键盘接收,返回接收的字符串date*
boolean legal = test.timelegal(date);//*调用timelegal函数,判断接收的字符串是否合法,如果合法则返回true*
if (legal) {
test.judge(test.dates("2010-01-01", date));//*首先调用dates函数,目的是计算天数并返回。然后将返回的天数传给judge函数,判断此刻渔夫在做什么。*
}
}
这部分是接受文件与输出文件的函数
/*
* 接收文件的函数
*/
public void receivefile( String input) throws IOException, Exception {
boolean legal = false;// *设置关键字,标示文件中的输入日期是否合法*
String date = null;/*/声明时间字符串date*
tsetFish test = new tsetFish();// *实例化该类的一个对象*
try {
BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream(new File(input))));//*创建字符缓冲流(文件输入流)*
FileOutputStream fos = new FileOutputStream("e:/out.txt");//*创建文件输出流*
while ((date = in.readLine()) != null) {//*如果读取的文件内容不为空,则一直查询*
legal = test.timelegal(date.trim());// *如果接收到字符串则进行判断该字符串是否合法*
if (legal) {/*/如果合法,则进行以下计算*
String str = test.judge(test.dates("2010-01-01", date.trim()));// *调用计算天数的函数,并将返回值返回给判断函数,判断此刻在捕鱼还是在晒网*
str=date.trim()+str;//*写入文件时,将日期与对应结果共同输入*
fos.write(str.getBytes());/*/将判断结果输出到out.txt文件中*
fos.write("\r\n".getBytes());//*换行*
}
}
System.out.print("文件为空了\r\n");
fos.close();//*关闭流*
in.close();
} catch (FileNotFoundException e) {
System.out.print("找不到文件");//*找不到文件异常*
}
}
用来判断输入的日期是否合法
/*
* 判断输入日期是否合法的函数
*/
public boolean timelegal(String time2) {
boolean legal = false;// *设置关键字,标示输入日期是否合法*
DateFormat format = new SimpleDateFormat("yyyy-mm-dd");// *设置将字符串解析为时间的模板*
try {
Date date2 = format.parse(time2);// *将输入的字符串解析为时间,检查输入的时间格式是否正确*
} catch (ParseException e) {
System.out.print("您输入的格式不正确 ");
return legal;
}
String[] time2Array = time2.split("-");// *输入的时间格式正确,分割输入的字符串,将接收的日期字符串按—分割,存入数组time2Array*
int year = Integer.valueOf(time2Array[0]);// *time2Array[0]代表年数year*
int month = Integer.valueOf(time2Array[1]);// *time2Array[1]代表月数month*
int day = Integer.valueOf(time2Array[2]);// *time2Array[2]代表天数day*
if (((month == 4) || (month == 6) || (month == 9) || (month == 11)) && (day < 31)) {// *判断当为4,6,9,11月是,天数是否合法*
legal = true;
} else if (((month == 1) || (month == 3) || (month == 7) || (month == 8) || (month == 10) || (month == 12))
&& day < 32) {// *判断当为1,3,7,8,10,12月是,天数是否合法*
legal = true;
} else if ((month == 2)) {
if ((year % 4 == 0 & year % 100 != 0) || year % 400 == 0) {// *判断是否是闰年*
if (day < 30) {// *判断当为闰年时,二月的天数是否合法*
legal = true;
} else {
System.out.println("您输入的日期不合法");
}
} else {// *判断当不是闰年时,二月的天数是否合法*
if (day < 29) {
legal = true;
} else {
System.out.println("您输入的日期不合法");
}
}
} else {
System.out.println("您输入的日期不合法");
}
return legal;// 返回关键字
}
计算相隔的天数
/*
* 计算日期天数函数,返回天数
*/
public int dates(String time1, String time2) {
int days = 0;
Date date1 = null;
Date date2 = null;
DateFormat format = new SimpleDateFormat("yyyy-mm-dd");// *设置将字符串解析为时间的模板*
try {
date2 = format.parse(time2);// *将输入的字符串解析为时间*
date1 = format.parse(time1);// *将2010-1-1解析为时间*
long day2 = date2.getTime();// *计算输入时间相对时间戳的毫秒数*
long day1 = date1.getTime();// *计算2010-1-1相对时间戳的毫秒数*
days = (int) ((day2 - day1) / (1000 * 3600 * 24));// *计算毫秒数相差,并换算为天数*
} catch (ParseException e) {
return -1;
}
return days+1;//*返回天数*
}
利用周期判断打鱼还是晒网函数
/*
* 判断在打鱼还是在晒网函数
*
*/
public String judge(int days) throws Exception {
String str = null;
if (days >= 0) {// *判断天数是否为正数,如果是则计算天数,否则天数过早*
int y = (days % 5);// *天数对周期数取模,*
if (y == 1 || y == 2 || y == 3) {// *如果模为1,2,3则在打鱼,否则在晒网*
str = "主人正在打鱼,改天请你吃鱼";
} else {
str = "最近正在晒网,改天带你去打鱼";
}
} else {
System.out.println("您输入的日期过早了");
}
System.out.println(str);
return str;
}
}
程序流程图
主要方法:
1:文件输入与输出方法receivefile(String input)
目前只做到了,逐行输入,且每行只有一条信息。从键盘输入文件地址,判断文件是否存在。若不存在,则重新输入。若存在,逐行的读取信息,并判断日期格式是否正确然后计算天数得出结果,将结果输出到文件,知道读取完或文件为空为止。
2:字符串判断方法timelegal(String time2)
首先利用format判断字符串格式是否正确,若错误则重新输入,若正确,则判断日期是否合法,如是否符合实际,包括闰年与平年,若正确则继续,反之回到开始。
3:计算天数方法dates(String time1,String time2)
首先利用format.parse,将字符串解析为时间对象,然后调用getTime()方法,求得相对于同一个时间戳的毫秒数,并将其转化为天数
date2 = format.parse(time2);// *将输入的字符串解析为时间*
date1 = format.parse(time1);// *将2010-1-1解析为时间*
long day2 = date2.getTime();// *计算输入时间相对时间戳的毫秒数*
long day1 = date1.getTime();// *计算2010-1-1相对时间戳的毫秒数*
days = (int) ((day2 - day1) / (1000 * 3600 * 24));// *计算毫秒数相差,并换算为天数*
4:判断打鱼或晒网方法judge( int dates)
首先判断,天数为正,然后对周期数5求模,当为1,2,3时在打鱼,否则在晒网。
if (days >= 0) {// 判断天数是否为正数,如果是则计算天数,否则天数过早
int y = (days % 5);// 天数对周期数取模,
if (y == 1 || y == 2 || y == 3) {// 如果模为1,2,3则在打鱼,否则在晒网
str = “主人正在打鱼,改天请你吃鱼”;
} else {
str = “最近正在晒网,改天带你去打鱼”;
}
} else {
System.out.println(“您输入的日期过早了”);
}
心得
虽然这道题很简单,但在写的过程中,让我有了很大的收获。我深刻的理解到,任何一个细小的点,都是至关重要的,特别在输入的检查过中,我思考了很多,感觉了其中的乐趣。经过不断的测试与修改,这段代码已经基本符合要求,可以较好的对用户的输入进行检查,并且具有文件输入输出的功能,而且,也可以检查文件的内容是否正确。不过还有缺陷,那就是文件中的日期只能按行读取。感谢老师的要求,这是我第一次写博客,但让自己感觉很充实,我决心坚持下去,以后经常写下自己平时所学习的东西,激励自己。本人水平有限,还在不断学习中,如果文章有错误,欢迎提出。