第三次博客作业

前言:

第六次大作业:

本次大作业只有一题的题目量,本次大作业由于前面的菜单迭代系列已经基本完成,本次开始新的系列,课程统计程序系列,本次题目比较简单,主要原因是老师已经在课上对基本的逻辑以及一些设计的思路和结构已经非常的详细。有了这一个清晰的大框架之后,设计代码还是比较容易的,只需要添加一些基本的属性和方法即可。但是本次大作业还是有一个比较繁琐的点,那就是排序问题了,有对不同的东西排序,数字之间,字母之间,中英文混合之间的排序,需要用到一些不同的方法。之间没有使用过hashmap,需要理清楚key,value,这些之间的一些关系。明白hashmap的一些用法。最让我觉得比较妙的一点是,当如果一个东西是多对多的话,不管是聚集还是组合,还是啥都不太好,因此可以直接创建一个类,让这两个东西充当它们的属性,进行一对一处理。

第七次大作业:

本次大作业有四题的题目量,但是其他几个我认为都是帮助你更好的写好大作业,比如:hashmap的使用以及多态的灵活运用,这些都是对那个课程成绩的分析有着更好的帮助。本次成绩分析是在第一次大作业的课程成绩分析上进行的迭代,相比较与上次,本次课程性质增加了实验课,因此考核方式也增加了实验。实验课的性质与其他两门课程不一样,要处理的东西也会稍微比较多。正则的表达式也就需要再次学习加深,怎么做到成绩数量的0次或者无数次,并且需要考虑到中间的空格作用用来匹配输入的格式要求。其他的东西基本上与第一次基本相同,因此修改起来结构并不是很困难,最令我烦恼的是题目里并没有很清楚的讲到什么时候该存入学生的信息,什么时候该存入课程的信息,什么时候该存入选课系统的信息。当输入错误信息的时候应该怎么进行处理。

第八次大作业:

本次大作业有五题的题目量,并且我认为除了课程成绩系列的其他题目都有一定的难度,都需要进行考虑,思索结构才能写的出来,而不是简单的就能写出来,要考虑类的结构设计,考虑各个类之间有什么关系,用什么关系比较好,每个类中的属性和方法是什么。最难的当然还是课程成绩处理这个题目了,每次大作业与前几次的结构相差还是有点大的,输出需要进行重新处理,成绩的信息也需要重新进行处理,输入的正则也需要进行更改。以及考试类课程的权重比也不是固定的了,需要自己手动判别输入。对于输入的权重比之和一定要为1,这里有个易错点就是整数与小数无法进行比较。

第六次大作业设计与分析:

7-1 课程成绩统计程序-1
分数 100
作者 蔡轲
单位 南昌航空大学

某高校课程从性质上分为:必修课、选修课,从考核方式上分为:考试、考察。

考试的总成绩由平时成绩、期末成绩分别乘以权重值得出,比如平时成绩权重0.3,期末成绩权重0.7,总成绩=平时成绩*0.3+期末成绩*0.7。

考察的总成绩直接等于期末成绩

必修课的考核方式必须为考试,选修课可以选择考试、考察任一考核方式。

1、输入:

包括课程、课程成绩两类信息。

课程信息包括:课程名称、课程性质、考核方式(可选,如果性质是必修课,考核方式可以没有)三个数据项。

课程信息格式:课程名称+英文空格+课程性质+英文空格+考核方式

课程性质输入项:必修、选修

考核方式输入选项:考试、考察

课程成绩信息包括:学号、姓名、课程名称、平时成绩(可选)、期末成绩

课程信息格式:学号+英文空格+姓名+英文空格+课程名称+英文空格+平时成绩+英文空格+期末成绩

以上信息的相关约束:

1)平时成绩和期末成绩的权重默认为0.3、0.7

2)成绩是整数,不包含小数部分,成绩的取值范围是【0,100】

3)学号由8位数字组成

