第二阶段Java总结

前言:

较第一阶段的java练习,第二阶段的难度明显加大,题目的难度以及相互之间的联系愈加紧密。类图相对复杂,一个题目之间类的逻辑关系也更加巧妙和理解起来愈加生涩。对于我来说要解决这些问题确实有些难度。

一.作业过程的总结

1. 此阶段三次作业在于对Java继承,多态,封装特性的熟悉运用,深入理解面向对象设计原则中的“单一职责原则”并运用这些特性来解决问题。

2.封装性:封装是一种信息隐蔽技术,它体现于类的说明,是对象的重要特性。

继承性:继承性是子类共享其父类数据和方法的机制。它由类的派生功能体现。

多态性:对象根据所接收的消息而做出动作。同一消息被不同的对象接受时可产生完全不同的行动,这种现象称为多态性。利用多态性用户可发送一个通用的信息,而将所有的实现细节都留给接受消息的对象自行决定,如是,同一消息即可调用不同的方法

每个类都是一种对象的封装。作业中多涉及继承关系,根据题目给出的类图提示。结合自己的思考,理解继承的运用。

3.作业过程中遇到的问题及解决方法

本阶段第一次作业第一题,以南水北调背景而衍生出来的实际问题,是本阶段相对来说比较难的一题。该题目目的在于对数据的处理,使用Java中字符串处理类以及使用正则表达式对输入数据的处理。

在本题中。数据格式包括测量时间(measureDateTime)、目标水位(objectWaterLevel)、 实际水位(actualWaterLevel)、闸门目标开度(objectGateOpening)、闸门实际开度(actralGateOpening) 及流量(waterFlow)。

且对数据的输入做了较多的限定:

各数据之间采用 Tab(“\t”)进行分隔,每次可以输入多条数据,直到遇到用户输入“exit”。

对于测量时间:格式为“年/月/日 时:分”。年份不是 4 位数时,“月”与“日”为一位数时,之前不加“0”,日期与时间之间有一个空格,“时”与“分”之间采用冒号分隔(英文半角),“时”为一位数时之前不加“0”,“分” 始终保持两位且始终为“00”(即整点)。“时”数必须是 24 小时进制中的偶数值。

对于水位以及开度:目标水位、实际水位、流量:均为实型数,取值范围为[1,1000),小数点后保留 1-3 位小数 或无小数(也无小数点)。目标开度、实际开度:实型数,取值范围为[1,10),必须保留 2 位小数,两个开度之间用“/” 分隔。

这些限定条件无疑增加了解题的难度。

对于整个问题处理过程的架构。

对于数据处理之间的逻辑,应为先判断整条数据是否满足形式要求,若满足在进行各个部分数据的合法性检测,并将所有数据都做合法性检测,如果所有的数据解合法,那么再进行计算。

首先要对数据进行校验,因为数据都是以\t来分隔的。对一行整体数据进行校验,可以用正则表达式,即为

/月/日 时:分\t目标水位\t实际水位\t目标开度\t实际开度\t流量”。

 

但这样处理可读性不好。故改用

 

这样方便且简单。如果整条数据形式上满足要求就进一步判断。对于时间合法性的处理,使用一个单独的函数。

 

先将时间按空格分成两部分,然后再按”:”分割小时和分钟,按”/”分割年月日,然后进行相应的判断。

 

 

接下来处理水流量和实际水位、目标水位,因为此三者范围相同,且均为带有

1-3位小数的实型数。判断方法相同。使用正则表达式即可完成。

 

处理数据的开度也大相径庭。

 

程序对于错误数据的处理:当某一行数据有误时应指出该行的行号以及具体错误出现的列号以及输出整行数据。如下:

 

 

第二题。使用蒙特卡洛方法估算圆周率,

一个边长为 s 的正方形,它的内接圆和正方形的面积之比为 πr2/4 r 2 = π/4。由此可以在正方 形的面积范围内产生大量(n 个,需要足够大)随机的点,再统计这些点在圆的范围内的数量 m。则 π/4 = m/n,由此可估算 π 的值。

以此思路来设计程序。

解题步骤如下:将计算所需的数据进行检验,然后将其正确传入相关的类中,横纵坐标以及长宽传入retangle类中。n传入MonteCarloSimulation类中。根据思路要想统计m则必先求圆心坐标。具体如下

 

接下来要产生随机点,且要满足在圆或正方形中。必需做限定。

 

形如a+Math.random()*b产生的范围为a~a+b。

再判断是否在圆中若在则sum+1。

 

最后返回结果到主函数中。

 

第三题图形的继承。

要求:从键盘输入1,则定义圆类,从键盘输入圆的半径后,主要输出圆的面积; 从键盘输入2,则定义矩形类,从键盘输入矩形的宽和长后,主要输出矩形的面积; 从键盘输入3,则定义球类,从键盘输入球的半径后,主要输出球的表面积和体积; 从键盘输入4,则定义立方体类,从键盘输入立方体的宽、长和高度后,主要输出立方体的表面积和体积;

本题的关键在于对继承关系的理解,即子类能够使用父类对象的所有方法和属性。可对父类方法重写。如此题中的Shape类便是一个父类。其中有一个求面积的方法,返回0.0。

 

其他继承Shape类的类可对求面积方法重写如CIrcle类。

 

本阶段第二次Java练习第一题考察继承、多态性的使用。图形继承与多态。

解题思路与类逻辑。

使用nextLine()函数输入数据,将数据正确传入相应的类中。然后判断各个部分数据是否合法。然后求出各自的面积,求和,再将面积排序。

