第五、六、七次大作业分析

发布时间 2023-06-23 13:05:07作者: 萝小腐

一、目录

   前言

   设计与分析

   心得

   主要困难以及改进建议

   总结

1.前言:

       这三次大作业用到的知识点主要是对HashMap的用法,掌握HashMap的用法,能够让你很容易做出题目,另外,同前面几次作业一样,正则表达式的运用必不可少,这两个知识点是这几次作业的主要知识点,掌握其中的用法和方法,可以让你简化代码量,类的设计也要明确,分工要明确,还有就是会运用ArrayList数组,对于这三次作业有很大帮助,写代码时确保思路清晰,才能让代码更加流畅运行,不至于频频出错,同时也可以很快找出代码的问题所在。使用HashMap有许多好处,比如判断是否重复输入,用到containsKey这个方法体,极大的简化了我们的代码量,不用再像从前那样用for循环去遍历了。此外,这几道题目还有一个难点,那就是在输出信息时要用到中英文排序,这我也是在网上扒了一段代码过来,才能够排序输出,自己勉强能看懂一些,但却是写不来,对于自己所写的代码,自己感觉在思路上算不得清晰,有点模糊的感觉,感觉自己就是被测试点牵着鼻子走,这样的话就容易扰乱你的思路。刚开始是不知道如何对成绩系统来写代码的,但写着写着,想着想着,发现这次大作业和前面写过的菜单计价程序有得一比,简直是换汤不换药,因此,可以根据参考菜单计价程序来写这个代码,会使你的思路突然打开。这三次大作业的代码量不算很多,至多不超过240行,不过其中还是对面对对象还是用得少了。写代码前进行类设计分析,可以更好的写代码,明确写代码的思路。

2.设计与分析

        第六次大作业分析:第六次大作业,也是新作业的开始 ,在题目发布之前,老师就带着我们对这个作业进行了一次分析,并且让我们对该题目进行了一次类的设计,而后更带着我们进行了一次类设计划分析,这样一来,听了老师的讲解后,对题目也有了一定的思路,然后做起题目来也更加顺手,对题目有了一个更加深刻的理解。在对题目进行了一次细致思考后,然后开始写代码,但是中途并不顺利,卡点了。在判断输出的时候有种按照测试点来过的,因此在写代码时也写出了一些不良的代码,但却是能过测试点的。这个题目的代码量也不是很多,跟刚开始接受的菜单计价程序的代码差不多,但有了老师的提醒:使用HashMap、ArrayList等知识点,确实能够很好的解决实际问题,同时也减轻了我们思维的负担,在题目中老师也给出了相应的类图设计,然后靠我们自己,一步步还原出代码,以下是这段代码在SourceMonitor上分析出来的数据。

对于所写的代码 ,复杂度不是很高,不过我觉得我这个代码还可以再精简一些。对于所写代码,对代码所出现的一些缺点,以下是我进行的分析:

1. 变量名和类名命名不统一,有些变量或类名不够直观,不易理解。

2. 对于可能出现多次的数据结构,如Student、CourseChild等,使用了数组,没有使用集合等更为灵活的数据结构,有可能导致空间的浪费和效率的降低。

3. 在课程信息和学生信息中,使用了字符串数组进行处理,可读性不高,有些参数需要多次判断才能得到正确的结果。

4. 输出时,使用了System.out.println较多,可以考虑封装一个输出函数,提高程序的可维护性。

对于以上四点,我觉得应该改进一下,使代码精简,更具可读性。

         第七次大作业分析:第七次大作业在原来的基础之上添加了一个实验课,且计算成绩的方法较以前来说也不一样,输入该课程4-9个成绩,然后计算平均分,这样就需要对正则表达式进行一次修改,对于原先的代码,我是先计算出实验课的平均分,然后纳入考察课程里面进行成绩计算,这个方法有点简单粗暴,但我所改动的代码量不多,也是耗时不久就将它做出来了,比较容易,但我仍然觉得需要再创建一个计算实验成绩的计算方法,这样对于Java面对对象的思想就更能表现出来,而我写的代码,则更像是面对过程来写的,这是这个代码存在缺陷最大的地方,有待改善。在原先基础的代码上,可以多设计一个类,来计算实验课成绩。

       第八次大作业分析:第八次作业在原来题目的基础上改动很大,考试成绩不是固定的平时成绩占比0.3,考试成绩0.7,而是不固定的,实验课成绩也一样,输入每个实验成绩的占比,然后进行计算。对我来说,一开始是不知道从何处入手的,但思考久了,总会找到方法的。首先,通过题目就是要一个一个测试点的过,然后等你全部通过时,分数也会随之上涨,思路也会逐渐清晰。接下来是我用SourceMonitor上分析出来的数据,如下图:

 这次较第六次的作业而言,复杂度是增高了许多。这个代码改了很久,一开始理解题目的意思有误,导致许多测试点通过不了,但当改正过后,是对了不少测试点的,但有一个测试点迟迟过不去

 就是case14,这样的测试点我是迟迟没有想出来,虽然想到了各种测试点,但自己放上去一测,自己根据题目的意思判断还是没有错误的,别人能够一下子通过这个测试点,大概很大一部分原因是他的算法精良,类设计的好,反观对于我所设计的一个类中,有一些属性的初始值是没有设计好的,甚至出现了-1这个数字,我觉得就应该好好改一下。类设计不好,导致这个测试点不过,以下是我设计的几个类。

