第三次博客作业

前言

题目集7:要求程序可以为学生所玩的游戏提供正确答案的功能,即根据学生得到的卡片种类与数量,给出排序前和排序后的卡片顺序,同时给出所有卡片的面积之和。其中涉及到对于Comparable接口的应用,Card类需要实现Comparable接口中的CompareTo()方法。也要求掌握类的继承、多态性使用方法以及接口的应用。分为题目集7-1和题目集7-2,7-2的题目要求在7-1的要求上做了更进一步的改进。

题目集8:作业要求编写一个银行 ATM 机的模拟程序,能够完成用户的存款、取款以及查询余额功能。

          设计要求:注意题目集中的各实体类之间的关系,尤其是一对多的组合关系。

                     对实体类的设计要做到单一职责原则,且不能缺少规定的实体类。

题目集9:本次作业对题目集8中的功能做出了改进,要求编写一个银行 ATM 机的模拟程序,能够完成用

户的取款以及查询余额功能。

要求尽量对上次作业的程序进行重构,使之符合“开---闭”原则。

 

设计与分析

题目集77-1

 

首先要先解决输入问题,在一行输入一串数字以0结束。一代表圆形,二代表矩形,三代表三角形,四代表梯形。每一个卡片中都包含着图形的属性,并且在输出的时候会要求进行单个的计算,所以会想到用Arraylist实现,因为它可以实现数组,并且可以从数组中提取单个元素的进行计算。首先设计一个抽象类shape,圆,矩形,三角形梯形,都继承于图形类。在卡片类中定义一个图形类,其他四个类中都分别申明自己的属性为私有类型,类似于圆的半径,矩形的长宽高,并且在三角形类中需要判断三边关系是否正确,并且每个类中都要判断边的长度大于零。其次解决输出问题。输出包括非法输入的输出和合法输入的输出,

非法输入:如果图形数量非法(小于 0)或图形属性值非法(数值小于 0 以及三角形三边不能组成三 角形),则输出“Wrong Format”。

合法输入的输出:如果输入合法,则正常输出,所有数值计算后均保留小数点后两位即可。

输出内容如下: 

排序前的各图形类型及面积,格式为“图形名称 1:面积值 1 图形名称 2:面积值 2 …图形名称 n:面积值 n ”,注意,各图形输出之间用空格分开,且输出最后存在一个用于分隔的空格;

排序后的各图形类型及面积,格式同排序前的输出; 

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

题目集7-2

本次题目要求类似于上一次的题目,输入的要求是一样的,但是输出的要求不同。上一次题目集中要求输出总和,这次的题目及要求输出最大的面积,并且将每一个类的图形用[]分割开来输出,如果输入没有对应的图形,[]中是空白。

所以需要在每一个数组中排列好后再进行输出,也类似于上一次的题目,四种图形全部继承于抽象的图形类,因为输出要求输入名字,所以四种类型都要继承父类的方法shapeName(),要注意方法为String类型。

和上一次题目不同的是,上一次这题目是无序的,是对应于输入的顺序,这一次的题目是根据输入的不同类型进行分类输出的,将圆形归为一类输出,再将矩形归为一类输出,以此类推,不同的类要使用[]分开,并且在输出的排序模块中,要求对每个类型进行排序好过后输出。

题目集8

首先要解决输入问题,要求用#字符代表结束,类似于上一次作业中要求以零为终止符号,根据作业要求可以知道,一个用户可以拥有多个银行帐号,一个银行帐号,可以拥有多个隶属卡号,并且不同的银行之间不能实现跨行存取款,如果进行此类操作,则判断为输入错误,每个银行卡号都默认为八个八。本次作业的银行有两个银行,分别为中国建设银行和中国工商银行,中国建设银行的ATM机有四台,中国工商银行的ATM机有两台,中国建设银行的ATM机的编号为一到四,中国工商银行的ATM机的编号为五到六,在输入中,必须要准确的对应ATM机编号和银行名称,否则会判断为输入错误。

根据题目中有多少隶属卡号就需要创建多少个对象,进行操作的ATM机类的父类是全部的ATM类。当输入的金额大于零时代表取款,否则代表存款。

输入格式如下: 

存款、取款功能输入数据格式 卡号 密码 ATM 机编号 金额(由一个或多个空格分隔) 其中,当金额大于 0 时,代表取款,否则代表存款。 

