javase综合案例4 -- 考试系统
文章目录
- 一,项目要求
- 二,创建实体类ExamItem
- 三,创建考试服务类ExamService
- 3.1 全局变量 考题列表itemList(List< ExamItem >类型),答案数组answerArr (String[]类型),得分score
- 3.2 初始化方法init()
- 3.3 打印菜单的方法printMenu()
- 3.4 开始考试方法startExam()
- 3.5 判卷方法judgeExam()
- 3.6 打印上次成绩方法printLastExam()
- 四,创建考试测试类
- 五,测试
- 六,考题
一,项目要求
考试系统要实现:菜单功能打印,考试,查看上次考试成绩,退出系统等功能。
(1) 通过Idea创建工程,在exam包里创建一个考题类ExamItem,包含考试题目title,选项一optionA,
选项二optionB,选项三optionC,选项四optionD,正确答案answer属性。
(2) 在exam包里创建一个考试服务类ExamService,包含一个考题列表itemList(List< ExamItem >类
型),答案数组answerArr (String[]类型),得分score。包含一个初始化方法public void init(),开始考试
方法public void startExam(),判卷的方法private void judgeExam(),保存用户答案和成绩的方法
public void save(),打印上次考试成绩的方法public void printLastExam(),打印菜单的方法public
void printMenu()
init方法的作用是从 Items.txt 文件中读取数据,把数据封装成ExamItem对象,把对象存入
itemList中,并根据itemList的size大小,初始化answerArr数组,在ExamService的无参构造方法
里调用init方法进行初始化。
startExam的作用是开始考试,打印考题,处理用户操作。
judgeExam的作用是根据用户的答案,和正确答案进行判卷,
save的作用是保存用户答案和成绩,把自己每道题的答案,考试得分存入 result.txt 文件中。
printLastExam的作用是打印上次考试的成绩,即save中存储的内容。
(3) 在exam包里创建一个考试系统类ExamSystem,在main方法中写程序的流程,完成每个菜单的功能
二,创建实体类ExamItem
包含
考试题目title,选项一optionA,选项二optionB,选项三optionC,选项四optionD,正确答案answer属性
public class ExamItem {private String title;private String optionA;private String optionB;private String optionC;private String optionD;private String answer;@Overridepublic String toString() {return title+"\n"+optionA+"\n"+optionB+"\n"+optionC+"\n"+optionD+"\n";}public ExamItem(String title, String optionA, String optionB, String optionC, String optionD, String answer) {this.title = title;this.optionA = optionA;this.optionB = optionB;this.optionC = optionC;this.optionD = optionD;this.answer = answer;}public ExamItem() {}public String getTitle() {return title;}public void setTitle(String title) {this.title = title;}public String getOptionA() {return optionA;}public void setOptionA(String optionA) {this.optionA = optionA;}public String getOptionB() {return optionB;}public void setOptionB(String optionB) {this.optionB = optionB;}public String getOptionC() {return optionC;}public void setOptionC(String optionC) {this.optionC = optionC;}public String getOptionD() {return optionD;}public void setOptionD(String optionD) {this.optionD = optionD;}public String getAnswer() {return answer;}public void setAnswer(String answer) {this.answer = answer;}
}
三,创建考试服务类ExamService
3.1 全局变量 考题列表itemList(List< ExamItem >类型),答案数组answerArr (String[]类型),得分score
// 考题List<ExamItem> itemList = new ArrayList<ExamItem>();// 答案数组String answerArr[];// 得分double score=0;
3.2 初始化方法init()
将初始化方法init放入考试服务类的无参构造器中,在创建对象时就调用达到初始化的目的
使用字符缓冲输入流读取已经保存好的考题文本
1.创建泛型为String的list列表
2.使用BufferedReader 中的readline方法读取每一行数据
3.将不是为“空行”的值添加到list中
4.遍历list,将数据存放入list中
5.根据题目的数量初始化答案数组answerArr的长度,并将正确答案放入数组中
public ExamService() {init();}public void init(){List<String> list = new ArrayList<>();// 使用try-with-resource 自动释放资源try (BufferedReader br = new BufferedReader(new FileReader("C:\\Users\\86155\\Desktop\\作业\\27考试系统\\Items.txt"));){// 定义字符串接收每一行String line ;while ((line = br.readLine()) != null) {if(!line.equals("")){ //如果不是空行则放入listlist.add(line);}}for (int i = 0; i < list.size(); i+=6) {// 将for循环中得到的数据添加到list中ExamItem examItem = new ExamItem(list.get(i), list.get(i+1), list.get(i+2), list.get(i+3), list.get(i+4), list.get(i+5));itemList.add(examItem);}// 根据题目的数量初始化答案数组的长度answerArr=new String[itemList.size()];// 将题号对应答案放入数组for(int i=0;i<itemList.size();i++){answerArr[i]=itemList.get(i).getAnswer();}} catch (IOException e) {throw new RuntimeException(e);}}
3.3 打印菜单的方法printMenu()
开始考试后用来提示操作的菜单
// 打印菜单public void printMenu(){System.out.println("----------欢迎进入考试-----------" +"\n 使用以下按键进行考试:" +"\n A-D:选择指定答案" +"\n P :显示上一题" +"\n N :显示下一题" +"\n F :交卷" +"\n\n 请按N键进入考试...");while(true){String s =sc.next();if (s.equalsIgnoreCase("N")) {break;} else {System.out.println("输错了,请按N键");}}}
3.4 开始考试方法startExam()
考试步骤:
1.提示菜单,进行操作
2.创建临时答案字符串数组ans[]和接收控制台输入值的a
3.for循环遍历考题列表itemList并打印
4.判断当前题目是否已经填写答案
5.输入操作----输入A-D填写答案,P上一题,N下一题,F交卷
6.判断操作(下一题----continue;上一题----i减2;最后一题已经填写----i减1;输错了----i减1)
7.交卷操作(提示还有没有没做的题目)确认交卷后调用判卷方法judgeExam()进行判卷
// 开始考试public void startExam(){// 打印菜单,选择开始printMenu();// 将临时答案用字符串数组保存String a ; // 接收输入的值String ans[] = new String[itemList.size()];for(int i=0;i<itemList.size();i++){// 打印试卷System.out.println(itemList.get(i).toString());// 判断当前是否已经有答案if(ans[i]!=null&&!ans[i].equalsIgnoreCase("N")&&!ans[i].equalsIgnoreCase("P")){System.out.println("您这道题已经作答,选的是"+ans[i]+",输入A-D更换答案,P上一题,N下一题,F交卷:");}a =sc.next();// 上一题if(a.equalsIgnoreCase("P")){if(i==0){System.out.println("已经是第一题了!");} else{i -= 2;continue;}}// 下一题else if (a.equalsIgnoreCase("N")) {if(i==itemList.size()-1){System.out.println("已经是最后一题了!");}else {System.out.println("已跳过该题");continue;}}// 交卷else if(a.equalsIgnoreCase("F")){for(int j=0;j<itemList.size();j++){if(ans[j]==null){System.out.println("第"+(j+1)+"题还没有做");}}System.out.println("确定提交试卷吗?(Y/N)");String choice = sc.next();if(choice.equalsIgnoreCase("Y")){// 考完试调用判卷方法进行判卷judgeExam(ans);break;}else if(a.equalsIgnoreCase("N")){}}// 判断输入的答案是否合法while(true){// 输入abcd格式正确则放入数组if (a.equalsIgnoreCase("A") || a.equalsIgnoreCase("B") || a.equalsIgnoreCase("C") || a.equalsIgnoreCase("D")) {ans[i]=a;break;}else{// 输错了则把值设置为nullif(ans[i]!=null&&!(ans[i].equalsIgnoreCase("A") || ans[i].equalsIgnoreCase("B") || ans[i].equalsIgnoreCase("C") || ans[i].equalsIgnoreCase("D"))){ans[i] = null;}System.out.println("请选择正确答案");i--;break;}}// 最后一题写完后if(i==itemList.size()-1){i--;}}}
3.5 判卷方法judgeExam()
判卷过程:
1.遍历正确答案数组与选择的答案进行比对
2.计分
3.使用字符缓冲输出流BufferedWriter将考试结果写入文本文件
4.分数重新赋值为0
// 判卷private void judgeExam(String ans[]){try (BufferedWriter bw=new BufferedWriter(new FileWriter("C:\\Users\\86155\\Desktop\\作业\\27考试系统\\result.txt"));){// 遍历 计分并将答案写入记事本for(int i=0;i<answerArr.length;i++){if(ans[i]!=null){bw.write(ans[i] + "-----------正确答案:" + answerArr[i] + "\n");if (ans[i].equalsIgnoreCase(answerArr[i])) {score += 100/itemList.size()/1.0;}}else bw.write( "未选择答案-----------正确答案:" + answerArr[i] + "\n");}bw.write("得分:"+score+"\n");score=0;} catch (Exception e) {throw new RuntimeException(e);}}
3.6 打印上次成绩方法printLastExam()
使用字符缓冲输入流BufferedReader读取保存考试结果的文本文件并输出显示
// 打印上次考试成绩public void printLastExam(){try(BufferedReader bufferedReader = new BufferedReader(new FileReader("C:\\Users\\86155\\Desktop\\作业\\27考试系统\\result.txt"))){char ch[]= new char[1024];int len;while((len=bufferedReader.read(ch))!=-1){System.out.print(new String(ch,0,len));}} catch (Exception e) {throw new RuntimeException(e);}}
四,创建考试测试类
public class Test {public static void main(String[] args) {ExamService examService = new ExamService();Scanner sc = new Scanner(System.in);while(true){System.out.println("=====================" +"\n 小孤鸡考试系统" +"\n 1.进入考试" +"\n 2.查看上次考试成绩" +"\n 3.退出系统" +"\n 请选择:");int num = 0;try {num = sc.nextInt();} catch (Exception e) {throw new RuntimeException("输入格式错了,只能为数字");}switch (num) {case 1:examService.startExam();break;case 2:examService.printLastExam();break;case 3:System.out.println("已退出!");return;default:System.out.println("输错了!");break;}}}
}
五,测试
1.开始考试
2.下一题
3.上一题
4.最后一题写完
5.交卷
6.查看上一次考试结果
7.退出系统
六,考题
第1题 Java语言是哪年发明的?
A. 1991
B. 1994
C. 1996
D. 1999
C
第2题 下列关于JDK、JRE和JVM的描述,哪项正确?
A. JDK中包含了JRE,JVM中包含了JRE
B. JDK中包含了JRE,JRE中包含了JVM
C. JRE中包含了JDK,JVM中包含了JRE
D. JRE中包含了JDK,JDK中包含了JVM
B
第3题 用于生成Java文档的JDK工具是?
A. javac
B. jdb
C. javadoc
D. junit
C
第4题 使用JDK工具生成的Java文档的文件格式是?
A. XML格式
B. HTML格式
C. 二进制格式
D. 自定义格式
B
第5题 以下关于支持Java运行平台的叙述,哪项错误?
A. Java可在Solaris平台上运行
B. Java可在Windows平台上运行
C. Java语言与平台无关。Java程序的运行结果与操作系统无关
D. Java语言与平台无关。Java程序的运行结果依赖于操作系统
D
第6题 JVM在执行一个Java类时,大致采用以下过程?
A. 装载类->校验类->执行类中的代码
B. 校验类->装载类->执行类中的代码
C. 装载类->执行类中的代码->校验类
D. 执行类中的代码->装载类->校验类
A
第7题 用于编译Java源文件的JDK工具是?
A. javac
B. jdb
C. java
D. junit
A
第8题 Java程序的跨平台特征是由以下哪项技术实现的?
A. 系统硬件
B. JVM
C. Java编译器
D. 操作系统
B
第9题 下列有关类、对象和实例的叙述,正确的是哪一项?
A. 类就是对象,对象就是类,实例是对象的另一个名称,三者没有差别
B. 类是对象的抽象,对象是类的具体化,实例是对象的另一个名称
C. 对象是类的抽象,类是对象的具体化,实例是对象的另一个名称
D. 类是对象的抽象,对象是类的具体化,实例是类的另一个名称
B
第10题 Java源文件的后缀名是?
A. .class
B. .c
C. .java
D. .txt
C
相关文章:

javase综合案例4 -- 考试系统
文章目录 一,项目要求二,创建实体类ExamItem三,创建考试服务类ExamService3.1 全局变量 考题列表itemList(List< ExamItem >类型),答案数组answerArr (String[]类型),得分score3.2 初始化方法init()3.3 打印菜单…...

Logistic回归
Logistic回归模型: 适用于二分类或多分类问题,样本特征是数值型(否则需要转换为数值型) 策略:极大似然估计 算法:随机梯度 或 BFGS算法(改进的拟牛顿法) 线性回归表达式…...

Langchain-Chatchat+Xinference集成部署
Langchain-ChatchatXinference集成部署 安装环境: 系统:Anolis OS 8.9 python版本:Python 3.9.19 Langchain-Chatchat版本:0.3.1.3 Xinference版本:v0.13.3 模型选择(下载时需要科学上网)&#…...

江协科技51单片机学习- p33 PWM呼吸灯和直流驱动电机调速
🚀write in front🚀 🔎大家好,我是黄桃罐头,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流 🎁欢迎各位→点赞👍 收藏⭐️ 留言📝…...

使用Jetbrains.Rider反编译Unity的DLL文件看源码
直接将dll文件的打开方式用Rider打开即可,打开BattleSeqGenertor.dll文件的效果如下:...

【学习笔记】决策单调性优化DP
背景 GDCPC还在发力,清华出题组出的牛客还是 4 题。 这次没有min25筛,不然我能5题(bushi 除了一道用 prufer 序列的恶心 DP 外,还有一道DP题是一个状态难想,并且还需要决策单调性优化的DP,被认为是偏简单…...

【每日一题】【二分图最大匹配】【经典板子题】有大家喜欢的零食吗 河南萌新联赛2024第(一)场:河南农业大学 C题 C++
河南萌新联赛2024第(一)场:河南农业大学 C题 有大家喜欢的零食吗 题目描述 在某幼儿园中共有 n n n个小朋友,该幼儿园的老师为这 n n n 个小朋友准备了 n n n 份不一样的零食大礼包。每个小朋友只能选择一个,但老…...

【python】OpenCV—Image Colorization
文章目录 1、CIELAB 色彩空间2、作色问题定义3、Caffe 模型4、代码实现——Image5、代码实现——Video6、参考 1、CIELAB 色彩空间 Lab颜色空间,也称为Lab色彩空间或CIELAB色彩空间,是一种基于人类视觉感知特性的颜色模型。它是在1931年国际照明委员会&…...

vue 学习笔记
模板语法 1. 插值语法 用于解析标签体内容 { { 表达式 } } ,可以直接读取到 data 中的所有属性 2. 指令语法 解析标签(标签属性, 标签内容, 绑定事件) v-bind : href " url " 或 : href &…...
武汉流星汇聚:‘中国制造’闪耀欧洲站,体育赛事成亚马逊增长点
随着2024年的欧洲体育赛事激情四溢,欧洲杯与奥运会的双重盛会不仅点燃了全球体育迷的热情,更为亚马逊欧洲站带来了前所未有的发展机遇。在这场体育盛宴的推动下,欧洲站正展现出其无限的发展潜力和广阔的市场前景,为中国卖家乃至全…...

RPA是什么?探讨RPA发展的最新趋势 | RPA研究
随着人工智能和自动化技术的飞速发展,机器人流程自动化(Robotic Process Automation,简称RPA)正逐渐成为企业数字化转型的关键工具。RPA通过模拟人类用户的操作行为,自动化执行重复性高、规则性强的任务,从…...
sqlalchemy时间范围查询
1、sqlalchemy时间范围查询 在 SQLAlchemy 中,进行时间范围查询可以通过比较日期或时间字段来实现。假设你有一个模型 Event,它包含一个 timestamp 字段,你想查询在某个时间范围内的所有事件。以下是如何使用 SQLAlchemy 来实现这个查询的示例。 首先,确保你有 SQLAlchem…...

电脑不小心删除的文件怎么恢复?教你文件恢复的绝招
在日常使用电脑的过程中,我们有时会因为误操作或不小心而删除了重要的文件。面对这种情况,很多人可能会感到焦虑和无助。但其实,通过一些专业的方法和工具,我们有可能恢复这些被误删的文件。本文将介绍两种常见的恢复方法…...
stm32:使用和学习--硬件和程序
一硬件 1. GPIO 1.FT, TT功能 ft:five tolerate tt:three tolerate 1. FT(Five-Volt Tolerant)引脚 FT 引脚能够容忍高于 VDD 的输入电压(例如 5V)。这些引脚通常不具有连接到 VDD 的保护二极管&…...

ARM知识点二
一、指令 指令的生成过程 指令执行过程示例 if (a 0) {x 0; } else {x x 3; } //翻译为 cmp r0,#0 MOVEQ R1,#0 ADDGT R1,R1,#3指令获取:从Flash中读取 CMP R0, #0,控制器开始执行。 指令解码:解码器解析 CMP 指令,ALU比较R…...
C# ?的使用
栏目总目录 可空类型标记符(?) 说明: 可空类型标记符?用于指示某个值类型(如int、float等)可以为null。这是C# 2.0引入的一个特性,用于处理数据库查询、JSON解析等场景中可能出现的空值。 示例代码&am…...

【unity小技巧】unity性能优化以及如何进行性能测试
文章目录 前言GPU性能优化打包素材 CPU性能优化代码执行优化 性能测试Vector2.Distance 和 sqrMagnitude哪个好?动画切换优化shader属性优化 URP渲染器资产优化对象池优化删除没必要的空函数图片、音乐音效、贴图等素材压缩ScriptableObject优化参数参考完结 前言 …...
算法参考改进点/知识点
1、clip文章中改进点 图像编码器image encoder: 将全局平均池化层替换为注意力池化机制。注意力池化机制:通过一个单层的“transformer式”多头QKV注意力,其中查询query是基于图像的全局平均池表示。改进VIT(Vision Transformer…...

electron 配置、打包 -报错解决
目录 一、配置途中遇到的问题: 二、 make 配置好后开始打包 三、Electron-builder 打包报错 一、配置途中遇到的问题: 1. 安装 yarn add electron -D 一直卡在这里失败 一直卡可以使用下面这个,然后再重新装依赖 1. 采用新的镜像地址 npm …...
基于STM32设计的智能鱼缸(华为云IOT)(200)
文章目录 一、前言1.1 项目介绍【1】项目功能介绍【2】设计实现的功能【3】项目硬件模块组成1.2 设计思路【1】整体设计思路【2】ESP8266工作模式配置【3】自动换水原理1.3 项目开发背景【1】选题的意义【2】可行性分析【3】参考文献1.4 开发工具的选择【1】设备端开发【2】上位…...
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以? 在 Golang 的面试中,map 类型的使用是一个常见的考点,其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...
Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器
第一章 引言:语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域,文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量,支撑着搜索引擎、推荐系统、…...
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南 在数字化营销时代,邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天,我们将深入解析邮件打开率、网站可用性、页面参与时…...

【笔记】WSL 中 Rust 安装与测试完整记录
#工作记录 WSL 中 Rust 安装与测试完整记录 1. 运行环境 系统:Ubuntu 24.04 LTS (WSL2)架构:x86_64 (GNU/Linux)Rust 版本:rustc 1.87.0 (2025-05-09)Cargo 版本:cargo 1.87.0 (2025-05-06) 2. 安装 Rust 2.1 使用 Rust 官方安…...

FFmpeg:Windows系统小白安装及其使用
一、安装 1.访问官网 Download FFmpeg 2.点击版本目录 3.选择版本点击安装 注意这里选择的是【release buids】,注意左上角标题 例如我安装在目录 F:\FFmpeg 4.解压 5.添加环境变量 把你解压后的bin目录(即exe所在文件夹)加入系统变量…...

【堆垛策略】设计方法
堆垛策略的设计是积木堆叠系统的核心,直接影响堆叠的稳定性、效率和容错能力。以下是分层次的堆垛策略设计方法,涵盖基础规则、优化算法和容错机制: 1. 基础堆垛规则 (1) 物理稳定性优先 重心原则: 大尺寸/重量积木在下…...
深度解析云存储:概念、架构与应用实践
在数据爆炸式增长的时代,传统本地存储因容量限制、管理复杂等问题,已难以满足企业和个人的需求。云存储凭借灵活扩展、便捷访问等特性,成为数据存储领域的主流解决方案。从个人照片备份到企业核心数据管理,云存储正重塑数据存储与…...

理想汽车5月交付40856辆,同比增长16.7%
6月1日,理想汽车官方宣布,5月交付新车40856辆,同比增长16.7%。截至2025年5月31日,理想汽车历史累计交付量为1301531辆。 官方表示,理想L系列智能焕新版在5月正式发布,全系产品力有显著的提升,每…...
scan_mode设计原则
scan_mode设计原则 在进行mtp controller设计时,基本功能设计完成后,需要设计scan_mode设计。 1、在进行scan_mode设计时,需要保证mtp处于standby模式,不会有擦写、编程动作。 2、只需要固定mtp datasheet说明的接口即可…...
Three.js进阶之粒子系统(一)
一些特定模糊现象,经常使用粒子系统模拟,如火焰、爆炸等。Three.js提供了多种粒子系统,下面介绍粒子系统 一、Sprite粒子系统 使用场景:下雨、下雪、烟花 ce使用代码: var materialnew THRESS.SpriteMaterial();//…...