22207130-叶盛东-Java大作业总结

news/2025/3/16 0:05:49/文章来源:https://www.cnblogs.com/yljh/p/18504305

Java大作业总结

目录
  • Java大作业总结
    • 一.前言
    • 第一次作业
      • 1.设计与分析
        • 第一小题
        • 第二小题
        • 第三小题
        • 第四小题
        • 第五小题
      • 2.踩坑心得
      • 3.改进建议
    • 第二次作业
      • 1.设计与分析
        • 第一小题
        • 第二小题
        • 第三小题
        • 第四小题
      • 2.踩坑心得
      • 3.改进建议
    • 第三次作业
      • 1.设计与分析
        • 第一小题
        • 第二小题
        • 第三小题
      • 2.踩坑心得
      • 3.改进建议
    • 总结

一.前言

这三次大作业前面的题目都比较简单,题量适中,题目集中的最后一题是最难的,在第三次大作业相较于前两次的大作业的最后一题也是最难的。这三次大作业能循序渐进,难度增大幅度快。让我学会更多Java的知识。本次总结粗略分析每个题目集的前面几个小题,重点分析每个题目集的最后一题

第一次作业

1.设计与分析

  • 第一小题

​ 这题根据题目所要求,在风扇类创建相关的成员变量,然后再重写一下toString方法,在main方法中直接打印风扇类的对象,即可打印出toString里面所要求的样式。


  • 第二小题

​ 第二小题和第一题差不多,都是按照要求创建相应的成员变量,主要的是这道题要求toString方法和printInfo方法,这2个方法要求输出的内容不同。


  • 第三小题

​ 第三小题主要是输入的信息的划分比较麻烦,浮点数运算比较难,在题目中给出浮点数运算的链接中,给出了4中方法,其中我认为String.format("%.2f", f)DecimalFormat 比较好用,在我使用过程中BigDecimal 向上或向下取整没用。


  • 第四小题

​ 第四小题和第三小题类似,不做赘述,主要注意的是题目中之说了运算2个平均分,但是在样例中得算2个总分和2个平均分。


  • 第五小题

​ 这题难的是对于输入信息的划分,开始时我用的不是正则表达式,划分起来很麻烦,有很多情况要考虑,是否有空格,输入是

合法,这些都要考虑,后来就换用了正则表达式。首先读取题目的数量,根据题目数量循环调用正则表达式方法读取题目信息。匹配到内容后,用Map存储

Map<Integer, Question> questions = new LinkedHashMap<>();

其中键为题号,值为一个Question类型的对象,Question里面有2个成员变量

  • content - 题目的内容
  • answer - 题目的答案

分割题目,答案,存储题目信息的逻辑如下代码所示

        String numberStr = extractPart(line, "#N:");String content = extractPartWithSpaces(line, "#Q:");String answer = extractPart(line, "#A:");int number = Integer.parseInt(numberStr.trim());questions.put(number, new Question(content, answer)); 

现在已经读取到了题目数量,题目,和标准答案,接着就要读取考生输入的答案了,由于所有的题目答案都是在一行输入

  • #A:2 #A:4

