一.主要功能与需求分析
1.本金为100万,利率或者投资回报率为3%,投资年限为30年,那么,30年后所获得的利息收入:按复利计算公式来计算就是:1,000,000×(1+3%)^30
2.如果按照单利计算,本息的最终收益
3.假如30年之后要筹措到300万元的养老金,平均的年回报率是3%,那么,现在必须投入的本金是多少呢?
4.利率这么低,复利计算收益都这么厉害了,如果拿100万元去买年报酬率10%的股票,若一切顺利,过多长时间,100万元就变成200万元呢?
5.如果我希望在十年内将100万元变成200万元,应该找到报酬率在多少的投资工具来帮助我达成目标?如果想在5年后本金翻倍,报酬率就应至少为多少才行呢?
6.如果每年都将积蓄的3万元进行投资,每年都能获得3%的回报,然后将这些本利之和连同年金再投入新一轮的投资,那么,30年后资产总值将变为多少?如果换成每月定投3000呢?(定额定投收益计算办法)
7. 如果向银行贷款10万元,年利率6.5%,期限为10年,那么每月等额本息还款多少?(算复利条件下等额还款金额)
•需求是演化出来的:需求的提出,不像我们上学期做编译原理实验一样,一次性地给出完整并且不变的问题描述,现实世界的很多软件需求大都是逐步提出的,因为客户一开始也不确定自己要什么。
•需求的表达:客户不是计算机专业人员,描述需求的方式是自己的业务场景,不会告诉你具体算法。
•业务领域:我们需要去了解我们不懂的领域知识、应用场景。
•软件设计-可扩展性:客户需求不断变化与增加,我们做软件设计时有没有考虑到程序的可扩展性?
•重构:在满足客户越来越多需求的时候,我们会不会发现原来的设计不够好,需要推翻前面所做的工作而对整个架构进行重新设计呢?
•迭代开发:开发-发布-运行-迭加开发-发布-运行……螺旋前进
•版本管理:github使用有什么感受?
•用户体验:界面设计,真实的软件,实现功能只是一方面……
•与人合作
•软件测试与质量保证
二.单元测试预期结果及其代码。
新增:
添加了可以修改用户输入数据后可以选择输入的单位,这可以使用户输入时不用输入过多的零,提高了用户的输入的正确率。方便了用户的使用。
有就是,健壮了用户输入数据后,传入到数据库的信息健全性,不会丢失用户的输入数据。之前的版本会使用户的一部分信息丢失,现在已经修复了。
测试模块 |
测试输入 |
预期结果 |
运行结果 |
bug跟踪 |
复利计算 |
(本金,年限,利率,次数) |
终值 |
||
测试运算结果 |
(100.0,1,0.05,1) |
105.0 |
√ |
|
测试输出正数 |
(100.0,1,0.05,1) |
True |
√ |
|
测试输入负数 |
(-100.0,1,-0.05,1) | true | √ | 已经添加输入控制 |
单利计算 |
(利率,本金,年限) |
终值 | ||
测试运算结果 | ("0.05","100.0","1") | 105.0 | √ | |
测试输入负数 | ("0.05","100.0","1") | True | √ | |
测试输出正数 | ("-0.05","-100.0","1") | true | √ | 已经添加输入控制 |
投资年限 | (利率,本金,终值,次数) | |||
测试运算结果 | ("0.05","100.0","105.0","1") | 1 | √ | |
测试输出正数 | ("0.05","100.0","105.0","1") | True | √ | |
测试输入负数 | ("-0.05","-100.0","105.0","1") | true | √ | 已经添加输入控制 |
...... | 以下结果与上表一致 |
接入数据库主要代码,更改后使输入数据库的信息更全:
1 public MySQL() throws Exception { 2 3 4 //STEP 2: Register JDBC driver 5 Class.forName(JDBC_DRIVER); //添加MYSQL驱动 6 7 //STEP 3: Open a connection 链接本地MYSQL 8 conn = (Connection) DriverManager.getConnection(DB_URL,USER,PASS); 9 10 //STEP 4: Execute a query 11 stmt = conn.createStatement(); 12 String sql; 13 sql = "SELECT * FROM test"; 14 ResultSet rs = stmt.executeQuery(sql); 15 16 //STEP 5: Extract data from result set 17 while(null != rs && rs.next()){ 18 System.out.println(rs.getString("rate")); 19 System.out.println(rs.getString("time")); 20 System.out.println(rs.getString("principal")); 21 } 22 23 } 24 25 26 public void sqlInsertSingle(String f,int moneyUnit, String strRate, String strPrincipal, 27 String strTime) throws SQLException { 28 29 items[N] = "item_" + String.valueOf(N); 30 String sql1 = "insert into test(earnings,rate,time,principal)values(‘" + f + "‘,‘" 31 + strRate + "‘,‘" + strTime + "‘,‘" + strPrincipal + "‘)" ; 32 stmt.executeUpdate(sql1); 33 34 } 35 36 public void sqlInsertCompound(String strEarnings,int moneyUnit, String strRate, String strPrincipal, 37 String strTime, String strCount) throws SQLException { 38 39 items[N] = "item_" + String.valueOf(N); 40 String sql1 = "insert into test(earnings,rate,time,count,principal)values(‘" + strEarnings + "‘,‘" + 41 strRate + "‘,‘" + strTime + "‘,‘" + strCount + "‘,‘" + strPrincipal + "‘)" ; 42 stmt.executeUpdate(sql1); 43 } 44 45 public void sqlInsertTime(String strTime ,int moneyUnit, String strRate, String strPrincipal, 46 String strEarnings, String strCount) throws SQLException { 47 48 items[N] = "item_" + String.valueOf(N); 49 String sql1 = "insert into test(time,rate,count,principal,earnings)values(‘" + strTime + "‘,‘" + 50 strRate + "‘,‘" + strCount + "‘,‘" + strPrincipal + "‘,‘" + strEarnings + "‘)" ; 51 stmt.executeUpdate(sql1); 52 } 53 54 public void sqlInsertPerincome (String strIncome, int moneyUnit, String strRate, String strInvestment, 55 String strTime) throws SQLException { 56 57 items[N] = "item_" + String.valueOf(N); 58 String sql1 = "insert into test(earnings,rate,time,inv)values(‘" + strIncome + "‘,‘" + 59 strRate + "‘,‘" + strTime + "‘,‘" + strInvestment + "‘)" ; 60 stmt.executeUpdate(sql1); 61 } 62 63 public void sqlInsertPrincipal(String strPrincipal, int moneyUnit, String strRate, String strEarnings, 64 String strTime, String strCount) throws SQLException{ 65 66 items[N] = "item_" + String.valueOf(N); 67 String sql1 = "insert into test(principal,rate,time,count,earnings)values(‘"+ strPrincipal + "‘,‘" + 68 strRate + "‘,‘" + strTime + "‘,‘" + strCount + "‘,‘" + strEarnings + "‘)" ; 69 stmt.executeUpdate(sql1); 70 71 } 72 73 public void sqlInsertRefund (String strRefund, int moneyUnit, String strRate, String strLoan, 74 String strTime) throws SQLException { 75 76 items[N] = "item_" + String.valueOf(N); 77 String sql1 = "insert into test(inv,rate,time,loan)values(‘" + strRefund + "‘,‘" + 78 strRate + "‘,‘" + strTime + "‘,‘" + strLoan +"‘)" ; 79 stmt.executeUpdate(sql1); 80 } 81 82 public void sqlInsertBestProject (String strRate, int moneyUnit , String strEarnings, 83 String strPrincipal, String strTime, String strCount) throws SQLException { 84 85 items[N] = "item_" + String.valueOf(N); 86 String sql1 = "insert into test(rate,time,count,principal,earnings)values(‘" + strRate + "‘,‘" + 87 strTime + "‘,‘" + strCount + "‘,‘" + strPrincipal + "‘,‘" + strEarnings + "‘)" ; 88 stmt.executeUpdate(sql1); 89 } 90 91 public ResultSet selectSQL () { 92 ResultSet rs = null; 93 try{ 94 stmt = conn.createStatement(); 95 String sql; 96 sql = "SELECT * FROM test"; 97 rs = stmt.executeQuery(sql); 98 }catch (Exception e){ 99 e.printStackTrace(); 100 } 101 102 return rs; 103 104 } 105
三.运行情况
使用程序进行更新的数据库
总结:
这个版本,主要是修复之前链接数据库后遗留的一部分bug,是升级的并不是版本更新,之前的是版本更新所以会有很大的改动的,而这次是升级所以大多数修改的是一些细节上的东西,难以一一列出,所以在外观上很难分别出来的。总结之前几次的作业,我发现修改是逐步的添加各种功能,所以,在升级上面我更注重了代码的可读性,还有规范性,还有细节功能上的添加修改。