第三次博客作业

一、作业总结

该次博客作业是对 课程成绩统计程序-1、 课程成绩统计程序-2、 课程成绩统计程序-3的一次总结。通过几次作业的迭代,程序也一步步完善。在这几次的作业中,我对自己的代码在之前的理解基础上有了一定的进步,增强了自己代码的可读性和灵活性,让自己的代码更完善,通过更合理的分工以及数据的合理储存,让相应的类完成本该属于自己的工作,以及相应的数据放到合理的类中,以达到代码工作和数据处理的合理分配和储存。这几次的作业让我对Java中的面向对象思想更加深刻,对其有了更完善的了解,对于每个分出的类,其中的数据和方法做到谁的工作和数据,就放到对应的类中,这样能做到代码更清晰可读,在符合逻辑的基础上,对代码的更改完善也会变得更轻松简单,一旦发现问题,无论是逻辑上的出错还是编译时代码写错,都能能迅速发现和更改。也对继承关系和组合关系有了一定的了解。同时为了完成该次作业,我也学会了try-catch的使用,以及正则表达式的使用,明白了如何合理的运用好继承关系和组合关系。但这几次的作业也同样让我认识到逻辑思维的严谨对一个程序来说有多么重要,这几次的作业都没拿到满分甚至是高分,有很大一部分原因真是因为我考虑的不够严谨,所想的程序总是会遗漏一些特殊情况导致扣分。接下来是我对这三次作业的简要分析。

二、对各个作业的简要分析

1.课程成绩统计程序-1

对于这道题我想到的就是先通过正则表达式将数据存储下来再通过后续方法对数据进行处理,由于课程输入有特定的格式,所以用正则表达式会很方便

先通过s将存入的数据储存,再通过正则表达式进行筛选,筛选完再用split语句以空格分割,分别输入对应的含参方法中,即可做到对数据的储存。

由于异常处理是最令我头疼的要求,总是会在这上面拿不到分,所以我先考虑异常处理的几种情况,我第一想到的就是刚学的try-catch来处理。通过含参构造将输入的数据存入班级类或学生类中或对班级类中的数据进行处理,由于每一种正确输入的格式都是确定且不变的,所以每次输入的数据一旦为异常输入,则不满足方法中参数的格式,从而进行相应的报错处理,这时可以通过try-catch来对异常数据进行相应的处理。在此之前我学了try-catch的使用方法,而try-catch对我的感觉就像是特殊的if-else,通俗地来说就是if报错,则else,也就是一旦try中抛出错误,则catch抓住错误,再通过catch中的代码进行更正。由于try中抛出的错误种类有很多,catch抓住的错误也就要进行一定的处理,比如时间错误:DateTimeException,一旦抛出时间错误,就要用catch(DateTimeException w)来抓住,再通过catch中的代码进行更正,这是对特定错误的处理,而对于一般广泛的无差别错误处理,则可用Exception来抓住所有错误,这是因为其实Java中报错的也是由类来完成,而Exception类是所有报错的类的父类。另外如特殊需要,也可以通过throw new ArithmeticException()语句强行抛出错误。有了以上的基础,

这是学生成绩数据输入的程序模块,通过while循环来不断重复着菜品输入的过程

 这是菜单adddish方法的代码,通过含参构造方法来将数据储存

如之前所说,特色菜和普通菜在菜品输入时的区别就是特色菜后面有个“T”,他们完全可以像如图一样合并为一个方法,在输入时由于仍然采用之前菜单计价程序-3的方法,将一行的数据储存在mation中,再通过split以空格分割成若干份并储存在数组k中,特色菜和普通菜的输入就能用k的长度来区分,从而进行如图操作,如果是特色菜则k的长度为3,将每个数据输入方法中即可,而如果是普通菜,则k的长度是2,在adddish方法的最后一个参数(用来储存标记是否是特色菜,如果该参数为T,则标记该菜为特色菜,也就该菜的dish.T=true)的输入为非“T”的任意一个字符,已达特色菜或普通菜菜品数据储存的目的。这时如果格式并不是菜单菜品的输入,则必然抛出一个异常,由于该异常没有特殊性这时可以用Exception来捕捉异常。此时有两种可能的情况,一种是输入的数据是接下来订单的数据,这样只需要用break语句跳出菜品输入程序的while循环即可,而另一种则是异常数据输入情况,按照题目要求,只需要输出“wrong format”即可,然后在最后进行下一次输入和对输入的分割完成此次循环。

对于学生数据的存入,如果输入数据满足格式,则进行成绩的记录,记录该学生成绩的信息,同时完成了输入空格过多的异常输入情况的

 对时间错误抛出的捕捉及处理,一旦时间输入不和要求则完成相应的异常输入处理,对成绩的存入,通过不断的异常抛出和抓取,逐步完成。其余由于格式错误,此时输入的数据则是异常输入,输出wrong format即可。