4)姓名不超过10个字符

5)课程名称不超过10个字符

6)不特别输入班级信息,班级号是学号的前6位。

2、输出:

输出包含三个部分,包括学生所有课程总成绩的平均分、单门课程成绩平均分、单门课程总成绩平均分、班级所有课程总成绩平均分。

为避免误差,平均分的计算方法为累加所有符合条件的单个成绩,最后除以总数。

1)学生课程总成绩平均分按学号由低到高排序输出

格式:学号+英文空格+姓名+英文空格+总成绩平均分

如果某个学生没有任何成绩信息,输出:学号+英文空格+姓名+英文空格+"did not take any exams"

2)单门课程成绩平均分分为三个分值:平时成绩平均分(可选)、期末考试平均分、总成绩平均分,按课程名称的字符顺序输出

格式:课程名称+英文空格+平时成绩平均分+英文空格+期末考试平均分+英文空格+总成绩平均分

如果某门课程没有任何成绩信息,输出:课程名称+英文空格+"has no grades yet"

3)班级所有课程总成绩平均分按班级由低到高排序输出

格式:班级号+英文空格+总成绩平均分

如果某个班级没有任何成绩信息,输出:班级名称+英文空格+ "has no grades yet"

异常情况:

1)如果解析某个成绩信息时,课程名称不在已输入的课程列表中,输出:学号+英文空格+姓名+英文空格+":"+课程名称+英文空格+"does not exist"

2)如果解析某个成绩信息时,输入的成绩数量和课程的考核方式不匹配,输出:学号+英文空格+姓名+英文空格+": access mode mismatch"

以上两种情况如果同时出现,按第一种情况输出结果。

3)如果解析某个课程信息时,输入的课程性质和课程的考核方式不匹配,输出:课程名称+" : course type & access mode mismatch"

4)格式错误以及其他信息异常如成绩超出范围等,均按格式错误处理,输出"wrong format"

5)若出现重复的课程/成绩信息,只保留第一个课程信息,忽略后面输入的。

信息约束:

1)成绩平均分只取整数部分,小数部分丢弃

参考类图:


image.png

分析:

本次大作业的设计类的结构思路大致如下:学生类,课程类,因为一个学生可以选多门课,同时一门课可以对应多个学生,所以这是一个多对多的关系,在处理这类关系的时候,我们可以新建一个类当作中间的桥梁,实现一个选课系统就是一门课对应一个学生,有多个选课系统。每个选课系统可以直接带有成绩的属性,当时由于成绩的计算方法需要根据课程的性质进行判断是那种考核方法,因此计算成绩是变化的,作为一个属性或方法之后不好进行更改,所以将成绩提取出来作为一个类,不同的计算算法进行继承。

 在Main函数里建了几个集合,学生类Students, 将学生的学号作为key以便后面的查找,班级类Class,班级号作为班级集合的key,因为选课系统的学生和课程不知道用哪个作为key比较合适,所以我用了Arraylist,课程类Course ,用课程名作为课程的key 。之所以我将他们设为static 的原因是因为在方法和其他类中都对这些集合进行的调用。因为相同的学生和相同的课程都是以第一项的为准,而在查询hashmap的一些性质和方法的时候,我们可以知道它存入按照一种特定的顺序,而且当出现重复的东西时候,后面的数据会对前面的数据进行一个替代的效果。而题目中要求以第一次的为准,所以当存入学生和课程信息的时候我们要判断是否存在这些东西,根据key值进行比较判断即可。

 判断是否存在这个key进行后续的操作。后面就是正则判断,输入的符合哪些正则要求,如果符合正则要求则进入那个相信操作,如果都不满足,输出wrong format。格式符合要求,再判断课程性质与考核方式的匹配是否符合题目中的要求。

 符合要求再进行判断课程是否存在,看是否添加课程。

本次类图结构添加属性和方法后如图所示:

