OO前三次作业总结
1.前言
前三次作业题量上来说并不算多,三到四道题给了一个礼拜的时间去完成,以下为依次对三周题目集的知识点,题量和难度进行概述:
-
- 第一周
第一次题目集是五道题,分别是:设计一个风扇Fan类,类和对象的使用,成绩计算-1-类、数组的基本运用,成绩计算-2-关联类,答题判题程序-1,其中最后一题难度较大,占分也很高(74分),由于本人知识点的不牢固和时间把握不足,并没有拿到分,只能在后续的补练中重新掌握。
前四道题主要还是在考类的设计这方面,是很基础的知识点,比如考察设计一个简单类需要设计它的成员变量,访问器和修改器,构造方法(无参构造和有参构造),和输出方法,以及在主类中设计声明具体的对象,然后到了第三四题开始考察数组的基本运用以及对多行信息读取分析的知识点,包括第四题我还用了HashMap这个特殊类来进行查找对应,总的来说前四题还是很基础的,考察知识点也基本是老师课堂讲过的,但是到了第五题,题目难度陡增(也可能是我实在太菜了,当然对比第二次题目集最后大题又显得简单),考察知识点开始变多变难,设计类也需要多考虑一下类之间的关联性,这个在之后的设计与分析模块再具体解释。
-
2.第二周
第二次题目集是四个题目,分别为手机按价格排序、查找
,sdut-oop-4-求圆的面积(类与对象),Java类与对象-汽车类, 答题判题程序-2,第二次题目集和第一次的很像,都是前三题较为正常基础,最后一题难度大幅度提升,前几题主要考察数组排序,链表排序,接口等知识点,其中接口部分也属于需要自学的内容,除了这个知识点别的都是基础知识点,当然最后那个大题目依然是难度很大,知识点考察复杂多变,占分比很大,我写了代码接近三百多行,走了很多弯路,到了代码后期感觉力不从心,思路也有点混乱,这个我再后面的板块具体分析。 -
3.第三周
第三周题量更少,只有三道题了,分别是面向对象编程(封装性), jmu-java-日期类的基本使用,答题判题程序-3,题量更少给的时间一样还是一个礼拜,那么毋庸置疑就是最后一题难度新高,先说前两题,第一题还是很基础的,就是基本类的设计,第二题是考察了一个难度不大的新知识点,利用已经封装好的类进行答题,使用的方法也大多数是类自带的,当然我走了弯路,一开始是考虑自己设计类来作答,最后一题难度新高,承接前面两题的基础上又进行了新的提升,占分比也更高了,我并没有写出来(哎呀),到现在也不是很懂
2.设计与分析
-
(1)先分析第一周题目集(结合类图,生成报表内容和题目源代码进行分析)重点分析最后一个大题目
首先最后一题的背景我总结为单卷单答所以设计并没有很复杂,如下
最后一题我设计了三个类分别为问题类(储存题号,题目内容,题目标准答案),试卷类(储存问题列表,问题数目),答卷类(储存判断结果列表,学生答案列表,试卷对象),以下图为我的类之间的关系,
除此之外我设计类之间的方法时,特别考虑了在三个类中都设计一个判题方法,虽然都是判题方法但是并不相同又互相联系,以下可见
public boolean isCorrect(String answer) {
return standardAnswer.equals(answer);
} (1)
public boolean isCorrect(int num, String answer) {
for (Question q : questions) {
if (q.getNumber() == num) {
return q.isCorrect(answer);
}
}
return false;
} (2)
public void judge() {
for (int num : answers.keySet()) {
results.put(num, examPaper.isCorrect(num, answers.get(num)));
}
} (3)
(3)这个判题方法是依次判断题目列表中的每一个题目并把结果存入列表中,并且向上调用(2)这个方法,(2)这个判题方法是在题目列表中找到对应题号的题目以此向上调用方法(1),方法(1)则是将学生答案与标准答案进行比较并返回结果,可以看见这各三个方法是彼此调用的
-
(2)第二周题目集的设计与分析
第二周除最后一题外,我先分析一下第一题,第一题考察了特殊知识点接口,要求该类实现Comparable接口,重写compareTo方法,实现按照price的大小来确定两个手机对象的大小关系,由这个题目我开始学习接口这个知识点,接口(Interface)是一种引用类型,它是方法的集合,或者说是一种契约。接口在Java中是一种非常重要的概念,它允许我们定义对象的行为但不提供具体的实现。接口只声明方法,但不包含方法的实现。具体的实现由实现接口的类来完成。也就是说接口中的方法都是要自己去写的,比如这道题我们需要自己去写compareTo方法。
接下来是对最后一题的设计分析,最后一题相比于答题判题程序-1,题目最主要的变化还是由一张试卷一张答卷变成了多张试卷、多张答卷的信息处理,另外还有试卷中的题目序号与题目本身的题号不一致带来的一些问题,这些都是需要考虑到的,多张试卷多张答卷处理我们是考虑用HashMap特殊类,题目输出顺序我们考虑用新建试卷题目类来处理。
对于这道题呢我设计了题目类(题号,题目内容,标准答案),试卷类(题目数量,题目清单),答卷类(试卷对象,答案列表,判断结果列表),还有新增的试卷题目类(试卷中题目的顺序号,题目对象,题目分值)和答案类(题目对象,学生答案,每一道题的正确性,对应得分)。下图为我的类关系图
-
(3)第三周题目集的设计与分析
在最后一题的分析前我先分析第二题日期类的基本使用,因为写这个题的时候我绕了很大个弯,我自己先设计了自定义的日期类,写到后面才发现哦原来是要用已经存在的类,用了时间类就也可以用这个类中现存的方法,一些对时间的基本处理也可以满足,像这道题里面用了判断日期是否为闰年的方法,两个日期比较的方法,计算两个日期之间差距的方法,判断日期是当年第几天,当月第几天,当周第几天的方法,还有判断日期是否合法的方法。由此可见使用已经封装2好的方法是很方便快捷的,我特地写出来也是为了提醒自己
最后一题的分析设计,最后一题在前两题的基础上学生信息、删除题目信息以及多种异常输入的监测,如答案为空字符、仅有学生信息没有答案内容的空白卷、试卷引用、试题引用错误等。同时也增加了更多信息输入,对信息提取整合的能力要求更高,这一次我不仅和之前一样设计了题目类(题号,题目内容,标准答案),试卷类(题目数量,题目清单),答卷类(试卷对象,答案列表,判断结果列表),还有新增的试卷题目类(试卷中题目的顺序号,题目对象,题目分值)和答案类(题目对象,学生答案,每一道题的正确性,对应得分),还设计了学生类,以下是我的类关系图
3.踩坑心得
这三次题目集由于我个人的水平确实一般所以有很多易错点,大多数我都好好改正保证以后不会再犯了,另外我还提取了几个格外注意的,见下文
- 第一次题目集中最后一题时,我测测试点时第一道题的判断总是错误的,后来我反反复复的看里很多遍,才发现其实时很小很小的错误也就是我存入第一道题标准答案时有多余的空格,即输出如下
5 +5=~10
false
答案后又多余空格导致判断失误,这个错误在切割输入信息时其实时很常见的,后续我把代码改为了answers[1]=answers[1].trim();
通过trim()这个方法就解决了这个问题 - 第二次题目集的最后一题,我一开始的思路是想把每一个答案给编上号,将题号储存在一个数组中然后对数组进行排序最后依次输出,将其分配在对应的答案上,看起来好像不错,但是实际操作非常困难,需要在很多个地方加入方法等,部分代码如下
int j=0;
for(int i=0;i<nums.length;i++)
{
int h=nums[i];
for(j=i-1;j>=0;j++)
{
if(h>nums[j])
{break;}
else
{
nums[j+1]=nums[j];
}
}
nums[j+1]=h;
}
for(int i:AnswerSheets.keySet())
{
for(int n=0;n<nums.length;n++)
{
AnswerSheets.get(i).getAnswer(n+1,nums[n]);
}
}
这是最关键部分的代码了但是实际操作远远比这个复杂,最后我选择创建试卷题目类,这样就可以顺利解决了
3.由于我第二次题目集最后一个大题目是在第一次大题目的基础上进行修改的,第一次题目是单张试卷,而第二次题目是多张试卷,我选择了使用HashMap来进行处理,然而仍然出现了问题,第一次题目我在代码一开始就创建试卷对象,之后题目对象可以加进去,但是第二次题目我只有在识别到试卷信息的时候才创建试卷对象,这导致题目对象不能马上加入试卷中,最后我考虑在所有信息读取完毕之后将题目遍历输入对应试卷,这样的处理很繁琐复杂,所以我仍在考虑别的处理方法,代码如下
Iterator<Map.Entry<Integer, ExamPaper>> iterator =exampapers.entrySet().iterator();
while(iterator.hasNext()){
Map.Entry<Integer, ExamPaper> entry = iterator.next();
for(int num:questionss.keySet()){
if(entry.getValue().getQuestion(num)!=null)
entry.getValue().addQuestion(questionss.get(num));
}
}
4.前三次大题目中都有一步时对输入数据进行分析,我一开始采用的是字符串分割,但随着数据越来越复杂,使用这个变得很困难,代码也变得繁琐难懂且经常非零返回,如下
//重新写过
// for(int i=0;i<Qnum;i++)
// {
// String line=scanner.nextLine();//先读取
// String[] parts=line.split("#");//初步分割
// String numberPart = parts[0].substring(2);
// String questionPart = parts[1].substring(2);//substring是除去最前面字母索引部分的
// String answerPart = parts[2].substring(2);
// int number = Integer.parseInt(numberPart.trim());
// String content = questionPart.trim();
// String answer = answerPart.trim();//这里还除了空白格
// Question question=new Question(number, content, answer);//利用以上信息创建新题目对象
// examPaper.addQuestion(question);//将其添加到试卷对象中
// }
我之后选择使用正则表达式,代码变得较简单起来,如下
(代码已隐藏)
4.改进建议
1.类设计的更为清晰简练,像本次作业我很多类设计了方法但又没有使用,这样降低了代码的可读性和美观,很拖沓
2.使用更高效的方法,像本次作业大题目我一开始考虑用动态数组来储存多张试卷答卷,这样不会有错但是并不方便,后来我改用了HashMap来储存,键存的是试卷号等等,这样查找起来更方便快捷高效 - 错误处理和异常管理,合理地处理潜在的错误情况,避免程序崩溃。使用异常来处理异常情况,而不是返回错误代码。(崩溃无数次非零返回无数次了
5.总结
通过本三次作业集我学会了类的基本设计,类之间的关系设计,类接口,输入数据分析分割(正则表达式),已封装类的使用等等,仍需学习改进的部分是对HashMap特殊类的使用,这部分我并不熟练,与此同时在分析数据时经常碰到的空格问题也需要进一步去解决,因为经常导致非零返回。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)