OOP1-3次作业
OOP1-3次作业
一.前言:
1.第一次PTA:
①题目理解:
第一行匹配一个数字,这个数字是给出题目的个数,#N代表给出的题目样式,#A代表你给出的答案,然后以end结尾。
②知识点:
一·用正则表达式的匹配(split函数的使用);
二·如何Java中创建一个二维数组,或者一维数组;
三·Java中如何将int型转化成String类型(valueOf,Integer.paseInt);
四·在方法中创建一个对象的实例,要放在构造方法里面;
③题量:
正常;
④难度:
正常;
2.第二次PTA:
①题目理解:
相对于pta1,他多加了试卷信息,并且多加了很多错误提示,他的输入可能是不按顺序的,三种信息的打乱混合输入,所以加强了对正则表达式的应用。
②知识点:
1·正则表达式去匹配一个字符串,如何去分组获得其内容;
2·Arroys.copyOf()函数的使用,获取下一次的时候应当在new一个对象,否则会将部分数据覆盖,或者其先扩增一个单位在进行复制;
3·trim()函数的使用
4·去除匹配字符串数组的的null
5·相关的逻辑
6·如何去重写一个函数toString()
③题量:
我觉得正常,就是大概每个星期自己做,差不多一个星期可以做完,但是有时候一直有的点过不去,就一直卡着;
④难度:
正常;
3.第三次PTA:
①题目理解:
增添了学生信息和删除题目信息这样造成了我们要去匹配学生信息,然后找到了这个学生信息,然后在匹配的题目里要先在删除信息里查找到信息,然后去匹配。
②知识点:
1·日期函数的使用:能直接返回开始时间到末尾时间的天数
2·我们可以那个数组去保存我们的得分。
③题量:
还好。
④难度:
偏大,感觉题目叙述的没有很清楚。
二.内容:
1.第一次PTA:
①题目简介:
设计实现答题程序,模拟一个小型的测试,要求输入题目信息和答题信息,根据输入题目信息中的标准答案判断答题的结果。
输入格式:
程序输入信息分三部分:
1、题目数量
格式:整数数值,若超过1位最高位不能为0,
2、题目内容
一行为一道题,可以输入多行数据。
格式:"#N:"+题号+" "+"#Q:"+题目内容+" "#A:"+标准答案
格式约束:题目的输入顺序与题号不相关,不一定按题号顺序从小到大输入。
3、答题信息
答题信息按行输入,每一行为一组答案,每组答案包含第2部分所有题目的解题答案,答案的顺序号与题目题号相对应。
②内容实现:
class Title保存题目信息,之后可以在questionpaper类中去创建数组去得到这些信息;
class AnswerPaper保存题目的分数,和相关的位置。
class QuestionPaper保留题目信息和保留题目分数去匹配,如果成功就会保存题目所得到的分数。
③踩坑心得:
一.
输入样例6:
含多余的空格符。例如:
1
#N:1 #Q: The starting point of the Long March is #A:ruijin
#A:ruijin
end
i=0;
for(i=0;i<retval.length-1;i++) {
title[i] = new Title(retval[i][1], retval[i][2].trim(), retval[i][3]);
// System.out.println(title[i].number + " " + title[i].content + " " + title[i].standardAnswer);
}
他想表达的意思是要把题目中的多余的空格全部去除,所以应用trim()函数,然后就过了。
二.
我们想在方法里去保存这个题目是对的还是错的,所以我们创建了一个dc数组,去保存,一开始我去写在外面,但是会报错因为构造方法是初始化如果你不写在构造方法内,他的num永远为0;
④改进建议:
提升代码的质量然后,仔细厘清代码逻辑和之间的关系;
2.第二次PTA:
①题目简介:
设计实现答题程序,模拟一个小型的测试,以下粗体字显示的是在答题判题程序-1基础上增补或者修改的内容。
要求输入题目信息、试卷信息和答题信息,根据输入题目信息中的标准答案判断答题的结果。
输入格式:
程序输入信息分三种,三种信息可能会打乱顺序混合输入:
1、题目信息
一行为一道题,可输入多行数据(多道题)。
格式:"#N:"+题目编号+" "+"#Q:"+题目内容+" "#A:"+标准答案
2、试卷信息
一行为一张试卷,可输入多行数据(多张卷)。
**格式:"#T:"+试卷号+" "+题目编号+"-"+题目分值
3、答卷信息
答卷信息按行输入,每一行为一张答卷的答案,每组答案包含某个试卷信息中的题目的解题答案,答案的顺序与试卷信息中的题目顺序相对应。
格式:"#S:"+试卷号+" "+"#A:"+答案内容
格式约束:答案数量可以不等于试卷信息中题目的数量,没有答案的题目计0分,多余的答案直接忽略,答案之间以英文空格分隔。
输出格式:
1、试卷总分警示
该部分仅当一张试卷的总分分值不等于100分时作提示之用,试卷依然属于正常试卷,可用于后面的答题。如果总分等于100分,该部分忽略,不输出。
格式:"alert: full score of test paper"+试卷号+" is not 100 points"
2、答卷信息
一行为一道题的答题信息,根据试卷的题目的数量输出多行数据。
格式:题目内容+""+答案++""+判题结果(true/false)
约束:如果输入的答案信息少于试卷的题目数量,答案的题目要输"answer is null"
判分信息为一行数据,是一条答题记录所对应试卷的每道小题的计分以及总分,计分输出的先后顺序与题目题号相对应。
格式:题目得分+" "+....+题目得分+"~"+总分
根据输入的答卷的数量以上2、3项答卷信息与判分信息将重复输出。
4、提示错误的试卷号
如果答案信息中试卷的编号找不到,则输出”the test paper number does not exist”,参见样例9。
②内容实现:
class Title保存题目信息,之后可以在questionpaper类中去创建数组去得到这些信息;
class AnswerPaper保存题目的分数,和相关的位置。
class QuestionPaper保留题目信息和保留题目分数去匹配,如果成功就会保存题目所得到的分数。
class Answerfen保留题目的答卷信息;
③踩坑心得:
一.
int fs[] = new int[1];
int z = 0;
int k = 0;
int p= 0;
int sum=0;
if(z<answerpaper[0].answer.length-1) {
for (k = 0; k < answerfens.length - 1; k++) {
if (answerpaper[0].numberPaper.equals(answerfens[k].numberPaper)) {
for (int j = 0; j < answerfens[k].lengthnumber(); j++) {
for (int m = 0; m < title.length - 1; m++) {
if (answerfens[k].number[j].equals(title[m].number)) {
if (title[m].standardAnswer.equals(answerpaper[0].answer[z])) {
// System.out.println(title[m].content + "~" + answerpaper[0].answer[z] + "~true");
fs[p] = answerfens[k].score2[j];
sum = sum + fs[p];
fs = Arrays.copyOf(fs, fs.length + 1);
p++;
z++;
} else {
// System.out.println(title[m].content + "~" + answerpaper[0].answer[z] + "~false");
fs[p] = 0;
sum = sum + 0;
fs = Arrays.copyOf(fs, fs.length + 1);
p++;
z++;
}
}
}
}
}
}
}
一开始没注意到这每次都要使其归零,否则就会产生数组越界报错。
二.
{
String[] t=a.split("#T:| |-");
int m=0;
int n=0;
for(int i=2;i<t.length;i++){
if(i%2==0)
{
t2[m]=t[i];//用t2数组去保存我们需要的数据因为他的输入是有规律的一个标题对应一个答案
t2=Arrays.copyOf(t2,t2.length+1);//然后动态增长
m++;
}
else
{
t3[n]=t[i];//同上
t3=Arrays.copyOf(t3,t3.length+1);
n++;
}
}
answerfens[h]=new Answerfen(t[1],t2,t3);//我们把接收到的数据放入到一个答案试卷当中去
t2=new String[1];//为数组开辟另一个空间,否则当下一次数据要更新的时候,他的数据会被覆盖,没有实现保存
t3=new String[1];//同理
answerfens=Arrays.copyOf(answerfens,answerfens.length+1);
h++;
}
每次我用arroys.copyOf函数动态使数组长度加一,然后我们要开辟一个新的空间,防止原来的内容被覆写掉了。
3.第三次PTA:
①题目简介:
格式:"#X:"+学号+" "+姓名+"-"+学号+" "+姓名....+"-"+学号+" "+姓名
4、答卷信息
答卷信息按行输入,每一行为一张答卷的答案,每组答案包含某个试卷信息中的题目的解题答案,答案的顺序号与试 卷信息中的题目顺序相对应。答卷中:
格式:"#S:"+试卷号+" "+学号+" "+"#A:"+试卷题目的顺序号+"-"+答案内容+...
5、删除题目信息
删除题目信息为独行输入,每一行为一条删除信息,多条删除信息可分多行输入。该信息用于删除一道题目信息,题目被删除之后,引用该题目的试卷依然有效,但被删除的题目将以0分计,同时在输出答案时,题目内容与答案改为一条失效提示,例如:”the question 2 invalid~0”
输出格式:
3、判分信息
判分信息为一行数据,是一条答题记录所对应试卷的每道小题的计分以及总分,计分输出的先后顺序与题目题号相对应。
格式:学号+" "+姓名+": "+题目得分+" "+....+题目得分+"~"+总分
4、被删除的题目提示信息
当某题目被试卷引用,同时被删除时,答案中输出提示信息。样例见第5种输入信息“删除题目信息”。
5、题目引用错误提示信息
试卷错误地引用了一道不存在题号的试题,在输出学生答案时,提示”non-existent question~”加答案。
6、格式错误提示信息
输入信息只要不符合格式要求,均输出”wrong format:”+信息内容。
如果答卷信息中试卷的编号找不到,则输出”the test paper number does not exist”,答卷中的答案不用输出,参见样例8。
8、学号引用错误提示信息
如果答卷中的学号信息不在学生列表中,答案照常输出,判分时提示错误。参见样例9。
本题暂不考虑出现多张答卷的信息的情况。
②内容实现:
class Title保存题目信息,之后可以在questionpaper类中去创建数组去得到这些信息;
class AnswerPaper保存题目的分数,和相关的位置。
class QuestionPaper保留题目信息和保留题目分数去匹配,如果成功就会保存题目所得到的分数。
class Answerfen保留题目的答卷信息;
class Student 保留学生信息;
③踩坑心得:
一.
void pdfs(){
int a[] =new int[1];
int numm=0;
int gg=0;
int sum=0;
//首先判断试卷存不存在
for(int k=0;k<answerfens.length-1;k++){
for(int i=0;i<answerpaper.length-1;i++){
if(answerfens[k].numberPaper.equals(answerpaper[i].textNumber)) {
//判断学生的学号是否存在
int flag = 0;
for (int l = 0; l < student.studentNumber.length; l++) {
if (answerpaper[i].studentNumber.equals(student.studentNumber[l])) {
flag = 1;
for (int p = 0; p < answerfens[k].number.length; p++) {
int flag3 = 0;//每次循环都要赋值为零
for (int q = 0; q < answerpaper[i].titleNumber.length; q++) {
if (answerpaper[i].titleNumber[q].equals(String.valueOf(p + 1))) {
flag3 = 1;
//去判断这个题目是否被删
int flag2 = 0;
if (deleteNumber != null) {
for (int r = 0; r < deleteNumber.titlenumber.length; r++) {
if (deleteNumber.titlenumber[r].equals(answerfens[k].number[p])) {
flag2 = 1;
// System.out.println("the question " + answerfens[k].number[p] + " invalid~0");
a[numm]=0;
a=Arrays.copyOf(a,a.length+1);
numm++;
}
}
}
if (flag2 == 0) {
int flag4 = 0;
for (int u = 0; u < title.length - 1; u++) {
if (answerfens[k].number[p].equals(title[u].number)) {
flag4 = 1;
if (answerpaper[i].titleAnswer[p].equals(title[u].standardAnswer)) {
// System.out.println(title[u].content + "~" + answerpaper[i].titleAnswer[q] + "~true");
a[numm]=Integer.valueOf(answerfens[k].score[p]);
a=Arrays.copyOf(a,a.length+1);
numm++;
} else {
// System.out.println(title[u].content + "~" + answerpaper[i].titleAnswer[q] + "~false");
a[numm]=0;
a=Arrays.copyOf(a,a.length+1);
numm++;
}
}
}
if (flag4 == 0) {
// System.out.println("non-existent question~0");
a[numm]=0;
a=Arrays.copyOf(a,a.length+1);
numm++;
}
}
}
}
if (flag3 == 0) {
// System.out.println("answer is null");
a[numm]=0;
a=Arrays.copyOf(a,a.length+1);
numm++;
}
}
}
sum=0;
for(int i11=0;i11<a.length-1;i11++){
sum=sum+a[i11];
}
gg=0;
for(int r=0;r<student.studentNumber.length;r++){
if(answerpaper[i].studentNumber.equals(student.studentNumber[r])){
gg=r;
}
}
//
用循环去匹配,每次都要找到特定条件跳出来,所以代码逻辑很绕;
三.总结:
一.要懂得基本的工具,和相关函数;
二.要明白代码的逻辑,熟悉idea调试的方法;
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)