第三次总结Blog
题目集7~9的总结:
前言:
本阶段题目集涉及的主要知识点有:
- 抽象类的使用
- 多态性使用方法以及接口的应用
- 对实体类的设计要做到单一职责原则
- 封装性
1.第七次题目集
(一)第七次题目集设计与分析:
- 7-1 图形卡片排序游戏
类图:

卡片大小排序游戏规则:考虑一款适合于小学生的卡片(Card)排序游戏,其规则为随机发放一些卡片给学生,卡片分为 四种形状:圆形(Circle)、矩形(Rectangle)、三角形(Triangle)及梯形(Trapezoid),并给出各种 卡片的相应参数,要求学生能够迅速求出各卡片的面积大小然后将卡片按照其面积值从大到小进行排 序,同时求出所有卡片的面积之和。
class Card implements Comparable<Card>{
Card(){
}
Shape shape;
Card(Shape shape)
{
this.shape=shape;
}
public void setShape(Shape shape) {
this.shape = shape;
}
public Shape getShape() {
return shape;
}
@Override
public int compareTo(Card o) {
if(this.getShape().getArea()>=o.getShape().getArea())
{
return 1;
}
else
return -1;
}
}
在主函数利用:
ArrayList<Card> k=new ArrayList<Card>();
k.sort(Collections.reverseOrder());
来进行对数组面积大小的排序。
结构分析:



本题的程序代码较为复杂,但是难度较一般,认真写了并且调试过后就能写出来,但是本体也有许多值得思考的点, 在Card类中使用了CompareTo的方法,以及学会了很多其他的方法。
题目集7(7-1)的设计分析总结
在主函数内设立两个ArrayList数组:
看输入的是多少,卡片分为 四种形状:圆形(Circle)、矩形(Rectangle)、三角形(Triangle)及梯形(Trapezoid)
再输入对应的边长或半径等参数,在各自的类中算出面积,使用 Comparable 接口, 即在 Card 类中实现 Comparable 接口中的 CompareTo()方法。
然后将卡片按照其面积值从大到小进行排序,同时求出所有卡片的面积之和,再将各种值输出。
- 7-2 图形卡片分组游戏
类图:

沿袭作业 7-1,本次作业主要对卡片(Card)进行分组游戏,其规则为随机发放一些卡片给学生, 卡片仍然分为四种形状:圆形(Circle)、矩形(Rectangle)、三角形(Triangle)及梯形(Trapezoid), 并给出各种卡片的相应参数,要求学生首先根据卡片类型将所有卡片进行分组(一个类型分为一组, 所以最多四组),然后能够对每组内的卡片根据面积值从大到小进行排序,同时求出该组内所有卡片 的面积之和,最后求出每组卡片面积之和中的最大值。
将根据卡片类型将所有卡片进行分组,对每组内的卡片根据面积值从大到小进行排序,同时求出该组内所有卡片 的面积之和,最后求出每组卡片面积之和中的最大值。
结构分析:



