oop前三次作业总结

一、前言


  关于前三次题目集,主要考察的是类与对象,重点在于对面向对象编程的设计原则之一:单一职责,和三大特征之一:封装。且本次题目集,有大量的字符串解析过程,所以也考察了正则表达式这个知识点。每一次的题量在减少,但考察的内容却不断增多,难度也随之加大。尤其是题目集的最后一题,每次不断迭代,综合考察类与对象的使用,需要想好设计思路,遵守单一职责原则。所以在此次blog中,我将重点分析每个题目集的最后一题。


二、设计与分析


(一)题目集一

- 题目:

7-1 答题判题程序-1
设计实现答题程序,模拟一个小型的测试,要求输入题目信息和答题信息,根据输入题目信息中的标准答案判断答题的结果。

输入格式:
程序输入信息分三部分:

1、题目数量

格式:整数数值,若超过1位最高位不能为0,

样例:34

2、题目内容

一行为一道题,可以输入多行数据。

格式:"#N:"+题号+" "+"#Q:"+题目内容+" "#A:"+标准答案

格式约束:题目的输入顺序与题号不相关,不一定按题号顺序从小到大输入。

样例:

#N:1 #Q:1+1= #A:2
#N:2 #Q:2+2= #A:4

3、答题信息

答题信息按行输入,每一行为一组答案,每组答案包含第2部分所有题目的解题答案,答案的顺序号与题目题号相对应。

格式:"#A:"+答案内容

格式约束:答案数量与第2部分题目的数量相同,答案之间以英文空格分隔。

样例:#A:2 #A:78

  2是题号为1的题目的答案
  78是题号为2的题目的答案

答题信息以一行"end"标记结束,"end"之后的信息忽略。

输出格式:
1、题目数量

格式:整数数值,若超过1位最高位不能为0,

样例:34

2、答题信息

一行为一道题的答题信息,根据题目的数量输出多行数据。

格式:题目内容+" ~"+答案

样例:

 1+1=~2
 2+2=~4

3、判题信息

判题信息为一行数据,一条答题记录每个答案的判断结果,答案的先后顺序与题目题号相对应。

格式:判题结果+" "+判题结果

格式约束:

 1、判题结果输出只能是true或者false,
 2、判题信息的顺序与输入答题信息中的顺序相同




- 分析:

本题重点考查的是类间关系,对输入的题目信息,答案信息进行判断,所以先考虑创建个类,题目类Question,包含题目信息,然后将一系列题目放在一个类里,考虑构造试卷类Testpaper,包含题目类的集合。用saveQuestion()方法来保存题目内容,考虑题目题号与题目在集合内的位置相对应,所以用题号来确定数组下标。答案要与题目结合在一起,要有关联,因此考虑构建Answerpaper答卷类,把试卷类作为属性,判断答题信息是否正确。答案输入的顺序与题目相同,所以直接按顺序储存在Answerpaper中的答案数组中,以便判题和输出,再创建判题集合将每一题的对错储存。输入的信息有格式约束,所以要对字符串解析,我在此次题目中直接在主方法中进行字符串解析。

类的设计:
  1.题目类(Qustion):保存题目信息并处理。

     private String number;//题目数量
     private String question;//题目内容
     private String standAnswer;//标准答案
     boolean checkAnwser(String answer)//判断答案是否符合标准答案

  2.试卷类(Testpaper):保存一张试卷信息并处理。

    private int Qnum;//题目数量
    private Question[] Qarr=new Question[100];//题目集合
    boolean checkAnwser(int num,String answer)//判断题目是否正确
    void saveQuestion(int num,String question,String standanswer)//储存一个题目信息

  3.答卷类(Answerpaper):保存并处理一张答卷信息。

    private Testpaper Tarr=new Testpaper();//试卷信息
    private String[] Aarr=new String[100];//每一题的答案信息
    private boolean[] Carr=new boolean[100];//每一题的判断结果
    boolean checkQuestion(int num)//获得第num题的判题结果

- UML类图:





(二)题目集二

- 题目:

7-2 答题判题程序-2
设计实现答题程序,模拟一个小型的测试,以下粗体字显示的是在答题判题程序-1基础上增补或者修改的内容。要求输入题目信息、试卷信息和答题信息,根据输入题目信息中的标准答案判断答题的结果。

输入格式:

