题目集7~9的总结性Blog

(1)前言:总结三次题目集的知识点、题量、难度等情况(2)设计与分析:重点对题目的提交源码进行分析【如下:】

 ①题目集7(7-1)、(7-2)两道题目的递进式设计分析总结

题目集07

这一题目集要求的是掌握类的继承、多态性使用方法以及接口的应用。所以

第一题:图形卡片排序游戏

首先要实现的功能是对输入的数据进行处理,输入1~4的数字,1 代表圆形卡片,2 代表矩形卡片,

3 代表 三角形卡片,4 代表梯形卡片。那么这里就需要创建四个类,

对圆形、三角形、梯形、矩形的四个类、还可以向上抽取出一个父类:Shape。

那么 根据一开始输入的数字,对相应的图形数据进行赋值,是圆形就只要输入半径,

结果需要的是面积和周长,所以那就不需要圆心的坐标。对于矩形,就需要输入长和宽,计算周长和面积,那么对于三角形,

就需要输入三角形的三条边,之后也要计算面积和周长,

再就是梯形,如果需要输入梯形就是要输入上底和下底,还有高,同样可以计算周长和面积。

那么需要对题目业务进行分析,首先最起码的是输入的数据要合法,

所以对于用户输入的每个数据都要逐一判断是否合法,在这里的处理我是在每个类里面都写了一个方法,

用于判断各自图形输入数据的合法性,如果输入合法,则正常输出,所有数值计算后均保留小数点后两位即可。

排序前的各图形类型及面积,格式为“图形名称 1:面积值 1 图形名称 2:面积值 2 …图形名称 n:面积值 n ”,

各图形输出之间用空格分开且输出最后存在一个用于分隔的空格; 排序后的各图形类型及面积,格式同排序前的输出;

所有图形的面积总和,格式为“Sum of area:总面积值”。

题目给出了主源码:

public class Main {

//在Main类中定义一个静态Scanner对象,这样在其它类中如果想要使用该对象进行输入,则直接 //使用Main.input.next…即可(避免采坑)

public static Scanner input = new Scanner(System.in); public static void main(String[] args){ ArrayList list = new ArrayList(); int num = input.nextInt(); while(num != 0){ if(num < 0 || num > 4){ System.out.println("Wrong Format"); System.exit(0); } list.add(num); num = input.nextInt(); } DealCardList dealCardList = new DealCardList(list); if(!dealCardList.validate()){ System.out.println("Wrong Format"); System.exit(0);4 / 4 } dealCardList.showResult(); input.close(); } } 

题目中要求计算面积总和,就先把各个图形的面积数据存储在一个数组里面,然后对这个数组里面的数据进行和的运算,最后计算得出的数据总和就是面积总和了。

这里用到的继承关系就是各个子图形继承自超类Shape,例如:

class Circle extends Shape{
private double radius;

public Circle() {
}

public Circle(double radius) {
this.radius = radius;
}

public double getRadius() {
return radius;
}

public void setRadius(double radius) {
this.radius = radius;
}

public double getArea() {
return Math.PI*Math.pow(radius, 2);
}

public boolea n validate() {
if(this.radius>0) {
return true;
}
else
ret urn false;
}
}其他图形的继承关系也是和这样的差不多。

如果程序要扩展,那么就会用上这层继承关系,对于这个题,如果说要用到继承,那么就是考察对学生继承关系语法的掌握。

难度:中

第二题: 图形卡片分组游戏 

这题和上一题一样,只不过对上一题进行了扩展,加了一些东西,

除了:对各图形信息进行输入并输出;输入数据的正确性校验;  对输入的图形按照图形类型进行分组并输出,之外,

还要满足:对每组内的图形按照面积值降序排序并输出;  求出每组内图形面积的总和; 求出所有组的面积总和的最大值并输出。输入数据同样以“ 0 ”结束。

然后根据第一行数字所代表的卡片图形类型,依次输入各图形的相关参数,例如:圆形卡片需要 输入圆的半径,矩形卡片需要输入矩形的宽和长,

三角形卡片需要输入三角形的三条边长,梯形需要 输入梯形的上底、下底以及高。数据和数据之间用空格分隔,首先也是对输入数据合法性的校验,

不合法就打印出“Wrong Format”。输入合法的话,保留小数点后两位。

这题考查了Comparable、Comparator 接口的应用 图形类设计可参考作业 7-1 的类层次结构,

本次作业要求对卡片排序时使用 Comparable 接口或 Comparator 接口。要求对每组内的卡片根据面积值从大到小进行排序,同时求出该组内所有卡片 的面积之和,

最后求出每组卡片面积之和中的最大值。输出格式也和第一题不同,排序前的各图形类型及面积,格式为[图形名称1:面积值1图形名称2:面积值2 …图形名称n:面积值n ]

生首先根据卡片类型将所有卡片进行分组(一个类型分为一组, 所以最多四组),然后能够对每组内的卡片根据面积值从大到小进行排序,同时求出该组内所有卡片 的面积之和,最后求出每组卡片面积之和中的最大值。

难度:中

 

 ②题目集8和题目集9两道ATM机仿真题目的设计思路分析总结

题目集08

第一题:ATM机类结构设计(一)这一题是对银行业务的设计