因为课程的性质不同,对应不同课程的构造函数的方法。学生类里面有着学生的ID,姓名,和成绩,以及计算该学生的成绩平均分。成绩类分为GradeA和GradeB分别继承Grade,考核方式对应GradeA, 考察方式对应GradeB。Class 里面有什么学生的集合,添加学生的方法,和设置总成绩。而在Output则是对输出进行一个处理,将hashmap进行排序。对班级中的学生成绩进行平均计算,按学号由低到高排序后输出学生的总成绩平均分。对课程字典中的课程进行排序后输出单门课程的总成绩平均分。对班级字典中的班级进行排序后输出班级的总成绩平均分。

正则表达式的处理:

成绩是否符合规定。

学号,姓名是否符合规定。

根据题目的要求,设计和分析如下:

数据结构设计:课程信息:使用一个字典来保存课程信息,以课程名称为键,对应的值为一个列表,包含课程性质和考核方式。学生成绩信息:使用一个列表来保存学生的课程成绩信息,每个元素为一个字典,包含学号、姓名、课程名称、平时成绩和期末成绩。输出结果:按照要求格式输出学生的所有课程总成绩的平均分,包括学生的学号、姓名和总成绩平均分。如果学生没有任何成绩信息,输出相应提示。

按照要求格式输出单门课程的成绩平均分,包括课程名称、平时成绩平均分、期末考试平均分和总成绩平均分。如果课程没有任何成绩信息,输出相应提示。
按照要求格式输出班级的所有课程总成绩平均分,包括班级号和总成绩平均分。如果班级没有任何成绩信息,输出相应提示。

异常处理:对输入的格式进行验证,如果不符合要求,输出相应的错误提示信息。

总体思路是首先解析和处理输入数据,然后根据数据进行计算和统计,最后按照要求格式输出结果。在处理过程中,要进行数据的合法性验证,例如成绩范围、学号格式、姓名长度等,同时注意处理重复的课程/成绩信息的情况。

第六次作业踩坑心得:

1. 

 刚开始没看到这个限制条件,我认为和之前一样,简简单单进行了一个四舍五入就好了,即用了(int)Math.Round(),而应该直接(int) 对数据进行小数的舍弃,取整数。

 2.

第二个则是课程名字的排序,因为我们在输入的时候课程名字,课程名字是中英文混合的,而中文也是变成拼音就行比较。

 上网查阅调用了这个库进行转化。

3.

 我刚开始用这个测试点,对课程的格式进行处理。但是一直卡着好几个测试点没有过,

 但修改完之后就过了几个测试点,具体的原因应该是如果不是必修或选修的几种情况,第一个正则可以进行但是没有相应的处理,而第二个是必修和选修的几种情况,其他情况都是输出不匹配格式的错误。

4.

 根据一个课程的名字,寻找和这个课程有关的选课系统。

5.

根据一个人的学号来进行查找相应的学生有关的选课系统,以便后面的成绩计算和平均分的计算。

6.

 我刚开始的时候当什么数据都不存在的时候是返回0的,可是当一个学生的所有成绩都是0分的话,我会输出该学生没有参加任何一门考试,而实际上它是参加了考试的时候。所以我返回-1,在比较的时候可以很好的解决这个问题。

7.

 这个测试点我就真的很服了,我找了很久,不知道哪里错了。而是我不知道什么时候该存入,什么时候不存入。而在有这个选课系统的时候,学号,课程名称相同的时候。无论后面的数据是否正确还是错误都不进行错误的考虑分析。

第七次大作业设计与分析:

7-3 课程成绩统计程序-2
分数 60
作者 蔡轲
单位 南昌航空大学

课程成绩统计程序-2在第一次的基础上增加了实验课,以下加粗字体显示为本次新增的内容。

某高校课程从性质上分为:必修课、选修课、实验课,从考核方式上分为:考试、考察、实验。