程序输入信息分三种,三种信息可能会打乱顺序混合输入:

1、题目信息

一行为一道题,可输入多行数据(多道题)。

格式:"#N:"+题目编号+" "+"#Q:"+题目内容+" "#A:"+标准答案

格式约束:

1、题目的输入顺序与题号不相关,不一定按题号顺序从小到大输入。
2、允许题目编号有缺失,例如:所有输入的题号为1、2、5,缺少其中的3号题。此种情况视为正常。

样例:

#N:1 #Q:1+1= #A:2
#N:2 #Q:2+2= #A:4

2、试卷信息

一行为一张试卷,可输入多行数据(多张卷)。

格式:"#T:"+试卷号+" "+题目编号+"-"+题目分值

 题目编号应与题目信息中的编号对应。

 一行信息中可有多项题目编号与分值。

样例:#T:1 3-5 4-8 5-2

3、答卷信息

答卷信息按行输入,每一行为一张答卷的答案,每组答案包含某个试卷信息中的题目的解题答案,答案的顺序与试卷信息中的题目顺序相对应。

格式:"#S:"+试卷号+" "+"#A:"+答案内容

格式约束:答案数量可以不等于试卷信息中题目的数量,没有答案的题目计0分,多余的答案直接忽略,答案之间以英文空格分隔。

样例:#S:1 #A:5 #A:22

   1是试卷号 

   5是1号试卷的顺序第1题的题目答案

   22是1号试卷的顺序第2题的题目答案

答题信息以一行"end"标记结束,"end"之后的信息忽略。

输出格式:

1、试卷总分警示

该部分仅当一张试卷的总分分值不等于100分时作提示之用,试卷依然属于正常试卷,可用于后面的答题。如果总分等于100分,该部分忽略,不输出。

格式:"alert: full score of test paper"+试卷号+" is not 100 points"

样例:alert: full score of test paper2 is not 100 points

2、答卷信息

一行为一道题的答题信息,根据试卷的题目的数量输出多行数据。

格式:题目内容+""+答案++""+判题结果(true/false)

约束:如果输入的答案信息少于试卷的题目数量,答案的题目要输"answer is null"

样例:

  3+2=~5~true
  4+6=~22~false.
  answer is null

3、判分信息

判分信息为一行数据,是一条答题记录所对应试卷的每道小题的计分以及总分,计分输出的先后顺序与题目题号相对应。

格式:题目得分+" "+....+题目得分+"~"+总分

格式约束:

1、没有输入答案的题目计0分

2、判题信息的顺序与输入答题信息中的顺序相同
样例:5 8 0~13

根据输入的答卷的数量以上2、3项答卷信息与判分信息将重复输出。

4、提示错误的试卷号

如果答案信息中试卷的编号找不到,则输出”the test paper number does not exist”,参见样例9。

设计建议:

参考答题判题程序-1,建议增加答题类,类的内容以及类之间的关联自行设计。





- 分析:

本题是前一题的升级版本,在上一题的基础上增加了试卷信息和答卷信息和分数,用于处理多张卷的情况,所以在原来设计的基础上,我增加了分数的判定与计算。所以考虑增加套卷类,以便储存多张试卷和答卷信息。与上题一样,还是在主方法中解析字符串。

类的设计:

  1.题目类(Qustion):保存题目信息并处理。

     private String number;//题目数量
     private String question;//题目内容
     private String standAnswer;//标准答案
     boolean checkAnwser(String answer)//判断答案是否符合标准答案

  2.试卷类(Testpaper):保存一张试卷信息并处理。

    private int Qnum;//题目数量
    private Question[] Qarr=new Question[100];//题目集合
    private int[] score=new int[100];//每一题的分数
    boolean checkAnwser(int num,String answer)//判断题目是否正确
    void saveQuestion(int num,String question,String standanswer)//储存一个题目信息
    int fullScore()//计算试卷总分

  3.答卷类(Answerpaper):保存并处理一张答卷信息。

    private Testpaper Tarr=new Testpaper();//试卷信息
    private String[] Aarr=new String[100];//每一题的答案信息
    private boolean[] Carr=new boolean[100];//每一题的判断结果
    private int[] Sarr =new int[100];//每一题获得的分数
    boolean checkQuestion(int num)//获得第num题的判题结果
    void calculateScore(int num)//获得第num题的得分
    int calculateAllscore()//获得卷面得分

  4.套卷类(Sheet):储存多张答卷信息。

    private Answer[] Aarr1 = new Answer[100];//储存答卷信息 

