一:前言
本次题目集1~3共12题,涉及到了正则表达式,Calendar类的使用,Linkedlist类的使用等,对于我这个刚接触java没多久的小白来说,1~3的最后一题难度颇高。
二:设计与分析
第一次作业:
解释:从题目给的字符串中提取出题目(包括题号,题目内容,标准答案)和答案,并且问题与答案是一对一的关系。
心得:第一次作业比较简单,一开始做的时候没注意到要题目给的设计建议,所以没去设计相应的类,但是还是很好做的,但是这对之后的作业有不好的影响。从这题开始,我开始学会了正则的应用,也体验到了正则表达式对于字符串的处理的强大。
第二次作业:
解释:从题目给的字符串中提取出题目(包括题号,题目内容,标准答案),试卷(包括试卷号,题号,分值)和答卷(包括答案内容,试卷号)。题目与试卷是多对多的关系(一个题目可以在多张试卷中,一张试卷可以包含多个题目),题目与答卷是多对多的关系(一个题目可以出现在多张答卷中,一张答卷可以有多个题目的答案),试卷与答卷是一对多的关系(一张试卷可以对应多张答卷,一张答卷只能对应一张试卷)。
心得:这里要处理好这三个类之间的关系,不然代码写到后面会很乱,并且会让第三次作业写的非常艰难(我已经中枪...),这里对于题目的提取最好用到HashMap,可以让后续的比较,问题与答案的匹配,问题内容的打印更方便。
第三次作业:
解释:从题目给的字符串中提取出题目(包括题号,题目内容,标准答案),试卷(包括试卷号,题号,分值),答卷(包括答案内容,试卷号,学号,题目序号),学生(包括姓名,学号)和删除的题目。题目与试卷是多对多的关系(一个题目可以在多张试卷中,一张试卷可以包含多个题目),题目与答卷是多对多的关系(一个题目可以出现在多张答卷中,一张答卷可以有多个题目的答案),试卷与答卷是一对多的关系(一张试卷可以对应多张答卷,一张答卷只能对应一张试卷),学生与答卷是一对一的关系(一张答卷对应一个学生,一个学生对应一张答卷)。
心得:在写代码前,提前构思好类与类之间的关系十分重要,因为第二次作业,我的类与类之间的关系没有设计好,改一处代码,其他代码的效果也会跟着改,导致我第三次作业写的举步维艰。
三:踩坑心得
第一次作业:
1.字符串的比较用了“==”,源码如下:
for (int i = 0; i < num; i++) { for (int k = 0; k < num; k++) { String number = String.valueOf(i+1); if(str1[k][0].trim()==number){ System.out.println(str1[k][1].trim()+"~"+str2[i]); } } } for (int i = 0; i < num; i++) { for (int k = 0; k < num; k++) { String number = String.valueOf(i+1); if(str1[k][0].trim()==number){ if(str1[k][2].trim()==str2[i].trim()){ System.out.print("true"); } else{ System.out.print("false"); } if(i<num-1){ System.out.print(" "); } } } }
导致了程序运行没有结果
2.在比较字符串是没有将空格删去,导致了一些测试点出差,源码如下:
for (int i = 0; i < num; i++) { for (int k = 0; k < num; k++) { String number = String.valueOf(i+1); if(str1[k][0].equals(number)){ System.out.println(str1[k][1].trim()+"~"+str2[i]); } } } for (int i = 0; i < num; i++) { for (int k = 0; k < num; k++) { String number = String.valueOf(i+1); if(str1[k][0].equals(number)){ if(str1[k][2].equals(str2[i])){ System.out.print("true"); } else{ System.out.print("false"); } if(i<num-1){ System.out.print(" "); } } }
在字符串比较时加上trim方法去掉两端的空格后程序正常
第二次作业:
类与类的关系设置的不当,导致类与类之间的关系混乱,逻辑混乱,循环,选择结构嵌套的太深,导致代码写着写着自己都不认识了,例如下面一段源码:
for (int i = 1; i <= countT; i++) {
for (int j = 0; j < countT; j++) {
if (Integer.parseInt(papers[j].score[0])==i){
for (int k = 0; k < countS; k++) {
if(Integer.parseInt(answersheets[k].answer[0])==i){
missing = 1;
int m = 1;
int n = 1;
while(papers[j].score[m]!=null){
if(m%2==1){
for (int l = 0; l < countN; l++) {
if (Integer.parseInt(papers[j].score[m])==papers[j].titles[l].tnumber){
if(answersheets[k].answer[n]!=null) {
System.out.print(papers[j].titles[l].question + "~" + answersheets[k].answer[n]);
if(answersheets[k].answer[n].equals(papers[j].titles[l].standardAnswer))
{
System.out.println("~true");
count[c] = Integer.parseInt(papers[j].score[m+1]);
}
else{
System.out.println("~false");
count[c] = 0;
}
c++;
n++;
}
else{
System.out.println("answer is null");
c++;
}
}
}
}
m++;
}
}
int sum = 0;
int flag = 0;
for (int x = 0; x < c; x++) {
sum = sum+count[x];
System.out.print(count[x]);
if(x!=c-1){
System.out.print(" ");
}
flag=1;
}
if (flag==1) {
System.out.println("~" + sum);
}
for (int x = 0; x < c; x++) {
count[x] = 0;
}
c=0;
}
}
}
if(missing == 0){
System.out.println("The test paper number does not exist");
}
}
第三次作业:
继第二次作业的问题,在设计类和题目的主体结构时,没有遵循迪米特法则和单一职责,导致第三次作业在第二次作业的基础上增加内容时,修改一处的代码,其他处的代码的执行效果也会跟着修改,导致整个程序越改越乱,最后只能从头设计题目的主体结构。
四.改进建议:
利用HashMap来存储题目对象,试卷对象,答卷对象,学生对象,在利用ArrayList存储HashMap。
五.总结:
因为在写这三次作业之前,我没有花时间去构思其主体结构,导致代码逻辑十分混乱,代码质量很差,所以,在下次作业当中,我一定会花时间去构思好主体结构,设计好类与类之间的关系,尽量去遵守迪米特法则和单一职责。虽然本次作业做的不好,但是我仍然学到了正则表达式,HashMap等好用的知识点,但是对于如何设计类的能力我还要好好去努力。