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】上位…...

Django与数据库
目录 创建项目app 路由子表 数据库 创建数据库 什么是ORM 定义数据库表 Django Admin 管理数据 过滤条件 代码直接生成HTML 使用模板 前后端分离架构 对资源的增删改查处理 列出客户 添加客户 临时取消 CSRF 校验 修改客户信息 删除客户 Django中ORM的处理 数据模…...

大数据系列之:CentOS7安装R详细步骤
大数据系列之:CentOS7安装R详细步骤 一、下载R二、解压R三、创建安装目录四、指定安装目录五、安装编译依赖六、编译与编译安装七、设置环境变量八、激活环境变量九、执行R命令十、执行demo测试程序 一、下载R wget https://cran.r-project.org/src/base/R-4/R-4.4…...

Linux学习第57天:Linux PWM驱动实验
Linux版本号4.1.15 芯片I.MX6ULL 大叔学Linux 品人间百味 思文短情长 本章的思维导图如下: 一、PWM驱动简析 1、设备树下的PWM控制节点 8 路 PWM 都属于 I.MX6ULL 的 AIPS-1 域,分为了两部分, PWM1~P…...

git 远程拉取指定文件
指定操作 git init 创建一个空的文件 git remote add orgin 远程仓库地址链接 表示添加远程库的地址 git config core.sparsecheckout true 打开sparsecheckout功能 注意:如果需要分支内所有文件,这个指令可以直接过忽略,则会拉取对应分支所有的文件…...

【css】 CSS3+JS做一个酷炫的仪表进度条3d进度条
创建一个动态进度环组件 在现代网页设计中,进度环是一种常见的视觉元素,用于展示任务的完成度或加载状态。本文将介绍如何使用Vue.js和Less创建一个动态进度环组件,该组件不仅具有美观的视觉效果,还能够根据用户输入动态改变颜色…...

uniapp小程序全局配置分享到朋友和朋友圈功能的实现
文章目录 1.创建/mixins/share.js插件2.全局配置3.编写share.js4.调用5.分享成功 1.创建/mixins/share.js插件 直接创建 2.全局配置 (1)找到main.js在下面引入share.js文件 (2)使用mixins混入vue中,这样就相当于在每一…...

Java优化后台分页
第一种情况:先查询出所有记录,再进行分页处理(分页中可以异步处理) 优化前: List<String> list Arrays.asList("1","2","3","4","5","6","…...

<数据集>电梯内人车识别数据集<目标检测>
数据集格式:VOC格式 图片数量:97张 标注数量(xml文件个数):97 标注类别数:3 标注类别名称: [person, motorcycle, bicycle] 序号类别名称图片数框数1person891322motorcycle78793bicycle2222 使用标注工具&#…...

二百五十三、OceanBase——Linux上安装OceanBase数据库(三):OBD页面上部署OceanBase数据库
一、目的 安装OceanBase后,启动obd web,需要在OBD页面上部署OceanBase数据库 二、参考文档 http://t.csdnimg.cn/Qeedq 三、实施步骤 1 在obadmin用户下,启动obd服务,登录页面访问 [obadminhurys23 oceanbase]$ obd web 2 登…...

Redis应用笔记
Redis应用笔记 一、 前言二、 Redis八种常用数据类型2.1 Redis的五种基本数据类型2.2 Redis的三种特殊数据类型 三、发现Redis热Key方案3.1 使用 Redis 自带的 --hotkeys 参数来查找3.2 使用MONITOR 命令3.3 借助开源项目 四、解决 hotkey五、Redis 内存碎片5.1 为何会有Redis …...