class Student{
    String Id;//学生学号
    String name;//学生姓名
    int score=-1;
}
class Class{
    String classNum;//班级号
    ArrayList<Student> student=new ArrayList<>();//学生列表
    public int all(){
        int Allscores=0;
        int j=0;
        for(Student s:student){
            if(s.score!=-1){
                Allscores=Allscores+s.score;
                  j++;
            }
        }
        if(j!=0)
        return (int)(Allscores/ j);
        else return -1;
    }
}

从Student类中,我让学生跟成绩关联成绩信息,由于一开始的时候认为学生成绩信息如果没有,即成绩为0时,即输出一系列的错误信息,后来才知道是我想错了,于是对判断条件进行了修改,代码已经写了这么多,只好从类中进行修改,于是才出现了-1。所以有时候要等思路清晰了在下手也不迟,再者,在Class类中也使用了-1,目的就是防止student.size为0,不然到时候就会出现非0返回之类的错误。不过这段代码还是有优点可循的,比如:这段代码的主要特点是采用了HashMap集合存储数据,方便查询和处理,并使用了多个类进行封装和组织。同时,还使用了正则表达式进行格式和合法性检查,提高了程序的健壮性。这段代码有有优点有缺点,总之,还是可以被修改得更好。

心得:

         1.学到了如何用HashMap存储对象信息,如何用ArrayList存储成绩权重和成绩,以及如何判断输入信息格式是否正确。同时,还学习到了如何进行中文字符串排序以及如何自定义比较器实现对象排序。在阅读代码的过程中,还可以明确每个类的作用和关系,进一步加深对面向对象的理解。

         2.总的来说,这段代码还是比较难理解的,需要对面向对象、集合等知识有一定的理解才能看懂。需要不断地练习与实践才能更好地掌握这些知识。可以多加深入的学习HashMap的使用和一些方法体,在网上学习一定的相关知识后,即使找到对应的题目进行练习,巩固自己的记忆。

      主要困难与改进建议

主要困难:

1.相较于之前的作业来说,可以说这三次作业是比之前要简单的,就是相对于个人而言,在理解题目意思上有一些困难。

2.对于许多知识点不能够熟练的运用是这几次大作业所需要的知识点,还有就是在设计类的时候会不免用到-1,我觉得这个需要改进

改进建议:

1.在老师带领我们对题目有一遍理解和对题目所要类的设计与分析,题目的难度大大减少,并且向我们说了要用到的知识点,我感觉这样挺好的。

2.可以在题目开始前向学生发放即将要做的题目,好让学生有足够的时间去想,这样上手就容易多了。

3.可以在题目开始之前,简单介绍一下使用那些新的知识点可以简单处理该题目,可以减轻负担。

    总结:

     对于这几次大作业来,我有点过于追求简洁,希望代码的行数越少越好,却不知道这样让我在后面做题的过程中,对于有些自己写的代码有些记不得,甚至还有些看不懂,有时同学问我怎么这段代码你是怎么想的,思路是什么,我也不能很好的解释清楚,到了后来,我自己觉得自己的代码写得很烂,完全没有一点思路清晰的样子,这也是我今后写代码时应该注意的,代码不要怕多,让人看得懂才最重要,同时,自己也要学会解释自己的代码,让别人能够听懂,知道你的思路。此外,能够在做题目时运用自己的现学的知识点也是十分必要的,现学现用,会巩固你对知识点的理解,在做题时能够发现自己运用这个知识点是否恰当,也是一种进步的表现。