考试的总成绩由平时成绩、期末成绩分别乘以权重值得出,比如平时成绩权重0.3,期末成绩权重0.7,总成绩=平时成绩*0.3+期末成绩*0.7。

考察的总成绩直接等于期末成绩

实验的总成绩等于课程每次实验成绩的平均分

必修课的考核方式必须为考试,选修课可以选择考试、考察任一考核方式。实验课的成绩必须为实验。

1、输入:

包括课程、课程成绩两类信息。

课程信息包括:课程名称、课程性质、考核方式(可选,如果性质是必修课,考核方式可以没有)三个数据项。

课程信息格式:课程名称+英文空格+课程性质+英文空格+考核方式

课程性质输入项:必修、选修、实验

考核方式输入选项:考试、考察、实验

考试/考查课程成绩信息包括:学号、姓名、课程名称、平时成绩(可选)、期末成绩

考试/考查课程信息格式:学号+英文空格+姓名+英文空格+课程名称+英文空格+平时成绩+英文空格+期末成绩

实验课程成绩信息包括:学号、姓名、课程名称、实验次数、每次成绩

实验次数至少4次,不超过9次

实验课程信息格式:学号+英文空格+姓名+英文空格+课程名称+英文空格+实验次数+英文空格+第一次实验成绩+...+英文空格+最后一次实验成绩

以上信息的相关约束:

1)平时成绩和期末成绩的权重默认为0.3、0.7

2)成绩是整数,不包含小数部分,成绩的取值范围是【0,100】

3)学号由8位数字组成

4)姓名不超过10个字符

5)课程名称不超过10个字符

6)不特别输入班级信息,班级号是学号的前6位。

2、输出:

输出包含三个部分,包括学生所有课程总成绩的平均分、单门课程成绩平均分、单门课程总成绩平均分、班级所有课程总成绩平均分。

为避免误差,平均分的计算方法为累加所有符合条件的单个成绩,最后除以总数。

1)学生课程总成绩平均分按学号由低到高排序输出

格式:学号+英文空格+姓名+英文空格+总成绩平均分

如果某个学生没有任何成绩信息,输出:学号+英文空格+姓名+英文空格+"did not take any exams"

2)单门课程成绩平均分分为三个分值:平时成绩平均分(可选)、期末考试平均分、总成绩平均分,按课程名称的字符顺序输出

考试/考察课程成绩格式:课程名称+英文空格+平时成绩平均分+英文空格+期末考试平均分+英文空格+总成绩平均分

实验课成绩格式:课程名称+英文空格+总成绩平均分

如果某门课程没有任何成绩信息,输出:课程名称+英文空格+"has no grades yet"

3)班级所有课程总成绩平均分按班级由低到高排序输出

格式:班级号+英文空格+总成绩平均分

如果某个班级没有任何成绩信息,输出:班级名称+英文空格+ "has no grades yet"

异常情况:

1)如果解析某个成绩信息时,课程名称不在已输入的课程列表中,输出:学号+英文空格+姓名+英文空格+":"+课程名称+英文空格+"does not exist"

2)如果解析某个成绩信息时,输入的成绩数量和课程的考核方式不匹配,输出:学号+英文空格+姓名+英文空格+": access mode mismatch"

以上两种情况如果同时出现,按第一种情况输出结果。

3)如果解析某个课程信息时,输入的课程性质和课程的考核方式不匹配,输出:课程名称+" : course type & access mode mismatch"

4)格式错误以及其他信息异常如成绩超出范围等,均按格式错误处理,输出"wrong format"

5)若出现重复的课程/成绩信息,只保留第一个课程信息,忽略后面输入的。

信息约束:

1)成绩平均分只取整数部分,小数部分丢弃

参考类图(与第一次相同,其余内容自行补充):

分析:

