总结Blog
前言
在这次的Java大作业学习中,通过三次不同难度的作业题目集,我不仅加深了对Java编程的理解,还掌握了面向对象设计、电路模拟以及复杂问题解决等多方面的技能。这些题目集的设计从简单到复杂,使我对面向对象有了更加深入的理解。
知识点概览
三次作业主要涉及以下知识点:
Java基础语法:掌握变量声明、数据类型、运算符、控制结构等基础概念。
集合框架应用:熟练使用ArrayList、HashMap、LinkedList等集合类进行数据管理。
面向对象编程(OOP):深入理解类和对象、继承、多态、封装等OOP核心概念。
正则表达式:学习正则表达式的构建和应用,进行高效的字符串匹配和处理。
电路模拟:模拟智能家居中的开关、调速器、灯具和风扇等电路元件的行为。
设计模式:探讨并应用设计模式,优化代码结构,提高代码的可读性和可维护性。
题量与难度
三次作业的题量和难度呈递增趋势,简单到复杂,每个作业都设计有独特的挑战和学习点。
设计与分析
题目集1:答题判题程序
题目集1要求设计一个答题程序,模拟小型测试的全过程,包括题目信息、试卷信息、学生信息以及答卷信息的输入和处理。
源码分析:
我创建了一个HashMap来存储题目和学生信息,便于快速检索。
LinkedList用于维护学生答卷,保持了答题的顺序性。
实现了一套完整的异常检测和处理机制,确保了程序的健壮性。
心得体会:
总体来说,这次的判题程序比上一代没有多大变化,只是多了多选和单选题,以及输入的逻辑,但让我对继承与多态有了初步的认识,java的特性已经初露锋芒,让我对此赞叹不已
题目集2:家居强电电路模拟程序-1
题目集2要求开发一个智能家居强电电路模拟系统,模拟开关、调速器、灯具和风扇等设备的行为。
源码分析:
定义了多个类,如Switch、Governor、Appliance等,来表示不同的电路元件。
运用了面向对象的设计原则,构建了模块化的电路模拟系统。
程序能够根据输入的连接信息和控制命令,动态模拟电路的实时状态。
心得体会:
第一次看到题目的时候,着实吓了一跳,不能说是毫无头绪,只能说是,毫无头绪
第一代的设计还算简单,但考虑到迭代难度不小,这里必须吐槽一下,第一代给予的信息实在太少,导致我对后面迭代的设计毫无头绪,希望以后在第一代迭代中就能较为清晰地描述题目,以便让我在第一代就能设计出较为完善的框架分别后续迭代代码的增加,而不是删除又修改。
在这次设计中,在储存电路元件这方面,我用了两个地方来储存,一个是hashmap,一个是电路,电路中的电子元件用来工作运行,hashmap则是分别输出。
在输出这方面,由于要按照开关,调速器等等的顺序来输出,我用for循环来输出,六个元件用了六个for循环,这种做法非常愚蠢,在下次迭代中已改进。
在运行遍历电路这方面,虽然本次迭代只有一个电子元件且只有串联,但考虑到后面的迭代,我完善了整个电路体系,也就是说,在这次设计中我完成了串联中有并联,并联里面的串联还有并联的无限嵌套的情况。
该遍历包括判断是否短路、短路、计算电阻、电压
具体实现是通过串联类中调用并联类的方法,在并联类中调用串联类的方法,双方互相无限调用从而达到深层遍历的效果。在本次大作业设计中我最满意的就是这点,为后续的迭代剩下了非常多的功夫。这让我体会到了基础框架设计好了是真的很爽(使得我第二次大作业只用了很少的时间就完成了编码)
题目集3:家居强电电路模拟程序-2
题目集3在上一题的基础上增加了新的功能,如并联电路模拟和电阻计算。
源码分析:
扩展了之前的类结构,增加了ParallelCircuits类来处理并联电路。
为每个电路元件增加了电阻属性,并在模拟中考虑了电阻对电流和电压的影响。
程序现在能够处理更复杂的电路结构,包括串联和并联的组合。
心得体会:
学习了电路基础知识,如电阻、电流和电压的关系。
掌握了如何处理更复杂的程序设计问题,并在设计中考虑了更多的实际因素。
采坑心得
在开发过程中,我遇到并克服了一系列挑战:
需求分析:在第二次作业中,由于对题目要求理解不够准确,导致初期实现的功能未能满足测试点要求。我意识到需求分析的重要性,并学会了如何准确理解题目需求。
面向对象设计:在设计电路模拟系统时,我学会了如何将现实世界的物理概念抽象为程序中的类和对象,并应用设计模式来优化代码结构。
正则表达式应用:在处理输入信息的格式验证时,学会了使用正则表达式进行高效的字符串匹配和处理。同时意识到了正则表达式的强大功能,在最近几次实践中不断提升使用正则表达式的技巧,对正则表达式的运用越来越熟练了。
幸于第一次迭代设计足够完善,在第二次编码中并没有花很多设计,基本的框架和第一次一样不需要修改,只是修改了输入和输出。在输入中我设计了一个正则表达式用来匹配并获取所有线路,让我再次感慨正则表达式的强大。
在在此的输出中我大有改进,删去了上次迭代中用一堆for循环输出的方法,改为每一个电子元件设计了一个getOrder的方法用来返回每个电子元件各自输出的顺序。
这次的排序使用的是Collections自带的排序,重写了compare to方法使得电子元件先根据输出顺序进行排序,再根据num编号进行排序,使的只需要用一个for循环输出这个有序容器一次即可完成所有电子元件的输出。
在本次大作业中,令我感触最深以及花时间最多的是精度问题,在第一次提交时就已经通过了几乎所有测试点,除了其中的某两个,思考了很久才知道是精度问题。通过该问题让我意识到,浮点数的运算中精度问题是绝不可忽视的。
在本次设计中,在基本框架以及类的设计等等方面并没有改变与体会,但在一些其他方面略有体会。首先是集合,对集合的使用更加熟练,对其底层的原理也有了更深的体会,在本次程序中我使用了大量增强for对迭代器有了初步的认识与理解,同时通过重写compare to,
我对接口有了更深的认识。
改进建议
针对现有程序,以下是一些建议:
- 在输入这方面,略显冗杂,可维护较低,每次迭代的需要去修改,改进的建议是完善对输入类的设计,以及对多种情况的考虑,同时,输入现在题目还没有对输入错误情况的处理,但以防万一以及使代码更加健壮,可以考虑可能的错误输入情况并对之进行处理。
- 精度问题,虽然测试点已经通过,但程序中仍然存在不少潜在未被测试点揪出的精度问题,之后的代码中我会逐步解决完善这些问题。
总结
通过这三次PTA作业,我对类的设计,数据的封装,单一职责原则,以及正则表达式有了更深一步的理解,同时在正则表达式的设计方面需要进一步学习,正则表达式的强大是毋庸置疑的。同时我认识到了一个完善的框架是非常重要的,框架就像是人的骨架,框架怎么样也基本上决定了程序是什么样的,一个好的框架能能使你的编码更加流畅简单同时利于后续的修改和增加。