前言:
在我学习的过程中,发现每个题目集的难度都逐渐升级。题目集1是为了帮助我们熟悉Java的基本语法和概念,所以题目相对简单,但题目数量较多。我花了一天的时间来完成这个题目集,从中掌握了一些基本的编码技巧和语法规则。
随后,我开始解决题目集2,这是一个更具挑战性的阶段。题目集2要求我们在类中创建方法来解决问题,这涉及到更复杂的逻辑和编码思维。对于刚刚入门的我来说,需要花费几天的时间来充分理解和掌握这些概念,并将它们应用到实际问题中。
到了题目集3,我遇到了更大的挑战。这个题目集涉及到继承的概念,这是我之前没有接触过的内容。为了完成这个题目集,我需要额外自学继承的知识,并学会如何将它应用到题目中。这部分知识对我来说是全新的,因此花费了很多时间和精力来学习和理解。
尽管这个学习过程非常艰辛,但通过解决这些题目集,我逐渐提高了自己的编程能力,从简单的语法到复杂的逻辑,从简单的类到继承的应用。每一个题目都是一次难度不小的挑战,但它们也是我成长过程中的重要里程碑。
通过这个经历,我学到了很多关于Java编程的知识和技巧,也提升了自己的解决问题的能力。我相信,通过不断努力和实践,我会越来越熟练,能够应对更复杂的编程任务。
设计与分析:
关于圈复杂度:
上课的时候老师讲到关于圈复杂度的问题,圈复杂度在1-10的代码状况是清晰且具有结构化的。我们需要把圈复杂度尽量的降到最低,使我们的代码更清晰,易维护。
题目集1的7-8:判断三角形类型
圈复杂度如下:
题目本身并不难,但是需要多次循环输入数据并判断符不符合规则,所以我多次运用了for循环语句和switch语句,但是却导致圈复杂度高于10。使得流程比较简单但是圈复杂度过于高,两次的for循环让我难以达到一个较低的圈复杂度,for循环的叠加圈复杂度是成倍数增长的,所以在以后的代码中尽量是不能出现for循环的叠加。
题目集2的7-1:成绩计算-1-类、数组的基本运用
类图如下:
在学生类中,我使用了私有属性和公有方法的封装方式,这是面向对象的编程实践。私有属性可以通过公有方法(如getStudentID()和getName())来获取,这样可以保护属性的安全性。在计算平均分的方法中,我使用了类型转换将总分转换为浮点数进行计算。这是为了确保平均分能够被精确计算出来。在主程序中,我使用了一个循环来读取每个学生的信息并创建学生对象。这种方式利用了循环和数组来处理重复的任务。在输出学生信息的循环中,使用了格式化输出来保证输出的数据格式。让输出更加整齐并且符合题设要求的格式要求。总体来说,这道题比较简单,让我理解了在面向对象的设计上运用封装。值得注意的是,在程序末尾关闭了Scanner对象,可以释放资源。
题目集2的7-2:成绩计算-2-关联类
类图如下:
成绩类(Score):属性:平时成绩(dailyScore)和期末成绩(finalScore)。方法:计算总成绩(calculateTotalScore),根据计算规则(平时成绩0.4+期末成绩0.6)返回总成绩的整数部分。
学生类(Student):属性:学号(studentId)、姓名(name)、语文成绩(chineseScore)、数学成绩(mathScore)和物理成绩(physicsScore)。方法:添加语文成绩(addChineseScore)、添加数学成绩(addMathScore)、添加物理成绩(addPhysicsScore)、计算总分(calculateTotalScore)、计算平时成绩平均分(calculateDailyScoreAverage)、计算期末成绩平均分(calculateFinalScoreAverage)。上述方法中,计算总分方法会遍历所有科目的成绩,并调用成绩类的计算总成绩方法,将各科目的总成绩相加得到最终总分。计算平时成绩平均分和期末成绩平均分的方法会遍历每个科目的成绩,并将对应的平时成绩或期末成绩累加,最后除以科目数量得到平均分。
主函数(Main):使用Scanner类获取用户输入的学生信息,并根据输入创建学生对象。循环3次,每次循环创建一个学生对象。对于每个学生对象,根据输入的成绩信息使用学生类的相应方法添加成绩。调用学生类的计算总分、计算平时成绩平均分和期末成绩平均分的方法,得到相应的结果。使用printf方法按指定格式输出学生的学号、姓名、总分、平时成绩平均分、期末成绩平均分和总分平均分。
学会了如何创建类和使用类的属性和方法。成绩类和学生类的设计让我更好地理解了面向对象的思想,将相关的数据和方法封装在类中,使代码更加模块化和可重用。我还学会了使用Scanner类获取用户输入,并且对输入的数据进行处理和计算。实验过程中,我注意到代码中使用了一些条件判断和循环来处理多个学生的信息,这增加了代码的灵活性和扩展性。
题目集2的7-7:菜单计价程序-1
类图如下:
这个代码实现了一个菜单点餐系统,有一定难度。通过菜品类、菜谱类、点菜记录类和订单类,实现了菜品的信息管理、菜谱的查找、点菜记录的添加和订单的计价功能。在这个实现过程中,我学习到了如何使用类和对象来组织和管理代码。通过定义不同的类,将相关的属性和方法封装在一起,提高了代码的可读性和可维护性。菜谱类中的searchDish方法使用了遍历数组的方式来查找菜品,这展示了如何在数组中查找特定元素的常见技巧。订单类中的addARecord方法使用了循环和条件判断来找到合适的位置插入菜品记录,这展示了如何在数组中添加元素的方法。此外,通过使用Scanner类获取用户输入,我学会了如何与用户进行交互,并根据用户的输入作出相应的处理。这在实际编程中是非常常见和重要的。通过完成这个代码,我进一步理解了面向对象编程的思想和方法。将不同的功能封装成类,使得程序结构更清晰,代码逻辑更清晰。同时,这个代码也展示了如何使用基本的Java语法,如类的定义、构造函数、方法的定义与调用、数组的使用、循环和条件判断等。总的来说,这个代码实现了一个简单的菜单点餐系统,通过不同的类和对象之间的交互,完成了菜品信息的管理、菜谱的查找、点菜记录的添加和订单的计价等功能。这个代码可以作为基础的示例,帮助理解和学习面向对象编程的思想和Java语言的基本用法。
题目集3的7-2:课程成绩统计程序-1
类图如下:
Course类有三个属性:name(课程名),nature(性质),assessment(考核方式)。它还有一个构造函数用于初始化这些属性。Student类有五个属性:id(学生ID),name(学生姓名),rGrade(平时成绩),fGrade(期末成绩)和Grade(总成绩)。它包含了一些getter和setter方法来获取和设置这些属性的值。它也有一个构造函数用于初始化学生的ID和姓名,以及将平时成绩和期末成绩设为0。Main类是程序的入口点,包含了主方法main。它使用Scanner类从控制台读取输入。程序将输入的内容分为课程和学生两种情况进行处理。对于课程信息,程序将课程名、性质和考核方式作为参数创建Course对象,并将其添加到courses列表中。对于学生信息,程序将学生ID、姓名、课程名、平时成绩作为参数创建Student对象,并将其添加到students列表中。如果输入中还包含期末成绩,则将期末成绩设置给学生对象,并计算出总成绩。在程序的最后,根据输入的不同情况输出相应的结果。如果没有学生信息,将显示每个课程还没有成绩的提示。如果只有一个学生和一个课程,并且考核方式为"考试",则根据学生的成绩情况输出相应的信息。calculateTotalGrade方法用于计算总成绩,根据平时成绩和期末成绩的权重进行加权平均。
踩坑心得:
1)在前两个题目集中,题目的难度都不大。提交时要注意的是格式问题,我就因为是格式不对输出的语句少了一个点,导致有几个点答案错误,一开始以为是自己的逻辑问题,然后调试了很久发现还是答案错误。最后发现是因为输出语句漏了一个点,这种低级的错误不仅浪费精力和时间,而且还很搞心态。所以以后遇见多个答案错误可以先看看是不是输出的格式错误,再来排查是不是逻辑错误。
2)对于一些特殊的测试点,比如题集2中的某年某天,自己在调试的时候一定要多调试几遍,并且测试所有可能想到的点,确保自己的程序不会在一些特殊的测试点卡住,最后也可以根据一些测试点提示来判断。
3)题目集三对于我来说太难了,而且放假期间没有足够重视,导致后续都没有很多时间去完成,最后过的测试点也很少,下一次不能拖延。
改进建议:
在题目集1和2中,题目的难度并不大,但是我在做题的时候只顾着去实现功能。没有在代码的圈复杂度上下功夫。导致反而越是简单的题目代码的圈复杂度越高,在之后的题集中不仅是要完成功能的实现,更重要的是要在设计和圈复杂度上下足功夫。
在题集3中,遇见难度较高的题目时,不要着急去写代码,要先把题目思路给捋清楚。先设计好类和方法,最后再来写代码。切记不能暴力写题,写题之前的思考很重要!
在优化上下功夫,不能只是把功能实现,在完成功能后要对代码进行迭代优化。
要学会熟练的运用编译软件去调试程序,找出自己的逻辑错误。
学会用Debug调试程序,根据变量框的数值变化找出逻辑错误。
提高代码效率,写注释!!
总结:
对于本阶段三次题目集,难度系数呈指数增长。特别是最后一次题目集,对我们来说是一个很大的挑战。但是经过这一个月的学习,自己把所有的题集都攻克,是有很大的成就感的。对于每一次的题集,都会运用到老师上课时讲到的方法。题集一目的是为了让我们更加熟悉Java的语法,题集二中运用到了类中的方法,相当于c语言中的函数。题集三主要是类的设计,也是最难的题集。其实学习Java更重要的是学会面向对象的思维,这和c语言的学习有很大的不同。我们所学的不仅仅是编程语言,而是面向对象的思维模式。学习Java的模式和c语言很不一样,所以不能拿学习c语言那一套来学习Java。Java这门课是有难度的,所以在以后的学习中还需加倍努力。
要铭记在写代码的过程中要遵循的两大原则:
单一职责原则 :
1.就一个类而言,应该仅有一个引起它变化的原因 ,计算出来的不能是属性。
2.一个类尽量不和其他类产生关系,一个方法只干一件事。
面向对象原则:
1 单一职责原则:每个类/方法围绕一个主题
2 迪米特法则:不要和陌生人说话
在这一阶段的学习中,我对Java这门编程语言的理解更深了。Java这门语言给我们带来了很多c语言中不能实现的东西,而且面向对象的思维模式也给我带来很多不一样的地方。我还有许多地方有待进步,比如类的设计,也需要抓紧时间学习。
标签:题目,代码,BLOG,平时成绩,成绩,方法,复杂度 From: https://www.cnblogs.com/YiKe-QUAN/p/17747661.html