第三次总结
一. 前言
- 总结这一阶段,知识点:1继承与多态.2对于集合的应用.3java接口4. 单一职责应用 5.开-闭原则 6.类与类之间的组合关系 7.类的单一职责 8.抽象类的应用。题量:这一阶段总共有四道题目,分别为7-1,7-2,8-1,8-2.题量虽然不多,但是涉及的知识点非常的多,难度也偏上一点。总的来说,如果这一个阶段你不认真的学习的话,你就会落下很多,这一个阶段对我们的编程能力有很大的提高。经历一个过度阶段,你必须的坚持才能克服困难。
 
二.设计与分析
1、题目集七(7-1)
这是一题图形卡片排序游戏,即输入一串图形的属性,然后按照面积进行排序再将图形输出。1代表圆形卡片,2代表矩形卡片,3代表三角形卡片,4代表梯形卡片。

 
设计原则:这个题目建造了一个工程,工程里面有八个类,首先有一个抽象类Shape,有一个name属性,和三个方法,即求面积,判断该图形是否合法,和输出,四个图形类,继承Shape。一个类判断你输入的数据中有没有错误的.还有一个主类Main类进行执行。这是大致的思路。在写题目的过程中,肯定不是一帆风顺的,当时刚刚学习抽象类,对于抽象类不是很了解,对于他的应用还需要在书上或者网上找资料。还有对于当时做这个题目的时候遇到一个问题就是对于compareTo接口不是很了解,花费了我很长时间,最后谈谈我对于comparaTo的理解compareTo(Object o)方法java.lang Comparable接口中的方法,当需要对某个类的对象进行排序时,该类需要实现Comparable接口的,必须重写public int compareTo(To)方法。也就是说,只要实现了这个接口的对象(数组)就相当于有了排序的能力,所以叫做comparable—可排序的,所以可以说这是一种内部排序的方式,通过实现它唯一的方法compareTo()。简而言之,你可以利用这一点,对一个对象的某一个属性进行排序,从而对对象进行排序。
类图如下:

对类图进行分析:Cricle Rectangle Trapezoid Triangle 类均继承类Shape 属于实体类。 Card 聚合Shape类,实现compara to()接口,便于对对象中的属性进行排序。
2、 题目集七(7-2)
这题属于题目集一的PLUS版本,即对题目及一进行升级,输出面积排序的时候,以每一种对象进行排序,例:

 
设计原则:与上一题一样这个题目也是有把各类,各个类执行不同的功能。首先有一个抽象类Shape,有一个name属性,和三个方法,即求面积,判断该图形是否合法,和输出,四个图形类,继承Shape。一个类判断你输入的数据中有没有错误的.还有一个主类Main类进行执行。这是大致的思路。在刚开始写的时候,我以为这道题目只是简单的排序不同谁知道上一题是求总面积,这一题则是求最大的面积值,这一点给我下了套,提交刚开始都不对,当然这只是一个小错误,但是他却反映出我的最大缺点,是我应该改进的。至于这题与上一题的做法不同之处则是,上一题我用的是一个链表储存所有的对象,然后再通过对象的属性对对象进行排序。本题则是我用了五个链表,四个是对不同的对象进行排序,另一个则是储存所有的对象然后再找出面积最大的对象,然后改进输出,最后达到目的。
类图分析:

对类图进行分析:Cricle Rectangle Trapezoid Triangle 类均继承类Shape 属于实体类。 Card 聚合Shape类,实现compara to()接口,便于对对象中的属性进行排序。(注:此题整体结构没有修改,只是修改了主类,所以看起来和上一个题目的类图相似)
3、题目集八 (7-1)
设计原则:该工程下共有八个类 message 类聚合 card atm bank user account 类Bank里面有一个链表存储对象 user 和 atm .user类中则有链表存储Account对象。Account 类中同样也有链表存储对象card 从而将所有的类连接起来。做题心得,当时在做这道提的时候刚开始没想这么多,我当时觉得只有一个类就可以完成对这道题的完成,直接用if匹配,但是这样达不到这道题目的要求我们已不能得到相应的锻炼,对自己没有什么提高。这样做没有什么意义。基于此处我就在想要怎么完成此道题目,而且要做到可修改,如果再添加几个用户仍然能够使用,而不需要做太大的修改。为此创建了一个存储信息的类Information
存银行
public Bank information_bank1() {
Bank bank = new Bank();
ATM atm = new ATM();
List<ATM> list_atm = new ArrayList<ATM>();
List<User> list_user = new ArrayList<User>();
list_user.add(information_user1());
list_user.add(information_user2());
bank.setList_user(list_user);
bank.setBank_name("中国建设银行");
atm.setNumber("01");
list_atm.add(atm);
atm.setNumber("02");
list_atm.add(atm);
atm.setNumber("03");
list_atm.add(atm);
atm.setNumber("04");
list_atm.add(atm);
bank.setList_ATM(list_atm);
return bank;
}
存用户
public User information_user1() {
User user = new User();
List<Account> list_account = new ArrayList<Account>();
list_account.add(information_account1());
list_account.add(information_account2());
user.setName("杨过");
user.setList_account(list_account);
return user;
}
存账户
public Account information_account1() {
Account account = new Account();
List<Card> list_card = new ArrayList<Card>();
list_card.add(information_card1());
list_card.add(information_card2());
account.setBalance(10000.0);
account.setAccount_number("3217000010041315709");
account.setList_card(list_card);
return account;
}
存卡
public Card information_card1() {
Card card = new Card();
card.setCard("6217000010041315709");
return card;
}
这样做的好处是,如过添加用户之后,可以直接添加,其他的方面都不用改,便于之后的扩展。
类图如下:

