(1)前言:
前三次作业共计十八道题目,其中包含的知识点主要有包括:计算方面有单位换算,奇偶判断,浮点数相等判断等,其中的判断三角形类型和房产税计算十分具有代表性。数组方面有数组存储和遍历,查找重复数据等,其中对重复数据的查找与清除的两道题目对代码时间复杂度有一定的要求。面向对象方面有定义类,封装属性和方,关联类等,其中封装学生数据和菜品计算两道都有对其针对性的考察。算法类有如巴比伦法求平方根的公式类,也有如二进制转换,日期计算等由库内自带的函数进行加工处理的算法,通过该类算法能够使得部分工作比如计算两个日期的相差天数或是其他特殊工作方便许多。三次作业中的大部分题目难度较低,求解耗时较少,其余部分题目对知识点的考察鲜明直接,方便我们学习并熟悉基本编程技巧,其中涉及到对对象的封装和关联类的设计的题目,具有一定的挑战性,耗时较长。
(2)设计与分析:
成绩计算类这段代码的时间复杂度大体上是O(n)的时间复杂度,其中n为学生的数量。在程序中,定义了一个Student类来存储每个学生的信息,包括学号、姓名、语文、数学、物理成绩以及总分和平均分。并且在类中定义了计算总分和平均分的方法,通过对象.方法名的方式进行调用。在主函数中,使用Scanner类和BufferedReader类从用户的输入流中读取学生的信息,依次调用Student类的方法计算每个学生的总分和平均分,并打印输出。该题目是第一道关于类与数组的运用题,题目较为简单,适合让我们学习将学生信息封装在Student类中的方法,也 使程序结构更加清晰易懂。
第二道成绩计算类的题目难度略微有所提升,输入数据量有所提升 首先,定义了两个类:Score(成绩)和Student(学生)。Score类用于计算每个科目的得分和平均分,Student类用于存储学生的个人信息和各科目的成绩。程序通过Scanner类从用户输入中获取学生的信息和成绩,并进行相应的计算和存储。
输入阶段:使用while循环实现对学生信息和成绩的输入,循环次数取决于输入的次数。在每次循环中,执行了一些基本的赋值操作,时间复杂度为O(1)。因此,输入阶段的时间复杂度为O(n),其中n为输入的次数。
计算阶段:在每次循环中,调用Score类的方法进行计算,时间复杂度为O(1)。因此,计算阶段的时间复杂度也为O(n)。
输出阶段:使用for循环遍历学生对象数组,并输出结果。循环次数固定为3次,时间复杂度为O(1)。
因此,整个程序的时间复杂度为O(n)。该程序使用了面向对象的设计思想,通过定义类和方法来实现不同的功能,并使用循环结构和数组来处理多个学生的信息。在计算和存储方面较为简单,适合小规模的数据计算和管理。程序的时间复杂度较低,效率较高。
对于菜单计价程序,解题代码的复杂度比较低,大体上是O(n)的时间复杂度,其中n为输入的菜品数量。在程序中,共定义了四个类:Dish、Menu、Record和Order,分别表示菜品、菜单、订单上记录和订单。这些类的属性和方法都比较简单,因此这段代码的整体逻辑清晰,易于理解和调试。在程序的主函数中,使用了Scanner类从用户的输入读取菜品信息,依次调用Order类的getTotalPrice方法结合Dish中存储的菜品价格计算所点菜品的价格最后得到订单总价。通过将不同的功能分别封装在不同的类中,使得程序结构更加清晰,并且易于扩展和维护。
对于课程成绩统计程序,该题解主要包含了Course、Score和Student三个类。通过输入不同的指令来实现对学生成绩的录入和查询。
首先,代码中定义了Course类,其中使用一个成绩对象Score和一个学生数组stu用以存储学生数据,以及一些相关的方法。Score类表示成绩信息,包括平时成绩、期末成绩和总成绩,还有一个计算总成绩的方法。Student类表示学生信息,包括姓名、学号等。Course类中定义了一些方法,用于查找课程、录入学生信息等操作。
代码中的Match方法用于解析输入的字符串,判断其属于哪一类指令(课程输入、考察成绩或考试成绩),并进行相应的处理。通过使用正则表达式进行匹配,提取出关键信息,然后调用Course类的方法进行处理。
在主函数中,通过循环不断读取用户输入,并调用Match方法进行处理。最后输出学生成绩信息。
代码的时间复杂度主要集中在Match方法和主函数中的循环。Match方法中使用了正则表达式进行匹配,在最坏情况下可能需要遍历整个字符串,所以时间复杂度为O(n),其中n为字符串的长度。主函数中的循环会根据输入的指令次数进行迭代,所以循环的次数为O(m),其中m为指令的个数。总体来说,代码的时间复杂度为O(n*m)。
在使用正则表达式时,要注意其匹配规则的准确性和兼容性,以及对不同情况的处理。此外,在处理数据时要考虑到各种异常情况,比如输入格式错误等,进行相应的处理和提示。在对题解的编写中,我对数据的分辨排序以及各类非法输入的判别实在束手无策,最后完成了数据的输入以及存储,而难以写出如何判断输出的方法。
(3)踩坑心得:在解题过程中应该注意题目细节,不要因为没看到题目要求而增加无故的工作量甚至白忙活一场。
而在对较难题目的代码编写过程中则是时常出编译错误:
Exception in thread "main"java.lang.IndexOutOfBoundsException: No group 1 at
java.base/java.util.regex.Matcher.group(Matcher.java:646) at Main.Match(Main.java:159) at Main.main(Main.java:225),是在使用 matcher.group(1) 时没有匹配到任何内容导致无法获取第一个捕获组。这是因为我输入的字符串匹配的是整个符合标准的字符串,如果要从中录入数据的话需要对各个数据新建相应的正则表达式以完全录入所需数据。
Exception in thread "main" java.lang.NullPointerException: Cannot load from object array because "cou.stu" is null at Main.Match(Main.java:178) at Main.main(Main.java:278):在main函数中对类的声明后没有初始化便开始调用,使得指针尝试将值存储到一个空对象数组时出错,为了避免此类情况的发生,对于对象类数组的调用一定要先确保其已经被正确初始化并分配了足够的空间。
(4)主要困难以及改进建议:对于类的创建以及调用需要时间摸索熟悉,对输入数据的处理与判别尤其需要细心并且细致讨论各类情况,防止非法输入导致程序无法正常运行。
(5)总结:关于此次解题经验,我总结了部分要点:
1.明确题目要求与意义:根据题目说明和所提供的示例输入输出等辅助信息理解题目要求与目的。
2.理清思路再写题目:在理解了题意后,先理清题目的解题思路,避免在编写过程中出现混乱或错误,使得写好的代码要推倒重做。
3.考虑边界条件和异常情况:在编写题目时要考虑到各种可能的输入情况,包括边界值和异常情况,以保证代码的稳定性。
4.不断学习更新知识:题目的编写过程也是对自己知识的回顾和巩固,通过编写题目可以不断学习并更新自己的知识体系,只有这样才能适应多变的题型。
总的来说,这次写题目对我来说是一次很有收获的经历。通过这次写题目,我锻炼了自己的问题设计和解决能力,并提高了对编程知识的理解和应用能力。希望在以后的学习和实践中能够继续加油,不断提升自己的技术水平。
标签:题目,复杂度,学生,blog,java,成绩,输入 From: https://www.cnblogs.com/21207312blog/p/17747665.html