答题判题程序分析

news/发布时间2024/5/18 7:14:43

7-1设计一个风扇类
第一题是入门的一道题,首先定义一个风扇类(class Fan),包括常量(public final),不同类型的数据类型比如有int类型,boolean类型,double类型,string类型,然后一个无参构造方法,一个有参构造方法,把参数传进去以获得数据,最后用toString方法显示对象(public String tiString())。
接下来是主函数的内容,需要注意的就是创建对象时new的用法(Fan fan1=new Fan();Fan fan2=new Fan(fanSpeed, fanOn,fanRadius,fanColor);)以及后续的引用,以及最后输出时候用toString方法(System.out.println(fan2.toString());)。
7-2类和对象的使用
这道题比第一题进化一些,首先是有参构造方法用了this方法,然后是为属性提供了getter()和setter()方法。
public String getName(){return name; } public void setName(String name){ this.name=name;}
7-3成绩计算-1-类、数组的基本运用
这道题又加入了一个点是在类里面定义了sum和average方法去计算总分和平均分。
然后在主函数又新学了个知识就是创建对象数组,因为学生有多个需要创建新的对象。
7-4成绩计算-2-关联类
这道题比上一题多加了东西但是基本还是一致的。

对答题判题程序的分析:
设计实现答题判题程序,这道题有三次变化,从最基本的框架开始,然后一步步去进化,每一次向其中加入更多的东西,比如一开始就是使用数组,后面会用到arraylist类储存数据,后面再学习HashMap的内容,然后下面就对这些题做一个逐步的分析。
7-1答题判题程序-1
首先每个基本的程序都是包括输入和输出的,那么这个程序的输入信息就分为三部分,题目数量,题目内容,答题内容。
题目内容的输入方式是有格式的,并且输入的内容包括了题号,题目内容,标准答案,那么就需要建立一个题目类class Lesson用于封装单个题目信息,然后它是一张试卷有多个题目,就需要试卷类class Term封装整套题目的信息,最后一个答题类去输入答案,再将输入的答案与标准答案比对看是否正确。
首先遇到的问题是不知道怎么在试卷类里面放多个题目,如何实现可以输入多个,那么就有了集合的内容,在试卷类中写入题目类private Lesson lesson,再构造一个方法创建题目类的对象。而在答案类里面就要实现答案和标准答案的比对,相同输出true,不同输出false。
然后这道题目最大的问题就是输入的内容如何对应相应的部分,比如说如何获得输入的这部分内容是题目还是答案,如何将答案与标准答案比对。此时就会用到split方法,我们输入一条字符串,然后用正则表达式将输入的题目分为题号,题目内容,标准答案三部分再调用term中的creat方法去创建对象。答案则是用了substring方法,取第三个之后的字符也就是输入的答案与标准答案对比,然后用equals方法,遇到end时停止输入,最后输出。

7-2答题判题程序-2和7-3答题程序-3
在答题判题程-1的基础上,增加了试卷信息,里面包含了试卷中不同题目的分值,答案也不知是单纯一张卷子中,而是多张试卷,每组答案有试卷号,顺序题号的各题目答案。

