这周,我的软件设计体系结构老师留了这么道题

客观题型自动阅卷系统体系结构分析:

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自动阅卷判断选择题,客观题型自动阅卷系统(管道过滤器模式)相关推荐

  1. 阅卷管理用c语言编程,模拟人工阅卷C语言编程题自动评阅系统设计与实现.doc

    模拟人工阅卷C语言编程题自动评阅系统设计与实现 模拟人工阅卷C语言编程题自动评阅系统设计与实现 摘要:传统的C语言在线考试系统对编程题的评阅比较机械,无法反映考生的真实水平.本文在分析人工阅卷流程的基 ...

  2. java 自动拆箱_Java中的自动装箱拆箱

    Java中的自动装箱拆箱 一.自动装箱与自动拆箱 自动装箱就是将基本数据类型转换为包装类类型,自动拆箱就是将包装类类型转换为基本数据类型. 1 //自动装箱 2 Integer total = 90; ...

  3. java前端目录_[Java教程]前端那点事儿——Tocify自动生成文档目录

    [Java教程]前端那点事儿--Tocify自动生成文档目录 0 2016-06-29 22:00:07 今天偶然间看到文档服务器有一个动态目录功能,点击目录能跳转到指定的位置:窗口滑动也能自动更新目 ...

  4. java 自动装载_java_详解Java的Spring框架下bean的自动装载方式,Spring容器可以自动装配相互协 - phpStudy...

    详解Java的Spring框架下bean的自动装载方式 Spring容器可以自动装配相互协作bean之间的关系,这有助于减少对XML配置,而无需编写一个大的基于Spring应用程序的较多的和元素. 自 ...

  5. 二维码相关---java生成二维码名片,并且自动保存到手机通讯录中...

    二维码相关---java生成二维码名片,并且自动保存到手机通讯录中... 技术qq交流群:JavaDream:251572072 1.首先介绍一个api.   Zxing是Google提供的关于条码 ...

  6. Idea 导包自动变成星号 Idea 导包自动变成*号的问题 java.io.* Idea 自动导包变成星号

    Idea 导包自动变成星号 Idea 导包自动变成*号的问题 java.io.* Idea 自动导包变成星号 一.问题描述 1.在使用idea开发时,经常会出现导入的包自动变成 xx.*的情况,比如下 ...

  7. idea ctrl + 类点击进入的是 .class 而不是 .java文件 修改idea的配置为自动下载源码

    问题 使用idea ctrl点击方法时进入了.class文件 而不是 .java文件 解决方法 点击进去之后会看到顶端有个蓝条,蓝条上有两个选项:Download Sources 和 Choose S ...

  8. java poi生成word 插入表格,图片,自动合并单元格,并且可以在已存在的word上追加

    poi版本选3.10以上的 要不然插入图片 word会打不开 <dependency><groupId>org.apache.poi</groupId><ar ...

  9. sts html自动提醒,STS、Eclipse中编写java、html、javascript文件的自动提示设置 html标签属性提示 总结...

    总结:STS.Eclipse中编写java.html.javascript文件的自动提示设置 html标签属性提示 解决方案: 一.HTML ①鼠标右键点击创建的文件,选择[Properties] ② ...

  10. 我的世界服务器java启动脚本_我的世界自动重启脚本教程

    今天为大家带来了我的世界自动重启的一个脚本,如何让服务器自动重启呢?那就来看看小编为大家带来的文章吧! 首先,你要有一个对应你服务器核心的插件,能让你的服务器实现定时关闭服务器. 说白了就是定时或者定 ...

最新文章

  1. Android中Activity共享变量的另一方法:Application context
  2. iqn怎么查 linux_程序员必备:46个Linux面试常见问题!收藏!
  3. Redis-3.2主从复制与集群搭建
  4. Vue中计算属性与class,style绑定
  5. centos7启用EPEL Repository
  6. 在条码打印软件上如何选择TSC TTP-244Pro打印机
  7. mysql.bat启动关闭脚本
  8. 微信小程序获取用户信息(附代码、流程图)
  9. 解决java:找不到符号办法
  10. 解决MacBook Pro Touch ID失灵不起作用的方法
  11. HCNR200和HCNR201在电机驱动和电流回路中的应用
  12. 关于第七届CNCERT网络安全应急服务支撑单位考核情况的通报
  13. MATLAB打开后一直在初始化,或者初始化很慢问题
  14. MySql下最好用的数据库管理工具是哪个?
  15. 淘宝店铺层级划分规则是什么?如何去玩转?
  16. 收集一个错误,foxmail发送邮件时报错反馈550 5.7.0 DT:SPM
  17. winds以管理员身份运行命令提示符
  18. C++ Primer 18 用于大型程序的工具
  19. python编程入门指南明日科技pdf-零基础学Python PDF 全彩影印版
  20. Intellij IDEA 11个隐藏技巧

热门文章

  1. vim编辑器永久显示行号
  2. 【数学建模】看了都说好,高温作业专用服装设计拟合函数模型,强烈建议收藏
  3. 【Luogu3444】ORK-Ploughing(贪心)
  4. 箱线图多个y含组怎么画_箱线图的N种画法
  5. 2021华为软挑赛题_思路分析——实时更新,做多少更多少(四)
  6. (原创)windows10cmd装逼命令
  7. sqlyog怎么查找表_sqlyog各种搜索方法
  8. php代码,IP地址归属地批量查询功能
  9. 国内外组态软件对比分析(InTouch、WinCC、iFix、iNeuOS)
  10. 如何用C语言编写小游戏让你的学习不在无聊——三子棋