- UML类图:





(三)题目集三

- 题目:

7-3 答题判题程序-3
设计实现答题程序,模拟一个小型的测试,要求输入题目信息、试卷信息、答题信息、学生信息、删除题目信息,根据输入题目信息中的标准答案判断答题的结果。

输入格式:

程序输入信息分五种,信息可能会打乱顺序混合输入。

1、题目信息
题目信息为独行输入,一行为一道题,多道题可分多行输入。

格式:"#N:"+题目编号+" "+"#Q:"+题目内容+" "#A:"+标准答案

格式约束
1、题目的输入顺序与题号不相关,不一定按题号顺序从小到大输入。
2、允许题目编号有缺失,例如:所有输入的题号为1、2、5,缺少其中的3号题。此种情况视为正常。
样例:

 #N:1 #Q:1+1= #A:2
 #N:2 #Q:2+2= #A:4

2、试卷信息

试卷信息为独行输入,一行为一张试卷,多张卷可分多行输入数据。
格式:"#T:"+试卷号+" "+题目编号+"-"+题目分值+" "+题目编号+"-"+题目分值+...

格式约束:
题目编号应与题目信息中的编号对应。
一行信息中可有多项题目编号与分值。
样例:#T:1 3-5 4-8 5-2

3、学生信息

学生信息只输入一行,一行中包括所有学生的信息,每个学生的信息包括学号和姓名,格式如下。

格式:"#X:"+学号+" "+姓名+"-"+学号+" "+姓名....+"-"+学号+" "+姓名

格式约束:

答案数量可以不等于试卷信息中题目的数量,没有答案的题目计0分,多余的答案直接忽略,答案之间以英文空格分隔。

样例:

   #S:1 #A:5 #A:22
   1是试卷号 
   5是1号试卷的顺序第1题的题目答案 

4、答卷信息

答卷信息按行输入,每一行为一张答卷的答案,每组答案包含某个试卷信息中的题目的解题答案,答案的顺序号与试 卷信息中的题目顺序相对应。答卷中:

格式:"#S:"+试卷号+" "+学号+" "+"#A:"+试卷题目的顺序号+"-"+答案内容+...

格式约束:
答案数量可以不等于试卷信息中题目的数量,没有答案的题目计0分,多余的答案直接忽略,答案之间以英文空格分隔。
答案内容可以为空,即””。
答案内容中如果首尾有多余的空格,应去除后再进行判断。
样例:

   #T:1 1-5 3-2 2-5 6-9 4-10 7-3
   #S:1 20201103 #A:2-5 #A:6-4
   1是试卷号
   20201103是学号
   2-5中的2是试卷中顺序号,5是试卷第2题的答案,即T中3-2的答案 
   6-4中的6是试卷中顺序号,4是试卷第6题的答案,即T中7-3的答案 

注意:不要混淆顺序号与题号

5、删除题目信息

删除题目信息为独行输入,每一行为一条删除信息,多条删除信息可分多行输入。该信息用于删除一道题目信息,题目被删除之后,引用该题目的试卷依然有效,但被删除的题目将以0分计,同时在输出答案时,题目内容与答案改为一条失效提示,例如:”the question 2 invalid~0”

格式:"#D:N-"+题目号

格式约束:

   题目号与第一项”题目信息”中的题号相对应,不是试卷中的题目顺序号。

   本题暂不考虑删除的题号不存在的情况。      

样例:

#N:1 #Q:1+1= #A:2
#N:2 #Q:2+2= #A:4
#T:1 1-5 2-8
#X:20201103 Tom-20201104 Jack
#S:1 20201103 #A:1-5 #A:2-4
#D:N-2
end

输出

alert: full score of test paper1 is not 100 points
1+1=~5~false
the question 2 invalid~0
20201103 Tom: 0 0~0

答题信息以一行"end"标记结束,"end"之后的信息忽略。

输出格式:

1、试卷总分警示

该部分仅当一张试卷的总分分值不等于100分时作提示之用,试卷依然属于正常试卷,可用于后面的答题。如果总分等于100 分,该部分忽略,不输出。

格式:"alert: full score of test paper"+试卷号+" is not 100 points"

样例:alert: full score of test paper2 is not 100 points