但又由于最终代码太过冗长,我又发现一旦运用好正则表达式,可以筛选出很多异常输入,比如利用正则表达式,可以很好限定学号位数、课程名称长度、学生姓名长度、输入课程成绩分数的范围,剩下的异常只需要在方法中对其他异常处理进行处理。

 这是先对分数的合理性进行处理,如果分数超过了一百或者分数小于零,则输出wrong format并用return跳出方法,如果分数没问题,那么再对学生所对应的班级做处理,首先看是否出现过该班级,如果没出现过该班级号则增加一个班级,如果该班级在之前已经出现过则无视。再查找是否存在所输入的课程名称,如果没有该课程,则输出“课程+does not exist”,如果该课程是存在的,则继续成绩录入的步骤。

 接下来是对选修还是必修、考试还是考核进行对应的数据处理操作,如果是考试,那么考试的总成绩由平时成绩、期末成绩分别乘以权重值得出,比如平时成绩权重0.3,期末成绩权重0.7,总成绩=平时成绩*0.3+期末成绩*0.7;如果是考核,那么考察的总成绩直接等于期末成绩必修课的考核方式必须为考试,选修课可以选择考试、考察任一考核方式。

为更好的完成成绩处理操作,我增加了一些方法作为工具方便使用

 这是用来查找所储存的课程信息

 这是用来查找所存储的学生信息

 这是用来查找所存储的班级信息

这次的作业没拿到高分,主要是因为考虑的情况还是没考虑周全

2.课程成绩统计程序-2

这次的作业在课程成绩统计程序-1的基础上增加了实验课的处理,

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

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

实验课不同于其他类型课程,实验课程成绩信息包括:学号、姓名、课程名称、实验次数、每次成绩实验次数至少4次,不超过9次实验课程信息格式:学号+英文空格+姓名+英文空格+课程名称+英文空格+实验次数+英文空格+第一次实验成绩+...+英文空格+最后一次实验成绩

 又因为最后还要进行按课程用字典顺序输出、学生按学号顺序输出学生课程总成绩平均分按学号由低到高排序输出,所以想到用list来实现这一功能

 由于课程、学生的数据是通过对象数组来储存的,我还不会用list来直接处理,所以我先将课程、学生的数据存入list数组,再通过sort对排序进行再定义,最后将处理好的数据存入另一个String类型的数组,再将原对象数组按照该String类型数组的顺序来排序。

由于做这次作业,并没有大量异常输入,并且发现用正则表达式会更简洁,而菜单计价程序-3的main类对数据的处理方面太差,我决定用正则表达式来完成数据的处理。在之前的学习中我了解了正则表达式的用法,首先格式的配对用matches方法,matches判断是否相等boolean返回值,substring[]看字符位置如【0,1】是首位,以此类推、\\d表示配对数字(字符型)"+"代表多位、\\s表示配对空格也可以直接输入空格、\\w表示配对单个字母、\\D表示配对除数字外任何单个字符(包括中文)、[\u4e00-\u9fa5]+匹配多个中文,有了这个知识点作为基础。

这次没拿到满分的原因我也不知道,就是有三分怎么都拿不到,想过很多异常情况,但都不是考点

3.课程成绩统计程序-3

课程成绩统计程序-3在第二次的基础上修改了计算总成绩的方式,修改类结构,将成绩类的继承关系改为组合关系,成绩信息由课程成绩类和分项成绩类组成,课程成绩类组合分项成绩类,分项成绩类由成绩分值和权重两个属性构成。实验的总成绩等于课程每次实验成绩乘以权重后累加而得。课程权重值在录入课程信息时输入。(注意:所有分项成绩的权重之和应当等于1)课程信息包括:课程名称、课程性质、考核方式、分项成绩数量、每个分项成绩的权重。考试课信息格式:课程名称+英文空格+课程性质+英文空格+考核方式+英文空格+平时成绩的权重+英文空格+期末成绩的权重考察课信息格式:课程名称+英文空格+课程性质+英文空格+考核方式实验课程信息格式:课程名称+英文空格+课程性质+英文空格+考核方式+英文空格+分项成绩数量n+英文空格+分项成绩1的权重+英文空格+。。。+英文空格+分项成绩n的权重。实验课程成绩信息包括:学号、姓名、课程名称、每次成绩{在系列-2的基础上去掉了(实验次数),实验次数要和实验课程信息中输入的分项成绩数量保持一致}为避免四舍五入误差,计算单个成绩时,分项成绩乘以权重后要保留小数位,计算总成绩时,累加所有分项成绩的权重分以后,再去掉小数位。学生总成绩/整个班/课程平均分的计算方法为累加所有符合条件的单个成绩,最后除以总数。这次的作业写的很差,主要是没时间写,全在应付考试了。

posted @ 2023-06-23 20:46  无的之矢  阅读(52)  评论(0)    收藏  举报