前三次大作业总结

*首先,我建立了Ques问题类,Test试卷类,anscard答题卡类,Student学生类

Ques:num,ques,ans,pd(题目的对错),fen1(分数),fen2(所得的分数),y(题目的状态)。
Test:num2,List<Ques>l,sum(总分)。
anscard:num3,man(学号),List<Ques>card。
Student:name,num;

*建立listQ,listT,listC用于储存多张试卷,答题卡和题目

*利用for循环读取信息

*利用正则表达式进行判断
试卷:"#T:[0-9]+(\\s+[0-9]+-[0-9]+)*"
题目:"#N:[0-9]+\\s+#Q:.+\\s+#A:.+"
答卷:"#S:[0-9]+\\s+[0-9]+(\\s+#A:[0-9]+-.*)*"
学生:"#X:([0-9]+\\s+\\w+-)*([0-9]+\\s+\\w+)"
错误:"#D:N-(.+)"
只有符合以上的几种格式才可以进入录入信息

* 将题目储存在新建一个Ques中,在保存到listQ中

* 将试卷储存在新建的一个Test中,并标记试卷序号,在用split函数将后续的题目序号和分值分割,依次储存到String组中,在进行储存到Test的题目List中,储存题目时寻找题目,如果listQ中没有题目,y赋值成2,如果有录入题目,并将分值同时进行录入,同时记录总分sum,并且在录入试卷就输出试卷的总分信息情况。

* 将答卷储存到新建的Card中,用正则表达式将序号和学号分开,再用split函数将题目的顺序号和答案分别储存,这里有一个坑就是,Card中的顺序是试卷题目的顺序,这个困扰了我好久,而且题目中还没有说清,我就更加迷糊了。

* 学生信息的储存较为容易,也是使用正则表达式,同时使用数组,List作为桥梁,进行保存。

* 删除信息时,我将ListQ,ListT,中的题目内容都进行了修改,修改成“noQues”“noQues”这样的形式,对于之后的判断,判断答案或问题是否是“noQues”,再输出“no expection...”就行了。

* 信息的输出还是比较重要,我在上面花了大量的时间,但是最后还是没能理解一些格式上输出的问题,比如:问题末尾用空格的时候,我们应该是使用trim()函数进行省略,还是不省略呢,trim()函数会省略整个字符串左右的空格,经过和同学探讨,并验证了其他学生的AC代码,我觉得是要求使用trim()的。本人在输出的时候也踩了很多坑,比如输出的题目答案信息和赋分信息都是答卷的顺序,浪费了很多时间在这上面。

* 同时我还在标志时踩了一些坑,在题目没有被使用也就是没被引用的时候,状态赋值y都是1(为空),输出“answer is null”(输出的满足条件是答题卡中没有该题目的答案且答案和序号都没有),接下来的试卷接受题目过程中,如果题目根本不存在,那么就赋值为2(不存在),输出“no expection...”,接下来的删除过程中,y就赋值为3,此时输出类似“the question 2 invalid~0”这样的信息。本人觉得最不好赋值的就是“answer is null”这种情况,因为这个也浪费了很多时间。

* 在录入自己答案的时候,同时进行了比较,和分数的赋值(fen2),在输出的时候将fen2进行相加,就可以得到每位同学的总分啦

**3.关于题目的心得**
ps:这道题写了两遍,都是一Main到底的结构,第二次考虑使用了一点函数,但是对于我这种菜鸟来说简直是不怎么简单,看了别的同学的AC代码后,我也简单反思一下,以后做题要先列出大致的方向与思路,其次就是一定一定要看懂题目,否则就会写成像这道题一样的一锅粥~
第三次作业还是没有做得很完美,测试点没有完全AC,这对于接下来的第四次大作业有很大的困难,但是我还会继续改进我的错误。
接下来展示一下我的类的结构
![](https://img2024.cnblogs.com/blog/3432803/202404/3432803-20240421191516081-678689237.png)

可以看出我的这些类比较单一,简单,思考可以增添的函数,将主函数中的类似
If(matcher.find())的这样的结构分割成settimu();setTest();setCard();。。这样的函数,这样一来,主函数就能进行简单的化简!
在写代码的过程中,帮助我最大的就是调试了,我用的是IDEA的编译器,调试为我解决了很多思路上的难题,纠正了大多数的错误,简直不要太香!
**4.一些额外的思路**
在之前的思路中,我还想到了根据Test的试卷序号给Test排序这样的方法,如下我使用了Comparator的接口,后来发现没必要,但是也学到了。

class NumComparator1 implements Comparator {
@Override
public int compare(Test p1, Test p2) {
return p1.getNum1() - p2.getNum1();
}
}


同时我还想到了冒泡排序这样的方法:

public void paixu(List card){
int n = card.size();
for (int i = 0; i < n - 1; i++) {
for (int j = 0; j < n - i - 1; j++) {
if (card.get(j).getMynum() > card.get(j + 1).getMynum()) {
// 交换相邻元素
myAns temp = card.get(j);
card.set(j, card.get(j + 1));
card.set(j + 1, temp);
}
}
}
}

**ps:**最后一题我想也可以没有myans类,这样只使用Ques类,保存题目列表和答题卡和试卷的题目(因为都有Ques,ans,num这样的结构,Ques是一个通用的类),在保存到ArrayList中,在进行访问输出就可以了。(仅代表个人观点)

这是提交的代码有一部分的测试点还没有通过
![](https://img2024.cnblogs.com/blog/3432803/202404/3432803-20240421171616334-442564693.png)
其中包含一些当格式错误时的信息还没有找到,和最后两个乱序输入的测试点,之前出现过非零返回的错误,老师说是程序上的错误,具体的解决办法还没有找到QAQ,所以接下来的任务就是解决这问题。

**5.主要使用的工具**
1. csdn网站:学习几乎全靠它
2. 菜鸟代码检测工具:正则表达式的检验

**6.我的总结**
* 首先,这三次pta大作业让我深刻感受到了JAVA的便利和题目难度,建立类相比于C语言的结构体而言确实实用且方便了不少,对于新手而言,的确有一定的难度。

* 同时我也学会了如何正确使用Java类和类之间的互相使用,同时,类中还可以放一些其他的结构(ArrayList,Hashmap...),使数据的访问和保存的复杂度减少。

* 还有就是题目一定要看仔细,否则就会出现重写的情况,那就完了。

* 出现了bug怎么办:帮助我最大的就是调试了,它将我所有的数据信息全部显示出来,更加方便我寻找并更改逻辑上的错误,使我的代码准确性更高,具体如图:
![](https://img2024.cnblogs.com/blog/3432803/202404/3432803-20240421195706132-381751897.png)

* 题目中我认为最重要的就是正则表达式,它十分的方便,同时使用split(),trim()函数使我保存信息更加的方便。
总而言之想要做好必须要花出大量的时间,第三次作业没做好,要有一定的耐心,我们一起加油吧!
posted @ 2024-04-21 20:15  孙睿晗  阅读(29)  评论(0)    收藏  举报