OOP 1-3次作业总结
23201636-曾繁榕
目录
- 前言
- 设计与分析
- 踩坑心得
- 改进建议
- 总结
前言
本次作业知识点:类与对象的基本使用,通过接口实现类重写(继承),日期类的基本使用,还主要考察了正则表达式的运用,字符串的提取分割;
个人体会:本次作业难度适中,题量适中,但有些比较复杂的类设计上容易出现错误,且部分知识未学习的情况下需要我们短时间内自行掌握给解决题目造成困难;
大题源码
第一次作业
答题判题程序-1
import java.util.Scanner;
class Answer{
int num;
String answer;
String question;
public Answer(int num,String answer,String question){
this.num=num;
this.answer=answer;
this.question=question;
}
}
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int num = input.nextInt();
String s;
String[] str;
String[] str1=new String[4];
input.nextLine();
Answer a[]=new Answer[num];
for(int i=0;i<num;i++)
{
s=input.nextLine();
str=s.split("#");
str1[0]=str[1].replace("N:","");
char c0='0';
for(int j=0;j<str1[0].length()-1;j++)
{
char c=str1[0].charAt(j);
if(c!=' ')
{
c0=str1[0].charAt(j);
break;
}
else
continue;
}
int n=c0-'0';
str1[1]=str[2].replace("Q:","");
str1[2]=str1[1].trim();
str1[3]=str[3].replace("A:","~");
String ss=str[3].replace("A:","");
String ss1=ss.trim();
String ss2="A:";
String ss3=ss2+ss1;
a[i]=new Answer(n,ss3,str1[2]);
// StringBuffer s1 = new StringBuffer();
// for(int j=2;j<str.length;j++)
// {
// s1.append(str1[j]);
// }
// System.out.println(s1);
}
String[] str2;
s=input.nextLine();
str2=s.split("#");
for(int i=1;i<=str2.length-1;i++)
{
String s1=str2[i].replace("A:","");
String s2=s1.trim();
String s3="~"+s2;
for(int j=0;j<str2.length-1;j++)
{
int n=a[j].num;
if(n==i)
System.out.printf("%s%s\n",a[j].question,s3);
}
}
for(int i=1;i<str2.length-1;i++)
{
String b0=str2[i].replace("A:","");
String b="A:"+b0.trim();
for(int j=0;j<str2.length-1;j++)
{
int n=a[j].num;
if(n==i)
{
if(a[j].answer.equals(b))
System.out.printf("true ");
else
System.out.printf("false ");
}
}
}
String b0=str2[str2.length-1].replace("A:","");
String b="A:"+b0.trim();
for(int i=0;i<num;i++)
{
if(a[i].num==num)
{
if(a[i].answer.equals(b))
System.out.printf("true");
else
System.out.printf("false");
}
}
if(num!=0)
input.nextLine();
}
}
第二次作业
答题判题程序-2
import java.util.*;
import java.util.regex.Pattern;
import java.util.regex.Matcher;
import java.util.ArrayList;
class Question{
String num;
String question;
String answer;
Question(){
}
Question(String num,String question,String answer){
this.num = num;
this.question = question;
this.answer = answer;
}
public String toString(){
return question;
}
}
class Test{
String tnum;
String qnum[];
int score[];
Test(String tnum){
this.tnum=tnum;
}
public void add(String num,int s){
if(qnum==null&&score==null)
{
String a[] = new String[1];
int t[] = new int[1];
a[0] = num;
t[0] = s;
qnum = a;
score = t;
}
else{
String a[] = new String[qnum.length+1];
for(int i=0;i<qnum.length;i++)
{
a[i]=qnum[i];
}
a[qnum.length] = num;
qnum = a;
int t[] = new int[score.length+1];
for(int i=0;i<score.length;i++)
{
t[i]=score[i];
}
t[score.length] = s;
score = t;
}
}
}
class StuTest{
String snum;
String answer[];
StuTest(String snum){
this.snum = snum;
}
public void addanswer(String ans){
if(answer==null)
{
String a[] = new String[1];
a[0] = ans;
answer = a;
}
else{
String a[] = new String[answer.length+1];
for(int i=0;i<answer.length;i++)
{
a[i]=answer[i];
}
a[answer.length] = ans;
answer = a;
}
}
}
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int num1=0,num2=0,num3=0;
Question q[] = new Question[10];
Test t[] = new Test[5];
StuTest stu[] = new StuTest[5];
String s = sc.nextLine();
String regex = "#N:\\s*(\\d*)\\s+#Q:(.*?)\\s+#A:(.*)";
String regex1 = "#T:\\s*(\\d*)\\s+(\\d+-\\d+\\s*)+";
String regex2 = "#S:\\s*(\\d*)\\s*(#A:\\s*.*\\s*)+";
Pattern pattern = Pattern.compile(regex);
while(true){
if(s.equals("end"))
break;
if(Pattern.matches(regex,s))
{
Matcher m = pattern.matcher(s);
if(m.find())
{
q[num1] = new Question(m.group(1).trim(),m.group(2).trim(),m.group(3).trim());
}
// System.out.println(q[num1].toString());
num1++;
}
else if(Pattern.matches(regex1,s))
{
String str[] = s.split(" ");
String ss = str[0].replace("#T:","");
// System.out.println(ss);
t[num2] = new Test(ss);
for(int i=1;i<str.length;i++)
{
String str1[] = str[i].split("-");
int x = Integer.parseInt(str1[1]);
t[num2].add(str1[0],x);
}
num2++;
}
else if(Pattern.matches(regex2,s))
{
String str[] = s.split(" ");
String ss = str[0].replace("#S:","");
stu[num3] = new StuTest(ss);
for(int i=1;i<str.length;i++)
{
String sss = str[i].replace("#A:","");
stu[num3].addanswer(sss);
}
num3++;
}
s = sc.nextLine();
}
for(int i=0;i<num2;i++)
{
int sum = 0;
for(int j=0;j<t[i].score.length;j++)
{
sum = sum + t[i].score[j];
}
if(sum!=100)
System.out.println("alert: full score of test paper"+t[i].tnum+" is not 100 points");
}
for(int i=0;i<num3;i++)
{
int index = -1;
int sum = 0;
for(int j=0;j<num2;j++)
{
if(stu[i].snum.equals(t[j].tnum))
index = j;
}
if(index==-1)
{
System.out.println("The test paper number does not exist");
}
else{
for(int j=0;j<stu[i].answer.length;j++)
{
for(int k=0;k<num1;k++)
{
boolean b = false;
if(t[index].qnum[j].equals(q[k].num))
{
if(q[k].answer.equals(stu[i].answer[j]))
b = true;
System.out.println(q[k].question+"~"+stu[i].answer[j]+"~"+b);
if(b)
{
sum = sum + t[index].score[j];
}
}
}
}
for(int j=0;j<t[index].qnum.length-stu[i].answer.length;j++)
{
System.out.println("answer is null");
}
for(int j=0;j<stu[i].answer.length;j++)
{
for(int k=0;k<num1;k++)
{
boolean b = false;
if(t[index].qnum[j].equals(q[k].num))
{
if(q[k].answer.equals(stu[i].answer[j]))
b = true;
if(b)
{
if(j==t[index].qnum.length-1)
System.out.printf("%d",t[index].score[j]);
else
System.out.printf("%d ",t[index].score[j]);
}
else{
if(j==t[index].qnum.length-1)
System.out.printf("0");
else
System.out.printf("0 ");
}
}
}
}
for(int j=0;j<t[index].qnum.length-stu[i].answer.length;j++)
{
if(j==t[index].qnum.length-stu[i].answer.length-1)
System.out.printf("0");
else
System.out.printf("0 ");
}
System.out.printf("~%d\n",sum);
}
}
}
}
第三次作业
答题判题程序-3
import java.util.*;
import java.util.regex.Pattern;
import java.util.regex.Matcher;
import java.util.ArrayList;
class Question{
String num;
String question;
String answer;
boolean isDelete=false;
Question(){
}
Question(String num,String question,String answer){
this.num = num;
this.question = question;
this.answer = answer;
}
public String toString(){
return question;
}
}
class Test{
String tnum;
String qnum[];
int score[];
Test(String tnum){
this.tnum=tnum;
}
public void add(String num,int s){
if(qnum==null&&score==null)
{
String a[] = new String[1];
int t[] = new int[1];
a[0] = num;
t[0] = s;
qnum = a;
score = t;
}
else{
String a[] = new String[qnum.length+1];
for(int i=0;i<qnum.length;i++)
{
a[i]=qnum[i];
}
a[qnum.length] = num;
qnum = a;
int t[] = new int[score.length+1];
for(int i=0;i<score.length;i++)
{
t[i]=score[i];
}
t[score.length] = s;
score = t;
}
}
}
class StuTest{
String snum;
String stuid;
int anum[];
String answer[];
StuTest(String snum,String stuid){
this.snum = snum;
this.stuid = stuid;
}
public void addanswer(int anumber,String ans){
if(anum==null&&answer==null)
{
int num[] = new int[1];
String a[] = new String[1];
num[0] = anumber;
a[0] = ans;
anum = num;
answer = a;
}
else{
int num[] = new int[anum.length+1];
String a[] = new String[answer.length+1];
for(int i=0;i<anum.length;i++)
num[i] = anum[i];
for(int i=0;i<answer.length;i++)
{
a[i]=answer[i];
}
num[anum.length] = anumber;
a[answer.length] = ans;
anum = num;
answer = a;
}
}
}
class Student{
String stuID;
String sname;
Student(String stuID,String sname){
this.stuID = stuID;
this.sname = sname;
}
public String toString(){
return stuID+" "+sname+": ";
}
}
class Delete{
String dnum;
Delete(String dnum){
this.dnum = dnum;
}
}
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int num1=0,num2=0,num3=0,num4=0,num5=0;
Question q[] = new Question[10];
Test t[] = new Test[5];
StuTest stu[] = new StuTest[5];
Student st[] = new Student[5];
Delete d[] = new Delete[5];
String s = sc.nextLine();
String regex = "#N:\\s*(\\d*)\\s+#Q:(.*?)\\s+#A:(.*)";
String regex1 = "#T:\\s*(\\d*)\\s*(\\d+-\\d+\\s*)*";
String regex2 = "#S:\\s*(\\d*)\\s*(\\d*)\\s*(#A:(\\s*\\d+-.*\\s*)*\\s*)*";
String regex3 = "#X:\\s*(\\d*)\\s*(.*?)";
String regex4 = "#D:\\s*N-(\\d+\\s*)";
Pattern pattern = Pattern.compile(regex);
while(true){
if(s.equals("end"))
break;
if(Pattern.matches(regex,s))
{
Matcher m = pattern.matcher(s);
if(m.find())
{
q[num1] = new Question(m.group(1).trim(),m.group(2).trim(),m.group(3).trim()+"");
}
// System.out.println(q[num1].toString());
num1++;
}
else if(Pattern.matches(regex1,s))
{
String str[] = s.split(" ");
String ss = str[0].replace("#T:","");
// System.out.println(ss);
t[num2] = new Test(ss);
if(str.length>1){
for(int i=1;i<str.length;i++)
{
String str1[] = str[i].split("-");
int x = Integer.parseInt(str1[1]);
t[num2].add(str1[0],x);
}
}
num2++;
}
else if(Pattern.matches(regex2,s))
{
String str[] = s.split(" ");
String ss = str[0].replace("#S:","");
String ss1 = str[1];
stu[num3] = new StuTest(ss,ss1);
if(str.length>2){
String sstr[] = new String[str.length-2];
for(int i=0;i<sstr.length;i++)
{
sstr[i] = str[i+2];
}
Arrays.sort(sstr);
for(int i=0;i<sstr.length;i++)
{
String sss = sstr[i].replace("#A:","");
if(!sss.equals("")){
String str1[] = sss.split("-");
if(str1.length==1){
int x = Integer.parseInt(str1[0]);
stu[num3].addanswer(x,"");
}
else if(str1.length==2){
int x = Integer.parseInt(str1[0]);
stu[num3].addanswer(x,str1[1]);
}
}
}
}
num3++;
}
else if(Pattern.matches(regex3,s))
{
String str[] = s.replace("#X:","").split("-");
for(int i=0;i<str.length;i++){
String str1[] = str[i].split(" ");
st[num4] = new Student(str1[0],str1[1]);
num4++;
}
}
else if(Pattern.matches(regex4,s))
{
String str = s.replace("#D:N-","");
d[num5] = new Delete(str);
num5++;
}
else
System.out.println("wrong format:"+s);
s = sc.nextLine();
}
for(int i=0;i<num1;i++)
{
for(int j=0;j<num5;j++)
{
if(q[i].num.equals(d[j].dnum))
q[i].isDelete = true;
}
}
for(int i=0;i<num2;i++)
{
int sum = 0;
for(int j=0;j<t[i].score.length;j++)
{
sum = sum + t[i].score[j];
}
if(sum!=100)
System.out.println("alert: full score of test paper"+t[i].tnum+" is not 100 points");
}
for(int i=0;i<num3;i++)
{
int index = -1;
int sum = 0;
for(int j=0;j<num2;j++)
{
if(stu[i].snum.equals(t[j].tnum))
index = j;
}
int l = 0;
if(stu[i].answer!=null){
l = stu[i].answer.length;
}
if(index==-1)
{
System.out.println("The test paper number does not exist");
}
else
{
int x = 0,y = 0;
for(int j=0;j<l;j++)
{
int z = stu[i].anum[j]-1;
if(j<t[index].score.length){
for(int k=0;k<num1;k++)
{
boolean b = false;
if(t[index].qnum[z].equals(q[k].num)&&!q[k].isDelete)
{
if(q[k].answer.equals(stu[i].answer[j]))
b = true;
System.out.println(q[k].question+"~"+stu[i].answer[j]+"~"+b);
if(b)
{
sum = sum + t[index].score[z];
}
}
}
}
}
for(int j=0;j<t[index].qnum.length;j++)
{
boolean c = true;
for(int k=0;k<num1;k++)
{
if(q[k].num.equals(t[index].qnum[j]))
c = false;
}
if(c)
{
x++;
}
}
if(x!=0&&l>0)
System.out.println("non-existent question~0");
for(int j=0;j<l;j++)
{
if(j<t[index].score.length){
for(int k=0;k<num1;k++)
{
boolean b = false;
if(t[index].qnum[j].equals(q[k].num)&&q[k].isDelete)
{
System.out.println("the question "+q[k].num+" invalid~0");
}
}
}
}
for(int j=0;j<t[index].qnum.length-l;j++)
{
System.out.println("answer is null");
y++;
}
boolean found = false;
for(int j=0;j<num4;j++)
{
if(stu[i].stuid.equals(st[j].stuID))
{
System.out.print(st[j].toString());
found = true;
}
}
if(found){
for(int j=0;j<l;j++)
{
int z = stu[i].anum[j]-1;
if(j<t[index].score.length){
for(int k=0;k<num1;k++)
{
boolean b = false;
if(t[index].qnum[z].equals(q[k].num))
{
if(q[k].answer.equals(stu[i].answer[j]))
b = true;
if(b&&!q[k].isDelete)
{
if(j==t[index].qnum.length-1){
System.out.printf("%d",t[index].score[z]);
}
else{
System.out.printf("%d ",t[index].score[z]);
}
}
else{
if(x==0&&j==t[index].qnum.length-1){
System.out.printf("0");
// y++;
}
else{
System.out.printf("0 ");
// y++;
}
}
}
}
}
}
// System.out.println(x+" "+y+" "+l);
for(int j=0;j<y;j++)
{
if(x==0&&j==y-1)
System.out.printf("0");
else
System.out.printf("0 ");
}
if(l>0){
for(int j=0;j<x;j++)
{
if(j==x-1)
System.out.printf("0");
else
System.out.printf("0 ");
}
}
// for(int j=0;j<t[index].qnum.length-l;j++)
// {
// if(x==0&&j==t[index].qnum.length-l-1)
// System.out.printf("0");
// else
// System.out.printf("0 ");
// }
System.out.printf("~%d\n",sum);
}
else
System.out.printf(stu[i].stuid+" not found");
}
}
}
}
设计与分析
第一次作业
答题判题程序-1