而答题判题程序-2和7-3答题程序-3的区别就在于后者又加入了学生信息以及删除题目信息的功能,因为二者在答题时我的基本框架是一样的,在这里就一起分析。
首先,因为输入变多了,复杂度也增高了,在方法上做了一些调整。输入上一次性输完所有的字符串,然后在使用字符串分割的方法把其分割成对应的部分,这是最开始的一个思路,具体实现会在后续解释。
下面我就分析一下整个题目答题的类和具体内容分析。
1.Question 类:代表单个考试题目。
• id : 题目的序号。
• content : 题目内容。
• answer : 正确答案。
• valid : 题目是否有效,默认其值为 true。
在Question类中包含的方法:
因为题目中有无效性的测试,当输入格式不对或者是错误引用了不存在的题号的试题时,这道题就是无效的,那么在类中就写入一个方法标记题目无效。
• invalidate() : 将题目标记为无效。
2. TestPaper 类:代表一份试卷,可以包含多个题目及其分值。
• id : 试卷的编号。
• questions : 一个有序的哈希表,键是题目的 ID,值是该题目的分值。
从这里开始,就学习了一个新的知识点,就是HashMap,HashMap是Map接口的一个实现类(HashMap实现了Map的接口),它具有Map的特点,HashMap的底层是哈希表结构。Map具有双列存储的特点,一次添加两个元素,也就是键值对。Key数据类型为Integer类型,Value数据类型为String类型的Map。
然后我对HashMap的方法做了一个总结。
① put方法:用于添加元素(定位到位置,其中无元素,直接插入)。
② get方法:get(object key)返回键对应的值。
③ remove方法:移除指定键值对。
④ getOrDefault方法:是Map提供的,对不存在的键值提供默认值的方法。
⑤ containsKey方法:判断键(key)是否存在。
⑥ containsValue方法:检查HashMap中是否有指定值。
⑦ computeIfAbsent方法:返回value值
⑧ size方法:返回键值对数量。

• 方法:
• addQuestion(int questionId, int points) : 向试卷添加题目以及其分值。
• totalPoints() : 计算试卷的总分。
这里就会遇到一个问题,如何计算总分最为简便,我不可能一个一个提取出来然后又相加,然后就查到了map中的一个方法去计算总分,就是map.values().stream().mapToInt(Integer::intValue).sum()。

  1. Submission 类 :表示学生对特定试卷的一次提交。
    • paperId : 提交对应的试卷 ID。
    • answers : 存储学生提交的答案,键是题目序号,值是学生的答案。
    • 方法:
    • addAnswer(int questionSequence, String answer) : 添加学生的答案。
    • getAnswer(int questionSequence) : 获取学生对某个题目的答案,如果未回答则返回 “answer is null”。
    4. Student 类 - 表示学生。
    • id : 学生的学号。
    • name : 学生的姓名。
    • submissions : 存储学生的所有提交,键是试卷 ID,值是提交对象。
    • 方法:
    • ensureSubmission(int paperId) : 确保学生有一个对应的提交对象,如果没有则创建一个。
    主函数:
    • questions : 存储所有题目,键是题目 ID,值是 Question 对象。
    • testPapers : 存储所有试卷,键是试卷 ID,值是 TestPaper 对象。
    • students : 存储所有学生,键是学生 ID,值是 Student 对象。
    • errors : 存储输入解析过程中的错误信息。
    • scanner : 用于读取输入数据。
    接下来就是主函数的编写,主要思路还是输入一串长字符串然后对其进行处理将其分为各不同的题目,试卷封装,学生信息,答卷信息,删除的题目信息比对后输出对应内容。
    主函数:
    首先需要用private static final Map创建全局变量,也是运用HashMap的内容。
    private static final Map<Integer, Question> questions = new HashMap<>();
    private static final Map<Integer, TestPaper> testPapers = new HashMap<>();
    private static final Map<String, Student> students = new HashMap<>();
    private static final List errors = new ArrayList<>();
    那么如何把长字符串分割呢,只需要在不同方法中实现,首先,因为它的输入可能是乱序的,所以就需要有标志判断输入的是什么内容,这里就会用到startsWith(“”)方法:用于检查一个字符串是否以指定的子字符串开头。
    比如说输入字符串line,则当line.startsWith("#N:")时就进行某种方法,然后这个循环是有条件的,就有了一个新的知识点,做了一个总结。
    ① next():遇到空格停止。
    ② nextLine:可输入空格。
    ③ hasNext():检查下一个标记,逐个读取。
    ④ hasNextLine():检查下一行是否存在,逐行读取。
    注:每组元素个数确认或者已知时用in.hasNext(),每组元素个数不确定时用逐行读取的in.hasNextLine()。
    在输入时,用trim()方法去除空格,然后读取到end就停止。

