TIP

想做一个将文本处理的脚本,每次期末复习的效果感觉有点不好,在高中的时候,每天做题,感觉这样的效果会比较好一点。所以就想着能不能将期末的复习题文档转换成题库的形式。

# 需求

需求很简单,给一个带有很多题的文档,然后这个应用可以将文档转换成题库,例如:假如是一道选择题,应用可以将这道选择题分解开,选项变成可以选择的按钮,假如选的是正确的答案,这个选项会有提示正确,反之则提示错误。以后努力可以支持更多的题型。

# 分析与设计

暂时先不考虑文档的多样性。文档以txt格式,且格式是固定的。

我觉得最难的在于如何将这一道道选择题区分开,如何将选项区分开,如何提取出选项,题号,选项号,下面就围绕上述几个问题展开分析一下。

TIP

35.在系统间提供可靠的数据传输的层次是(D)。 A、物理层 B、数据层 C、网络层 D、传输层

例如我现在拿到这样一道题,首先肯定是要取出35、D、A、B、C、D这些可以唯一确定一道题类似ID。首先要对文档要做的就是去除空格,空格又两种,中文和英文,需要注意;其次就是需要统一括号,希望就是默认的答案就在括号里,这样可以简化寻找答案。

# 如何区分每一道题

首先要做的就是如何区分每一道题,一道题是作为一个独立的个体,必须要区分正确。每一道题的开头的都是(数字点非数字),可以以此简单的区分每一道题。代码也正是这样做的,写一个正则公式,找到所有的题号,就可以找到每道题起始的位置,则可以划分每一道题。

正则公式((\\d{1,}|[一二三])[.|、|.]{1}\\D),对应于上边的数字点非数字。一道题就是一个独立的单位,保存在ArrayList中。

实现代码如下

public void Divition() {
	flag = 0;
	String regex = "((\\d{1,}|[一二三])[.|、|.]{1}\\D)";
	pattern = Pattern.compile(regex);
	matcher = pattern.matcher(str);
	int index=-1;
	int end=-1;
	while(matcher.find()) {
		String s = matcher.group();
		end=matcher.end()-2;//代表点的位置
		if(s.charAt(0)=='一'||s.charAt(0)=='二'||s.charAt(0)=='三') {
			flag=0;
		}
		else {
			if(str.substring(end-flag-(s.length()-2), end).compareTo(limit[flag])>0) {
				flag++;
			}			
    	}
		if(index!=-1) {
			whole.add(str.substring(index, end-flag-(s.length()-2)));
		}
		index = end-flag-(s.length()-2);//解决第一道题不是个位数只取一位问题
	}
	end = str.length();
	whole.add(str.substring(index,end));
}

# 在一道题中提取题目

我觉得可以以遇到A为判断条件,但是这个A不能是题目中的单词,不能是括号中的正确答案。

在提取题目之前,我首先提取了答案,然后删掉这段答案,要不然在搜索的时候很可能与选项混淆。然后再找到第一个选项A的位置,在此之前的都是题目,正常在题目中是不会出现单独字母的(如果出现了,现在解决不了),所以只需要保证一个字母的前后都不是字母,就可以解决了。这是对于选择题来说的,对于判断题只需要删除掉正确答案就可以了。提取完题目就删掉题目了,只剩下选项了。

正则公式:([ABCDABCDabcd]{1}[.|、|.]{1})

代码如下:

public String Subject(String s) {
	String regex_T = "([ABCDABCDabcd]{1}[.|、|.]{1})";
	Pattern pattern = Pattern.compile(regex_T);
	Matcher matcher = pattern.matcher(s);
	int index = -1;
	if (matcher.find()) {
		index = matcher.start();
	}
	position = index;
	String cache = s.substring(0, index);
	return cache;
}

# 在题目中提取正确答案

正确答案就在括号中,所以只需要找到括号,然后取出里面的字符就可以了。

正则公式:(\\([ABCDABCDabcd]\\)),跟之前寻找A选项正好相反。

public String Result(String s) {
	String regex_R = "(\\([ABCDABCDabcd]\\))";
	Pattern pattern = Pattern.compile(regex_R);
	Matcher matcher = pattern.matcher(s);
	if (matcher.find()) {
		T += matcher.group().toString().charAt(1);
	}
	s = s.replaceAll(regex_R, "");
	return s;
}

