第三次博客作业
(1)前言:
1)知识点:
题目集07:
- Comparable 接口的应用;
- 在Main类中定义静态Scanner对象的使用,这样在其它类中如果想要使用该对象进行输入,则直接使用Main.input.next…即可;
- ArrayList 的使用;
- 抽象类和抽象方法的使用;
- Collections类的使用,如swap方法的使用
题目集08:
- StringBuilder 的使用;
- 正则表达式的使用;如按空格切割字符串并存入字符数组 String[] dt = sb.toString().split("\n");
- ArrayList的使用;自定义列表
- 迭代器的使用;用于遍历,如:Iterator<Card> cardItr = Account.list.iterator();
- String.format的使用;用于保留小数位数;
题目集09(该题目集是在题目集08的基础上进一步迭代,所以知识点大致相同):
1.StringBuilder 的使用;
2.正则表达式的使用;如按空格切割字符串并存入字符数组 String[] dt = sb.toString().split("\n");
3.ArrayList的使用;自定义列表
4.迭代器的使用;用于遍历,如:Iterator<Card> cardItr = Account.list.iterator();
5.String.format的使用;用于保留小数位数
2)题量:
题目集07有两道题目,都是关于图形卡片的,题量适中,总的代码量大概700行左右;
题目集08有一道题目,是关于ATM的,题量较多;
题目集09有一道题目,是在题目集07的基础上,进行迭代的,有了老师发的题目集08的参考代码,只需要在老师的代码上进行修改,题量适中;
3)难度:
题目集07:7-1的题目难度适中,但是这道题中的CardList类有点难度对于我来说,一开始不知道这个类是干什么的,虽然有老师给的类图,但是这个类中的card类型的自定义列表不太理解,查找资料才了解,这个自定义列表是存放card对象的,接下来就更好做了;
而7-2则是在7-1的基础上进行修改,将这些对象进行分组存入列表里就可以了;
题目集08:7-1的题目难度较大,第一次写ATM机的类结构设计,没有理解相关的概念,类的设计结构有问题,数据的初始化也有些问题,我自己是在Card类里初始化的,也就是说我的钱都在Card里,这是不合理的,钱应该存在账户里,而且初始化了之后找不到这张卡;这次的题目集也没有做完;
题目集09:老师发了题目集08的参考代码,也讲解了一部分代码,让我理解了一些,只需要在老师发的代码上进行修改即可,难度相对来讲低了一些,在做的过程中,在算手续费的部分出现了一些小问题,很多次都是多算了钱或者少算了钱,这个是我自己的算法问题,需要自己改进;
(2)设计与分析:
①题目集7(7-1)、(7-2)两道题目的递进式设计分析总结
7-1报表内容和类图:


7-2的报表内容和类图:


分析总结:
7-1和7-2的代码复杂度大部分都不高,两道题目中的Dealcardlist类中的复杂度较高,7-1的为8,而7-2的为15,主要是在Dealcardlist类中使用了较多的if语句;
7-1是让我们对图形卡片按面积大小进行排序,同时求出所有卡片面积的和,
7-2则是在7-1的基础上进行分组,然后能够对每组内的卡片根据面积值从大到小进行排序,同时求出该组内所有卡片 的面积之和,最后求出每组卡片面积之和中的最大值。
两道题目都需要用到继承和接口,继承都是circle,rectangle等类继承自Shape类,子类都重写了父类的getArea()和validate()的方法,而接口则是用来比较card的面积的大小;也用到了card类型的自定义列表,用于添加创建的card对象;在对列表进行排序的时候使用了Collections的swap方法;
Eg: for( int i = 0 ; i<cardList.size();i++) {
for(int j = 0; j<cardList.size()- 1 -i;j++) {
if(cardList.get(j).compareTo(cardList.get(j+1)) < 0)
Collections.swap(cardList,j,j+1);
}
}
这里本来是想用Arrays里的sort()排序的,但是会报错,类型数组中的方法sort(int[])不适用于参数(ArrayList<Card>),就使用了Collections类的swap()方法,进行排序了;

②题目集8和题目集9两道ATM机仿真题目的设计思路分析总结
题目集8的报表内容和类图:


题目集9的报表内容和类图:


