首页 > 其他分享 >OOP课第一阶段总结

OOP课第一阶段总结

时间:2024-04-21 20:45:15浏览次数:16  
标签:总结 题目 String int Question ArrayList AnswerSheet OOP 第一阶段

前三次OOP作业总结Blog

  • 前言

    • 作为第一次3+1的总结,这次题目集的难度逐渐升高,题量、阅读量和测试点的数量变化都很大,所以对我们的编程和理解能力提出了更高的要求。例如在第一次到第三次的题目集中,类的数量由三个增长到了十余个。投入的时间也由最开始的45个小时到了后来的1824小时。这个过程从主观来说非常的痛苦,但是好在并不是全无收获。

    • 在这三周的时间里存在很多的问题,一开始根本不懂得数据如何去保存,也不知道类如何去使用。第一阶段的题目集中非常着重的考察了正则表达式的使用,这一特点在第三次题目集中尤为显著。这也意味着很多东西都需要从0开始,这个从无到有的过程才是对我们能力的训练。

    • 在第三次题目集中测试点也增长到了前所未有的28个,情况非常的复杂,而且存在一个非常明显的现象。在题目集开放至第三天的时候,达到满分的只有寥寥几人,其余很多人都停留在了94、97分的阶段,300多人提交了一万多份答卷,而通过率却只有堪堪1%。造成这一现象的主要原因是一些特殊测试点的存在,比如“答案为空字符”、“空白卷”等测试点成为了学生去往满分的路上最大的拦路虎。这说明,在设计代码的时候,并没有考虑到一些非常极端的情况,这是一个很大的缺陷。为了解决这些问题,我们陷入了非常痛苦的循环之中:

      不断地用额外的测试点进行调试

      不断地询问别人遇到的问题

      不断地修改已经提交了几十遍的代码

  • 正文

    • 第一次题目集

      这次题目集难度倒是不高,但是对于接触面向对象编程不久的小萌新来说还是颇具挑战:

      题目主干:

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

      其中需要处理的数据一共只有两个类型:

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

      答题信息 "#A:"+答案内容

      这里需要使用正则表达式去分割各个信息的不同部分,并且储存起来

      UML类图:

      可以看到一共设计了三个类,分别是AnswerSheet,ExamPaper,Question

      简单展示一下题目集一的复杂度:

      复杂度:

      Method CogC ev(G) iv(G) v(G)
      AnswerSheet.AnswerSheet() 0 1 1 1
      AnswerSheet.getAnswer(int) 0 1 1 1
      AnswerSheet.saveAnswer(String) 0 1 1 1
      ExamPaper.ExamPaper() 0 1 1 1
      ExamPaper.getQuestionContent(int) 0 1 1 1
      ExamPaper.judgeAnswer(int, String) 0 1 1 1
      ExamPaper.saveQuestion(int, String, String) 0 1 1 1
      ExamPaper.sortByNumber() 0 1 1 1
      Main.main(String[]) 11 1 7 9
      Question.Question(int, String, String) 0 1 1 1
      Question.getContent() 0 1 1 1
      Question.getNumber() 0 1 1 1
      Question.getStandardAnswer() 0 1 1 1
      Question.judgeAnswer(String) 0 1 1 1

      从这个表格中可以看出Main的复杂度比较高,主要是因为数据的读入和输出都是在主函数里面完成的:

      public class Main {
          public static void main(String[] args) {
              Scanner scanner = new Scanner(System.in);
              int questionCount = Integer.parseInt(scanner.nextLine());
              ExamPaper examPaper = new ExamPaper();
              for (int i = 0; i < questionCount; i++) {
                  String input = scanner.nextLine().trim();
                  String[] parts = input.split("#");
                  int number = Integer.parseInt(parts[1].split(":")[1].trim());
                  String content = parts[2].split(":")[1].trim();
                  String standardAnswer = parts[3].split(":")[1].trim();
                  examPaper.saveQuestion(number, content, standardAnswer);
              }
              AnswerSheet answerSheet = new AnswerSheet();
              String answerInput = scanner.nextLine().trim();
              while (!answerInput.equals("end")) {
                  String[] answers = answerInput.split("\\s+");
                  for (String answer : answers) {
                      answerSheet.saveAnswer(answer);
                  }
                  answerInput = scanner.nextLine().trim();
              }
              examPaper.sortByNumber();
              for (int i = 1; i <= questionCount; i++) {
                  String questionContent = examPaper.getQuestionContent(i);
                  String answer = answerSheet.getAnswer(i);
                  System.out.println(questionContent + "~" + answer.replace("#A:",""));
              }
              for (int i = 1; i <= questionCount; i++) {
                  String answer = answerSheet.getAnswer(i);
                  boolean result = examPaper.judgeAnswer(i, answer.replace("#A:",""));
                  System.out.print(result ? "true" : "false");
                  if(i>=1 && i!=questionCount){
                      System.out.print(" ");
                  }
              }
          }
      }
      
    • 第二次题目集

      第二次题目集我完成的不好,这是显而易见的,因为越来越多的数据需要处理,让我一个对数组的使用很是生疏的初学者较为棘手,所以这次题目及的代码就已经写成一坨乱麻了,非常的难看。

      问题主要出现在对于试卷信息的处理上:

      试卷信息

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

      由于这次添加了试卷信息,需要给出得分,题目分值和题目编号一一对应,正常来说需要使用到HashMap这样的映射关系,将题目编号和题目分值以映射的关系储存在一起,便可以通过题目编号寻找到相应的分值。但是当时我铁了心的要用List实现,后来发现非常的困难,但是我对于HashMap的使用非常的生疏,所以也没有及时的更改我的思路,导致最后的代码修修补补,毫无逻辑可言。

      UML类图:

      主函数非常的复杂,属于是剑走偏锋,两百多行的代码,主函数就占了半壁江山:

      复杂度:

      Class OCavg OCmax WMC
      AnswerQuestion 2.2 3 11
      AnswerSheet 1.25 2 5
      ExamPaper 1 1 5
      Main 28 28 28
      Question 1 1 5
      Score 1 1 4
      Method CogC ev(G) iv(G) v(G)
      AnswerQuestion.AnswerQuestion() 0 1 1 1
      AnswerQuestion.getExamQuestionList(int) 3 1 3 3
      AnswerQuestion.isFullScore(int) 3 1 3 3
      AnswerQuestion.isPaperExist(int) 3 3 2 3
      AnswerQuestion.saveExamQuestion(int, int, int) 0 1 1 1
      AnswerSheet.AnswerSheet() 0 1 1 1
      AnswerSheet.getAnswer(int) 1 2 2 2
      AnswerSheet.getAnswers() 0 1 1 1
      AnswerSheet.saveAnswer(String) 0 1 1 1
      ExamPaper.ExamPaper() 0 1 1 1
      ExamPaper.getQuestionContent(int) 0 1 1 1
      ExamPaper.judgeAnswer(int, String) 0 1 1 1
      ExamPaper.saveQuestion(int, String, String) 0 1 1 1
      ExamPaper.sortByNumber() 0 1 1 1
      Main.main(String[]) 72 5 27 29
      Question.Question(int, String, String) 0 1 1 1
      Question.getContent() 0 1 1 1
      Question.getNumber() 0 1 1 1
      Question.getStandardAnswer() 0 1 1 1
      Question.judgeAnswer(String) 0 1 1 1
      Score.Score(int, int, int) 0 1 1 1
      Score.getPaperNumber() 0 1 1 1
      Score.getQuestionScore() 0 1 1 1
      Score.getQuestionSequence() 0 1 1 1

      我看到这个数据的时候也是感觉到了非常的夸张,基本上成为了主函数战士,一个人把其他类的活干了一半。

      还是看一下数据的输入部分吧:

      数据输入:

      while (true) {
                  String input = scanner.nextLine().trim();
                  if (input.equals("end")) {
                      break;
                  }
                  String[] parts = input.split("#");
                  String types = parts[1].split(":")[0].trim();
                  if (types.equals("N")) {
                      int questionNumber = Integer.parseInt(parts[1].split(":")[1].trim());
                      String content = parts[2].split(":")[1].trim();
                      String standardAnswer = parts[3].split(":")[1].trim();
                      examPaper.saveQuestion(questionNumber, content, standardAnswer);
                  }
                  if (types.equals("S")) {
                      String[] answerParts = input.trim().split("\\s+");
                      int answerNumber = Integer.parseInt(answerParts[0].replace("#S:", "").trim());
                      sNumbers.add(answerNumber);
                      AnswerSheet answerSheet = new AnswerSheet();
                      for (String answerPart : answerParts) {
                          if (answerPart.contains("A")) {
                              answerSheet.saveAnswer(answerPart.replace("#A:", "").trim());
                          }
                      }
                      answerSheets.add(answerSheet);
                  }
                  if (types.equals("T")) {
                      String[] paperParts = input.trim().split("\\s+");
                      int paperNumber = Integer.parseInt(paperParts[0].replace("#T:", "").trim());
                      tNumbers.add(paperNumber);
                      tCount++;
                      for (String paperPart : paperParts) {
                          if (paperPart.contains("-")) {
                              answerQuestion.saveExamQuestion(paperNumber, Integer.parseInt(paperPart.split("-")[0].trim()), Integer.parseInt(paperPart.split("-")[1].trim()));
                          }
                      }
                  }
              }
      

      在这里使用了一个while循环来不断地读取每一行的数据,当遇到end的时候便直接退出循环。这段代码对数据的分割都是通过split完成的,而不是使用正则表达式,对于这道题来说,前者的功能堪堪够用,但是对于第三次题目集来说就有一点狗骑吕布的感觉了。

      标签:总结,题目,String,int,Question,ArrayList,AnswerSheet,OOP,第一阶段
      From: https://www.cnblogs.com/vhengeee/p/18149470

