我的第三次博客作业
AZ-1的第三次博客作业
前言
题量
- 题目集6题量较小。
- 题目集7题量较小。
- 题目集8题量中等。
难度
- 题目集6虽然只有一道题,但是题目很长,难度很大,让人在看到的时就心生畏惧。菜单4在菜单3的基础上增加了大量的错误输入,大大增加了程序的代码量,很考验编程过程中的细心程度,也很考验对正则表达式的掌握程度。
- 题目集7总共有四道题目,除第四题外题目难度都不高。
- 题目集8总共有五道题目,除第二题外题目难度都不高。
知识点
- 课程1的知识点主要是正则表达式、对代码运行过程的优化以及内容的扩充。
- 课程2的知识点主要是正则表达式、对代码运行过程的优化以及内容的扩充。
- 课程3的主要知识点主要是程序设计中类的设计、程序设计中类结构设计、程序设计中的继承与多态和程序设计中的抽象类与接口。
题目集六 7-1 课程成绩统计程序-1
设计与分析
- SourceMonitor生成报表:
- idea生成类图:
- 类与设计分析:
-
类
Student
:表示学生,包含学生的姓名、学号、总分、平均分和上课次数等信息。具有计算总分、计算平均分和展示学生信息的方法。 -
抽象类
Grade
:表示成绩,包含一个整数成绩。具有根据考试模式获取成绩的方法。 -
子类
ExamGrade
:表示考试成绩,包含两个成绩部分:期中成绩和期末成绩。具有计算考试成绩的方法。 -
子类
InspectionGrade
:表示考察成绩,只包含一个成绩部分:期末成绩。 -
类
Course
:表示课程,包含课程名称、性质、考试模式和对应的成绩对象等信息。具有计算课程平均成绩和展示课程信息的方法。 -
类
CurriculaVariable
:表示课程变量,包含学生、课程和成绩等信息。具有根据课程模式获取成绩的方法。 -
类
Class
:表示班级,包含班号、学生列表和班级总分等信息。具有计算班级总分、计算平均分和展示班级信息的方法。 -
类
Main
:包含主函数,用于执行学生成绩管理系统的逻辑。其中包含了对输入的解析、创建对象、计算成绩等操作。
- 设计思路:
-
学生对象 (
Student
) 包含了学生的基本信息,通过与课程对象 (Course
) 和成绩对象 (Grade
) 的关联,实现了计算学生总分和平均分的功能。 -
课程对象 (
Course
) 包含了课程的基本信息,通过与成绩对象 (Grade
) 的关联,实现了计算课程平均成绩的功能。 -
成绩对象 (
Grade
) 是一个抽象类,包含了不同类型成绩的通用方法,通过继承实现了考试成绩和考察成绩的具体计算方法。 -
课程变量对象 (
CurriculaVariable
) 是学生、课程和成绩的关联类,用于记录学生选修的课程和对应的成绩。 -
班级对象 (
Class
) 包含了班级的基本信息和学生列表,通过与学生对象 (Student
) 的关联,实现了计算班级总分和平均分的功能。 -
主函数 (
Main
) 负责整个程序的逻辑实现,包括解析输入、创建对象、计算成绩、展示信息等操作。
踩坑心得
- 我一开始没有使用正则表达式来规范输入,而是单纯地使用if语句判断输入是否合规。这导致我的程序不能准确地判断用户输入的情况,相应地输出各种错误输入的输出提示。
心得:熟练地使用正则表达式可以准确地筛选出正确的输入形式,剔除各种各样奇奇怪怪的错误输入。
- 不能乱加访问修饰词
给Dish中的dishName加private修饰词:
心得:现在我们的程序只要能够运行拿满分就够了,目前还不会涉及到数据的私密性,没有必要把数据的访问权限设置地太高。
- 方法中传入的参数名字尽量与该类中存在的变量名不同,如果相同,要用this.指代该类中的变量:
心得:虽然我们几乎可以给变量起无数种名字,但是果然还是同样的名字方便日后理解。
- 一个错误输入可能同时符合多种错误输出情况,但错误输出有优先级。
心得:在编写程序时要时刻记得题目要求,内心要有一个程序运行的大概的流程,按照要求一步一步地编写程序。
改进建议
- 建议1:Order类中的Record数组可以设计成动态数组,增加程序灵活性。
- 建议2:去除一些运行过程中没有必要出现的变量。
题目集七 7-3 课程成绩统计程序-2
设计与分析
- SourceMonitor生成报表:
- idea生成类图:
-
类结构:
- Student类:表示学生,具有学号、姓名、总分、平均分和上课次数等属性,以及计算总分、平均分和展示信息的方法。
- Grade抽象类:表示成绩,具有成绩属性和获取成绩的方法。包括三个子类:ExamGrade、InspectionGrade和ExperimentalGrade,分别表示考试成绩、考察成绩和实验成绩。
- Course类:表示课程,具有课程名称、性质、考核方式和成绩等属性,以及成绩计算和展示信息的方法。
- CurriculaVariable类:表示课程变量,包括学生、课程和成绩等属性,以及获取成绩的方法。
- Class类:表示班级,具有班号、学生列表、总分、平均分和上课次数等属性,以及计算总分、平均分和展示信息的方法。
- Main类:包含主函数,用于程序入口和控制流程。
-
设计模式:
- Comparable接口:Student类实现了Comparable接口,用于比较学生对象,实现了按学号排序的功能。
- 组合关系:CurriculaVariable类中包含了Student对象和Course对象,表示学生和课程之间的关系。
- 多态性:Grade类为抽象类,具有多个子类,通过多态性实现了不同类型成绩的处理和计算。
- 单一职责原则:各个类的职责相对独立,每个类负责处理自身的属性和方法。
-
踩坑心得
- 程序有两种输入错误提示,“** does not exist”和“delete error”,这时需要注意这两个提示的输出顺序,否则会提示格式错误
心得:答案对固然重要,但是也要格式对才能得分。
- 订单总价的计算过程是菜的原价在按份量计算一次后进行四舍五入,再在乘以数量以及折扣后进行一次四舍五入,最后再加在一起即为订单总价格。如果是加在一起后再进行打折会计算出不同的答案。
心得:在编写程序前应该认真地研读题目要求,思考清楚程序运行过程再进行编写,避免出现逻辑错误。
- 为别桌点特色菜时被点菜的桌的口味度及特色菜总数量不变(不小心遗漏了在为别桌点菜时给别桌增加口味度总量以及特色菜总数量的过程)
心得:编写程序的过程中要专注,避免遗漏一些简单的部分。
- 如果某桌没有点特色菜则要在输出table *: *** ***后加一个空格
心得:虽然题目中没有给出相应的测试样例,但我们可以在不断的试错中把题目需要的格式测出来
- 如果点了特色菜,但是该桌的平均口味度为零的时候要输出不辣、不甜或者不酸。
心得:在编写程序前应该认真地研读题目要求,思考清楚程序运行过程再进行编写,避免输出的答案与题目要求不符合。
改进建议
- 建议1:Menu中的dishes数组和Order中的records数组都可以改为动态数组,增加程序的灵活性。
- 建议2:Table中的name对象和phoneNumber对象可以替换成一个Customer对象。
- 建议3:Table类中的与口味有关的参数可以整合为一个口味类。
- 建议4:创建一个特色菜类作为Dish类的子类。
题目集八 7-2 课程成绩统计程序-3
设计与分析
- idea生成类图:
- 类的分析:
-
Student
类:表示学生,包含学生的姓名、学号、上课总分、平均分和上课次数等属性,以及计算总分、平均分和展示信息的方法。 -
Grade
类:表示成绩,是一个抽象类,包含一个成绩值属性和获取成绩的方法。-
ExamGrade
类:继承自Grade
类,表示考试成绩,包含期中成绩、期末成绩、期中权重和期末权重等属性,以及计算考试总成绩的方法。 -
InspectionGrade
类:继承自Grade
类,表示考察成绩,只包含一个最终成绩属性。 -
ExperimentalGrade
类:继承自Grade
类,表示实验成绩,包含多个实验成绩和对应的权重,以及计算实验总成绩的方法。
-
-
Course
类:表示课程,包含课程的名称、性质、考试类型、成绩类型和成绩对象等属性,以及计算课程平均成绩和展示课程信息的方法。 -
CurriculaVariable
类:表示课程变量,包含学生、课程和成绩对象等属性,以及获取成绩的方法。 -
Class
类:表示班级,包含班号、学生列表、总分、平均分和上课次数等属性,以及添加学生、计算总分、计算平均分和展示班级信息的方法。 -
Main
类:主类,包含程序入口main
方法,负责管理学生、课程和班级的信息,以及输入和输出的逻辑。
- 设计分析:
-
类之间的关系:
Student
、Grade
、Course
、CurriculaVariable
和Class
类之间存在关联关系,通过相应的属性进行关联。Main
类负责协调各个类的功能,并对学生、课程和班级的信息进行管理。 -
继承关系:
Grade
类作为抽象基类,被ExamGrade
、InspectionGrade
和ExperimentalGrade
类继承,实现了不同类型的成绩计算逻辑。 -
接口和实现:
Comparable<Student>
接口由Student
类实现,用于对学生进行比较和排序。 -
集合和循环:代码中使用了
ArrayList
来存储学生、课程、课程变量和班级等对象的集合,通过循环遍历集合中的对象进行操作。 -
输入和输出:通过
Scanner
类实现对用户输入的获取,并使用System.out.println
进行输出。
踩坑心得
-
- 程序要求四舍五入,我一开始是用if语句控制的,毕竟就只有两种情况是需要四舍五入的,最终改进成通过使用Math.round(price)方法解决。
心得:Java库中自带了许多好用的方法,如果能够熟练运用的话一定能省很多的事和时间。
- 不能乱加访问修饰词
给Dish中的dishName加private修饰词:
心得:现在我们的程序只要能够运行拿满分就够了,目前还不会涉及到数据的私密性,没有必要把数据的访问权限设置地太高。
- 方法中传入的参数名字尽量与该类中存在的变量名不同,如果相同,要用this.指代该类中的变量:
心得:虽然我们几乎可以给变量起无数种名字,但是果然还是同样的名字方便日后理解。
改进建议
-
- 问题1:这次作业相对上一次难度跨越较大,在心理上对题目产生恐惧,导致没有心情写下去,现在回过头来看其实这个题目并没有想象中的那么难。
- 问题2:由于缺少经验,当时编写程序时是把所有类的功能完善之后再运行,导致我经常不能发现是由哪些代码导致的问题。
- 问题3:类与类之间的联系比较紧密,并且代码数量和类的数量对于一个初学者来说过多,我当时在编写时经常因为对类与类之间的关系不清晰而思考很久。
- 问题4:当时写题目时没怎么进行理论上的学习,基本都是靠着感觉编写,导致最后即使通过所有测试点也还是对Java缺少理解。
- 建议1:Order类中的Record数组可以设计成动态数组,增加程序灵活性。
总结
- 在10-16周的学习中我加深了对继承关系的理解,掌握了部分正则表达式的用法(比如\s匹配所有空白符,\S匹配所有非空白符;\d匹配所有数字,\D匹配所有非数字字符;{n,m}匹配n-m位数),学会了接口的用法(interface定义接口,implement继承接口),学会了动态数组的用法。
- 正则表达式的用法、接口的用法以及类与类之间的关系的划分我还需要更进一步地学习。
- 课上讲的一些东西我们不能立刻在作业中得以实践,会导致我们在课上听懂了,但是由于没有课后习题的及时巩固,最终忘记我们上课所学到的一些知识。