本次题目我认为分析的结构和第六次应该几乎相同,没有什么实际上的区别,思路上也没有什么太大的区别,只是添加一些实验的课程的类。

 类图也是大差不差,Grade多继承了一个子类,选课系统中多了一个属性。其他的和之前都没有什么变化。在输入处理的时候多添加一个正则的判断。

在输入多个实验成绩,我直接在主函数对这些成绩进行了平均分的处理,直接将平均分存入到学生信息中。

 

这个我认为还是比较关键的,对空格的格式进行了巧妙的处理。而且+代表可以出现0次或者出现无数次。

第七次大作业的踩坑心得:

1. 本次大作业有对实验次数的限制,而如果超过实验次数的处理是直接将这样数据处理为wrong format。因此我们可以在正则中进行处理。

2. 

 实验课的正则中开始是代表 实验次数,而后面的成绩正则只能判断是否符合成绩的格式规定,而不知道成绩的数量,因此需要判断输入成绩的数量和输入的次数是否相等。

3.

 这个测试点,虽然题目中写的是样例2和3,但是当我修改成样例2,3.都为正确结果的时候,还是无法通过。而当我测试样例1 的时候发现并没有通过。当我对输入输出进行一定的处理后,修改成正确的答案,就通过了这些测试点。牛头不对马嘴还是令人很苦恼的。

4. 因为多添加了一个课程,那么我们在判断课程性质和考核方式是否匹不匹配的要求也就增加了很多。当一个课程为选修的话,只有实验不符合规定,当一个课程为必修的话,只有考试是符合规定的。当一个课程为实验的话,只有实验是符合规定的。

5. 本次好像多添加了一个之前没有的测试点,我真的很无语对于这个测试点,俩个小时的时间,拿着室友的电脑和自己的电脑对于不同的测试点进行一个个的比较和分析。终于黄天不负有心人,我发现了当一个学生的数据都是不合理的情况下,这个人的成绩是不进入班级的,并且他虽然存在,但是他不影响班级的平均分的计算。这个点可能是老师忽略了,没有在题目中明确提出。而在下一次的大作业,老师对这个测试点进行了明确的说明。

第八次大作业设计与分析:

7-2 课程成绩统计程序-3
分数 64
作者 蔡轲
单位 南昌航空大学

课程成绩统计程序-3在第二次的基础上修改了计算总成绩的方式,

要求:修改类结构,将成绩类的继承关系改为组合关系,成绩信息由课程成绩类和分项成绩类组成,课程成绩类组合分项成绩类,分项成绩类由成绩分值和权重两个属性构成。

完成课程成绩统计程序-2、3两次程序后,比较继承和组合关系的区别。思考一下哪一种关系运用上更灵活,更能够适应变更。

题目最后的参考类图未做修改,大家根据要求自行调整,以下内容加粗字体显示的内容为本次新增的内容。

某高校课程从性质上分为:必修课、选修课、实验课,从考核方式上分为:考试、考察、实验。

考试的总成绩由平时成绩、期末成绩分别乘以权重值得出,比如平时成绩权重0.3,期末成绩权重0.7,总成绩=平时成绩*0.3+期末成绩*0.7。

考察的总成绩直接等于期末成绩

实验的总成绩等于课程每次实验成绩乘以权重后累加而得。

课程权重值在录入课程信息时输入。(注意:所有分项成绩的权重之和应当等于1)

必修课的考核方式必须为考试,选修课可以选择考试、考察任一考核方式。实验课的成绩必须为实验。

1、输入:

包括课程、课程成绩两类信息。

课程信息包括:课程名称、课程性质、考核方式、分项成绩数量、每个分项成绩的权重。

考试课信息格式:课程名称+英文空格+课程性质+英文空格+考核方式+英文空格+平时成绩的权重+英文空格+期末成绩的权重

考察课信息格式:课程名称+英文空格+课程性质+英文空格+考核方式

实验课程信息格式:课程名称+英文空格+课程性质+英文空格+考核方式+英文空格+分项成绩数量n+英文空格+分项成绩1的权重+英文空格+。。。+英文空格+分项成绩n的权重

