ToB企服应用市场:ToB评测及商务社交产业平台

标题: BLOG-1 [打印本页]

作者: 铁佛    时间: 2024-10-25 21:59
标题: BLOG-1
pta1-3次大作业博客总结

一、媒介

​                在前三次的PTA大作业中,我们依次完成了答题判题步伐1至3。这三个步伐彼此紧密相连,层层递进,每一次的完成都是在前一次底子上的一连修改、完善与优化。这三次大作业的顺利进行要求我们对类、Map、List、正则表达式等知识点有深入的明确与熟练的运用。从一开始,我们就需要构建一个合理的结构,由于这三个标题是紧密相扣的。
1.答题判题步伐1

​                答题判题步伐1的任务是模仿一个小型的测试体系,要求输入标题信息和答题信息,并根据标题信息中的尺度答案来判断答题的结果。这个过程不仅需要准确地解析和处理输入数据,还要求我们设计合理的算法来评估答案的正确性。
​                为了顺利完成这个标题,我们必须熟练掌握多种知识点,包括类的使用、字符串的分割、以及集合框架中的Map和List等。该标题的题量和难度均为中等,得当用来锻炼我们的编程能力和逻辑头脑。
​                 对我而言,作为一名从未接触过面向对象编程的初学者,这个任务在最初接办时确实显得有些棘手。面对面向对象的概念、类的设计以及如何高效地存储和处理数据,我需要耗费额外的时间进行明确和练习。然而,经过不断的积极和实行,我逐渐掌握了这些知识,并成功地完成了这个步伐。
2.答题判题步伐2

​                答题判题步伐2相比于答题判题步伐1新增了试卷信息模块。为顺利完成此题,我们同样需要熟练掌握类的使用、字符串的分割利用,以及集合框架中的Map和List等。这个标题的题量以及难度都属于中等。
3.答题判题步伐3

​                答题判题步伐3在答题判题步伐2的底子上新增了学生信息管理和标题信息删除功能。除了前面提到的知识点外,要完成此标题还需我们熟练掌握正则表达式,以判断输入格式的正确性。相比前两次PTA任务,第三次因新增了更多输入输出判断,题量和难度均大幅提升,完成此任务需要投入较多的时间和精力。
二、设计分析

1.答题判题步伐1

​                本标题要求设计一个答题步伐,用于模仿小型测试。步伐需输入标题信息和用户答题信息,并依据标题信息中的尺度答案判定答题结果。
为实现此功能,我们设计了四个核心类:
通过这四个类的协作,步伐可以有用地管理标题、记录答案,并盘算出测试结果,使整个答题流程清晰流畅。
类图


时序图


1.标题类

该类用于表现单个标题,包罗以部属性:标题编号、标题内容和尺度答案。类中界说了多种方法,支持基本的利用,例如设置和获取标题内容。此外,提供了答案校验方法,用于判断用户的回答是否正确。
  1. //判断答案是否正确
  2.     public boolean isCorrect(String answer) {
  3.         return standardAnswer.trim().equals(answer.trim());
  4.     }
复制代码
2.试卷类

该类用于表现一组标题集合,使用 Map 结构来存储多个标题。类中包罗了一些底子利用方法,如添加标题、删除标题、查找标题等。
3.答卷类

该类用于存储用户输入的答案、试卷信息及判题结果。类中包罗以下重要属性:paper(试卷类实例)、Map 类型的答案集合、以及 Map 类型的判题结果集合。重要利用包括生存答案、进行判题等功能,其中判题方法是该类的核心功能,用于对比用户答案与正确答案并生成结果。
判题方法首先通过 for 循环遍历试卷中的每个问题,使用 paper.getAllQuestions() 获取所有问题列表并依次进行评估。对于每个问题,从 answers 中提取用户的回答,并检查是否为空 (answer != null)。终极,所有标题的评估结果都会记录在 results 集合中。
  1. // 判题方法
  2.     public void evaluateAnswers() {
  3.         for (Question question : paper.getAllQuestions()) {
  4.             String answer = answers.get(question.getQuestionNumber());
  5.             if (answer != null) {
  6.                 boolean result = question.isCorrect(answer);
  7.                 results.put(question.getQuestionNumber()-1, String.valueOf(result));
  8.             } else {
  9.                 results.put(question.getQuestionNumber()-1,"false");
  10.             }
  11.         }
  12.     }
  13. }
复制代码
4.主类

该类综合调用了前面提到的三个类,用于实现标题的完整功能。其重要职责是接收用户输入,解析标题信息和答卷数据,并将其通报给相关模块进行处理,从而完成对标题的管理和答卷评判等任务。
2.答题判题步伐2

答题判题步伐2在答题判题步伐1的底子上新增了试卷信息,并且这三种信息可能会被打乱次序混合输入。
为实现此功能,我在答题判题步伐1的底子上进行了以下改进:
类图


时序图


1.试卷类

增加了试卷编号、分数和总分等属性及其相关基本利用。
2.答卷类

