概述
作业1
一. 问题详述
有句俗语叫“三天打鱼两天晒网”。某人从2010年1月1日起开始“三天打鱼两天晒网”,问这个人在以后的某一天中是“打鱼”还是“晒网”。用C或C++语言/java/python实现程序解决问题。
基本要求:1.程序风格良好(使用自定义注释模板),提供友好的输入输出。
提高要求:1.输入数据的正确性验证。
2.使用文件进行数据测试。如将日期 20100101 20111214 等数据保存在in.txt文件中,程序读入in.dat文件进行判定,并将结果输出至out.txt文件。
二.问题分析
根据题目分析,三天打鱼两天晒网,从2010年1月1日起开始统计,利用列举的方法,如下表所示,分析总结规律,最终得出计算过程。
表一
日期 | 状态 |
2010.1.1 | 打渔 |
2010.1.2 | 打渔 |
2010.1.3 | 打渔 |
2010.1.4 | 晒网 |
2010.1.5 | 晒网 |
2010.1.6 | 打渔 |
2010.1.7 | 打渔 |
…. | … |
根据上表可得出三天打鱼两天晒网以5天为一个周期,假设2010年1月1日为打渔的第一天,因此如果知道某一天与2010年1月1日相差的天数dateSum,再计算dateSum % 5,结果的余数若为0,1,2则在打渔,若为3,4在是在晒网。
假设要求2010年内该人某天的状态,则只需要用所求的日期减去1就可得到相差天数,最终计算得出结果;假设要求2010年以后某天的状态则需要用2010.1.1开始余下的天数364天,加上整年的天数,再加上该年的天数即可获得天数差,最后计算得出结论。
三.算法描述
1)计算从2010年1月1日开始至指定日期共有多少天;
2)由于“打鱼”和“晒网”的周期为5天,所以将计算出的天数用5去除;
3)根据余数判断他是在“打鱼”还是在“晒网”;
若余数为0,1,2则他是在“打鱼”; 否则是在“晒网”
在这三步中,关键是第一步。求从1990年1月1日至指定日期有多少天,要判断经历年份中是否有闰年,二月为29天,平年为28天。闰年的方法可以用伪语句描述如下:
如果 ((年能被4除尽 且 不能被100除尽)或 能被400除尽)
则 该年是闰年;
否则 不是闰年。
程序流程图如下:
三.源代码实现:
/*中国有句俗语叫“三天打鱼两天晒网”。某人从2010年1月1日起开始“三天打鱼两天晒网”,问这个人在以后的某一天中是“打鱼”还是“晒网”。
*用C或C++语言/java/python实现程序解决问题。
*基本要求:1.程序风格良好(使用自定义注释模板),提供友好的输入输出。
*提高要求:1.输入数据的正确性验证。
*
2.使用文件进行数据测试。如将日期 20100101
20111214
等数据保存在in.txt文件中,程序读入in.dat文件进行判定,并将结果输出至out.txt文件。
* */
package program;
import java.io.*;
public class DateJudgment {
public static void main(String[] args) throws IOException {
//throws抛出异常,不在主函数内处理异常
FileWriter fw = new FileWriter("input.txt");
//定义一个文件输出字符流,将内容保存在指定文件中
//将初始日期保存到input文件中
String s = "三天打鱼两天晒网问题,起始日期2010年1月1日";
fw.write(s);
fw.write("rn");
fw.write("需要计算的日期:");
/**
* 将年月日从键盘输入之后,再将信息输出至input文件中*/
BufferedReader bf;
System.out.println("请输入需要判断的年份:");
//输入年份提示语句
bf = new BufferedReader(new InputStreamReader(System.in));
String str = bf.readLine();
int year = Integer.parseInt(str);
//输入年份错误判断
if(year<2010) {
System.err.println("输入年份有误");
}
fw.write(str);
//输出年份
System.out.println("请输入需要判断的月份:");
//输入月份提示语句
bf = new BufferedReader(new InputStreamReader(System.in));
String str1 = bf.readLine();
int month = Integer.parseInt(str1);
//输入月份错误判断
if(month<=0 || month>12) {
System.err.println("输入月份有误");
}
fw.write(str1);
//输出月份
System.out.println("请输入需要判断的日期:");
//输入日期提示语句
bf = new BufferedReader(new InputStreamReader(System.in));
String str2 = bf.readLine();
int day = Integer.parseInt(str2);
//输入日期错误判断
if(day>31 || day<=0) {
System.err.println("输入月份有误");
}
fw.write(str2);
//输出日期
fw.close();
//关闭
int dateSum = 0;
//总天数差,初值为0
int dateSum1 = 0;
//dateSum1表示输入的日期在2010年与1月1日相差的总日期数,初始值为0
/**
* 计算总天数差
* 输入的 年月日中,先计算整月的天数,再加上当前月的天数day*/
switch (month - 1) {
case 11:
dateSum1 += 30;
case 10:
dateSum1 +=31;
case 9:
dateSum1 += 30;
case 8:
dateSum1 += 31;
case 7:
dateSum1 += 31;
case 6:
dateSum1 += 30;
case 5:
dateSum1 += 31;
case 4:
dateSum1 += 30;
case 3:
dateSum1 += 31;
case 2:
if(year%4==0&&year%100!=0 || year%400==0)
//判断是否是闰年
dateSum1 += 29;
else
dateSum1 += 28;
case 1:
dateSum1 += 31;
}
dateSum1 += day;
/**
* 判断输入的年份是2010年还是2010年以后
* 若是2010年,则只需要将上面所得的dateSum1减去1(减一是由于考虑2010年1月1日该人在打渔)
* 否则需要先计算整年的天数和当前年的天数(此计算方法同上),最后与2010年的天数364相加(364:除去1月1日)
*/
if(year == 2010) {
dateSum = dateSum1 -1;
}
else if(year>2010) {
int dateSum2 = 364;
int dateSum3 = 0;
for(int i=2011;i<year;i++) {
if(year%4==0&&year%100!=0 || year%400==0) {
dateSum3 += 366;
}
else {
dateSum3 += 365;
}
}
dateSum = dateSum1 + dateSum2 + dateSum3;
//所得结果为2010后的总天数差
}
System.setOut(new PrintStream("output.txt"));
//重定向输出流
System.out.println("距离2010年1月1日相差"+dateSum+"天");
/**
* 三天打鱼两天晒网即5天为一个周期,利用总天数差%5,所得余数判断
* 余数为0 1 2时,表示在打渔
* 余数为3 4 时,表示在晒网*/
if(dateSum1%5==0||dateSum1%5==1||dateSum1%5==2) {
System.out.println(year+"年"+month+"月"+day+"日"+"在打渔");
}
else {
System.out.println(year+"年"+month+"月"+day+"日"+"在晒网");
}
}
}
四.学习心得
首先该问题是一个比较基础的编程练习题,没有涉及太多的算法,但自己觉得程序编程风格不是很好,没有进行封装。
通过本问题的学习,规范和完善自己的编程风格,为以后的学习打基础。
IO流的相关接口:
以下是不同企业对与编程语言的编写风格的要求链接:
华为:http://www.docin.com/p-1428894885.html
腾讯:https://blog.csdn.net/zhaoxqzz/article/details/82190325
阿里:https://blog.csdn.net/JobsandCzj/article/details/78049526
其他企业的规范要求可以在网上查阅学习。
程序设计方法
合理的程序结构
准确表达与语言逻辑
注意非语法错误引起的不稳定性
程序设计风格
选用合适的常量标示符
选择有实际含义的标示符作为变量名
坚持按一定的缩进规则书写和录入程序
控制复杂度的风格
适当使用注释
命名
程序、变量、函数、过程、类等的名字象人的名字一样是一个记号,是用来标志这个对象的,一个好的命名应该简单、易记、易于理解。
最后
以上就是漂亮宝贝为你收集整理的Java实现“三天打渔两天晒网”问题作业1的全部内容,希望文章能够帮你解决Java实现“三天打渔两天晒网”问题作业1所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复