实验次数至少4次,不超过9次

课程性质输入项:必修、选修、实验

考核方式输入选项:考试、考察、实验

考试/考查课程成绩信息包括:学号、姓名、课程名称、平时成绩(可选)、期末成绩

考试/考查课程成绩信息格式:学号+英文空格+姓名+英文空格+课程名称+英文空格+平时成绩+英文空格+期末成绩

实验课程成绩信息包括:学号、姓名、课程名称、每次成绩{在系列-2的基础上去掉了(实验次数),实验次数要和实验课程信息中输入的分项成绩数量保持一致}

实验课程信息格式:学号+英文空格+姓名+英文空格+课程名称+英文空格+第一次实验成绩+...+英文空格+最后一次实验成绩

以上信息的相关约束:

1)成绩是整数,不包含小数部分,成绩的取值范围是【0,100】

2)学号由8位数字组成

3)姓名不超过10个字符

4)课程名称不超过10个字符

5)不特别输入班级信息,班级号是学号的前6位。

2、输出:

输出包含三个部分,包括学生所有课程总成绩的平均分、单门课程总成绩平均分、班级所有课程总成绩平均分。

为避免四舍五入误差,

计算单个成绩时,分项成绩乘以权重后要保留小数位,计算总成绩时,累加所有分项成绩的权重分以后,再去掉小数位。

学生总成绩/整个班/课程平均分的计算方法为累加所有符合条件的单个成绩,最后除以总数。

1)学生课程总成绩平均分按学号由低到高排序输出

格式:学号+英文空格+姓名+英文空格+总成绩平均分

如果某个学生没有任何成绩信息,输出:学号+英文空格+姓名+英文空格+"did not take any exams"

2)单门课程成绩按课程名称的字符顺序输出

课程成绩输出格式:课程名称+英文空格+总成绩平均分

如果某门课程没有任何成绩信息,输出:课程名称+英文空格+"has no grades yet"

3)班级所有课程总成绩平均分按班级由低到高排序输出

格式:班级号+英文空格+总成绩平均分

如果某个班级没有任何成绩信息,输出:班级名称+英文空格+ "has no grades yet"

异常情况:

1)如果解析某个成绩信息时,课程名称不在已输入的课程列表中,输出:学号+英文空格+姓名+英文空格+":"+课程名称+英文空格+"does not exist"

2)如果解析某个成绩信息时,输入的成绩数量和课程的考核方式不匹配,输出:学号+英文空格+姓名+英文空格+": access mode mismatch"

以上两种情况如果同时出现,按第一种情况输出结果。

3)如果解析某个课程信息时,输入的课程性质和课程的考核方式不匹配,输出:课程名称+" : course type & access mode mismatch"

4)格式错误以及其他信息异常如成绩超出范围等,均按格式错误处理,输出"wrong format"

5)若出现重复的课程/成绩信息,只保留第一个课程信息,忽略后面输入的。

6)如果解析实验课程信息时,输入的分项成绩数量值和分项成绩权重的个数不匹配,输出:课程名称+" : number of scores does not match"

7)如果解析考试课、实验课时,分项成绩权重值的总和不等于1,输出:课程名称+" : weight value error"

信息约束:

1)成绩平均分只取整数部分,小数部分丢弃

参考类图(与第一次相同,其余内容自行补充):

分析:

