OOP第一次Blog
本次Blog总结前三次作业的心得和体会
**前言:前三次PTA作业整体难度不算很大,题量也一般,但是运用的知识点还是挺多挺杂的。
第一次:没用到什么繁琐的知识点,初步见识到类之间的关联性和耦合性,难度不大,但是比较考验耐性。
第二次:开始接触接口,用接口辅助排序,最后一道题在第一次的基础上进行了迭代,我引入了Linklist类,可以更好地操作。
第三次:这次比较考验类的封装性,最后一题经过两次迭代,类与类之间的关系更加复杂,有几个测试点没有过。
**设计与分析:
首先第一次题目都比较简单其他的都是最基本的类的构建,分析一下最后一题吧,第一次最后一题,我构建了三个类
题目类(用于封装单个题目的信息):
属性:题目编号、题目内容、标准答案-standardAnswer
方法:数据读写set\get方法、
判题方法(答案-answer):判断答案-answer是否符合标准答案-standardAnswer
试卷类(用于封装整套题目的信息)
属性:题目编号,试卷编号,题目分值
方法:判题方法(题号-num、答案-answer):判断答案-answer是否符合对应题号的题目标准答案-standardAnswer
保存题目(题号-num、题目-question):将题目保存到题目列表中,保存位置与num要能对应
答卷类(用于封装答题信息)
属性:试卷(试卷类的对象)、答案列表(保存每一题的答案)、判题列表(保存每一题的判题结果true/false)
方法:判题方法(题号-num):判断答案列表中第num题的结果是否符合试卷中对应题号的题目标准答案
输出方法(题号-num):按照题目的格式要求,输出题号为num的题目的内容和答题结果。
保存一个答案(题号-num,答案-answer):保存题号为num的题目的答题结果answer。
由于第一次这种题目,对java的封装性还是很好的掌握,写题目是破坏了类与类之间的关系。
我在答卷中搜索对应题目时,我把所有的题目都遍历了一遍,没有将这道张卷子的题目取出来
就像下面这样
我开了一个Linklist类保存所以分数,我挨个检查所以题目找到对应的编号,比较答案,然后输出。
这是很麻烦的一种做法。
但是最后也是把所有测试点过了,也没有太大问题。
然后是第二次作业,这次作业第一题我接触到了接口,用来自定义排序方式
从而达到降序的目的。
然后分析这次作业的最后一题,在第一次的基础上进行了迭代,但是改变不算很大,我没有新加类,所以简单说一下哪些改变。
这次可能会有多张答卷和试卷,所以为了我采用LinkList类型保存答卷和试卷。
使用while死循环多次输入直到end,每次分别加入对应的链表中。
然后又改变这次试卷中题目的顺序,但是这个改变没有影响,因为本就是从小到大的遍历,但是有一点不一样,题目顺序可能有空缺。
例如,1,2,4没有3。这是合法输入。
所以我在Test(试卷类)中将题目序号用LinkList类保存,排序。
这道题之后也和上次差不多了。
最后是第三次作业,这次作业第二题,学习到了日期类的基本使用方法。
创建日期对象:Date date = new Date();
格式化日期:SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");,然后使用sdf.format(date)进行格式化。
日期比较:date1.compareTo(date2),返回值表示date1和date2之间的差异。
日期计算:date1.getTime() - date2.getTime(),返回两个日期之间的时间差(以毫秒为单位)。
其他也没什么难度。
然后第三次作业最后一题,就非常让人崩溃,我这道题有几个测试点没有过。
本次新加了一个类
Student(学生类)
属性:学号,姓名。
方法:检查学生是否存在,返回String类型。
本次输入信息中引入了一种新的信息,删除信息,用LinkList类型保存了所以删除的题目。
并在题目链表中删除。
然后答卷类中也新加入了学号的新属性(String类型)
并且添加检测学号是否存在的方法、
然后还加入了错误格式检测,有多中错误格式,用正则表达式一一比对即可
String[] regex = { "^#N:\d\s#Q:.#A:.",
"^#T:\s\d+\s((\d+\s-\s\d+\s)+)$", "^#S:\s\d+\s\d+\s(.?)$",
"^#X:\s\d+\s(.?)+(?:-\d+\s(.?)+)$", "^#D:\sN\s-\s\d+\s*$", };
然后和上次一样进行遍历比对,过程比较繁琐。
根据试卷的题目顺序,在答卷中遍历查找答案,如果没有则输出相应提示,
然后根据优先级查找问题是否被删除,如果没有就比对答案,添加分数。
如果问题被删除加入0分,输出提示。
但是最后的最后还是有三个测试点没有过去。
**踩坑心得:
正则表达式多次匹配错误,题目说的比较模糊,导致我写正则表达式时多次错误。
导致匹配失败。
例如:
"#N:(.)#Q:([ a-zA-Z0-9])#A:(.)"
"([0-9]+)[ ]([a-zA-Z]*)"等都是匹配失败案例。
java中想要多行输入,nextInt()与nextLine()
千万千万千万不要同时使用,很可能会报错,如果要输入数字,先用String类型接收,之后转化为int类型。
多次循环过后,循环数弄反了。这是一个很崩溃的错误,因为非常难找。
好几百行代码中找这种错误真的很绝望。
例如:
逻辑错误,推荐写大作业之间用笔写下自己的逻辑和思路,不然纯靠自己脑子记住真的很容易逻辑出错,忽然混淆,java代码本身就比较繁琐,
逻辑错误就会导致之间退出代码或者无法访问。
例如:
**改进建议:
第三次作业可以通过新加一种类来优化代码
试卷题目类(Question_Paper):用于保存试卷中的题目信息。
由于试卷中的题目序号与题 目本身的题号不一致。且题目在不同试卷中的分值可能不一样,因此,设计试卷题目类。
int p_q_num;//试卷中题目的顺序号
Question question;//题目类的对象,保存题目信息
int question_score;// 题目分值
int judge_markAnswer(String answer) // 判断题目得分
这样保存了试卷与题目的关系,就不需要每一次都从所有题目中遍历。
另外还可以使用HashMap类型保存试卷中对应编号和分数,也可以简化代码。
以提高代码的质量和性能。
**总结:
对面向对象编程(OOP)概念理解加深了,Java是一种面向对象的语言,通过这三次作业,更深入地理解类、对象等概念。
然后代码组织与结构的能力增强,编写大型Java程序需要良好的代码组织和结构。
会学习如何使用接口、类组织代码,以及如何使用注释来提高代码的可读性。
调试能力提高,调试是开发过程中不可或缺的一部分。学会如何使用调试工具和技巧来定位和修复代码中的错误。
还学会了许多类的使用例如LinkList,ArraysList,HashMap等等。
然后是一些建议:
第三次的作用最后一题,仅仅是一张答卷,可以添加多张答卷,更符合实际。
之后的PTA作用可以加入一些算法数据结构的知识,促进我们自学,这几次作用都没有什么算法知识。
可以加入更多关联实际的题目,增强对面向对象的理解。