javase综合案例4 -- 考试系统

news2024/11/15 19:43:19

文章目录

  • 一,项目要求
  • 二,创建实体类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;

    @Override
    public 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("")){       //如果不是空行则放入list
                    list.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{
                     //  输错了则把值设置为null
                     if(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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

从0开始的算法(数据结构和算法)基础(六)

二叉树 什么是二叉树 二叉树是一种非线性数据结构(层次关系结构)&#xff0c;代表“祖先”与“后代”之间的派生关系&#xff0c;体现了“一分为二”的分治逻辑。与链表类似&#xff0c;二叉树的基本单元是节点&#xff0c;每个节点包含值、左子节点引用和右子节点引用。 首先…

人生苦短,我用 Python,AI 模型助力高效数据提取

一、前言 在网络爬虫和数据挖掘领域&#xff0c;提取网页内容是一项常见且重要的任务。无论是从新闻网站、电商平台还是社交媒体&#xff0c;获取有用的信息都是开展后续分析和应用的前提。然而&#xff0c;传统的网页内容提取需要编写大量的代码来处理和解析 HTML 文档&#…

comfyui flux

下载文本编码器&#xff0c;模型放到ComfyUI/models/clip/ 下&#xff0c;t5模型可以任选其一&#xff1b;https://huggingface.co/comfyanonymous/flux_text_encoders/tree/main 下载vae模型&#xff0c;https://huggingface.co/black-forest-labs/FLUX.1-schnell/tree/main&a…

31、Python之面向对象:开闭原则与多态?学我者生、似我者死

引言 前面我们花了不少的篇幅把Python中面向对象的封装与继承简单介绍了一遍。今天来聊一下Python面向对象的第三个特性&#xff1a;多态。 其实&#xff0c;在《Python之面向对象&#xff1a;一切皆对象&#xff0c;可你真的需要面向对象吗》这篇文章中&#xff0c;对比面向…

Python大数据分析——朴素贝叶斯模型

Python大数据分析——朴素贝叶斯模型 数学方面思路理论基础高斯贝叶斯分类器多项式贝叶斯分类器伯努利贝叶斯分类器 代码部分高斯贝叶斯——皮肤识别多项式贝叶斯——毒蘑菇识别伯努利贝叶斯——情感分析 数学方面 思路 该分类器的实现思想非常简单&#xff0c;即通过已知类别…

vs code 代码同步到服务器,无需下载插件,使用自带ftp

可使用 vscode 自带ftp,无需下载插件 快捷键 ctrl shift p {"name": "My Server", //上传名"host": "192.168.56.102",//服务器"protocol": "ftp",//协议"port": 21,//端口"username": &q…

《机电信息》是什么级别的期刊?是正规期刊吗?能评职称吗?

​问题解答 问&#xff1a;《机电信息》是不是核心期刊&#xff1f; 答&#xff1a;不是&#xff0c;是知网收录的正规学术期刊。 问&#xff1a;《机电信息》级别&#xff1f; 答&#xff1a;省级。主管单位&#xff1a;江苏省设备成套股份有限公司 主办单位&#x…

nvm安装高版本的node18.17.0,报https://nodejs.org/dist/latest/SHASUMS256.txt

1、执行npm install v18.17.0这条命令时&#xff0c;报如下错误&#xff1a; 2、或者报Node.js v18.17.0 is not yet released or is not available. 解决方案&#xff1a; 1、打开nvm 的安装路径中的setting.json node_mirror:npm.taobao.org/mirrors/node/ npm_mirror:npm.…

基于目标检测的目标跟踪(python)

文章目录 概要环境准备目标检测实现目标跟踪实现整合后的代码可能遇到的问题Could not load library libcudnn_ops_infer.so.8. Error: libcudnn_ops_infer.so.8: cannot open shared object file: No such file or directory参考概要 基于目标检测的目标跟踪过程通常包括以下…

硬控年轻人的长沙,城市底色竟是研发

近年来&#xff0c;找到“流量密码”的长沙&#xff0c;吸引了来自全国各地的年轻人&#xff0c;形成百川赴海之势。而消费生力军的到来&#xff0c;也让长沙成为新消费发展的“沃土”&#xff0c;三顿半、茶颜悦色、文和友、墨茉点心局、柠季、零食很忙等一众“顶流”新消费品…

ADC的一些细节

一&#xff0c;输入通道 总共 2 个 ADC&#xff08;ADC1&#xff0c;ADC2&#xff09;&#xff0c;每个 ADC 有 18 个转换通道: 16 个外部通道、 2 个内部通道&#xff08;温度传感器、内部参考电压&#xff09; ADC1和ADC2的通道都相同&#xff0c;是采用分时复用来…

汇凯金业:黄金交易技术分析方法

黄金交易&#xff0c;作为一种高风险、高收益的投资方式&#xff0c;需要投资者具备一定的专业知识和技能&#xff0c;才能在市场中获得收益。技术分析&#xff0c;作为一种重要的分析方法&#xff0c;可以帮助投资者判断市场趋势&#xff0c;寻找交易机会。 一、趋势分析&…

TOB拓客销售新方向全网大数据捕捉

销售开拓市场什么最重要 &#xff1f; 思考这个问题几秒钟&#xff0c;相信大家就知道了 当然是客户数据&#xff0c;只有源源不断的客户数据才有成交机会&#xff0c;所以每个企业都会遇到获客难的问题 那么今天哦我们俩围绕这个问题&#xff0c;给大家汇报一下&#xff…

5 倍网络性能提升!DigitalOcean上线全新高级内存优化型和高级存储优化型 Droplet 云主机

支持用户从想法到实现&#xff0c;再到业务不断发展过程中提供持续可靠的支持&#xff0c;这是 DigitalOcean 的核心使命。所以 DigitalOcean 也在不断推出更多专业的解决方案。 DigitalOcean Droplet 是基于虚拟化硬件上运行的虚拟机&#xff08;VM&#xff09;。用户创建的每…

使用无服务器功能的云计算成新趋势?无服务器功能的隐藏挑战

无服务器函数非常适合小任务 使用无服务器功能的云计算已广受欢迎。它们对实现新功能的吸引力源于无服务器计算的简单性。您可以使用无服务器功能来分析传入的照片或处理来自 IoT 设备的事件。它快速、简单且可扩展。您不必分配和维护计算资源 - 只需部署应用程序代码。主要的…

简单的docker学习 第11章 镜像中心

第11章 镜像中心 Docker Hub 与阿里云都是 Docker 的公网镜像中心&#xff0c;用户可以将自己的镜像 push 到公网镜像中心中自己的镜像仓库&#xff0c;并可将仓库设置为私有库&#xff0c;使他人无法看到&#xff0c;更无法 pull&#xff0c;以保证镜像的安全性。不过&#x…

云服务IaaS、PaaS、SaaS的区别

云计算有三种主要服务模式&#xff1a;基础设施级服务&#xff08;IaaS&#xff09;&#xff0c;平台级服务&#xff08;PaaS&#xff09;和软件级服务&#xff08;SaaS&#xff09;&#xff0c;它们具体是啥&#xff1f;三者之间的区别是什么&#xff1f; IaaS、PaaS、SaaS是…

WAF是什么,有什么用?

在互联网技术的飞速发展下&#xff0c;企业对网络安全的重视程度与日俱增。面对日益复杂的网络攻击和数据安全威胁&#xff0c;云WAF&#xff08;Web Application Firewall&#xff09;作为一种先进的网络安全解决方案&#xff0c;正逐渐成为企业网络安全架构中的关键组件。本文…

WEB渗透Web突破篇-WAF绕过

SQL注入分块传输 https://github.com/c0ny1/chunked-coding-converter跑注入点被拦截使用分块传输&#xff0c;右键选择使用SQLMAP跑注入>python sqlmap.py -r 1.txt --batch --proxyhttp://127.0.0.1:8080 --dbs自动提供可用的tamper Atlas https://github.com/m4ll0k/At…

第1讲:C语言常见概念

目录 1. C语言是什么&#xff1f; 2. C语言的历史和辉煌 3. 编译器的选择VS2022 4. VS项目和源文件、头文件介绍 5. 第⼀个C语言程序 6. main函数 7. printf和库函数 8. 关键字介绍 9. 字符和ASCII编码 10. 字符串和\0 1. 转义字符 12. 语句和语句分类 13. 注释是什…