本次大作业和前两次的就截然不同了,可以说结构进行了很大的一个变化。成绩的输出也从原来的平均成绩,平时成绩,期末成绩变成了只输出平均成绩。成绩类由原来的继承关系变成了组合关系,我认为还是组合关系比较好一点。相比于继承关系,组合关系更具灵活性和可扩展性。通过组合关系,可以动态地组合不同的类,以适应各种需求的变更。例如,对于不同的课程类型,可以组合不同的分项成绩类进行计算;对于不同的学校或学院,可以根据需要组合不同的成绩类模块进行定制。综上所述,组合关系更加灵活、可扩展和适应变更。通过不同类的组合,可以实现更多样化的功能和计算方式,更好地满足实际需求。继承关系的使用需要更加慎重,适合于具有类似属性和方法的类之间的层次化组织。本次大作业还增加了权重,必修和实验都有每次考试的权重,最终成绩的计算由每次的成绩乘以本次考试对应的权重。如果解析考试课、实验课时,分项成绩权重值的总和不等于1,输出:课程名称+" : weight value error",如果解析实验课程信息时,输入的分项成绩数量值和分项成绩权重的个数不匹配,输出:课程名称+" : number of scores does not match",这些都是本次大作业新添加的东西。因此结构还是和之前有着很大的差别。

 虽然从类图中,我们会发现变化不是很大,但是输入的处理,对于错误信息的处理,对于正确成绩的存入还是有着很显著的区别的。对于一门课中我放了一个数组,专门用于存储每次课程成绩的权重。因为实验课中有很多很多的成绩,所以我在grade的类里面放了一个GradeA的集合,GradeA专门用于返回一次成绩乘以权重对应后的成绩。而在主函数,我将自己的结构进行了重新的梳理和修改了结构,更改了一些先后顺序。我先将那些格式符合,但是他的考核方式和课程性质不一致的进行了处理。处理课程输入的时候,格式符合,判断课程是否存在,对数据判断是否存入。成绩的分析,要判断权重的次数和输入成绩的次数是否符合。如果长度一致,再判断,权重比的值是否为1,不是进行特定的输出。在本次大作业还发现一个bug,但同一学号一起输入,即使那个人没有成绩但我会计算两遍,

 课程类里面,对于一个字符串进行处理,将那个符合条件的权重存储到数组中去。

第八次大作业踩坑心得:

1. 第一点应该是大部分人都错的比较多的是,比较那个1的那个,因为权重的值是浮点类型,而不能够直接和整数类型进行比较,我们应该对浮点类型进行强制转换为整数类型才能够进行比较,或者说该浮点类型是不是在一个范围里面。

 2. 还有就是正则的问题了,刚开始我写的是对成绩数量的正则,而这样如果我的实验课只有两门成绩的时候,代码会将这个信息认为成是考试科目的信息。一门认为考察的信息。显然这是和题意不符合的。实验课这种要输出一定的错误信息内容。而进入其他的功能可能有点不太好实现该功能。

 3. 

 这个测试点应该是考察了float和double的区别,在Java代码中,使用float类型或double类型的浮点数时,可能会出现使用float类型结果正确而使用double类型结果错误的情况。这通常是由于浮点数的精度问题导致的。Java中的浮点数类型采用IEEE 754标准表示,但是floatdouble具有不同的精度范围。float是单精度浮点数,占用32位(4字节),而double是双精度浮点数,占用64位(8字节)。因此,double类型提供了更高的精度,可以表示更大范围的数值和更多的小数位。
4. 本次对课程的存入先后顺序改变了,先判断考核方式与课程性质的匹配。匹配之后,判断课程是否存在,如果已经存在该课程的信息,那么不管它后面的信息正确还是错误都不进行处理。在判断权重的长度是否规定,再判断权重的和值是否相加为1。
5. 而对于课程成绩的输入处理同样改变了顺序。先判断是否存在相同的选课系统,存在则不对后面数据的正确性进行判断。不存在则将学生学号前6位分割成班级号,班级不存在进行新班级的添加,判断课程是否存在。判断考核方式和权重的数量。最后全部正确,对数据进行添加。
6.

 这个测试点,可能涉及的方面有点广,一直没有找到相应的测试点。没有一点头绪进行修改,于是我将自己的正则,对于课程信息的处理进行了更改,对于数据处理发生了一些变化,我将那个权重的数量问题放到正则里面进行判断,而不是放在外面了。

 

 并且提前对不符合格式的课程输出相应的东西。

