前言
-
知识点
1.前三次大作业之后,学习到继承这一特征,第四次大作业开始使用继承了,但基础的数据存储结构我使用的还是HashMap,这个还是使用得比较得心应手。这道题中正则表达式的使用是最多的,因为有错误匹配以及多种信息提取的需要。
2.第五次大作业除继承外,还使用了多态这一特征。这题要求的实现不是很困难,因此代码没设计很复杂的结构,数据存储很简单,不用进行错误输入判断,也只用了简单的正则表达式。
3.这道题涉及的知识点其实仍是之前的继承、多态、正则表达式、HashMap、ArrayList等,但继承、多态的使用更有分量,如果说第五次只是简单几个,这次就更多结合题目设计,更为规范。
-
题量
第四次大作业和第五次大作业都是一道较难题+两道简单题的配置,第六次大作业只有一道困难题,这三次总体花费时间是差不多的,简单题不用花费什么时间,主要还是程序题花的时间多。
-
难度
1.在我看来,第四次大作业的总体难度要低于第三次大作业,虽然第四次大作业迭代在第三次的基础上添加了多选题和填空题,但每种题型相应的测试点也减少了,因此我第三次大作业没能AC,而第四次大作业AC了。
2.第五次大作业因为是一次全新的迭代,题目也因此较为简单,因为限制条件不多,只是简单的一条无电阻的串联电路,所以我设置的不是很规范就AC了。
3.第六次大作业的难度在于并联电路的添加,需要根据各元件电阻计算各元件分得电压,也因为我第五次大
作业纯图省事,有很多不适用于此次大作业的设计,几乎相当于重写了。
设计与分析
踩坑心得
-
第四次大作业
做第四次大作业迭代时才发现一个第三次大作业中很大的bug,就是只对应给出的测试样例中的错误输入做了错误输入判断。
以下是我第三次大作业中的输入操作
点击查看代码
if(mat.find())//题目信息
{
Qcount = Integer.parseInt(mat.group(1));
Question Qclass = new Question(mat.group(2),mat.group(3));
q.put(Qcount, Qclass);
}
else if(line.startsWith("#T:"))//试卷信息
{
Pcount++;
if(mat1.find())
Pnum = Integer.parseInt(mat1.group(1));
Paper Pclass = new Paper(Pnum);
// 匹配题目编号和分值
while (mat3.find()) {
Qisexit = true;
Tcount++;
Tnum = Integer.parseInt(mat3.group(1));
if(q.get(Tnum)==null)
Qisexit = false;
Pclass.add(Tnum,Integer.parseInt(mat3.group(2)),Qisexit,Tcount);
}
p.put(Pcount, Pclass);
}
else if(line.startsWith("#S:"))//答卷信息
{
Sisexit = true;
Pisexit = true;
Acount++;
if(mat2.find())
{
Anum = Integer.parseInt(mat2.group(1));
sid = Integer.parseInt(mat2.group(2));
}
if(p.get(Anum)==null)
Pisexit = false;
if(s.get(sid)==null)
{
Sisexit = false;
}
Answer Aclass = new Answer(Anum,mat2.group(2),Pisexit,Sisexit);
while(mat6.find())
{
Dcount++;
Aclass.add(Integer.parseInt(mat6.group(1)),"");
}
while (mat3.find())
{
Dcount++;
Aclass.add(Integer.parseInt(mat3.group(1)),mat3.group(2));
}
a.put(Acount, Aclass);
}
else if(line.startsWith("#X:"))//学生信息
{
while(mat4.find())
{
Snum = Integer.parseInt(mat4.group(1));
Student Sclass = new Student(mat4.group(2));
s.put(Snum, Sclass);
}
}
else if(mat5.find())
{
q.get(2).Delete();
}
else
System.out.println("wrong format:"+line);
line = in.nextLine();
这是第四次改进后的
if(matN.matches())//答案唯一题
isNQuestion(line,patN);
else if(matZ.matches())//多选题
isZQuestion(line,patZ);
else if(matK.matches())//模糊选项题
isKQuestion(line,patK);
else if(matT.matches())//试卷信息
isPaper(line,patT,patF);
else if(matS.matches())//答卷信息
isAnswer(line,patS,patA,patF);
else if(matX.matches())//学生信息
isStudent(line,patXF);
else if(matND.matches())//删除
isDelete(line,patND);
else
System.out.println("wrong format:"+line);
可以看出,第四次相比之下,不仅if-else内的操作减少了,也避免了我第三次中忽略了错误输入,使用了startsWith()函数而不是与正则表达式匹配的情况。
-
第五次大作业
- 没能仔细看清题目要求,题目中要求以浮点数计算后仅保留整数部分,我一开始时使用的是String.format(),这是四舍五入保留整数的函数,后来改成了(int)强制转换,计算更加精确了。
- 没考虑到只有单个电器的情况,而是后续检测到有开关且都闭合的情况下才使电路闭合可流通,后面改成了一开始就可以闭合除非检测到开关断开的情况就改电路断开。
-
第六次大作业
- 第一次提交只有6分,也就是只过了题目给出的三个测试点,后面发现是忘记加新迭代的落地扇。加上之后就到了57分。
- 后面找了室友一起找bug,发现一种开关情况判断有问题,改完这一个后就到94分。
- 最后的两个测试点还是和室友一起找出来的,发现是一个浮点数计算上的问题,改完就AC了。
改进建议
代码设计可以更贴切单一职责、开闭原则。
总结
-
收获
1.对继承和多态的运用更加熟练了
2.学会了多种对字符串的操作
3.对单一职责的了解更加深入,使用更加灵活。
4.设计思路得到提升,对类的分工更为明确。 -
意见