那就还得分割一下答案信息,同时用一个List存储答案

        List<String> answers = new ArrayList<>();            String[] userAnswers = line.split("#A:");for (int j = 1; j < userAnswers.length; j++) { // 跳过第一个空字符串answers.add(userAnswers[j].trim());}

存储好题目,标准答案和考生输入的答案后,就得输出题目考生输入的答案和truefalse了。

先是遍历questions这个Map,根据题号获取题目信息并输出,接着补上‘~’号再遍历answers这个List,输出对应的考生的答案,最后判断考生输入答案是否是标准答案而输出对应结果。

总的来说代码逻辑就是

  • 首先读取题目数量。
  • 接着逐条读取题目信息,并使用LinkedHashMap存储题目信息,确保题目按输入顺序被处理。
  • 读取用户答题信息直到遇到“end”标记停止。
  • 输出每道题的题目内容及用户答案。
  • 对比用户答案与标准答案,输出判题结果。

输入处理

  • 使用extractPartextractPartWithSpaces方法解析输入行中的题号、题目内容和标准答案。
  • 题目信息存储在一个LinkedHashMap中,键为题号,值为题目对象。
  • 用户答案存储在一个ArrayList中。

输出处理

  • 输出部分首先遍历LinkedHashMap,打印出每道题的题目内容和用户的答案。
  • 然后再次遍历LinkedHashMapArrayList,和通过比较用户的答案和题目对象的标准答案来构建判题结果字符串。
  • 最后输出判题结果。

类图


2.踩坑心得

  • 刚开始时用的是字符串分割,一个一个匹配,但是后面要考虑的情况实在是太多了,题目中可能有空格,题目不是数学公式等问题,因此后面换了正则表达式,可以直接匹配题目,不用考虑各种可能出现的情况。

String pattern = prefix + "\\s*(.*?)(?=\\s*#A:|$)";

String pattern = prefix + "\\s*(.*?)(?:\\s+|$)";

  • 刚开始时不是用Map存储题目的题号和题目内容,而是用List只存储题目内容,但是遇到

    2
    #N:2 #Q:1+1= #A:2
    #N:1 #Q:5+5= #A:10
    #A:10 #A:2
    end
    

    这种示例时,程序会先输出第二题而不是第一题,导致出错。因此后面改用Map存储题号和题目内容。

3.改进建议

  • 这次作业基本上没有用到类的思想,只定义了一个问题类和一个Main类。



第二次作业

1.设计与分析

  • 第一小题

​ 这道题主要是运用接口,实现类得重写接口的方法。比较手机的价格,同时按升序排序的话又得重写Collection类的sort方法.


  • 第二小题

​ 这题主要是构造方法的运用,可以用无参构造方法,也可以用有参构造方法来创建一个对象。


  • 第三小题

​ 这题只要补充代码就行,而补充的代码就是对类里面成员变量的操作。


  • 第四小题

看题目就知道要划分题目类试卷类答卷类,我又自己定义了个扫描试卷类评分类,减少Main类的代码

题目类有3个参数

  • number - int类型,题号
  • content - String类型,题目内容
  • answer - String类型,题目标准答案

试卷类有3个参数

  • id - int类型,试卷号
  • questionScores - List<Map.Entry<Integer, Integer>>类型,里面存储了一个Map,Map键为题号,值为分数
  • totalScore - int类型,总分

答卷类有2个参数

  • testPaperId - int类型,试卷号
  • answers - List<String>类型,存储考生答案

扫描类有3个参数

  • questions - Map<Integer, Question>类型,存储题目编号和Question对象
  • testPapers - Map<Integer, TestPaper>类型,存储试卷号和TestPaper对象
  • answerSheets - List<AnswerSheet>类型,存储AnswerSheet对象

  • 由于要输入试卷号,题目和考生答案等太多内容,用正则表达式解析不过来,因此我选择字符串分割,自己解析对应数据。在扫描数据时,我选择在循环一行一行扫描解析,遇到输入的是end就结束解析,每一行都会判断开头是否是#N,#T,#S,然后在进入对应的解析代码中,进入对应解析代码中,还得按空格用split进行分割数据,接着再进行对应操作,然后用有参构造方法创建题目/试卷/答卷的对象,最后用集合存储对象,扫描工作即可完成。

  • 在评分类中,定义一个总分数组,先把每个相同试卷号的小题分数相加,若不足100分就提示“alert: full score of test paperX is not 100 points”,同时如果答案信息中试卷的编号找不到也要输出对应提示“The test paper number does not exist”。
    至此才正式到了判断环节,先变量试卷类中的questionScores 成员变量取出每一个Map,然后再遍历Map,获取题号,根据题号从扫描类的questions获取题目类对象,同时判断题目对象中的标准答案和考生输入的答案是否相同,相同就把总分数组的分数相加,计算出总分,若是在answerSheets里面找不到题号对应的答案,输出“answer is null”。最后输出题目

        for (Map.Entry<Integer, Integer> entry : testPaper.questionScores) {int questionNumber = entry.getKey();int questionScore = entry.getValue();Question question = scanPaper.questions.get(questionNumber);String studentAnswer = answerIterator.hasNext() ? answerIterator.next() : null;boolean correct = studentAnswer != null && studentAnswer.equals(question.answer);totalScore += correct ? questionScore : 0;scores[scores.length - testPaper.questionScores.size() + testPaper.questionScores.indexOf(entry)] = correct ? questionScore : 0;if (studentAnswer == null) {resultOutput.append("answer is null\n");} else {resultOutput.append(question.content).append("=").append("~").append(studentAnswer).append("~").append(correct).append("\n");}}

类图

2.踩坑心得

  • 刚开始解析题目时,我用的是 String[] parts = line.split(" ");因为样例中没有题目中有空格的情况,但是实际测试中有2个样例非零返回,后面查找原因是题目有空格,导致题目被划分开了,从而导致Integer.parseInt这个方法解析的不是数字,可能是运算符号等等。

3.改进建议

  • 这次作业里面的参数命名不好,有试卷号,有题号,试卷号和题号在其他类中也有,导致容易混淆,代码看的费劲。
  • 引入自定义异常类,并记录详细的错误日志。例如,可以创建InputFormatException等异常类,当检测到输入格式错误时抛出,并记录具体的错误信息。
  • 考虑使用更高效的数据结构来提高程序的性能。例如,使用TreeMap来替代HashMap进行有序存储,或者使用ConcurrentHashMap来支持并发访问。



第三次作业

1.设计与分析

  • 第一小题

​ 这道题主要是运用getter方法和setter方法


  • 第二小题

​ 这题主要是熟悉日期类的使用,如何格式化日期和解析日期,格式化日期用到了DateTimeFormatter类和LocalDate类,LocalDate类能很好的判断该日期是是当年的第几周,第几天,该年份是否是闰年等。


  • 第三小题

这道题我是在第二次大作业基础上改的,增加了学生类删除类,同时还修改了参数的名字。

题目类有3个参数

  • number - int类型,题号
  • content - String类型,题目内容
  • answer - String类型,题目标准答案

试卷类有3个参数

  • id - int类型,试卷号
  • questionNumAndScores- List<Map.Entry<Integer, Integer>>类型,里面存储了一个Map,Map键为题号,值为分数
  • totalScore - int类型,总分

答卷类有3个参数

  • studentID - String类型,学生编号

  • testPaperId - int类型,试卷号

  • questionNumAndAnswer- List<String>类型,存储考生答案


扫描类有3个参数

  • questions - Map<Integer, Question>类型,存储题目编号和Question对象
  • testPapers - Map<Integer, TestPaper>类型,存储试卷号和TestPaper对象
  • answerSheets - List<AnswerSheet>类型,存储AnswerSheet对象
  • cun - int类型,计题目数量
  • ErrorCun - int类型,出错的题目数量
  • students - List<Student>类型,存储学生对象
  • deleteQuestionsList - List<deleteQuestions>类型,存储删除类的

删除类有1个参数

  • QuestionNum - int类型,所删除的题目的编号

在扫描类输入题目信息时,本来应该输入#N:1 #Q:1+1= #A:2却输入成#N:1 +1= #A:2,这会导致代码解析出错,从而导致整个程序退出运行,那么直接加入try{}catch{}语句,同时在catch代码块里面输出题目让我们输出的信息,这既能解决解析出错导致整个程序崩溃,还能符合题目要求。同时题目还增加了删除题目的功能,因此要在questions集合删除对应的题目,但是这也会导致一个问题:
Question question = scanPaper.questions.get(questionNumber);可能要获取删除的题目,那么值就为空,因此这里要加一个判断若为空,就提示题目要我们输出对应的信息。在判断为空的地方还得判断是否是题目不存在还是答案不存在还是问题无效这三种情况。


类图


2.踩坑心得

  • 这次作业没有看见还有输入格式错误的样例,最后找到原因,本来向另外判断的,但是看见样例如果输入格式错误都是最优先打印的,因此直接用try catch语句把错误提示打印出来。

  • 由于删掉了一个题目,但是在评分类还获取了这个题目,导致整个程序崩溃。


3.改进建议

  • ratingSystem 类中直接访问 scanPaper 类的静态成员变量是不好的设计模式。可以通过构造函数传递所需的对象实例来解决这个问题。
  • 考虑将输入解析逻辑从 scanning() 方法中提取出来,使得 scanPaper 类的职责更加单一。
  • 一些方法名可以更清晰地描述其功能,比如 gradeSheet 可以改为 evaluateAnswerSheet,使其意图更为明确。

总结

这三次作业难度不断提高,特别是答题判断程序。同时也学会了很多,比如正则表达式,类的单一原则,时间类的使用,集合的使用和集合的遍历,集合的嵌套等知识......,对于Java提供的集合的遍历特别是Map的方法,还需要还有集合的迭代器也是。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/822430.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于ESP32的桌面小屏幕实战[1]:需求分析与方案选型

项目来源:B站小智学长 1. 需求分析看时间:可联网同步时间;有屏幕 看天气:可联网同步天气;有屏幕 记单词:可联网同步单词;有屏幕 番茄工作时钟:可以手机设置工作、休息时间;有屏幕 获取B站粉丝数: 看室内温湿度:有温湿度传感器;有屏幕 可放入口袋:1-2寸屏幕;带电池…

利用samtools flagstat 对bam文件统计比对率的时候看的是哪个mapping rate

001、 在samtools flagstat 对bam的统计结果中,一共有三个比对率的结果: 002、比对率结果应该以哪个为准? 答案是:以3为准003、以山羊、绵羊的fastq数据,绵羊的参考基因组进行比对测试 a、如果以primary mapped对比,基本看不出两者的差异(其中S是sheep,G是goat) b、…

CPU 计算时延分析

CPU 计算时延 CPU(中央处理器)是计算机的核心组件,其性能对计算机系统的整体性能有着重要影响。CPU 计算时延是指从指令发出到完成整个指令操作所需的时间。理解 CPU 的计算时延对于优化计算性能和设计高效的计算系统至关重要。 1. CPU 计算时延的组成 CPU 计算时延主要由以…

Windows 记录一次磁盘相关的PC卡顿问题

我的电脑最近经常抽疯,时不时卡顿一次 检查系统事件日志,会有这俩个:发出了对设备 \Device\RaidPort0 的重置。 已在磁盘 0 (PDO 名称: \Device\0000003a)的逻辑块地址 0x7206a8 处重试 IO 操作。DiskGenis检查磁盘0,是正常的:这个FASPEED硬盘是国产士必得牌子的。京东商城…

RF/射频器件: CMD246C4 CMD235C4 CMD236C4 CMD254C3 CMD299K4 CMD262 一款5 W GaN MMIC功率放大器芯片

CMD254C3是一款高IP3双平衡混频器,采用无引脚表贴封装,可用于11 GHz至20 GHz的上变频和下变频应用。CMD246C4是一款宽带GaAs MMIC低相位噪声放大器,采用无引脚表贴封装,非常适合军事、航天和通信系统。16 GHz时,该器件提供17 dB的增益,饱和输出功率为+18 dBm,噪声系数为…

记录下使用docker-compose搭建开发环境

目录结构 docker-compose.ymlversion: "3" services:nginx:image: nginx:latestports:- "80:80"volumes:- ./code:/var/www/html- ./nginx/default.conf:/etc/nginx/conf.d/default.confdepends_on:- phpphp:#image: php:8.0-fpm########################…

题目1 - 3 总结

一、前言 在过去的一段时间里,我们完成了三次题目集的挑战。这三次题目集涵盖了丰富的知识点,题量和难度也各有不同。 (一)知识点概述 题目集 1 主要涉及 Java 的面向对象编程基础,包括类的定义、对象的创建和方法的调用。在这个题目集中,我们学会了如何使用类来封装数据…

题目集 1 - 3 总结

一、前言 在过去的一段时间里,我们完成了三次题目集的挑战。这三次题目集涵盖了丰富的知识点,题量和难度也各有不同。 (一)知识点概述 题目集 1 主要涉及 Java 的面向对象编程基础,包括类的定义、对象的创建和方法的调用。在这个题目集中,我们学会了如何使用类来封装数据…

题目集 1 - 3 总结性

一、前言 在过去的一段时间里,我们完成了三次题目集的挑战。这三次题目集涵盖了丰富的知识点,题量和难度也各有不同。 (一)知识点概述 题目集 1 主要涉及 Java 的面向对象编程基础,包括类的定义、对象的创建和方法的调用。在这个题目集中,我们学会了如何使用类来封装数据…

2024-2025-1 20241420 《计算机基础与程序设计》第五周学习总结

2024-2025-1 20241420姚金济 《计算机基础与程序设计》第五周学习总结 作业信息 |作业所属课程|<班级链接>https://edu.cnblogs.com/campus/besti/2024-2025-1-CFAP |作业要求|<链接>https://www.cnblogs.com/rocedu/p/9577842.html#WEEK05 |这个作业的目标| ①…

《DNK210使用指南 -CanMV版 V1.0》第三十三章 image元素绘制实验

第三十三章 image元素绘制实验 1)实验平台:正点原子DNK210开发板 2)章节摘自【正点原子】DNK210使用指南 - CanMV版 V1.0 3)购买链接:https://detail.tmall.com/item.htm?&id=782801398750 4)全套实验源码+手册+视频下载地址:http://www.openedv.com/docs/boards/k…

zlibrary网址是哪个及zlibrary电脑客户端/app下载

Z-Library是一家电子图书馆,同时也是全球科学图书和学术文献最大的免费资源之一。以下是对Z-Library的详细介绍及使用步骤: 一、Z-Library介绍 资源规模:Z-Library的数字档案库包含超过1400万本书籍,涵盖了广泛的学科领域,使其成为互联网上最为庞大的图书馆之一。 实体书籍…