# 提取出每一个选项

题目提取完了,那就该提取选项了,碰到字母,并且这个字母是单独存在的。因为现在一道题中只剩下了选项,所以只需要找字母加上点或顿号等。

正则公式:([ABCDABCDabcd]{1}[.|、|.]{1})

判断题代码实现

public String Option(String s) {
	// TODO Auto-generated method stub
	String cache="";
	cache += "<input type=\"radio\" id=\""+ID+"-"+"T"+"\" name=\"xxx\" />";
	cache += "T";
	cache += "\n<input type=\"radio\" id=\""+ID+"-"+"F"+"\" name=\"xxx\" />";
	cache += "F";
	cache += "\n<br />\n";
	cache += "</form>\n";
	return cache;
}

选择题代码实现

public String Option(String s) {
	String regex_X = "([ABCDABCDabcd]{1}[.|、|.]{1})";
	Pattern pattern = Pattern.compile(regex_X);
	Matcher matcher = pattern.matcher(s);
	int index = -1;
	String cache = "";
	int end = -1;
	while (matcher.find()) {
		end = matcher.start();
		if (index != -1) {
			cache += "<input type=\"radio\" id=\"" + ID + "-" + s.charAt(index) + "\" name=\"xxx\" />";
			cache += s.substring(index, end);
			cache += "\n<br />\n";
		}
		index = end;
	}
	end = s.length();
	cache += "<input type=\"radio\" id=\"" + ID + "-" + s.charAt(index) + "\" name=\"xxx\" />";
	cache += s.substring(index, end);
	cache += "\n<br />\n";
	cache += "</form>\n";
	return cache;
}

# 实现类图

采用java语言,用正则对文本进行判断,切割。

Handle
+ str: String=""
+ str: String=""
+ out: String=""
+ out: String=""
~ pattern: Pattern=null
~ pattern: Pattern=null
~ matcher: Matcher=null
~ matcher: Matcher=null
~ whole: ArrayList<String> 
~ whole: ArrayList<String> 
+ Handle(s: String)
+ Handle(s: String)
+ Init(): void
+ Init(): void
+ Divition(): void
+ Divition(): void
+ merge(): void
+ merge(): void
Print
~ file: String=null
~ file: String=null
+ Print(file: String)
+ Print(file: String)
+ out():void
+ out():void
Choice
+ choice: Choice
+ choice: Choice
~ str: String=null
~ str: String=null
~ ID: String=null
~ ID: String=null
+ out: String=""
+ out: String=""
~ T: char
~ T: char
~ position: int
~ position: int
~ pattern: Pattern=null
~ pattern: Pattern=null
~ matcher: Matcher=null
~ matcher: Matcher=null
+ run(s: String): String
+ run(s: String): String
+ TitleNumber(s: String): String
+ TitleNumber(s: String): St...
+ Option(s: String): String
+ Option(s: String): String
+ Subject(s: String): String
+ Subject(s: String): String
+ Result(s: String): String
+ Result(s: String): String
+ onClick(): String
+ onClick(): String
Judgement
+ judgement: Judgement
+ judgement: Judgement
+ ID: String=null
+ ID: String=null
+ str: String=null
+ str: String=null
~ T: char
~ T: char
+ out: String=""
+ out: String=""
~ pattern: Pattern=null
~ pattern: Pattern=null
~ matcher: Matcher=null
~ matcher: Matcher=null
+ run(s: String): String
+ run(s: String): String
+ TitleNumber(s: String): String
+ TitleNumber(s: String): St...
+ Subject(s: String): String
+ Subject(s: String): String
+ Result(s: String): String
+ Result(s: String): String
+ onClick(): String
+ onClick(): String
Classification
~ T: char
~ T: char
~ cache: String=null
~ cache: String=null
+ Result(s: String): void
+ Result(s: String): void
+ Function(s: String): String
+ Function(s: String): Stri...
Connect
+ file: String=null
+ file: String=null
~ reader: BufferedReader=null
~ reader: BufferedReader=null
+ Connect(file: String)
+ Connect(file: String)
+ con(): void
+ con(): void
Main
Main
Use
Use
«interface»Mold
+ run(s: String): String
+ run(s: String): String
+ TitleNumber(s: String): String
+ TitleNumber(s: String): Str...
+ Option(s: String): String
+ Option(s: String): String
+ Subject(s: String): String
+ Subject(s: String): String
+ Result(s: String): String
+ Result(s: String): String
+ onClick(): String
+ onClick(): String
Use
Use
Use
Use
Use
Use
Use
Use
Use
Use
Viewer does not support full SVG 1.1

