第三次博客作业

(1)前言:

1)知识点:

题目集07:

  1. Comparable 接口的应用;
  2. Main类中定义静态Scanner对象的使用,这样在其它类中如果想要使用该对象进行输入,则直接使用Main.input.next…即可;
  3. ArrayList 的使用;
  4. 抽象类和抽象方法的使用;
  5. Collections类的使用,如swap方法的使用

题目集08:

  1. StringBuilder 的使用;
  2. 正则表达式的使用;如按空格切割字符串并存入字符数组 String[] dt = sb.toString().split("\n");
  3. ArrayList的使用;自定义列表
  4. 迭代器的使用;用于遍历,如:Iterator<Card> cardItr = Account.list.iterator();
  5. 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.在题目集077-1本来是想用Arrays里的sort()排序的,但是会报错,类型数组中的方法sort(int[])不适用于参数(ArrayList<Card>),就使用了Collections类的swap()方法,进行排序了;

 

 

 

 

 

 

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

 

 


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

 

 

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

 

 

 

(4)改进建议:对相应题目的编码改进给出自己的见解,做到可持续改进

  1. 题目集09的透支取款还可以继续优化,可以减少if语句的使用
  2. 题目集09的贷记账户和借记账户没有很好继承自账户,可以进一步修改
  3. 题目集07的7-2中,在cardSort()方法里不止有排序的代码,还有输出的代码,不符合单一职责原则,可以将输出部分放到一个输出方法里面;

(5)总结:

收获:

  1. 学会了自定义列表的使用,自定义列表里可以添加相对于的对象;
  2. Main类中定义静态Scanner对象的使用,这样在其它类中如果想要使用该对象进行输入,则直接使用Main.input.next…即可;
  3. 正则表达式的一些使用;如按空格切割字符串并存入字符数组 String[] dt = sb.toString().split("\n");
  4. .初步了解迭代器的使用方法;用于遍历,如:Iterator<Card> cardItr = Account.list.iterator();
  5. 初步了解了StringBuilder 的使用;可以看成一个长度可以变化的字符串;

不足:

自己对面向对象的理解还不够,对类结构的设计能力也不足,需要进一步加强练习;

建议||感想:

我觉得翻转课堂非常不错,可以锻炼自己的表达能力,也可以培养自己的上台讲课的信心;

 

 

posted @ 2021-06-20 14:21  无心yg  阅读(63)  评论(0)    收藏  举报