parseInput() : 解析输入数据,根据不同的前缀处理数据并存储到相应的数据结构中。支持的前缀包括:
• #N: : 解析题目:parseQuestion(line):利用split方法将输入的题目根据空格分为几部分,先检查输入格式,然后这里用到了Integer.parseInt()方法是强制类型转换,将字符型转变成int类型以便序号比对,还有substring方法,subString是Java提供的一种字符串截取方法,通常我们可以用参数来控制截取的字符串,这里用到的就是比如说parts[1].substring(3)就是此时得到的字符串从下标为3的位置开始截取到最后的值。然后再采用HashMap中的put方法将键值对输入到列表中,一个id对应题目也就是questions.put(id, new Question(id, content, answer))。
HashMap的优点就是键值对,每一个点只有一个值,然后放到列表里,就能够比对试卷的编号,题号,从而确认输出的内容。
• #T: : 解析试卷:parseTestPaper(line):与上基本一致,然后它是根据“-”分割的。
• #X: : 解析学生信息:parseStudents(line):同上,就是分割学生的信息,分为学号,姓名,再利用put放进列表中。
• #S: : 解析学生提交:parseSubmission(line),返回true或者false,如果格式不对则输出wrong format的内容
• #D:N- : 标记某个题目为无效。
• 若行不符合上述格式,则记录错误信息。
• printErrorsAndResults() : 打印所有的错误信息和每个学生的考试结果。检查每份试卷的总分是否为100分,计算每个学生的每次提交的得分。
在输出中用到了Map.Entry,Map.Entry是Map的一个内部接口。Map提供了一些常用方法,如keySet()、entrySet()等方法,keySet()方法返回值是Map中key值的集合;entrySet()的返回值也是返回一个Set集合,此集合的类型为Map.Entry。Map.Entry是Map声明的一个内部接口,此接口为泛型,定义为Entry<K,V>。它表示Map中的一个实体(一个key-value对)。接口中有getKey(),getValue方法。我们要使用Map.Entry遍历Map组合,再利用arraylist的内容存储数据最后按照格式输出。


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

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

相关文章

el-select下拉框远程搜索且多选时,编辑需要回显的一个简单案例

前端业务开发中不管使用vue2~3,还是react,angular各种前端技术栈,经常会遇到这种业务。一个下拉框Select中,不仅需要需要支持远程模糊搜索,还需要支持多选。并且在编辑时,还能正常把已经多选好的内容回显到Select中。 用Vue3+ElementPlus+TS举一个简单的案例。其他技术栈…

2.Nacos简介

Nacos简介 Nacos官方地址:https://nacos.io/ Nacos英文全称为 Dynamic Naming and Configuration Service,是一个由阿里巴巴团队使用Java语言开发的开源项目。 Nacos是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。 官方介绍是这样的:Nacos致力于帮助您…

6.常见寄存器和指令

一.寄存器 1.通用寄存器2.特殊寄存器stvec(Supervisor Trap Vector) 内核在这里写入trap处理程序的地址;RISC-V会跳转到stvec中的地址来处理trap,xv6的stvec就是trampoline page的起始地址sepc 发生trap时,RISC-V将当前的pc值存储到这里(pc随后会被stvec中的值覆盖)。从trap…

MFC-error C2589: “(”:“::”右边的非法标记

MFC-error C2589: “(”:“::”右边的非法标记错误信息 出错语句 问题原因 解决办法 错误信息 ① 错误 C2589 “(”:“::”右边的非法标记② 错误 C2059 语法错误:“)” 出错语句inline double getFitnessScore (double max_range = std::numeric_limits<double>::max()…

Thinkphp5.x全漏洞复现分析

基础知识 命名空间和子命名空间 我们可以把namespace理解为一个单独的空间,事实上它也就是一个空间而已,子命名空间那就是空间里再划分几个小空间,举个例子: <?phpnamespace animal\cat; class cat{public function __construct(){echo "meow"."\n"…

退出到restart application设置

在主题中加一个退出按钮。 点击退出按钮,增加退出事件中加入如下语句: ModalResult:=mrCancel;