编写一个银行 ATM 机的模拟程序,能够完成用户的存款、取款以及查询余额功能。

首先分析业务:要完成存取款,要做的事是,存取款要对应相应的卡号,因为每张卡的余额都是独立的,

所以在存取款之前,就必须对银行卡账号进行核对,银行卡里面就必须存储这个银行卡所有者的个人信息,以及余额等数据,

而在核对银行卡的时候,就需要查询是否存在这张卡

,所以就需要在 银行里所有的银行卡查询,看是已经创建了这张卡,由此我们可以安排相应的一个方法来专门校验是否存在这张卡,

这个方法暂且放置在Bank类里面,前面说到要在每张银行卡里储存互户主信息,所以在一开始初始化的时候,

就需要将使用者的信息和银行卡绑定起来,

题目中那个银行卡还存在不同种银行的,所以,也需要存储银行卡的所属银行信息,为接下来跨行取钱做准备。

还一个就是ATM机,这个每个银行都有ATM机,而且每台ATM机的型号又不一样,

所以可以根据这个特点来判断ATM机是属于哪家银行的,所以可以用ATM机来判断是否是跨行取钱。

如果输入卡号不存在,则输出“Sorry,this card does not exist.”。 如果输入 ATM 机编号不存在,则输出“Sorry,the ATM's id is wrong.”。

如果输入银行卡密码错误,则输出“Sorry,your password is wrong.”。如果输入取款金额大于账户余额,则输出“Sorry,your account balance is insufficient.”。

如果检测为跨行存取款,则输出“Sorry,cross-bank withdrawal is not supported.”。

输出格式倒也没什么好说的,就是在最后判断的时候输出的一个提示。这个题就是首先要初始化数据,中国银联是一个总体,

里面包含了所有银行,在这题中就是包含了中国建设银行、中国工商银行

//所有八个账号(每个账号底下包括子卡)
List<String > yangguo1 = new ArrayList<>(); //账号一
List<String > yangguo2 = new ArrayList<>();
List<String > guojing = new ArrayList<>();
List<String > zhangwuji1 = new ArrayList<>();
List<String > zhangwuji2 = new ArrayList<>();
List<String > zhangwuji3 = new ArrayList<>();
List<String > weixiaobao1 = new ArrayList<>();
List<String > weixiaobao2 = new ArrayList<>();

。这两个银行里面分别包含了各自所有的ATM机,01、02、03、04,05、06.然后是初始化用户信息,所有人初始余额都为10000.

//杨过所有账号的集合
List<Card> yangguoCards = new ArrayList<>();
//郭靖所有账号的集合
List<Card> guojingCards = new ArrayList<>();
//张无忌所有账号的集合
List<Card> zhangwujiCards = new ArrayList<>();
//韦小宝所有账号的集合
List<Card> weixiaobaoCards = new ArrayList<>();
//初始化每个人所属卡的数据

首先杨过,隶属银行有中国建设银行,他有两个银行账号都是中国建设银行的,其中一个账号有两个;隶属卡号,另一个是只有一个隶属卡号的,接下来郭靖、张无忌、韦小宝的个人信息初始化都是这样的。在这里的初始化信息适合用ArrayList链表存储信息,比如,可以船舰一个链表来存储杨过的银行账号,因为每个人都可以拥有很多个银行账号,然后接下来,隶属卡号也可以创建一个链表,用来存储这个账号地下的所有隶属卡号。银行里面的ATM机也可以用链表来存储

/*
* 创建一个中国建设银行的链表 和 一个中国工商银行的链表
*功能:存放每个银行里面所有的ATM机
* */
List<Atm> constrcionAtm = new ArrayList<>();
List<Atm> ICBCAtm = new ArrayList<>();

 

题目集09

 ATM机类结构设计(二)

题目要求分析:

这个题目是对上一题的扩展,增加了新的业务功能。

增加了借记卡。银行账户分为借记账户和贷记账户两种,其中,借记账户不能够透支 取款,而贷记账户可以透支取款,这里需要支付手续费。

需要单独创建一个中国农业银行,因为在这题中,借记卡都是这个银行里才有的,贷记卡透支取钱需要付5%的手续费,

此外,如果还要跨行取钱的话,就还需要额外付手续费,这个手续费每个银行标准都不一样,

创建中国农业银行的时候,也要连带着把中国农业银行的基本数据初始化,比如ATM机,这个银行里面也有ATM机,

新加入了三个用户,:张三丰、令狐冲、乔峰,这些人都是持有中国农业银行的贷记卡的,业务假定 :系统的测试用例均采用如上数据,

手续费默认均从银行卡所对应的账户中自动扣除。跨行业务手续费收取比例由 ATM 机隶属银行决定,

例如,用户手持中国 工商银行的银行卡在中国建设银行的 ATM 上进行取款操作,则手续费收取比例为 中国建设银行的相应比例,

按初始化数据中的规定为取款金额的 2%。跨行查询余额不收取手续费。透支取款手续费由中国银联统一规定为 5%,最大透支金额均为 50000 元。

其他的就只需要在上次题目的基础上改进,结果输出不一样,大致就是这样的了。

 

 

posted @ 2021-06-11 21:35  flemingonly  阅读(94)  评论(0)    收藏  举报