7. 对于同一个人,第一个信息正确,第二个信息错误,本来应该在计算班级平均分的时候,计算一次该成绩的时候就行,可是我的代码却进行了两次同一个人的重复计算。这让我刚开始百思不得其解,在我多次进行调试后,我在明白了其中的缘故。

 我对重复数据进行了筛选,确保每一个人的成绩只是计算了一遍。

主要困难及改进建议:

我认为这几次大作业的设计结构因为老师课上已经进行讲解的缘故,这个已经不是主要的困难;第一个我认为比较困难的是,中英文都存在的时候如何进行排序。题目中也没有说请用哪种方式排序,这个之前也从未接触过,需要自己查阅相关的资料并且与自己的代码进行结合。可以在使用该项功能的时候,前面出一个这样的小题,讲清楚一些细微的写法,让我们写的更加轻松一点。还有比较困难的是对数据处理这一方面,题目中并没有很详细的给出什么样错误的数据进行什么样的处理,有些数据错误,但是它的学生和班级还是要进行存储,而有些又是不进行存储。这些是否进行存储数据,我们只能从题目中的样例进行自己辨别。而自己观察,总是会出现一点纰漏。这还不是最麻烦的,当你对数据的存储错误并不是错大部分的测试点,而只会卡一两个测试点,这对之后找测试点的过程就非常的煎熬了。还有一个就是自己学得知识太少的原因,对于hashmap的key,value,之间的关系,以及hashmap怎么进行排序这些东西之前都没有接触过,需要自己进行大量的课余时间进行学习才能够写出这次的大作业。正则可以对于一些普通的规范性问题使用,有些东西还是不使用正则会比较好一点。

总结:

这几次大作业学习到了如何更好的灵活运用正则表达式,明白类之间的关系。还有对比了成绩类用继承还是组合关系哪个更好。

相比于继承关系,组合关系更具灵活性和可扩展性。通过组合关系,可以动态地组合不同的类,以适应各种需求的变更。例如,对于不同的课程类型,可以组合不同的分项成绩类进行计算;对于不同的学校或学院,可以根据需要组合不同的成绩类模块进行定制。

综上所述,组合关系更加灵活、可扩展和适应变更。通过不同类的组合,可以实现更多样化的功能和计算方式,更好地满足实际需求。继承关系的使用需要更加慎重,适合于具有类似属性和方法的类之间的层次化组织。

在对于float和double的使用上的精度问题。在编写Java代码时,应根据具体的需求选择适当的浮点数类型。如果需要更高的精度,或者对结果的准确性有更高的要求,建议使用double类型。只有在确实需要节省空间或明确知道问题的范围和精度要求较低的情况下,才使用float类型。我还学习到了一些关于hashmap的知识点,

  1. HashMap可以使用put方法添加键值对,使用get方法获取值,使用remove方法删除键值对。

  2. HashMap可以通过调用size方法获取存储的键值对数量,通过isEmpty方法检查是否为空。

  3. HashMap的遍历可以使用迭代器或者Java 8引入的forEach方法进行操作。遍历顺序不是键值对被插入的顺序,而是基于哈希码。
  4. 在HashMap中,键的唯一性是通过equals()和hashCode()方法来判断的。因此,如果您自定义了一个类,并将其作为HashMap的键,必须正确地实现equals()和hashCode()方法以保证正确的行为。

排序的话,hashmap无法进行排序,我是将其转化为TreeMap进行排序首先使用TreeMap的构造函数将HashMap中的键值对转移到TreeMap中。TreeMap会根据键的自然顺序对键值对进行排序。然后,使用entrySet()方法遍历TreeMap,按照键的顺序输出键值对。

posted @ 2023-06-22 20:55  里奥科  阅读(76)  评论(0编辑  收藏  举报