各个类之间以链表进行联系,从而提高了效率和可更改性,便于后期的修改。总而言之,这道题目花费了我很长时间,石花粉长时间给我带来了很大的收获,首先就是我知道怎样做才能做到程序的可修改性,下次再做的话,只需要修改一小部分就可以完成用户的需求,这正是我们需要提高的部分。而不是一味的只会做一种题,这样既能提高我们效率,还会让我们更加有自信,做题目不仅仅能够收获知识点,还能够培养我们独立思考,面对问题的能力。
4、题目集九(7-1)
这一题与上一次题目,不同的是有两种卡,借记卡和贷记卡,贷记卡即可以贷款,还增加了跨行取款的功能,跨行取款收取一定的手续费。
设计模板:(这一题是在老师的模板下进行改进代码所以就直接分析老师的代码了)首先说一下,老师,代码的精妙之处,与我的代码不同的是,老师的代码每个类中存在双向链表,即通过另一个类能调用他,他也能调用另一个类。这样的话就不要写一长串点点再来调用了。这是值得我们学习的地方。银联里有一个链表存储对象银行,银行里有两个列表一个列表是纯属账户一个列表是存储atm机,account对象里面有一个链表储存银行卡,同样用户里面也聚集类,用户和银行,从而实现双向连接,卡类里面同样存储账户ATM里有银行类。
解决这道题目,我对原来代码做的更改是,我把账号变成了抽象类,然后有两个,借记和贷记账户类继承抽象类。这样做我就能判断,从他输入账户判断是借记卡还是贷记卡。然后进而判断他是不是可以贷款。至于怎么判断跨行取款?我先从ATM机找到ATM属于的银行,然后再用银行与账户的银行判断是不是属于同一个银行?如果不属于一个银行,再看他匹配到了哪个银行?匹配到不同银行有对应不同的手续费。这只是初步想法,具体实行的时候有很多种可能要讨论,首先你要判断它,是借记卡还是贷记卡?如果是借记卡,这个时候只要考虑它的取款金额是否小于账户余额?如果不小于的话,直接输出错误,然后再判断是不是跨行?如果跨行,则对应相应的手续费。重要的是跨行取款的时候,你的取款金额不能等于账户金额因为有一部分得交手续费。得考虑到,贷记卡就比较复杂了,首先你要判断你要取的钱减去账户里的钱是否大于五万?如果大于五万,直接输出错误,注意的是,跨行,的时候,如果你要取的款,恰好等于五万,他是不能成功的,因为要收取一定的跨行费和贷款费,然后再逐一讨论。
这一部分一定要讨论清楚,如果少讨论了一个部分,就会少考虑一种情况
类图如下:

类图分析:现有一个抽象Acount类 类CreditAccount 和 DebitAccount 继承自Account ,然后就是雷雨类之间的双向连接。
三. 采坑心得
- 题目集七(7-1)这道题目的话,有一个点自己做的不好,就是Shape类中的tostring方法我没有应用好,以至于输出时需要用这么一大段话。有待改进。
 
System.out.print(CardList.get(b).getShape().getShapeName()+":"+String.format("%.2f", CardList.get(b).getShape().getArea())+" ");
- 题目集七(7-2)首先这道题目我修改的方法就是在原基础上修改的,当时我没又想到tostring方法的利用,其次这题我没有细心,做题目的时候粗心大意,没有看清要求,我觉得解决这个问题,比做出十道题都有用
 - Atm 级做题心得与体会,普通的取款没什么,我认为关键的就是那个跨行的时候一定要讨论清楚。
 
四. 代码改进
改进前
for(int b=0;b<CardList.size();b++)
System.out.print(CardList.get(b).getShape().getShapeName()+":"+String.format("%.2f", CardList.get(b).getShape().getArea())+" ");
System.out.println();
System.out.printf("Sum of area:%.2f\n",getAllArea());
}
改进后
for(int b=0;b<CardList.size();b++)
System.out.print(CardList.get(b).getShape().toString()+" ");
System.out.println();
System.out.printf("Sum of area:%.2f\n",getAllArea());
}
把tostring方法给运用上
五、 总结
自我总结、
首先通过这一阶段的学习,我首先学到的是知识点,而更大的是编程能力的提高,这一个阶段我的编程能力得到的是一个质的提高,从原来几十行代码解决一个计算机,到现在可以写出一个ATM虽然ATM还不够完善,但是我自己已经感觉到了提高。慢慢也感受到了编程的魅力所在。
意见与建议:
对于教师方面,我觉得老师的培养模式挺好,培养我们的自学能力,我觉得这个模式挺好。
作业方面:
个人认为题目难度适中,实验与课上课下没有什么意见,我觉得模式挺好,可以培养我们的自主学习能力。
                    
                
                
            
        
浙公网安备 33010602011771号