一、前言
1、第一次作业:大作业是答题判题Java程序编写,说实话,还是比较懵的,主要是多个类之间,什么方法应该放在哪个类挺模糊不清的,还有各种技巧,比如字符串截取,数组等,自己把视频看了很多遍。
2、第二次作业:第二次作业就一点吧尽量避免代码的重复,把private和public的方法搞清晰点。
3、第三次作业:写的非常难受,至今没得满分,其中乱序输入还是很烦人的,很多测试点过不了关。正则表达式掌握也不牢。还有就是public和private相关的封装性的问题吧,下面分析一下三次作业。
总的来说,难度还是很大的,但也确实提高了自己的能力,很多知识一知半解没掌握的很好,还要多多学习。
二、分析
设计与分析:对于这三次作业的架构,总共是设定了五个大类,分别是:
1、题目类(Question)
2、试卷题目类(Question_Paper )
3、试卷类(TestPaper)
4、答案类(Answer 新增)
5、答卷类(AnswerPaper)
注意Question_Paper是因为试卷中的题目序 号与题目本身的题号不一致而按题目来设计,也是借鉴了老师的设计思路,比我的清晰多了。而答案类和题目类分别是用于保存答卷中一道答案的信息和保存一道题目的信息以及处理的方法。
第一次作业:
for (int i = 0; i < n; i++) {
// 读取下一行作为当前题目的字符串表示
Qstr[i] = input.nextLine();
// 使用正则表达式按照特定分隔符分割题目字符串
splitArr = Qstr[i].split("\\s*#N:\\s*|\\s*#Q:\\s*|\\s*#A:\\s*");
// 从分割后的子串中提取题号、内容和标准答案
numArr[i+1] = splitArr[1];
contentArr[i] = splitArr[2].trim();
standardAnswerArr[i] = splitArr[3].trim();
// 根据提取的信息创建一个Questions对象,并将其添加到数组中
questions[i] = new Questions(Integer.parseInt(numArr[i+1]), contentArr[i], standardAnswerArr[i]);
}
// 初始化一些变量,包括用于临时存储和最终结果的数组
2String str1 = " ";
3String str2 = " ";
4String[] splitSstrArr = new String[countN+2];
5String[] sheetAnswerNum = new String[countS]; // 用于存储每张答卷的编号
6String[] numbersAndEquations = new String[0]; // 临时存储数字和算术表达式
7SheetAnswerPaper[] sheetanswerpaper = new SheetAnswerPaper[countS]; // 结构化答卷对象数组
8String[] numIds2 = new String[numids.length];
9
10// 遍历输入字符串数组 Sstr 的每一个元素
11for(int i=0; i<countS; i++) {
12
13 // 清理不必要的前缀字符
14 Sstr[i] = Sstr[i].replaceAll("#S:|#A:", "");
15
16 // 使用空格分割字符串
17 String[] parts = Sstr[i].split("\\s+");
18
19 // 遍历分割后的每个部分
20 for (String part : parts) {
21 // 检查该部分是否为数字或包含减号(假设代表数学问题)
22 if (part.matches("\\d+") || part.contains("-")) {
23 // 扩展 numbersAndEquations 数组,并将当前 part 添加进去
24 String[] newArray = new String[numbersAndEquations.length + 1];
25 System.arraycopy(numbersAndEquations, 0, newArray, 0, numbersAndEquations.length);
26 newArray[numbersAndEquations.length] = part;
27 numbersAndEquations = newArray;
28 }
29 }
30
31 // 提取第几张答卷的编号(例如 "#S:1" 中的 "1")
32 sheetAnswerNum[i] = numbersAndEquations[0];
33
34 // 提取与答卷编号相关联的其他ID(例如 "#A:1-5" 中的第一个部分)
35 numIds2[i] = numbersAndEquation[1];
36
37 // 分离出答题编号和具体答题范围
38 String[] sheetAnswernum = new String[numbersAndEquations.length-2];
39 String[] sheetAnswer = new String[numbersAndEquations.length-2];
40
41 // 遍历剩余的数字和算术表达式部分
42 for(int j=0; j<numbersAndEquations.length-2; j++) {
43 // 分割 "-“ 符号前后的部分
44 sheetAnswernum[j] = numbersAndEquations[j+2].split("-")[0];
45 sheetAnswer[j] = numbersAndEquations[j+2].split("-")[1];
46 }
47
48 // 对 sheetAnswernum 和 sheetAnswer 进行排序,保证答题编号有序
49 for(int m=0; m<numbersAndEquations.length-2-1; m++) {
50 for(int n=0; n<numbersAndEquations.length-2-m-1; n++) {
51 // 若当前编号大于下一个编号,则交换它们及其对应的答题范围
52 if(Integer.parseInt(sheetAnswernum[n]) > Integer.parseInt(sheetAnswernum[n+1])) {
53 str1 = sheetAnswernum[n];
54 sheetAnswernum[n] = sheetAnswernum[n+1];
55 sheetAnswernum[n+1] = str1;
56
57 str2 = sheetAnswer[n];
58 sheetAnswer[n] = sheetAnswer[n+1];
59 sheetAnswer[n+1] = str2;
60 }
61 }
62 }
63
64 // 确保 sheetAnswer 数组长度至少为 countN,如果不足则补充空字符串
65 if (sheetAnswer.length < countN) {
66 String[] newSheetAnswer = new String[countN];
67 System.arraycopy(sheetAnswer, 0, newSheetAnswer, 0, sheetAnswer.length);
68 Arrays.fill(newSheetAnswer, sheetAnswer.length, countN, "");
69
70 sheetAnswer = newSheetAnswer;
71 }
72
73 // 创建一个 SheetAnswerPaper 对象并将相关信息封装其中
74 sheetanswerpaper[i] = new SheetAnswerPaper(
75 Integer.parseInt(sheetAnswerNum[i]), // 答卷编号
76 sheetAnswer.length, // 答案个数
77 sheetAnswer, // 答案范围数组
78 sheetAnswernum, // 答题编号数组
79 numIds2[i] // 关联ID
80 );
81}
这段代码算是代表性比较高了,这段代码首先对输入字符串进行解析,提取出每张答卷的相关信息,然后将这些信息整理成有序的数组,并根据需要调整数组长度。最后,利用这些信息创建了一个结构化的 SheetAnswerPaper
对象数组,以便进一步管理和操作这些答卷数据。
三、踩坑心得
1、if else要少用,耦合度尽量要低
2、尽量避免代码的重复,把private和public的方法搞清晰
3、优化部分的设计有潜在问题,比如数组变换之类的
4、基础知识要打牢,这次编写作业很多基础知识掌握不过关
5、要遵守Java编程规范,如命名规范、缩进、空格等,使得代码更易读,也更容易被维护。这三次作业确实空格这方面把握不是很好,所以感觉很乱。
四、总结
总的来说,这三次代码编写还是没达到预期的,因为难度较高,自己的基础知识不好就导致编写起来比较困难
学习到的知识清单:正则表达式,类与方法,继承与多态,抽象类与接口(学了一点),数组,字符串,面向对象封装等
建议:可以多来几个小的面向对象题目,题目可以按知识点进行专项突破,也可以让我们更加理解和会运用面向对象思想。