第一次作业中的类较少,结构较为简单,类间关系简单,主要为两个类,题目类与主函数类;
第二次作业
答题判题程序-2

从类图上不难看出本次作业多了试卷类与答卷类,分别存放试卷信息以及对应试卷号的答卷信息;对类间关系的设计也更加复杂,相互调用时更容易产生错误,主函数中的各种重复调用也明显增多;
第三次作业
答题判题程序-3

本次作业新加入了学生类与删除题目类,答卷类中也加入学生的学号,使得整体设计更加复杂,类间关系更难设计,各种循环调用使得代码易出错,调试时出现各种问题;
踩坑心得
第一次作业
答题判题程序-1
在第一次作业中,题目较为简单易懂,主要问题是对字符串的处理出现多种问题,如输入时容易将首行末尾回车当作第一个题目导致第一个题目为空,还有对对字符串的拆分处理容易出错,以及第一次作业中各样例对多余空格的处理较为复杂,容易出错;
第二次作业
答题判题程序-2
第二次作业出现的问题主要包括对正则表达式的不熟练导致对多种信息的处理不到位,还有当信息输入乱序导致输出错误,多张答卷多张试卷导致非零返回等问题;
第三次作业
答题判题程序-3
第三次作业的问题主要体现在对空答案,空试卷的处理上,以及各种循环调用导致调试难度高,输出结果错误,对类间关系调用不足导致主函数代码复杂,使调试更上一个台阶,对空答案处理错误导致极易出现非零返回等情况;
改进建议
- 对类的使用不熟练,创建类的数量少,可以增加类的数量改进代码
- 类间关系掌握不够,很少使用类内调用另一个类,可以通过类间关系降低代码复杂度
- 第一次作业中未使用正则表达式,后面两次正则表达式的表达可以修改
- 可以将部分代码改成方法或类内方法从而降低代码复杂度
- 注释过少,后续代码可通过添加注释令代码简单易懂
- 代码循环套用太过复杂,容易出现各种问题
总结
对于刚接触面向对象程序设计且大部分内容需要在短时间内掌握来说,本次习题难度偏大,阅读题目的题目量较大,需要花费大量时间读懂题目,并需要自行掌握一些课程内尚未提及的知识点,更加清楚面向对象设计过程中对需求的把控与对面向对象设计的过程的进一步熟悉;
通过本次训练,我们对类的使用,类间关系设计更加熟悉,掌握了继承、Java日期类的基本使用,通过三次大题训练让我们熟练使用正则表达式与String类的各种方法将字符串分割处理,增强了我们对面向对象设计的能力,我们需要在日后的学习过程中巩固提高对所学知识的应用;
此外,我也发现了诸多代码习惯的问题,如不习惯对代码进行注释,对类间关系的运用不够熟练,代码复杂度过高,未将部分代码转换为方法形式从而使Main函数看起来较为复杂,这些需要我在日后的学习生活中进行学习与提高;

浙公网安备 33010602011771号