2、答卷信息

一行为一道题的答题信息,根据试卷的题目的数量输出多行数据。

格式:题目内容+""+答案++""+判题结果(true/false)

约束:如果输入的答案信息少于试卷的题目数量,答案的题目要输"answer is null"
样例:

 3+2=~5~true
 4+6=~22~false.
 answer is null

3、判分信息

判分信息为一行数据,是一条答题记录所对应试卷的每道小题的计分以及总分,计分输出的先后顺序与题目题号相对应。

格式:**学号+" "+姓名+": "**+题目得分+" "+....+题目得分+"~"+总分

格式约束:

 1、没有输入答案的题目、被删除的题目、答案错误的题目计0分
 2、判题信息的顺序与输入答题信息中的顺序相同
样例:20201103 Tom: 0 0~0

   根据输入的答卷的数量以上2、3项答卷信息与判分信息将重复输出。

4、被删除的题目提示信息

当某题目被试卷引用,同时被删除时,答案中输出提示信息。样例见第5种输入信息“删除题目信息”。

5、题目引用错误提示信息

试卷错误地引用了一道不存在题号的试题,在输出学生答案时,提示”non-existent question~”加答案。例如:

输入:

#N:1 #Q:1+1= #A:2
#T:1 3-8
#X:20201103 Tom-20201104 Jack-20201105 Www
#S:1 20201103 #A:1-4
end

输出:

alert: full score of test paper1 is not 100 points
non-existent question~0
20201103 Tom: 0~0

如果答案输出时,一道题目同时出现答案不存在、引用错误题号、题目被删除,只提示一种信息,答案不存在的优先级最高,例如:
输入:

#N:1 #Q:1+1= #A:2
#T:1 3-8
#X:20201103 Tom-20201104 Jack-20201105 Www
#S:1 20201103
end

输出:

alert: full score of test paper1 is not 100 points
answer is null
20201103 Tom: 0~0

6、格式错误提示信息

输入信息只要不符合格式要求,均输出”wrong format:”+信息内容。

  例如:wrong format:2 #Q:2+2= #4

7、试卷号引用错误提示输出

如果答卷信息中试卷的编号找不到,则输出”the test paper number does not exist”,答卷中的答案不用输出。

8、学号引用错误提示信息

如果答卷中的学号信息不在学生列表中,答案照常输出,判分时提示错误。

本题暂不考虑出现多张答卷的信息的情况。





- 分析:

本题又是上一题的延申,在上一题的基础上,又添加了学生信息和实现删除题目功能。吸取前两题类设计不足的问题,解析字符串也创建一个类,还创建了学生类,删除类,答案类和答卷类,各司其职,遵循单一职责。还创建一个Sheet类来连接试卷类和答卷类,减轻主类的职责。

类的设计:
  1.题目类(Qustion):保存题目信息并处理。

     private int number;//题目数量
     private String question;//题目内容
     private String standAnswer;//标准答案
     boolean checkAnwser(String answer)//判断答案是否符合标准答案

  2.试卷类(Testpaper):保存一张试卷信息并处理。

    private int testNumber;//试卷编号
    private Question[] Qarr=new Question[100];//题目集合
    private int[] score=new int[100];//每一题的分数
    private ArrayList<Integer> QnumberList = new ArrayList<>();//题目顺序
    boolean checkAnwser(int num,String answer)//判断题目是否正确
    void saveQuestion(int num,String question,String standanswer)//储存一个题目信息
    int AllScore()()//计算试卷总分

  3.答案类(Answer):保存并处理答案信息。

     private int Anumber;//答案顺序号
     private String answer;//答案内容

  4.答卷类(Answerpaper):保存并处理一张答卷信息。

    private int sheetNumber;//答卷编号
    private Student student = new Student();//学生信息
    private Answer[] answers = new Answer[100];//答案集合
    private int[] score = new int[100];//每一题得分
    private boolean[] check = new boolean[100];每一题判断结果
    private ArrayList<Integer> OderList = new ArrayList<>();//答案顺序
    void saveAnswer(int oder,Answer answer) //储存答案信息
    void saveScore(int number,int score)//获得第num题的分数
    void saveCheck(int number,boolean check)//获得第num题的判断结果 

  5.学生类(Answerpaper):

    private String ID;//学号
    private String name;//姓名

  6.套卷类(Sheet):

    private Testpaper test = new Testpaper();//试卷信息
    private Answerpaper answerpaper = new Answerpaper();//答卷信息
    void judgeTest()//判断答卷情况

  7.删除类(Delete):

  private int qnumber;//删除的题号
  private Testpaper test = new Testpaper();//试卷信息
  private Answerpaper answerpaper = new Answerpaper();//答卷信息
  void delQuestion()//删除题目

  8.字符串解析类(splitQuestion):

  private String str;//输入的字符串
  private Testpaper test = new Testpaper();//试卷信息
  private Answerpaper answerpaper = new Answerpaper();//答卷信息
  private ArrayList<Student> students = new ArrayList<>();//学生列表
  boolean Spilt()//解析并判断是否正确