本题的程序代码较为复杂,但是难度较一般,但是比上一题难度要大,认真写了并且调试过后就能写出来,但是本体也有许多值得思考的点法,以及学会了很多其他的方法。
题目集7(7-2)的递进式设计分析总结
相对(7-1),在Shape类引入了
public String toString()、
String shapeName;
abstract class Shape{
Shape(){
}
String shapeName;
Shape(String shapeName)
{
this.shapeName=shapeName;
}
@Override
public String toString() {
return "Shape{" +
"shapeName='" + shapeName + '\'' +
'}';
}
public void setShapeName(String shapeName) {
this.shapeName = shapeName;
}
public String getShapeName() {
return shapeName;
}
abstract public double getArea();
abstract public boolean validate();
}
圆形(Circle)、矩形(Rectangle)、三角形(Triangle)及梯形(Trapezoid)全部继承自Shape类。
主函数设立四个数组,利用多态性:
ArrayList<Card> k=new ArrayList<Card>();
Circle circle = new Circle(r);
Card card = new Card(circle);
card.getShape().setShapeName("Circle");
//-----------
Rectangle rectangle = new Rectangle(width, length);
Card card = new Card(rectangle);
card.getShape().setShapeName("Rectangle");
//-----------
Triangle triangle = new Triangle(x, y, z);
Card card = new Card(triangle);
card.getShape().setShapeName("Triangle");
//
Trapezoid trapezoid = new Trapezoid(x, y, z);
Card card = new Card(trapezoid);
card.getShape().setShapeName("Trapezoid");
k.add(card);
经过匹配,将各个数值加入不同ArrayList数组:
public static double device(ArrayList<Card> k)
{
int i=0;
ArrayList<Card> circle=new ArrayList<>();
ArrayList<Card> rectangle=new ArrayList<>();
ArrayList<Card> triangle=new ArrayList<>();
ArrayList<Card> trapezoid=new ArrayList<>();
String t1="Circle";
String t2="Rectangle";
String t3="Triangle";
String t4="Trapezoid";
for (i=0;i<k.size();i++)
{
if(sence())
{
if (Pattern.matches(t1, k.get(i).getShape().getShapeName()))
{
circle.add(k.get(i));
}
if (Pattern.matches(t2, k.get(i).getShape().getShapeName()))
{
rectangle.add(k.get(i));
}
if (Pattern.matches(t3, k.get(i).getShape().getShapeName()))
{
triangle.add(k.get(i));
}
if (Pattern.matches(t4, k.get(i).getShape().getShapeName()))
{
trapezoid.add(k.get(i));
}
}
}
根据卡片类型将所有卡片进行分组,对每组内的卡片根据面积值从大到小进行排序,同时求出该组内所有卡片 的面积之和,最后求出每组卡片面积之和中的最大值。
(二)第七次题目集采坑心得
1. 7-1个人在题目集7(7-1)中思路主要是:首先声明一个shape类,里面放一个getArea的方法。然后再写继承了父类Shape的子类Circle类和Rectangle类,并且在这两个类中写按照题目要求来的构造方法和一些方法,之后再写一个继承Rectangle类的子类Box和一个继承Circle类的子类Ball类,并且同样按照题目需求来书写相应的构造方法和一些方法
2. 题目集7(7-2)中,我参考了题目集7(7-1)中的一些思路,通过更改了一些子类,删除了不需要的一些类以及按照题目上所给的需求修改了一
下主方法的逻辑顺序和试着增添了一个接口在在源代码内。题目集7中的7-2与7-1差别其实也不是很大,总的来说个人觉得大体都是相同的,不过7-2中需要自己去再做一些增添补漏以及一些删减在里面。
(三)第七次题目集改进建议
难度适中,需要较好的明白类的继承、多态性使用方法以及接口的应用,难度比较适合我们。
并没有需要改进的地方。
2.第八次题目集
本次题目集虽然只有一道题,但是题目的难度较大,并不是那么轻易就能完成,本次题目是一道编写一个银行 ATM 机的模拟程序,能够完成用户的存款、取款以及查询余额功能的题目。
注意本题目中的各实体类之间的关系,尤其是一对多的组合关系、对实体类的设计要做到单一职责原则,且不能缺少规定的实体类、编程时考虑面向对象中的封装性本题目中的应用以及是否有能够扩展的衍生需求。
(一)第八次题目集设计与分析:
- 7-1 ATM机类结构设计(一)
编写一个银行 ATM 机的模拟程序,能够完成用户的存款、取款以及查询余额功能。
类图:
分析总结
class CU是中国银联类,里面储存银行名字及各卡号开户人的姓名。
public String nm(Bank bank)储存各卡号开户人的姓名
public String bk(Bank bank)储存银行名字
class Card是银行卡类,在这个类中进行对银行卡密码的匹配及对ATM机号的匹配。
class Bank是银行类,进行存款取款和判断取款是否大于存款的操作。
class Account是账户类,进行判断银行卡号是否存在和引入各类中的所有判断是否成功和进行存款查询的功能。
结构分析:
(三)第八次题目集改进建议
第八次题目集的难度偏难,类的设计的方式写起来比较复杂,测试点安排比较合理,没有太大问题,但整体难度偏难,花费的时间比较长,是一次很好的锻炼机会。
但不希望将方法规定死了只能用类的设计来写,即使是用if-else的结构,在下一题目集的改动也不是很麻烦,希望能考虑到各种方法的适用性。
3.第九次题目集
在第八次题目集的基础上,根据账户的不同,银行卡一般分为借记卡(针对借记账户)和信用卡(针对贷记账户) 两类,银行账户分为借记账户和贷记账户两种,其中,借记账户不能够透支取款,而贷记账户可以透支取款(可能需要支付手续费),且允许跨行办理相关业务。多加了四个人物及对应的银行卡号的贷记账号,并收取手续费和增加贷款业务。虽然只有一道题目,但难度较难,需要在上一题目集的基础上进行修改。
(一)第九次题目集设计与分析:
- 7-1 ATM机类结构设计(二)
编写一个银行 ATM 机的模拟程序,能够完成用户的取款以及查询余额功能。
类图:
⚫中国银联(China UnionPay):成立于 2002 年 3 月,是经国务院同意,中 国人民银行批准设立的中国银行卡联合组织,总部设于上海。主要负责建设和 运营全国统一的银行卡跨行信息交换网络、提供银行卡跨行信息交换相关的专 业化服务、管理和经营“银联”品牌、制定银行卡跨行交易业务规范和技术标 准。其包含多家银行机构。
⚫银行(Bank):是依法成立的经营货币信贷业务的金融机构,是商品货币经 济发展到一定阶段的产物。
⚫银行用户(User):能够在银行办理相应业务的用户。一个银行机构可以拥 有多个银行用户及多个银行账户,一个用户也可以在多个银行机构开立账户。
⚫银行账户(Account):客户在银行开立的存款账户、贷款账户、往来账户 的总称。一个银行用户可以拥有多个银行账户。
⚫银行卡(Card):经批准由商业银行(含邮政金融机构) 向社会发行的具有 消费信用、转账结算、存取现金等全部或部分功能的信用支付工具。一个银行 账户可以发行多张银行卡。
⚫ ATM(Automated Teller Machine),自动柜员机,因大部分用于取款,又 称自动取款机。它是一种高度精密的机电一体化装置,利用磁性代码卡或智能 卡实现金融交易的自助服务,代替银行柜面人员的工作。可提取现金、查询存 款余额、进行账户之间资金划拨、余额查询等工作。一般 ATM 机隶属于某一银 行机构。
分析总结
class CU是中国银联类,里面储存银行名字及各卡号开户人的姓名,增加张三丰、令狐冲、乔峰、洪七公等人。
public String nm(Bank bank)储存各卡号开户人的姓名
public String bk(Bank bank)储存银行名字
class Card是银行卡类,在这个类中进行对银行卡密码的匹配及对ATM机号的匹配。
class Bank是银行类,进行存款取款和判断取款是否大于存款的操作。
class Account是账户类,进行判断银行卡号是否存在和引入各类中的所有判断是否成功和进行存款查询的功能
结构分析:
(三)第九次题目集改进建议
该题目集中还存在测试点的问题,比如多次小额取款后,再取超额的钱,会超出范围显示值。
在不同的存款条件下也会出现越存越多的情况。
这些地方并没有设置为测试点,有较大的bug存在,希望下次能多增加一些测试点,将分数稍微分散。
--------------------总结------------------
①题目集7(7-1)、(7-2)两道题目的递进式设计分析总结:
题目集7(7-1):
在Card类中使用了CompareTo的方法:
class Card implements Comparable<Card>{
Card(){
}
Shape shape;
Card(Shape shape)
{
this.shape=shape;
}
public void setShape(Shape shape) {
this.shape = shape;
}
public Shape getShape() {
return shape;
}
@Override
public int compareTo(Card o) {
if(this.getShape().getArea()>=o.getShape().getArea())
{
return 1;
}
else
return -1;
}
}
在主函数内设立两个ArrayList数组:
ArrayList<Integer> w=new ArrayList<>();
ArrayList<Card> k=new ArrayList<Card>();
int n=input.nextInt();
看输入的是多少,卡片分为 四种形状:圆形(Circle)、矩形(Rectangle)、三角形(Triangle)及梯形(Trapezoid)
再输入对应的边长或半径等参数,在各自的类中算出面积,使用 Comparable 接口, 即在 Card 类中实现 Comparable 接口中的 CompareTo()方法。
然后将卡片按照其面积值从大到小进行排序,同时求出所有卡片的面积之和,再将各种值输出。
题目集7(7-2):
相对(7-1),在Shape类引入了
public String toString()、
String shapeName;
经过匹配,将各个数值加入不同ArrayList数组:根据卡片类型将所有卡片进行分组,对每组内的卡片根据面积值从大到小进行排序,同时求出该组内所有卡片 的面积之和,最后求出每组卡片面积之和中的最大值。
题目7(7-2)是题目7(7-1)的进阶版本,将(7-1)的代码经过以上修改即可。
②题目集8与题目集9的总结
题目集8:
class CU是中国银联类,里面储存银行名字及各卡号开户人的姓名。
public String nm(Bank bank)储存各卡号开户人的姓名
public String bk(Bank bank)储存银行名字
class Card是银行卡类,在这个类中进行对银行卡密码的匹配及对ATM机号的匹配。
class Bank是银行类,进行存款取款和判断取款是否大于存款的操作。
public double checkmoney(Card card, String[] k, double[] money)用来检测存款与取款的关系。
class Account是账户类,进行判断银行卡号是否存在和引入各类中的所有判断是否成功和进行存款查询的功能。
题目集9:
class CU是中国银联类,里面储存银行名字及各卡号开户人的姓名,增加张三丰、令狐冲、乔峰、洪七公等人。
public String nm(Bank bank)储存各卡号开户人的姓名
public String bk(Bank bank)储存银行名字
class Card是银行卡类,在这个类中进行对银行卡密码的匹配及对ATM机号的匹配。
class Bank是银行类,进行存款取款和判断取款是否大于存款的操作。
public double checkmoney(Card card, String[] k, double[] money)用来检测存款与取款的关系。
class Account是账户类,进行判断银行卡号是否存在和引入各类中的所有判断是否成功和进行存款查询的功能。
几乎与上一题目集没什么区别,改动在于:
public double checkmoney(Card card, String[] k, double[] money)中,借记账号分别求手续费。
总的来说:
题目集9相对比题目集8增加了ATM机的功能(增加借记卡,支持跨行办理相关业务等功能),且增加了一个银行的种类。综合来说,题目集9的设计相对比
与题目集8中的设计要更加完善,程序的功能也更加齐全。这种递进式的设计需要我们更加擅长使用多态等,同时也要求我们写出来的代码更具备重写性。看似
不是很难去改动设计的题目集9在实际操作中其实个人也还是觉得比较难解决。想要把题目集9写好需要之前题目集8中自己写的代码拥有高重写,扩写性。这三次题目集的题目量都不多,但是对我们的技术掌握要求较高,题目偏难,需要我们掌握类的继承、多态性使用方法以及接口的应用,面对小程序ATM的设计要沉得下心来编程,不能半途而废、要有耐心。综合运用所学的各种知识点完成ATM,并在此基础上不断加以改进,显然有一定难度,但这极好地锻炼了我们的能力,也充分让我们明白了自身的不足,是一些非常好的题目集。
浙公网安备 33010602011771号