对其核心函数答案评估进行了大幅修改
相比于答题判题步伐1,答题判题步伐2的答案评估函数进行了一下修改:
3.主类

相比于答题判题步伐1,答题判题步伐2的主类优化完善了用户输入解析部分,进行了以下改进:
3.答题判题步伐3

答题判题步伐3相比于前两次难度大幅提升,相比于前两次,第三次,第三次新增了学生信息、删除信息,以及大量格式判断。
为完成该标题,在前两次的底子上,进行了以下修改:
类图


时序图


1.答卷类

又一次对评估答案函数进行了进一步完善与优化:
2.学生类

界说了属性学号姓名及其基本利用。
3.匹配类

匹配类中界说了isVaild方法,使用正则表达式判断输入是否合法。
  1.     public boolean ifvaild(String line) {
  2.         // 匹配题目
  3.         if (Pattern.compile("^#N:\\d+ #Q:.+ #A:[\\w\\d]+.*$").matcher(line).matches()) {
  4.             return true;
  5.         }
  6.         // 匹配试卷
  7.         else if (Pattern.compile("^#T:\\d+(\\s\\d+-[\\d\\w]+)*\\s*$").matcher(line).matches()) {
  8.             return true;
  9.         }
  10.         // 匹配答卷
  11.         else if (Pattern.compile("#S:(\\d+) (\\d+) (.+)").matcher(line).matches()) {
  12.             return true;
  13.         }
  14.         // 匹配学生
  15.         else if (Pattern.compile("^#X:\\d{8} \\w+(-\\d{8} \\w+)*$").matcher(line).matches()) {
  16.             return true;
  17.         }
  18.         // 匹配删除题目
  19.         else if (Pattern.compile("^#D:N-\\d+$").matcher(line).matches()) {
  20.             return true;
  21.         }
  22.         // 如果都不匹配,则返回false
  23.         return false;
  24.     }
复制代码
三、踩坑心得

  1. private int effectiveness;
复制代码
  1. if (getEffectiveness() == -1) {
  2.             System.out.println("The test paper number does not exist");
  3.             return; // 如果有效性为 -1,则直接返回,不再评估答案
  4.         }
复制代码
  1.             // 题号是否在题库中存在
  2.             else if (!questionBank.getQuestionBank().containsKey(questionPaper.getQuestionNumber())
  3.                     || question.getQuestion().equals("-1")) {
  4.                 output = "non-existent question~0";
  5.                 score = 0;
  6.             }
  7.             // 題目是否被刪除
  8.             else if (question.getQuestionNumber() == paper.getDeleteNum()) {
  9.                 score = paper.getQuestionScore(question.getQuestionNumber());
  10.                 output = "the question " + question.getQuestionNumber() + " invalid~0";
  11.             }
复制代码
  1.         // 试卷所有分数置0
  2.         for (int score : paper.getScoreMap().values()) {
  3.             score = 0;
  4.             resultScores.put(j, score);
  5.             j++;
  6.         }
复制代码
四、改进建议

五、总结

在此次这三次大作业中,我们逐步完成了三个答题判题步伐的开发,每个步伐都是在前一个的底子上进行了改进与扩展。这频频大作业不仅加深了我对面向对象编程、数据结构和算法设计等知识的明确,还提升了我解决实际问题的能力。
在第一个答题判题步伐中,要求设计一个基本的测试体系,输入标题信息和答题信息,并通过尺度答案进行判断。这一过程要求我们熟练掌握类的设计、字符串的处理及集合框架的运用。作为一个初学者,我在学习如何设计类及其交互时遇到了一些困难,但在不断的实践中,我逐渐掌握了相关的知识并成功实现了步伐功能。
第二个步伐在第一步伐的底子上增加了试卷信息模块,处理复杂输入的需求。我在设计时,增加了试卷编号、分数等属性,并优化了输入解析的代码,以支持信息的乱序输入。这一改进不仅提升了步伐的灵活性,也让我对步伐设计的模块化有了更深的明确。
进入到第三个步伐时,我面临了更大的挑战。新增的学生信息管理、标题信息删除功能以合格式判断使得第三次大作业的复杂性大幅提升。在设计中,我创建了多个新类以分担各自的功能。此外,我运用正则表达式对输入格式进行验证,确保步伐在接收数据时的严谨性。这一过程让我深刻体会到底子知识的重要性,特殊是在数据结构和正则表达式的运用上。
通过这三次大作业,我不仅提升了编程技能,还培养了分析问题和解决问题的能力。遇到的诸多挑战,好比如何有用管理输入输出、如何进行数据的有用性检查、如那边理对象之间的关系,都促使我不断反思和调解我的设计思路。在此过程中,我也意识到注释的重要性,合理的注释不仅能帮助我明确代码,也为他人阅读和维护代码提供了便利。这次三次大作业让我在实践中不断学习和成长,明确了软件开发过程中的重要环节,如设计、实现、测试和维护。未来,我会继续增强这些方面的学习,尤其是提高代码的可读性与可维护性,力求在编写高质量代码的道路上不断前行。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4