- UML类图:





三、踩坑心得

题目集(一)

-坑点:

1.含多余的空格符。输出答案不正确 😦

  1
  #N:1 #Q: The starting point of the Long March is #A:ruijin
  #A:ruijin
  end


改进:字符串解析不正确,错把题目也分割掉了,所以尝试只用#和:分割


去除多余空格后,就成功AC这道题了😃


-评价与心得:

此题结构不复杂,所以在设计类的时候,没有考虑仔细,将大部分功能一股脑放在主方法里,很多功能没有考虑到,只是在面向测试点编程,例如,因为此题没有格式不正确的输入情况,所以导致我在设计类时没有考虑字符串是否匹配,结构不清晰,没有遵守单一职责原则。





题目集(二)

-坑点:

1.多张答卷时,出现第二张将第一张替换掉的情况。😕

改进:调试了好多次,将答卷定义在,解析答卷信息的if语句里,最后定义了一个变量作为答卷张数,在保存答卷时,增加张数。


这样,每次答卷信息都不会干扰。


2.输入多张答卷信息,试卷不满一百分,会重复输出总分警示。😭

改进:因为,我输出都用Sheet,所以每一次答卷都会输出警示,只要将输出警示放在testpaper解析的if语句里即可


-评价与心得:

此题在上一题的基础上加了分数和多张答卷信息,结构较上一题复杂了一些,我没有重新分析设计类,延续上一题的结构,导致出现不少bug,最终还是没有AC😞例如:答案缺失,不会输出,答案为空,也不是正常输出。还是没有理解单一职责,类的数量太少,结构混乱。💩





题目集(三)

-坑点:

1.删除的题目,不提示已经删除。

改进:我在删除时将题目顺序的数组中将相应的数量也删除了,导致直接跳过这一题,所以只删除题目,并将答案赋值为"Invalid".


2。答案为空时,不输出。


改进:在分割字符串时,若答案为空,赋值为空字符,判断时,按正常答案判断并输出


-评价与心得:

此题在上一题的基础上,又复杂化了,所以我改了之前的写法,尝试遵循单一职责,但还是理解不到位,没有AC😥 至少解决了,答案为空的问题,结构在逻辑上也没有上一次那么混乱。主要还是正则表达式没有运用好,字符串解析问题较大。⚠️




四、总结


三次作业总评

总的来说,三次作业的最后一题,一次次地增加难度,开始考虑的很简单,在第一次,只实现了局限的功能,结构混乱,不能随着题目的复杂度提高而迭代功能代码。说实话,这次blog重点不在于介绍如何解题,而是罗列出解题时的思路与步骤,让我厘清自己错误在哪,对前三次作业做一个分析与记录,从而让我接下来的题目能更好地解决,也便于提升自己的编程能力,形成良好的面向对象的思维。显然,在这三次题目中,我并没有很好地运用面向对象的原则。写到这里,我能清晰地看到自己思维的混乱和逻辑的错误。还有贯穿题目的重要的工具——正则表达式,也没有很好的运用与掌握。😇😇😇对于第三部分,踩坑心得,坑点看起来很少,但都是较大的错误,也明显地反应了,类设计的不合理,只能根据测试点来修改每一次的代码。三次的作业总体的情况很差,希望之后的作业能更好。


改进与建议

两大重点:单一职责、正则表达式,前者要在类的设计中,严格遵守,保证类间关系的合理性。后者要熟练掌握,来解析字符串。后面的题目中又会增加新的内容,要进一步研究面向对象的几个原则,注重类的设计。

posted @ 2024-04-21 21:47  东风不写诗  阅读(80)  评论(1)    收藏  举报