课程设计(单机考试系统)

 创建单机考试系统的Java之旅

 引言
在现代教育体系中,考试是评估学生知识和技能的重要手段。随着科技的进步,传统的纸笔考试正逐渐向数字化、自动化方向发展。今天,我将带您一探究竟,如何用Java语言创建一个简易的单机考试系统。

 需求分析
单机考试系统的核心需求包括:
题库管理:添加、编辑和删除题目。
试卷生成:选取题库中的题目生成试卷。
答题功能:考生可以输入答案并进行提交。
成绩计算:系统自动评分并展示结果。
用户界面:简洁友好的操作界面。

 设计思路
我们将采用Java Swing来构建用户界面,并使用对象导向的设计方式来构建系统架构。

 关键类设计
1. ItemService: 存储题目信息。
2. Item: 管理题库数据。
3. Name: 用户名的输入与比对
4. Name Service:用户名的储存 

 实现步骤

 第一步:建立题库
首先,我们定义Item.txt来存储每个题目的信息。之后,创建Item ItemService类来管理这些题目,提供增加、删除和修改题目的方法。

1. What is the capital city of Australia?
A. Sydney
B. Melbourne
C. Canberra
D. Perth
C

2. Which planet is known as the "Red Planet"?
A. Venus
B. Mars
C. Jupiter
D. Saturn
B

3. Who wrote the novel "Pride and Prejudice"?
A. Charles Dickens
B. Jane Austen
C. William Shakespeare
D. Mark Twain
B

4. What is the chemical symbol for gold?
A. Au
B. Ag
C. Fe
D. Cu
A

5. Which country is famous for the Taj Mahal?
A. India
B. China
C. Japan
D. Egypt
A

6. Who painted the Mona Lisa?
A. Vincent van Gogh
B. Leonardo da Vinci
C. Pablo Picasso
D. Michelangelo
B

7. Which language is widely spoken in Brazil?
A. English
B. Portuguese
C. Spanish
D. Italian
B

8.What is the largest ocean in the world?
A. Atlantic Ocean
B. Indian Ocean
C. Southern Ocean
D. Pacific Ocean
D

9. What is the chemical formula for water?
A. H2O
B. CO2
C.  O2
D. NaCl
A

10. Who is the current President of the United States?
A. Joe Biden
B. Donald Trump
C. Barack Obama
D. George W. Bush
A
package com.java.domain;

/**
 * @author shengyan
 * @create 2024-05-27 14:02
 */
public class Item {
    private String question;
    private String[] options;
    private String answer;

    public Item(String question, String[] options, String answer) {
        this.question = question;
        this.options = options;
        this.answer = answer;
    }

    public String getQuestion() {
        return question;
    }

    public void setQuestion(String question) {
        this.question = question;
    }

    public String[] getOptions() {
        return options;
    }

    public void setOptions(String[] options) {
        this.options = options;
    }

    public String getAnswer() {
        return answer;
    }

    public void setAnswer(String answer) {
        this.answer = answer;
    }

    public String toString() {
        return question + "\n" +
                options[0] + "\n" +
                options[1] + "\n" +
                options[2] + "\n" +
                options[3] + "\n标准答案:" + answer + "\n";
    }//返回一个字符串,表示项目的详细信息,包括问题、选项和答案。这个方法在打印项目对象时会被自动调用。
}
 

第二步:生成试卷
通过ItemService设置题目

package com.java.service;

import com.java.domain.Item;

import java.io.*;
import java.util.ArrayList;
import java.util.List;

/**
 * @author shengyan
 * @create 2024-05-27 14:07
 */
public class ItemService {
    private Item[] items;//题目数组

    private final String ITEM_FILENAME = "D:\\develop\\exam\\item.txt";//读取的文件位置
    private final String ANSWER_FILENAME = "./answer.dat";//文件输出的位置
    private final int LINES_PER_ITEM = 6;//每题占用的行数
    public final int TOTAL_ITEMS;//题目数