题目集08的复杂度为8;题目集09的复杂度为15;有点高了,主要是算手续费的时候使用了较多的if语句
if(account.getDbalance()==50000) { //贷记卡
if (amount > balance + account.getDbalance()) {//超过透支额度
System.out.println("Sorry,your account balance is insufficient.");
System.exit(0);
}
else { //未超过透支额度
if(account.getBalance()<=0) {
if (account.getBank().getBankNO() != aTM.getBank().getBankNO()) {
account.setBalance(balance - amount * (aTM.getBank().getFee() + 0.05 + 1));
}else {
account.setBalance(balance- amount * 1.05);
}
}
else if(account.getBalance()<=amount&&account.getBalance()>0) { //开始透支
double t = account.getBalance(); //未透支的钱
double t1 = amount - account.getBalance(); //透支的钱
if (account.getBank().getBankNO() != aTM.getBank().getBankNO()) {
account.setBalance(t -t- t1*(1+0.05)-amount*aTM.getBank().getFee());
}else {
account.setBalance(balance-t - t1 * 1.05);
}
}
else {
if (account.getBank().getBankNO() != aTM.getBank().getBankNO()) {
account.setBalance(balance - amount * (1 + aTM.getBank().getFee()));
}else {
account.setBalance(balance-amount);
}
}
}
}
else { //借记卡
if (amount >= balance) {
System.out.println("Sorry,your account balance is insufficient.");
System.exit(0);
}
else {
if (account.getBank().getBankNO() != aTM.getBank().getBankNO()) {
account.setBalance(balance - amount * (1 + aTM.getBank().getFee()));
}else {
account.setBalance(balance-amount);
}
}
}
题目集8和题目集9都是ATM机的类结构设计,题目集8的要求是编写一个银行 ATM 机的模拟程序,能够完成用户的存款、取款以及查询余额功能,并且这次作业的银行卡都是借记卡(不能透支),也不允许跨行办理相关业务,难度降低了不少;
题目集08需要先将基础数据初始化,刚开始我是将数据在card类中进行初始化的,在card类中创建列表,将卡号添加到列表里面,

但只是这样,就会有问题,不知道card的所属银行和信息等,也找不到这张卡,这样是不行的,card应该和银行双向绑定,其他的也是双向绑定,这样才能找到这张卡和信息;
题目集09则是在题目集08的基础上,增加了几个账户,增加了借记卡(可以透支),还增加了手续费;老师也把题目集08的参考代码发出来了,只需要在题目集08的代码进行修改,首先先添加新的用户和ATM机和银行,在给银行里添加跨行手续费,透支手续费和透支额度,透支额度是这样设计的,如果这张卡是借记卡,则设置额度为0,如果是信用卡,则设置额度为50000;然后将输出方式改成题目要求的;
(2)采坑心得:
1.在题目集07的7-1中,我一开始是直接在Cardlist里进行比较面积的大小,没有用到接口,没有按要求答题,重新学习了接口的知识后,使用了接口

2.在题目集07的7-1中,我自己创建的Double类型的列表,想直接添加图形的数据,但是这跟参考类图里cardlist列表类型不符合,学习了自定义列表之后,开始尝试用Card类型的列表去添加Card对象,而不是直接添加图形的数据了;

3.在题目集07的7-1中本来是想用Arrays里的sort()排序的,但是会报错,类型数组中的方法sort(int[])不适用于参数(ArrayList<Card>),就使用了Collections类的swap()方法,进行排序了;


4.在题目集08中,一开始我是想用列表来添加atm机的编号的,但是这样不能在取款的时候获得atm的编号;

后面是直接创建ATM的对象,给atm初始化;

5.在题目集09的透支取款中,一开始是用了20多个if语句进行判断的,后来修改到了15个if语句,虽然还是很多,但是也有了进步

(4)改进建议:对相应题目的编码改进给出自己的见解,做到可持续改进
- 题目集09的透支取款还可以继续优化,可以减少if语句的使用
- 题目集09的贷记账户和借记账户没有很好继承自账户,可以进一步修改
- 题目集07的7-2中,在cardSort()方法里不止有排序的代码,还有输出的代码,不符合单一职责原则,可以将输出部分放到一个输出方法里面;
(5)总结:
收获:
- 学会了自定义列表的使用,自定义列表里可以添加相对于的对象;
- 在Main类中定义静态Scanner对象的使用,这样在其它类中如果想要使用该对象进行输入,则直接使用Main.input.next…即可;
- 正则表达式的一些使用;如按空格切割字符串并存入字符数组 String[] dt = sb.toString().split("\n");
- .初步了解迭代器的使用方法;用于遍历,如:Iterator<Card> cardItr = Account.list.iterator();
- 初步了解了StringBuilder 的使用;可以看成一个长度可以变化的字符串;
不足:
自己对面向对象的理解还不够,对类结构的设计能力也不足,需要进一步加强练习;
建议||感想:
我觉得翻转课堂非常不错,可以锻炼自己的表达能力,也可以培养自己的上台讲课的信心;

浙公网安备 33010602011771号