因为题目明确给出了五个功能,就可以写五个函数,使他们对同一个数据结构中的数据进行增删查改操作就可以了。然后还要有读取和保存文件的功能。
具体方案为:编写四个类,分别为主类、功能类、记录类、文件类。他们是互相调用的关系。主类根据用户输入的选择调用功能类的方法成员,而功能类调用记录类的方法成员修改记录类的数据。文件类里面则是有读取和保存两个方法,程序开始时调用读取方法,程序结束时调用保存方法。至于保存记录的数据结构我选择的是链表,因为本程序功能需要频繁的删除增加数据,用链表可以很方便的执行删除插入操作。(图 2.1.1)
链表的节点数据结构定义:
private class Node{
Node next = null; //指针
int num; //编号
double money; //收支金额,正为收负为支
String date; //日期
String info; //说明信息
}
(图 2.1.1)
(1)模块简洁,清晰分明
模块之间通过一个或一组参数相互调用,实现了 Java 语言封装的特色。
eg:Main 类中获取用户操作的代码,Main 类将用户输入作为参数提供给 Function 类做进一步处理。
int choose=show();//选择操作
Function.judge(choose);//进一步处理
(2)系统健壮性良好
程序的每个输入都有异常检查和合理性约束,并且被伪死循环包围。不满足条件或者格式的输入将无法跳出循环以至必须重新输入。这样将不会出现程序无法识别用户输入的情况。
eg:获取用户操作输入的代码被死循环包围,只有输入符合要求才可以从循环中跳出进入下一步。
while(true) {
try {ch=Integer.valueOf(inputStream.readLine().trim()).intValue();
}catch(Exception e) { //捕获任何类型的异常}
if(ch>=0 && ch<=4) break;
else System.out.print("不合法的输入!请重新输入:");
}
(3)安全性得以保障
记录类被定义为终结类,类中的变量和数据结点都被 private 修饰符所修饰。只能通过 public 方法来调用,同时类中不提供修改变量的方法,从而确保记录中的数据不会被恶意修改。保障了数据正确性和安全性。但是这里有一个缺陷就是数据可以被恶意删除,系统没有权限控制和操作日志记录功能。图 2.1.2
(图 2.1.2)
3、方案分析比较
除了当前使用的方案,当时我还设想了如下几种方案:
(1)用类似 C 语言面向过程编程的方法,只编写一个主类,将五个功能写成主类的成员方法,然后在 main 函数中按过程顺序调用这些功能以及文件的读取和保存功能。
方案分析:面向过程编程因为符合人类通常的思维,并且因为我们上学期有 C 语言的基础,初学者编程和阅读起来将更加容易。但是将所有方法以及数据写进一个类会使代码看起来很臃肿,并且这样相当于丢弃了 Java 面向对象编程的一些很好的特性和思想。对提高自身技术水平的意义不大。
(2)将每个功能单独编写为一个类,他们继承同一个父类。在主类中根据用户输入选择调用。
方案分析:这样方便定位程序的错误,更易编写和调试。然而定义的类过多也会使程序看起来很奇怪,同时考虑到各功能之间其实并没有太多相同之处,继承的意义不大,故弃用此方案。
开发使用的是集成开发环境软件 eclipse
版本列表:
从 2006 年起,Eclipse 基金会每年都会安排同步发布。至今,同步发布主要在 6 月进行,并且会在接下来的 9 月及 2 月释放出 SR1 及 SR2 版本。
版本代号 | 平台版本 | 主要版本发行日期 | SR1 发行日期 | SR2 发行日期 |
---|---|---|---|---|
Callisto | 3.2 | 2006 年 6 月 26 日 | N/A | N/A |
Europa | 3.3 | 2007 年 6 月 27 日 | 2007 年 9 月 28 日 | 2008 年 2 月 29 日 |
Ganymede | 3.4 | 2008 年 6 月 25 日 | 2008 年 9 月 24 日 | 2009 年 2 月 25 日 |
Galileo | 3.5 | 2009 年 6 月 24 日 | 2009 年 9 月 25 日 | 2010 年 2 月 26 日 |
Helios | 3.6 | 2010 年 6 月 23 日 | 2010 年 9 月 24 日 | 2011 年 2 月 25 日 |
Indigo | 3.7 | 2011 年 6 月 22 日 | 2011 年 9 月 23 日 | 2012 年 2 月 24 日 |
Juno | 3.8 及 4.2 | 2012 年 6 月 27 日 | 2012 年 9 月 28 日 | 2013 年 3 月 1 日 |
Kepler | 4.3 | 2013 年 6 月 26 日 | 2013 年 9 月 27 日 | 2014 年 2 月 28 日 |
Luna | 4.4 | 2014 年 6 月 25 日 | 2014 年 9 月 25 日 | N/A |
Mars | 4.5 | 2015 年 6 月 24 日 | N/A | N/A |
Neon | 4.6 | 2016 年 6 月 22 日 | N/A | N/A |
Oxygen | 4.7 | 2017 年 6 月 28 日 | N/A | N/A |
Photon | 4.8 | 2018 年 6 月 | N/A | N/A |
在 Neon 版本之后,每个主版本一般在 6 月发布,后续更新版在九月,十二月,和 3 月发布。[1]
获取途径:
去官网下载:http://www.eclipse.org/ downloads/ 图 2.2.1
图 2.2.1
需要安装 JDK 和配置环境变量,然后再安装集成开发工具 esclipse 即可。
安装配置 JDK 过程:
(1) 下载 JDK 和 jre,安装在 Java 根目录下不同文件夹里
(2) 配置环境变量:
新建 JAVA_HOME 变量:JDK 的安装目录
添加 PATH 变量:%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;
新建 CLASSPATH 变量:.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar
(3) 检验是否配置成功
运行 cmd,输入 Java,显示命令帮助信息
输入 javac,显示命令帮助信息
输入 Java –version,显示 Java 版本信息
输入 javac -version,显示 Java 编译器版本信息
此时配置成功。图 2.2.2
(图 2.2.2)
(图 2.2.3)
测试功能 | 测试输入 | 测试结果 | 测试截图 |
---|---|---|---|
文件读取 | 无 | 读取了之前的记录的总金额 | 2.2.4.1 |
显示界面 | 无 | 成功显示了系统介绍和用户操作界面 | 2.2.4.1 |
用户选择操作 | 5 | 提示重新输入 | 2.2.4.2 |
用户选择操作 | -1 | 提示重新输入 | 2.2.4.3 |
用户选择操作 | abc | 提示重新输入 | 2.2.4.4 |
用户选择操作 | 4c00 | 提示重新输入 | 2.2.4.5 |
收入录入 | 1 100 null | 成功录入 | 2.2.4.6 |
支出录入 | 2 800 abc | 成功录入 | 2.2.4.7 |
收支查询 | 3 | 成功查询 | 2.2.4.8 |
记录删除 | 4 7 | 成功删除 7 号记录 | 2.2.4.9 |
文件保存 | 0 | 成功保存操作 | 2.2.4.a |
(图 2.2.4.1)
(图 2.2.4.2)
(图 2.2.4.3)
(图 2.2.4.4)
(图 2.2.4.5)
(图 2.2.4.6)
(图 2.2.4.7)
(图 2.2.4.8)
(图 2.2.4.9)
(图 2.2.4.a)
(1)Main 类与 Function 类的接口——获取用户选择操作
while(true) {
int choose=show(); //选择操作
Function.judge(choose);//进一步处理
}
(2)读取一个整数(含合理性约束条件)
BufferedReader inputStream = new BufferedReader(new InputStreamReader(System.in));
while(true) {
try {
ch=Integer.valueOf(inputStream.readLine().trim()).intValue();
}catch(Exception e) { //捕获任何类型的异常
}
if(ch>=0 && ch<=4) break;
else System.out.print("不合法的输入!请重新输入:");
}
(3)自动获取录入信息时的日期
Date d = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
date = sdf.format(d);
(4)根据金额长度不同自动调整表格列宽
if(String.valueOf(money).length()<=6)
(5)实现收入和支出共用同一套代码的核心语句
if(diff) money=-money;
Record.addNode(money, date, info);
(6)链表插入节点算法核心语句
Node tmp = head;
while (tmp.next != null) {
tmp = tmp.next;
}
newNode.num=tmp.num+1;
tmp.next = newNode;
(7)链表删除节点算法核心语句
Node n = head;
while(n.next!=null) {
if(n.next.num==num) {
allMoney-=n.next.money;
n.next=n.next.next;
Nonum--;
return true;
}
else if(n.next.num>num)
return false;
else n=n.next;
}
(8)读写文件 I/O 流创建
//dataout 用于写二进制文件
DataOutputStream dataout = new DataOutputStream(
new BufferedOutputStream(
new FileOutputStream(filename)));
//instr用来读取数据
DataInputStream instr=new DataInputStream(
new BufferedInputStream(
new FileInputStream(filename)));
本系统可以实现家庭财务的增删查的工作,同时可以在程序开头结尾自动读取保存文件。查询记录显示的格式美观,程序对用户的输入进行检查,容错性良好,用户友好性高。用链表存储需要大量插入删除的数据,算法的时间复杂度良好。
系统待完善的功能:
(1)可以设置不同的角色,每个角色需要用户名和密码登陆,不同角色的权限不同。
(2)增加记录操作的功能,可以用一个日志文件记录何时哪个用户登陆,进行了什么操作。只有拥有管理权限的用户可以查看日志文件并撤销操作等等。
(3)查询的形式可以丰富一点(仿照 SQL 语句或直接连通数据库),同时可以按照日期,金额,操作人……对查询的结果进行排序。
(4)可以编写使用更美观,用户体验度更加好的图形界面。
(5)思考是否存在更好的记录存储结构和算法,因为链表的优势在于方便在任何地方插入和删除节点。然而本系统插入一般都是在最后面,体现不出链表的优势所在。
(6)增加撤销操作功能,普通用户可以撤销自己的误操作。管理者可以撤销任何用户的操作。
本次课程设计题目要求实现的功能相对简单,编写过程中并未遇到太大的问题。只是因为上学期 Java 课程知识掌握的不牢固,加之假期和开学后长时间没有进行复习,导致遗忘了很多基础知识。在正式做设计之前,需要花很长时间去重新复习这些知识。
并且因为之前有一个数据结构的课程设计,分配在 Java 课程设计的时间较短。最后因为时间关系,很多预想中的功能没能得到实现,这是本次课程设计中最遗憾的事情。
综上所述,本次课设最难之处在于基础知识掌握的不牢固。
解决方案:
从教材入手复习基础知识,大概的复习一遍之后着手开始设计。在过程中遇到不懂或遗忘的地方便去请教同学或上网查阅资料解决问题。想要实现什么功能也会上网去查找是否存在相关函数可供使用。
学习计算机要多动手多实践,在设计过程中不仅使我巩固了快要遗忘的知识,还使我学到了更多的知识,使我对 Java 的理解更深一层。
大小: 1.14MB
➡️ 资源下载:https://download.csdn.net/download/s1t16/87400404