    public ItemService() {
        List<String> list = readTextFile(ITEM_FILENAME);//读取文件中题目的内容
        //计算得到题目数量
        TOTAL_ITEMS = list.size() / LINES_PER_ITEM;

        items = new Item[TOTAL_ITEMS];
        //初始化题目数组,从文件中读取,放题目
        for (int i = 0; i < TOTAL_ITEMS; i++) {
            String question = list.get(i * LINES_PER_ITEM);
            String[] options = {
                    list.get(i * LINES_PER_ITEM + 1),
                    list.get(i * LINES_PER_ITEM + 2),
                    list.get(i * LINES_PER_ITEM + 3),
                    list.get(i * LINES_PER_ITEM + 4)
            };
            char answer1 = list.get(i * LINES_PER_ITEM + 5).charAt(0);
            String answer = "" + answer1;
            items[i] = new Item(question, options, answer);
        }
    }
    /**
     * 返回指定题号的题目
     * @param no
     * @return
     */
    public Item getItem(int no) {
        if (no <= 0 || no > TOTAL_ITEMS) {
            return null;
        }

        return items[no - 1];
    }
    /**
     * 读取指定位置文件的内容到内存中,存题目
     * @param filename
     * @return
     */
    public List<String> readTextFile(String filename) {
        FileReader fr = null;
        BufferedReader br = null;
        List<String> content = new ArrayList<String>();

        try {
            fr = new FileReader(filename);
            br = new BufferedReader(fr);

            String line;
            while ((line = br.readLine()) != null) {
                if (!line.trim().equals("")) content.add(line);
            }
        } catch (FileNotFoundException e) {
            System.out.println(e.getMessage());
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (br != null) {
                try {
                    br.close();
                } catch (IOException e) {
                    System.out.println(e.getMessage());
                }
            }

            if (fr != null) {
                try {
                    fr.close();
                } catch (IOException e) {
                    System.out.println(e.getMessage());
                }
            }
        }

        return content;
    }
    /**
     * 将所有的答案构成的数组持久化到文件中,存选的答案
     * @param answer
     */
    public void saveAnswer(String[] answer) {
        FileOutputStream fos = null;
        ObjectOutputStream oos = null;

        try {
            fos = new FileOutputStream(ANSWER_FILENAME);
            oos = new ObjectOutputStream(fos);

            oos.writeObject(answer);
        } catch (IOException e) {
            System.out.println(e.getMessage());
        } finally {
            if (oos != null) {
                try {
                    oos.close();
                } catch (IOException e) {
                    System.out.println(e.getMessage());
                }
            }
        }
    }
    public char[] readAnswer() {
        char[] answer = null;

        FileInputStream fis = null;
        ObjectInputStream ois = null;

        try {
            fis = new FileInputStream(ANSWER_FILENAME);
            ois = new ObjectInputStream(fis);

            answer = (char[])ois.readObject();
        } catch (Exception e) {
            System.out.println(e.getMessage());
        } finally {
            if (ois != null) {
                try {
                    ois.close();
                } catch (IOException e) {
                    System.out.println(e.getMessage());
                }
            }
        }//从文件中读取答案

        return answer;
    }

    /**
     * 重置答案
     */
    public void Restartanswer(){
        String filePath = ANSWER_FILENAME;

        try {
            File file = new File(filePath);
            if (file.exists()) {
                RandomAccessFile raf = new RandomAccessFile(file, "rw");
                raf.setLength(0); // 设置文件长度为0,即清空文件内容
                raf.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }//用于重置答案文件的内容
}

第三步:用户名的处理和比对

通过Name类和NameService进行用户名的储存和比对

package com.java.domain;

import java.util.Objects;

/**
 * @author shengyan
 * @create 2024-06-08 21:11
 */
public class Name {
    private String name;
    private String password;

    public Name(String name, String password) {
        this.name = name;
        this.password = password;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    @Override
    public String toString() {
        return "name{" +
                "name='" + name + '\'' +
                ", password='" + password + '\'' +
                '}';
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Name name1 = (Name) o;
        return Objects.equals(name, name1.name) && Objects.equals(password, name1.password);
    }
//用于比较两个Name对象是否相等。如果两个对象的name和password成员变量值都相等,则认为这两个对象相等。
    @Override
    public int hashCode() {
        return Objects.hash(name, password);
    }
}//计算哈希值,保证项目的完整性
package com.java.service;

import com.java.domain.Name;

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

/**
 * @author shengyan
 * @create 2024-06-08 21:12
 */
public class NameService {
    private Name[] names;

    private final String NAME_FILENAME = "D:\\code5_idea\\Project\\name.txt";
    private final int NUMBER_OF_NAMES = 2;

    public NameService() {
        List<String> list = readTextFile(NAME_FILENAME);

        names = new Name[NUMBER_OF_NAMES];
        for (int i = 0; i < NUMBER_OF_NAMES; i++) {
            Scanner scanner = new Scanner(list.get(i));
            scanner.useDelimiter(",");
            names[i] = new Name(scanner.next(), scanner.next());
        }
    }//首先调用readTextFile方法读取文件内容,并将结果存储在一个List<String>类型的变量list中。然后,使用一个循环遍历list,并使用Scanner类解析每个字符串,将其分割为两部分(姓名和姓氏),然后将这些信息存储在names数组中。

    /**
     * 返回用户名
     * @param no
     * @return
     */
    public Name getUserName(int no) {
        if (no < 0 || no > NUMBER_OF_NAMES) {
            return null;
        }

        return names[no];
    }
    /**
     * 读取指定位置文件的内容到内存中
     * @param filename
     * @return
     */
    public List<String> readTextFile(String filename) {
        FileReader fr = null;
        BufferedReader br = null;
        List<String> content = new ArrayList<String>();

        try {
            fr = new FileReader(filename);
            br = new BufferedReader(fr);

            String line;
            while ((line = br.readLine()) != null) {
                if (!line.trim().equals("")) content.add(line);
            }
        } catch (FileNotFoundException e) {
            System.out.println(e.getMessage());
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (br != null) {
                try {
                    br.close();
                } catch (IOException e) {
                    System.out.println(e.getMessage());
                }
            }

            if (fr != null) {
                try {
                    fr.close();
                } catch (IOException e) {
                    System.out.println(e.getMessage());
                }
            }
        }

        return content;
    }

以上就是我个人所负责的模块与功能

全部信息详情见https://blog.csdn.net/thatisright/article/details/139563771

团队博客

 测试与部署
开发完成后,进行充分的测试以确保系统稳定运行。可以使用JUnit进行单元测试,确保每个模块按预期工作。然后,打包应用程序为JAR文件,便于部署和分发。

主要功能截图

 总结
通过这个简单的单机考试系统项目,我们了解了如何使用Java开发一个实际的应用程序。从需求分析到设计,再到编码和测试,每一步都至关重要。希望这篇博客能为您的Java学习之旅带来启发。感谢您的阅读,祝您编程愉快!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值