# 重构后的实现类图

发现有点不符合开闭原则,代码重构后去除了classification类,这样把自己的特征都写到自己的类中。特征在Rule()方法

Handle
+ str: String=""
+ str: String=""
+ out: String=""
+ out: String=""
~ pattern: Pattern=null
~ pattern: Pattern=null
~ matcher: Matcher=null
~ matcher: Matcher=null
~ whole: ArrayList<String> 
~ whole: ArrayList<String> 
+ Handle(s: String)
+ Handle(s: String)
+ Init(): void
+ Init(): void
+ Divition(): void
+ Divition(): void
+ merge(): void
+ merge(): void
Print
~ file: String=null
~ file: String=null
+ Print(file: String)
+ Print(file: String)
+ out():void
+ out():void
+ Remove(file: String): String
+ Remove(file: String): Stri...
Choice
+ choice: Choice
+ choice: Choice
~ str: String=null
~ str: String=null
~ ID: String=null
~ ID: String=null
+ out: String=""
+ out: String=""
~ T: char
~ T: char
~ position: int
~ position: int
~ pattern: Pattern=null
~ pattern: Pattern=null
~ matcher: Matcher=null
~ matcher: Matcher=null
+ run(s: String): String
+ run(s: String): String
+ TitleNumber(s: String): String
+ TitleNumber(s: String): St...
+ Option(s: String): String
+ Option(s: String): String
+ Subject(s: String): String
+ Subject(s: String): String
+ Result(s: String): String
+ Result(s: String): String
+ onClick(): String
+ onClick(): String
+ Rule(s: String): String
+ Rule(s: String): String
Judgement
+ judgement: Judgement
+ judgement: Judgement
+ ID: String=null
+ ID: String=null
+ str: String=null
+ str: String=null
~ T: char
~ T: char
+ out: String=""
+ out: String=""
~ pattern: Pattern=null
~ pattern: Pattern=null
~ matcher: Matcher=null
~ matcher: Matcher=null
+ run(s: String): String
+ run(s: String): String
+ TitleNumber(s: String): String
+ TitleNumber(s: String): St...
+ Subject(s: String): String
+ Subject(s: String): String
+ Result(s: String): String
+ Result(s: String): String
+ onClick(): String
+ onClick(): String
+ Rule(s: String): String
+ Rule(s: String): String
Connect
+ file: String=null
+ file: String=null
~ reader: BufferedReader=null
~ reader: BufferedReader=null
+ Connect(file: String)
+ Connect(file: String)
+ con(): void
+ con(): void
Main
Main
Use
Use
Use
Use
Use
Use
Use
Use
«interface»Mold
+ run(s: String): String
+ run(s: String): String
+ TitleNumber(s: String): String
+ TitleNumber(s: String): Str...
+ Option(s: String): String
+ Option(s: String): String
+ Subject(s: String): String
+ Subject(s: String): String
+ Result(s: String): String
+ Result(s: String): String
+ onClick(): String
+ onClick(): String
+ Rule(s: String): String
+ Rule(s: String): String
Viewer does not support full SVG 1.1

# 开发环境的搭建

暂时先在本地测试

# 总结

考虑到以后可能会有其他题型添加,就把一些功能分开写了,这样就可以很好的对程序扩充了;有的文档不仅有选择题还有判断题,先开始我是以题号作为ID的,最后我把判断和选择放到一起的时候,就出现了ID重复的问题,所以就用1-代表判断题,2-代表选择题,就可以解决不同题型ID重复的问题了,相同题型,假如说题号一样的话,就会出问题了,在现在这个代码还解决不了这样的问题。

# 样例

# 一、判断

1.数据库安全控制的目的是防止非法对数据库的使用和对数据库的恶意破坏。
T F

2.面向集合的操作方式是SQL语言的特点之一。
T F

