java自动阅卷判断选择题,客观题型自动阅卷系统(管道过滤器模式)
这周,我的软件设计体系结构老师留了这么道题
客观题型自动阅卷系统体系结构分析:
1、 分析基本的系统需求;
2、 针对系统需求,试用“管道-过滤器”风格进行架构设计:
a) 画出系统架构图。
b) 描述架构图中各组件(过滤器)、管道、数据源、数据池等功能。
c) 选用一种程序设计语言实现这一系统,并分析其可行性、合理性。
这道题乍一听很抽象,我写好程序以后感觉收货颇多,对管道-过滤器模式理解很深刻。所以写篇博客记录一下。(emmm架构图我就不放了哈哈)
1.基本的系统需求
(1)客观题的切割
将试卷按照区域或题目进行图片切分,将切割后的图片递交给评分模块。
(2) 扫描试卷
通过扫描仪对答题卡进行扫描,将试卷答案录入到系统里。
(3)客观题自动评分
录入客观题标准的答案,然后评分模块通过对比当前试卷的答案和标准答案来判断对错。
(4)分数累加计算
所有客观题评判完毕,自动计算总分数。
2. 描述架构图中各组件(过滤器)、管道、数据源、数据池等功能。
数据源:试卷,提供系统的初始数据流
管道:扫描仪,经过扫描仪的扫描以后,答题卡变成了按顺序排列的选项字母
过滤器:判卷服务器,即判断对错的程序,经过程序对比考生的选项和标准答案,计算各题得出考生的客观题各个题的得分。
数据池:考生的客观题作答情况输出到数据池,数据池计算得出总成绩,即程序的最终结果,将结果显示给阅卷老师。
3.Java代码实现(模拟管道过滤器模式)
这是我的思路:
(1)通过扫描仪扫描客观题的答案,然后写入管道。
(2)通过管道进入过滤器,分别对每道题进行评分,然后写入下一个管道。
(3)过滤后的每道题,通过管道到达数据池,在数据池取出每道题的得分,汇总计算出总成绩。
具体实现代码如下:
Packet(试题类)
package filter;
public class Packet {
private int pno = -1;
private String content;
private int score = 0;
public Packet() {
}
public Packet(int pno) {
this.pno = pno;
}
public void setContent(String content) {
this.content = content;
}
public String getContent() {
return content;
}
public int getScore() {
return score;
}
public void setScore(int score) {
this.score = score;
}
public int getPno() {
return pno;
}
@Override
public String toString() {
return "试题{" +
"题号:" + pno +
", 选项:'" + content + '\'' +
'}';
}
}
Filter(过滤器)
package filter;
public abstract class Filter {
protected Pipe input;
protected Pipe output;
public Filter(Pipe input, Pipe output) {
this.input = input;
this.output = output;
}
public abstract void process();
}
FilterImpl(过滤器的实现)
package filter;
public class FilterImpl extends Filter {
public FilterImpl(Pipe input, Pipe output) {
super(input, output);
}
@Override
public void process() {
while (input.size() > 0) {
try {
Packet p;
for (int i = 0; i < 10; i++) {
p = input.read();
String answer = p.getContent();
if (answer.equals("A"))
System.out.println(p + "回答错误!");
else {
p.setScore(10);
System.out.println(p + "回答正确!");
}
output.write(p);
System.out.println("第 " + p.getPno() + " 题写入管道成功!");
}
} catch (Exception e) {
System.out.println("管道为空!");
e.printStackTrace();
}
}
System.out.println("------------------------------------------------");
}
}
Pipe(管道)
package filter;
import java.util.ArrayDeque;
public class Pipe {
private ArrayDeque packets = new ArrayDeque();
public void write(Packet packet) {
packets.addFirst(packet);
}
public int size() {
return packets.size();
}
public Packet read() throws Exception {
if (size() == 0) {
throw new Exception("管道为空!");
}
Packet p = packets.getLast();
packets.pollLast();
return p;
}
}
DataSource(数据源)
package filter;
public class DataSource extends Filter {
public DataSource(Pipe output) {
super(null, output);
}
@Override
public void process() {
for (int i = 1; i <= 10; i++) {
System.out.println("DataSource: 开始扫描第 " + i + " 题...");
Packet p = new Packet(i);
double num = Math.random() * 100;
String option = generateOption(num);
p.setContent(option);
System.out.println("第 " + i + " 题写入管道成功!");
output.write(p);
}
System.out.println("------------------------------------------------");
}
String generateOption(double i ){
if(i >= 0 && i < 25)
return "A";
else if(i >= 25 && i < 50)
return "B";
else if(i >= 50 && i < 75)
return "C";
else return "D";
}
}
DataSink(数据池)
package filter;
import java.util.ArrayDeque;
public class DataSink extends Filter {
protected ArrayDeque received = new ArrayDeque();
public DataSink(Pipe input) {
super(input, null);
}
public int size() {
return received.size();
}
@Override
public void process() {
try {
System.out.println("进入数据池!");
Packet p;
int score = 0;
for (int i = 0; i < 10; i++) {
p = input.read();
score += p.getScore();
}
System.out.println("总成绩为" + score);
} catch (Exception e) {
System.out.println("管道为空!");
e.printStackTrace();
}
}
}
TestPipes(测试类)
package filter;
public class TestPipes {
public static void main(String[] args) {
Pipe pipe1 = new Pipe();
Pipe pipe2 = new Pipe();
DataSource source = new DataSource(pipe1);
source.process();
FilterImpl filter = new FilterImpl(pipe1, pipe2);
filter.process();
DataSink sink = new DataSink(pipe2);
sink.process();
}
}
运行结果:
image.png
image.png
java自动阅卷判断选择题,客观题型自动阅卷系统(管道过滤器模式)相关推荐
- 阅卷管理用c语言编程,模拟人工阅卷C语言编程题自动评阅系统设计与实现.doc
模拟人工阅卷C语言编程题自动评阅系统设计与实现 模拟人工阅卷C语言编程题自动评阅系统设计与实现 摘要:传统的C语言在线考试系统对编程题的评阅比较机械,无法反映考生的真实水平.本文在分析人工阅卷流程的基 ...
- java 自动拆箱_Java中的自动装箱拆箱
Java中的自动装箱拆箱 一.自动装箱与自动拆箱 自动装箱就是将基本数据类型转换为包装类类型,自动拆箱就是将包装类类型转换为基本数据类型. 1 //自动装箱 2 Integer total = 90; ...
- java前端目录_[Java教程]前端那点事儿——Tocify自动生成文档目录
[Java教程]前端那点事儿--Tocify自动生成文档目录 0 2016-06-29 22:00:07 今天偶然间看到文档服务器有一个动态目录功能,点击目录能跳转到指定的位置:窗口滑动也能自动更新目 ...
- java 自动装载_java_详解Java的Spring框架下bean的自动装载方式,Spring容器可以自动装配相互协 - phpStudy...
详解Java的Spring框架下bean的自动装载方式 Spring容器可以自动装配相互协作bean之间的关系,这有助于减少对XML配置,而无需编写一个大的基于Spring应用程序的较多的和元素. 自 ...
- 二维码相关---java生成二维码名片,并且自动保存到手机通讯录中...
二维码相关---java生成二维码名片,并且自动保存到手机通讯录中... 技术qq交流群:JavaDream:251572072 1.首先介绍一个api. Zxing是Google提供的关于条码 ...
- Idea 导包自动变成星号 Idea 导包自动变成*号的问题 java.io.* Idea 自动导包变成星号
Idea 导包自动变成星号 Idea 导包自动变成*号的问题 java.io.* Idea 自动导包变成星号 一.问题描述 1.在使用idea开发时,经常会出现导入的包自动变成 xx.*的情况,比如下 ...
- idea ctrl + 类点击进入的是 .class 而不是 .java文件 修改idea的配置为自动下载源码
问题 使用idea ctrl点击方法时进入了.class文件 而不是 .java文件 解决方法 点击进去之后会看到顶端有个蓝条,蓝条上有两个选项:Download Sources 和 Choose S ...
- java poi生成word 插入表格,图片,自动合并单元格,并且可以在已存在的word上追加
poi版本选3.10以上的 要不然插入图片 word会打不开 <dependency><groupId>org.apache.poi</groupId><ar ...
- sts html自动提醒,STS、Eclipse中编写java、html、javascript文件的自动提示设置 html标签属性提示 总结...
总结:STS.Eclipse中编写java.html.javascript文件的自动提示设置 html标签属性提示 解决方案: 一.HTML ①鼠标右键点击创建的文件,选择[Properties] ② ...
- 我的世界服务器java启动脚本_我的世界自动重启脚本教程
今天为大家带来了我的世界自动重启的一个脚本,如何让服务器自动重启呢?那就来看看小编为大家带来的文章吧! 首先,你要有一个对应你服务器核心的插件,能让你的服务器实现定时关闭服务器. 说白了就是定时或者定 ...
最新文章
- Android中Activity共享变量的另一方法:Application context
- iqn怎么查 linux_程序员必备:46个Linux面试常见问题!收藏!
- Redis-3.2主从复制与集群搭建
- Vue中计算属性与class,style绑定
- centos7启用EPEL Repository
- 在条码打印软件上如何选择TSC TTP-244Pro打印机
- mysql.bat启动关闭脚本
- 微信小程序获取用户信息(附代码、流程图)
- 解决java:找不到符号办法
- 解决MacBook Pro Touch ID失灵不起作用的方法
- HCNR200和HCNR201在电机驱动和电流回路中的应用
- 关于第七届CNCERT网络安全应急服务支撑单位考核情况的通报
- MATLAB打开后一直在初始化,或者初始化很慢问题
- MySql下最好用的数据库管理工具是哪个?
- 淘宝店铺层级划分规则是什么?如何去玩转?
- 收集一个错误,foxmail发送邮件时报错反馈550 5.7.0 DT:SPM
- winds以管理员身份运行命令提示符
- C++ Primer 18 用于大型程序的工具
- python编程入门指南明日科技pdf-零基础学Python PDF 全彩影印版
- Intellij IDEA 11个隐藏技巧