BLOG总结
前言:
在过去的三个星期里,我接触了许多新的知识和技能。从编程思想到软件包的使用,涉及了诸如set、map、stream、DoubleLinkedList、lambda表达式、正则表达式等内容,这些是我之前接触较少但非常精密的知识。同时,我还学习了银行类的设计、农夫过河实验以及期中考试(主要考察继承、多态和容器类的使用),并对之前学到的技能进行了复习。
在这几周的学习中,我发现迭代和自学是学习过程中的主题。迭代体现在每次PTA实验中,从点线的设计到三角形、凹四边形,甚至是农夫过河实验中的船类、分类、兔子类和萝卜类等方面。通过逐步优化设计,我意识到之前设计中的不足之处,并进行了修正。然而,我也意识到粗糙的设计可能会导致重复,甚至在编码过程中出现一些意想不到的问题。因此,在未来的实验中,我将更加注重细分和优化设计。这些都是迭代思想带来的收获。
另一方面,自学体现在课堂上的变化。逐渐减少的课时使得我们不得不更多地依靠自己,从数据结构类到优化代码的方法,我都需要自主学习。在上一次的实验报告中,我更多地体现了思考的过程,而在编码过程中,我也意识到了一些问题。这让我明白了迭代过程中的价值,也更加坚定了我对于细致思考和自学的重视。
题目总结:
期中考试题目一
第一题要求设计表示平面直角坐标系上的点(Point)和线(Line)的类。考察基础的语法,要求输出结果保留两位小数,并使用`String.format("%.2f", data)`。相关属性要用private,除了行为之外不使用public以保证代码耦合度低。
期中考试第二题
第二题是对第一题的迭代,要求增加一个类Plane,并定义一个共同父类Element(抽象类),其中包含display()抽象方法。子类需完善继承来的方法,通过Main里的子类对象赋值给父类对象进行调用。
期中考试第三题
第三题在第二题基础上继续迭代,要求增加一个GeometryObject容器类,其属性为ArrayList类型的对象,并要求添加add()和remove(int index)方法。要求在main里根据要求判定添加、删除或退出,并注意范围判定和泛型内容。
链表设计
设计单向链表和双向链表,使用接口和泛型实现,通过Java类存储数据模拟结构体。在实现过程中,单向链表的删除需要指向被删除节点的前一个节点,而双向链表可以直接删除等等。
图形类设计
设计一个程序,通过用户输入选项和数据进行与四边形有关的计算。判断是否是四边形、平行四边形、菱形、矩形、正方形,判断是凹四边形还是凸四边形,输出交点数量和五个点坐标,并判定第一个点是否在后四个点所构成的凸四边形或三角形内部。
农夫过河
涉及着农夫过河的大实验,需要对对象进行过河、死亡、吃等操作,并考虑如何优化代码,引入多继承的思路,并分析多个类的关系。
ATM机类设计
设计一个ATM机类,实现对每个类有清晰明确的认知,尽可能降低耦合度,并对check、帐户匹配等功能进行判定。
第三题要求在第二题的基础上进行迭代,添加一个GeometryObject容器类。该容器类具有一个属性,类型为ArrayList(如果不了解泛型,可以不使用)。容器类还要实现add()方法和remove(int index)方法。add()方法用于向容器中添加对象,remove(int index)方法用于删除容器中指定位置的对象(注意,ArrayList的索引从0开始)。这里使用了Java自带的ArrayList来实现容器功能。需要注意的是,添加到容器中的对象的类型应该是Element类的子类,与第二题中的Point、Line、Plane类保持一致。除此之外,对于main方法也进行了一些改良。根据要求判断是添加、删除还是退出操作,可以使用switch语句来实现。在编写代码时,需要注意审题,题目中已经给出了switch语句的框架。GeometryObject容器类中使用了一点泛型的内容,但实际上并没有充分利用它。我们只需要将子类对象添加到ArrayList中,或者从ArrayList中删除对象。在输出时也没有那么复杂,可以直接使用foreach循环遍历ArrayList来输出对象。在考试时可能会忘记这种操作方式,所以在容器类中可以添加一个方法来返回容器中的值,然后在main方法中直接使用foreach循环来遍历ArrayList并调用display()方法。
农夫过河的大实验已经在前言中进行了一定的讲解,主要思路不再赘述。我将重点讲一下不足之处以及待优化的点。为了分析这些问题,首先需要对整个实验中使用的方法进行总结。整个实验可以分为三个大块:一是每个对象都具有的过河和死亡这些共同的方法,二是部分对象具有的吃的行为,以及农夫位置所带来的保护机制。目前的实现方式是一个大的农夫类,下面有很多子类,但并没有建立食谱,而是直接在主方法中进行硬性判断。毫无疑问,这种方式是不科学的,我并不打算详细讨论其弊端,而是提出优化的思路。我考虑到了多继承的概念,与Python和C++支持多继承不同,Java可能需要多个接口或者内部类。经过仔细思考,我将这个问题分成了两块。以狼为例,狼的父类从"Father"变成"肉食类",肉食类中包含了一些关于死亡、过河和吃的方法。以菜为例,它只需要死亡和过河的方法。我将对象分为"肉食类"和"菜食类"这两个大的父类下面的子类,然后再加一个父类,包含死亡和过河的方法以及相应的属性,这样可以有效地解决问题。考虑到我们当前的代码并没有使用接口,这种方式也比使用接口更方便进行修改。
设计ATM机类时,需要对每个业务操作进行逐行输入,直到输入字符“#”为止。代码示例如下:
while (!s.equals("#")) {
String[] information = s.split("\\s+");
Information.Wrongformat(information);
s=in.nextLine();
}
对于这道ATM机设计题目,难度较大,要求对每个类有清晰明确的认知,尽可能降低耦合度,实现功能区分。在对数据进行判定时,主要难点在于如何检查账户,匹配用户名和账户名。在编写代码时,需要对整个题目有整体概念,明确构成整个题目的关键点和类,梳理每个类拥有的属性,理解每个属性的意义和作用,以及哪些功能由哪些类实现。
在对结果进行输出时,需要分开讨论两种输入情况。设计`Account`类时,需要注意类与`Bank`的关系,合理调用并区分类的功能。考虑清楚一对多和多对一的关系,以及在输入数据时的存储分配和搜索过程。对不符合题目要求的数据进行检查,输出相应错误信息并结束程序,进行下一次输入。对于修改账户余额,也应该有一个独立的类来实现该功能。
改进建议:
在设计时,应该避免盲目行动,而是要先考虑适用于特定题目的算法类型。对于复杂的问题,有利于先绘制类图,比如对于ATM机类的设计,需要理解各个类中方法的作用,如"changemoney"和"present"功能类。此外,通过农夫过河的实验,我意识到了继承与组合的区别以及程序设计中代码复用的重要性。合理的继承和复用对代码优化至关重要。另外,在Java语言中,多态的基本概念、使用方法、上转型和下转型,以及对刚接触的知识如set、map、stream、DoubleLinkedList、lambda表达式和正则表达式等需要加以巩固。
总结:
总结来说,经过近几周的学习,我开始逐渐理解面向对象的真正含义,并学会了有效率地优化算法和处理耦合等问题。这是一个漫长的过程,很多习惯都是日积月累形成的,推导、重复、再推导、再重复。以我现在的水平,要完成更高水准的任务仍然很困难,这也对自己平时的学习提出了更高的要求。随着课程的深入,题目肯定会变得越来越难,因此如何保持进度,学好这门学科成为当前的重大任务。踏实学习,展望未来,不只是空洞的口号,加油,好好学习。
在这次的学习中,已经过了一半的课程时间,同样收获颇丰。在前言中提到,这几周的学习贯穿的关键词是迭代和自学。一系列的实际题目验证了这一点。Java中存在许多便利的类和有用的功能,比如正则表达式、lambda表达式等。不能再用C语言的思维方式学习Java。这几周的学习不会因为一篇blog而停止,而我也意识到这篇blog还存在不足之处。在上一次blog中提到踏实学习、展望未来,在这次中同样如此。如果有任何地方存在假大空或者做得不足的地方,还请同学们指出。我的联系方式是QQ:1102981285。这次的blog中有一些题目没有源码,其他的我都贴了,希望下一次能够做得更好。结束。