查询余额功能输入数据格式卡号。

然后需要解决的是输出问题,输出的格式为

①输入错误处理

  • 如果输入卡号不存在,则输出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.

②取款业务输出

输出共两行,格式分别为:

[用户姓名]在[银行名称]的[ATM编号]上取款¥[金额]

当前余额为¥[金额]

其中,[]说明括起来的部分为输出属性或变量,金额均保留两位小数。

③存款业务输出

输出共两行,格式分别为:

[用户姓名]在[银行名称]的[ATM编号]上存款¥[金额]

当前余额为¥[金额]

其中,[]说明括起来的部分为输出属性或变量,金额均保留两位小数。

④查询余额业务输出

¥[金额]

金额保留两位小数。

因为每个用户对应一个账户,并且在输出的时候也是对应着输出,所以和上一次题目一样也需要用到Arraylist的数组,并且要注意,一旦检测到输入有误,则程序立即停止运行,之前正确的输入给予相应的输出。本次题目要注意各实体类之间的关系,尤其是一对多的组合关系。对实体类的设计要做到单一职责原则,且不能缺少规定的实体类。并且还要注意编程时,要考虑面向对象中的封装性,以及是否有能够拓展的衍生需求。

题目集9

本次题目在上一次这题目的基础上做了改进,本次作业中,银行卡包含借记卡和信用卡两类,且允许跨行办理相关业务,例如在中国建设银行的ATM机上使用中国工商银行的银行卡,也可以进行业务操作,并且本次题目增加了透支取款手续费以及透支的最大限额,在上一次的题目基础上增加了跨行取款手续费,增加了中国农业银行,中国农业银行有五个ATM机,编号是从七到11,用户也增加了四个,透支取款手续费,由中国银联统一规定,为5%最大,投资金额均为¥50,000,在合成副用原则及单一职责原则基础上,尽量对上次作业的程序进行重构,使之符合开闭原则。

其余的要求和上一次的题目基本吻合,除了增加可以跨行操作,以及增加了中国农业银行的相关操作。

 

踩坑心得

题目中许多地方会用到保留几位小数的问题,但是保留小数有两种方法,一种是四舍五入,另一种是不用四舍五入,直接去掉需保留几位小数之后数字,

 

例如 double a = 3.1415926;    (int)(a * 100)/1就是经过直接删除需保留小数位数之后的数字,而不用四舍五入。

 

2.在做题目集四  7-3需要考虑输入的数字是否合法的时候经常要做判断,于是把这个方法协程了一个函数,但是要注意的是方法放在那里,在我们学习类之前,我们都是把方法放在Main中。

 

 

继承类之间方法的的关系1.重载 : Overload, 2.覆盖: Overwrite ,3.覆写: Override,也是同样了解到创建父类该有的条件,了解较多的可能就是继承了,继承就是为了实现可复用.而我们刚刚接触的多态:则是不同的对象,接受到同一个消息的时候会产生不同的操作.当然这个月学到的不只是语法还学到了面向对象的编程方式和思维方式,学习了接口,接口的概念,接口的作用,

学的还是很不够的,在这些知识点方面还是需要多练练,多多去了解的,因为对于这些作业来说,真正的其实是在他人的辅导下才得以写完的,我自己掌握的知识点还是完全不够的。

改进建议

接口这部分的处理有很大的改进空间,java 往大的说其实可以叫做面向接口编程,在这方面有很大的改进空间的。刚拿到题目的时候,不能就开始写,这样格式不对的话,就前功尽弃了,还有就是准确理解题目中要用到的东西,如果再做一次这样的作业,我会建议我自己准确理解类和类之间的关系,这样才能更好的用代码将自己想要表达的意思写清楚,才能达到事半功倍的效果。

总结

经过这几次难度有所提高的题目,感觉自己的编程能力提高了很多,在一写细节的地方我学习到了很多技巧,需要不断的摸索,不断地积累,因为知识是学不完的,不能一蹴而就,每天积累一点点,每天都会用进步,就像这次作业中老师的处理方式,比我的要好,这样我就学会了更好的处理方式,就是这样的不断积累自己不会的,慢慢进步!

posted @ 2021-06-20 22:36  1715  阅读(91)  评论(0)    收藏  举报