相关文章

  • PTA1-3总结w
    <1>前言:知识点:1.类的定义:代码中定义了三个类,Question、Answer和Paper,分别用来表示问题、答案和试卷。每个类都包含了相应的属性和方法。2.对象的创建:在main方法中通过new关键字创建了Question、Answer和Paper类的对象,然后对对象的属性进行赋值和操作。3.HashMap的使用:代码......
  • 关于题目集1~3的总结
    前言前三次pta作业最后一题都是答题判题程序,题目难度逐级提升但写完后收获也不小。首先一点是需求分析,不应上来就写代码而是从业务需求整体分析,在确定好程序的层次结构再开始实现相应的功能。在这三次作业中,将所学的编程知识很好地运用,其次,三次作业也同样考验我们的自学能力比......
  • NCHU题目集1~3的总结
    目录一.前言二.设计与分析三.采坑心得四.改进建议五.总结前言知识点总结题目集一字符串处理对输入的字符串进行对应的匹配与确认,找到对应的字符串的内容,将对应字符串中不合规范的内容进行处理,合格后直接存储。字符串的比对,满足要求的字符串进行输出和相应......
  • OOP第一次Blog
    本次Blog总结前三次作业的心得和体会**前言:前三次PTA作业整体难度不算很大,题量也一般,但是运用的知识点还是挺多挺杂的。第一次:没用到什么繁琐的知识点,初步见识到类之间的关联性和耦合性,难度不大,但是比较考验耐性。第二次:开始接触接口,用接口辅助排序,最后一道题在第一次的基础上......
  • blog1 1--3周PTA训练总结
    一.前言:在学习过C语言之后,面向对象的程序设计在本学期如期开启。该课程的编程语言是java,java与所学过的C语言有诸多相似之处,与C语言课程所不同的是,这门课程注重的是面向对象,如果说C语言是语法的学习,那么java就是其实战应用的学习,这门课的学习更让我深刻的感受到比写代码更重要的......
  • OOP答题判题系统1-3次总结
    一.前言1.知识点:(1)面向对象编程(OOP):这三道题目要求设计并实现题目类、试卷类和答卷类等,这涉及到类的定义、属性的封装以及方法的实现,是OOP的核心概念。(2)方式设计:设计并实现用于判题、保存题目、保存答案等功能的方法,这涉及到方法的命名、参数设计以及逻辑实现。(3)数据结构与集合......
  • 前三次答题判题程序总结
    前言:本次作业主要考察类的设计,从第一次作业只需三到五个类就能解决问题到第三次需要六七个类以上才能解决问题,这要求我们在写程序之前必须设计好各个类之间的关系和职责,这需要我们有良好的设计习惯并且遵守面向对象程序设计的原则。这几次作业难度很大,第一次作业200行可以搞定,第......
  • PTA前三次题目集总结
    以下内容是我对PTA三次习题作业最后一题的思路,源码以及总结学到的java知识大多都来自写题目集这些题目对我对java的认知与学习起到了不小的帮助答题判题程序-1题目内容设计实现答题程序,模拟一个小型的测试,要求输入题目信息和答题信息,根据输入题目信息中的标准答案判断答题的......
  • oop-PTA题目集1~3总结
    一、前言在学习了Java最基础的语法以及完成五次oop课前训练集之后,我们终于步入正轨,从符合人类思维的、流程化的,但存在可复用性差等缺点的面向过程的编程方式转入面向对象编程。谈到面向对象,就不得不谈及它的三大特点:封装、继承、多态。而这三次的题目尚未涉及继承和多态,主要是实......
  • OOP面向对象编程三次题目总结
    一.前言:在这三次题目集中,最后一小题为判题程序,其余题为基础的知识点题,输入一段题目内容,试卷内容,答卷内容,评判对错情况和计算最终总分,在这三次作业的迭代下,我一次比一次做的不好,第一次是满分,第二次95,第三次只有79,即使效果不好,我还是把我的做题思路写下来供大家参考。二.三次作业......