对于数据的传递。使用循环来实现。

 

 

 

将申明的各个图形对象放入Shape类的数组里。因为Circle 类Rectangle类 Triangle类都是Shape类的子类。

使用循环让每个对象调用各自的getArea方法。再将面积放入数组,进行排序。

 

 

第二题。一元多项式求导。

该题目的要求:使用类的继承、多态性编写程序对简单多项式的导函数进行求解

 

从上图可看出,对于此题难点在于如何拆分多项式。不能单纯的按照”+””-”号来分。

按照我的思路,将输入的数据进行按字符拆分。

 

再将其变成字符串。

但拆分的时候还需考虑,数值不为一位的时候,应将后面的数值字符也并入上一个字符串中。如数值位123,拆分为’1’ ‘2’ ‘3’在变换成字符串的时候,应变为”123”而不是”1”  “2”   “3”。

这样一来就可以对每个部分进行操作。

在检验输入是否合法时使用正则表达式。

 

来判断是否输入合法。

本阶段第三次Java练习,第一第二题解题思路大相径庭。

图形卡片的排序问题,在一行中输入一串数子,1~4的整数分别代表圆形、矩形、三角形、梯形。然后在下一行输入相应的图形数据,如长宽高,三角形三边。

将数据正确传入相应的类中,判断数据是否合法,判断数据是否>0和能否构成三角形。

此题的难点在于如何让类名跟着面积一起排序。

让所有的图形类继承Shape类,Shape类中有String name;变量。将实例化的各个对象放入Shape类的数组里。实例化时将类名存于name变量中。如下

 

最后将Shape数组里的对象按照面积的大小进行排序。

 

第二题增加了些许改变,要将各个图形类进行分组输出,而且分别对每组进行降序排序。

对于分组输出:在实例化对象时将各个对象的数量分别记录下来。使用循环进行输出。

 

然后再使用循环进行各个排序。

 

再按要求输出。

第三题求素数的数量。

使用筛选法:即偶数不是素数,奇数可能是素数,素数的倍数不是素数。这样可较快求出素数数量。

4. 此阶段完成作业的时间比例:4天,4天,2天。

5.对编程过程的严谨性的认识及教训

对于数剧的输入,可以用字符串生成器,也可使用nextLine()函数对一行数据进行输入。使用trim()函数来处理字符串,避免输入数据两端有空格的情况。

对数组的操作,应该注意空指针的情况。以及逻辑思路的完整性。

二.设计心得

  1. 对面向对象三大技术特性之间关系的理解

封装是一种信息隐蔽技术,它体现于类的说明,是对象的重要特性。封装使数据和加工该数据的方法(函数)封装为一个整体,以实现独立性很强的模块,使得用户只能见到对象的外特性(对象能接受哪些消息,具有哪些处理能力)封装的目的在于把对象的设计者和对象的使用者分开,使用者不必知晓其行为实现的细节,只须用设计者提供的消息来访问该对象

继承性是子类共享其父类数据和方法的机制。它由类的派生功能体现。一个类直接继承其他类的全部描述,同时可修改和扩充。继承具有传递性。继承分为单继承 如果没继承性机制,则类的对象中的数据、方法就会出现大量重复。继承不仅支持系统的可重用性,而且还促进系统的可扩充性。

多态性的实现受到继承性的支持,利用类继承的层次关系,把具有通用功能的协议存放在类层次中尽可能高的地方,而将实现这一功能的不同方法置于较低层次,这样,在这些低层次上生成的对象就能给通用消息以不同的响应。

  1. 面向对象设计的基本原则理解

最简单,最单纯的事情最容易控制,最有效。类的职责简单而且集中,避免相同的职责分散到不同的类之中,避免一个类承担过多的职责 减少类之间的耦合,当需求变化时,只修改一个地方。

  1. OO编程思维的理解

万物皆是对象,将问题分解,每个部分抽象出一个对象。使用对象来解决问题。

  1. 类设计心得

尽量做到单一职责,以及应对变化的能力,即改变类的属性,该类仍可对其做出处理。

三.测试的理解与实践

 1. 测试对于编码质量的重要性

测试在于对程序检测,弥补设计上的疏漏。保证程序的健壮性,以及增强用户体验。

2.假设使用Junit进行程序的测试是否可行

JUnit的官网给出的简介: JUnit is a simple framework to write repeatable tests. It is an instance of the xUnit architecture for unit testing frameworks.每编写完一个函数之后,都应该对这个函数的方方面面进行测试,这样的测试我们称之为单元测试。JUnit通过运行一组测试来自动测试实现是否正确。编写大型程序的重要观点是将问题分解成最小的、正交的单元,这些单元可以组装成更大的模块,形成最终的程序。这种方法的一个好处是,可以对每个单元进行彻底的、独立于其他单元的测试,以便在重写代码和配置模块时快速隔离和纠正错误

即可使用Junit对程序进行测试。

四.课程收获

此阶段较第一阶段,是一次进阶,熟悉了上阶段的语法,对字符串的操作。在练习的过程中熟悉Java的特性,并能够设计一般的类图逻辑。

五.对课程的建议

此阶段初次触及java 较为复杂的问题,所有这阶段作业还是有相当的难度。题量适中。

对于课程讲解的建议:希望老师多带我们分析案列,剖析标准案例,程序的设计思想,类之间的联系,逻辑关系。进一步体会Java有别于C的特点。

猜你喜欢

转载自www.cnblogs.com/wkxjsc/p/12815534.html
今日推荐