3.面向对象的操作方式是SQL语言的特点之一。
T F

4.日志文件是用于数据库恢复的重要文件。
T F

5.在登录日志文件时,应该先更新数据库,后登录日志文件。
T F

6.飞机的座位与乘客之间的联系是一对一联系。
T F

7.判断一个并发调度是否正确,可以用“可串行化”概念来解决。
T F

8.对关系模型来说,范式级别越高,实际应用效果越好。
T F

9.视图是关系数据库系统提供给用户以多种角度观察数据库中的数据的重要机制。
T F

10.索引有助于提高数据检索的速度,因此建立索引的数量越多越好。
T F

11.一个基本表最多只能有一个索引。
T F

12.若希望某数据库中的全体用户都具有某个权限,较好的做法是创建一个角色并将此权限授给该角色。
T F

13.当一个表的各记录中某列的字符长度不固定时常将该列定义为CHAR类型。
T F

14.当一个表的各记录中某列的字符长度不固定时常将该列定义为VARCHAR类型。
T F

15.若数据库关系设计中存在函数传递依赖,可能满足2NF,但一定不满足3NF。
T F

# 二、多项选择题(共61小题)

1.从逻辑意义上讲,一个计算机网络是由()构成的。
A、通信子网
B、资源子网
C、局域网
D、广域网

2.计算机网络的发展经历了()阶段。
A、远程联机系统
B、初期计算机网络
C、开放式标准化网络
D、中期计算机网络

3.网络的发展趋势必将导致()三网合一,网络安全、服务质量、多媒体信息的快速传送将成为网络性能的关键问题。
A、计算机网络
B、通信网络
C、广播电视网络
D、无线网络

4.网络拓扑结构是指节点相连形成的几何形状。网络常见的拓扑结构有()。
A、星型网络
B、总线型网络
C、环型网络
D、树型网络

5.以地理分布范围为标准,计算机网络可分为()等。
A、局域网
B、城域网
C、广域网
D、校园网

# 三、单选题

1.数据库管理系统的英文缩写是。
A.DB
B.DBS
C.DBMS
D.DBSS

2.是按照一定的数据模型组织的,长期储存在计算机内,可为多个用户共享的数据的集合。
A.数据库系统
B.数据库
C.关系数据库
D.数据库管理系统

3.关系数据模型的三个组成部分中,不包括
A.完整性规则
B.数据结构
C.数据操作
D.并发控制

4.关系代数表达式的优化策略中,首先要做的是
A.对文件进行预处理
B.尽早执行选择运算
C.执行笛卡儿积运算
D.投影运算

5.事务有多个性质,其中不包括
A.一致性
B.惟一性
C.原子性
D.隔离性

6.SQL语言通常称为。
A.结构化查询语言
B.结构化控制语言
C.结构化定义语言
D.结构化操纵语言

7.如何构造出一个合适的数据逻辑结构是主要解决的问题。
A.关系数据库优化
B.数据字典
C.关系数据库规范化理论
D.关系数据库查询

8.要保证数据库逻辑数据独立性,需要修改的是。
A.模式
B.模式与内模式的映射
C.模式与外模式的映射
D.内模式

9.下列四项中,不属于数据库特点的是。
A.数据共享
B.数据完整性
C.数据冗余很高
D.数据独立性高

10.学生社团可以接纳多名学生参加,但每个学生只能参加一个社团,从社团到学生之间的联系类型是。
A.多对多
B.一对一
C.多对一
D.一对多

11.反映现实世界中实体及实体间联系的信息模型是
A.关系模型
B.层次模型
C.网状模型
D.E-R模型

12.对表进行垂直方向的分割用的运算是。
A.交
B.投影
C.选择
D.连接

13.在SQL中,用户可以直接操作的是。
A.基本表
B.视图
C.基本表或视图
D.基本表和视图

14.对数据库并发操作有可能带来的问题包括
A.读出“脏数据”
B.带来数据的冗余
C.未被授权的用户非法存取数据
D.破坏数据独立性

15.数据管理技术的发展过程中,经历了人工阶段、文件系统阶段和数据库管理阶段,在这几个阶段中,数据独立性最高的是阶段。
A.文件系统
B.人工管理
C.数据库系统
D.数据项管理