深 圳 职 业 技 术 学 院 学 报 2011 年 第 1 期 Journal of Shenzhen Polytechnic No.1, 2011 全 国 国 际 商 务 英 语 考 试 考 场 编 排 算 法 的 设 计 及 实 现 陈 锐 浩 ( 深 圳 职 业 技 术 学 院 教 育 技 术 与 信 息 中 心, 广 东 深 圳 518055) 摘 要 : 根 据 全 国 国 际 商 务 英 语 考 试 考 场 编 排 的 要 求, 设 计 一 种 优 化 的 随 机 编 排 算 法, 并 且 用 C# 语 言 实 现. 采 用 DataSet 和 SqlCommandBuilder 组 合, 实 现 对 考 生 考 场 和 座 位 的 批 量 编 排, 最 大 限 度 地 减 少 数 据 库 的 访 问 次 数. 文 中 给 出 算 法 实 现 的 步 骤 和 效 果. 实 践 证 明, 该 算 法 可 靠, 运 行 效 率 高, 效 果 良 好. 关 键 词 : 考 务 管 理 ; 考 场 编 排 ;DataSet;SqlCommandBuilder 中 图 分 类 号 :TP315 文 献 标 识 码 :A 文 章 编 号 :1672-0318(2011)01-0013-06 全 国 国 际 商 务 英 语 考 试 是 我 国 商 务 行 业 内 的 一 个 非 常 重 要 的 认 证 考 试, 由 中 国 国 际 贸 易 学 会 直 接 领 导, 考 试 中 心 设 在 深 圳 职 业 技 术 学 院. 该 考 试 的 特 点 是 范 围 广, 面 向 全 国 各 级 高 校 的 大 学 生 和 在 企 事 业 在 职 工 作 人 员 ; 考 点 分 散, 目 前 共 有 一 级 考 点 和 二 级 考 点 共 计 378 个, 分 布 于 全 国 各 地 ; 考 试 灵 活, 它 不 同 于 传 统 的 英 语 四 六 级 考 试, 不 仅 包 括 笔 试, 还 有 口 试, 考 生 可 以 只 报 考 某 一 门, 而 且 从 报 名 到 考 试, 整 个 过 程 是 由 考 试 [1] 中 心 统 筹 安 排 的. 考 场 编 排 是 全 国 国 际 商 务 英 语 考 试 考 务 工 作 中 的 一 项 重 要 工 作, 不 论 从 准 确 性, 还 是 从 效 率 上, 都 具 有 极 高 的 要 求. 因 此 一 个 科 学 高 效 的 考 场 编 排 算 法, 对 于 该 考 试 的 组 织 具 有 很 大 的 促 进 作 用. 1 全 国 国 际 商 务 英 语 考 试 考 场 编 排 要 求 全 国 国 际 商 务 英 语 考 试 目 前 每 年 分 别 在 5 月 份 和 11 月 份 举 行 考 试, 为 了 保 证 考 试 组 织 的 统 一 性 和 协 调 性, 报 名 完 毕 之 后, 由 考 试 中 心 统 一 进 行 考 场 编 排. 考 场 编 排 是 以 考 点 为 单 位, 生 成 每 一 位 考 生 的 考 场 号 和 座 位 号. 考 点 再 根 据 现 实 情 况, 填 写 每 一 考 场 号 对 应 的 教 室 和 地 址. 由 于 考 点 系 统 提 供 考 场 考 生 桌 贴 的 生 成 功 能, 考 场 具 体 的 布 局 安 排 由 考 点 实 施, 所 以 考 场 编 排 的 时 候 只 要 考 虑 到 生 成 对 应 的 考 场 号 和 座 位 号 就 可 以. 在 进 行 考 场 编 排 的 时 候, 要 求 尽 可 能 将 考 试 的 座 位 随 机 打 乱, 防 止 出 现 一 起 报 名 的 考 生 坐 在 一 起. 每 个 考 场 的 人 数 限 制 为 不 超 过 30 人, 编 号 为 01~30, 超 过 30 人, 考 场 号 加 一. 考 生 考 场 号 和 座 位 号 要 在 准 考 证 上 体 现, 考 场 号 为 三 位 数, 不 足 三 位 前 面 补 0. 2 算 法 设 计 为 了 达 到 考 生 的 座 位 随 机 打 乱 的 效 果, 必 须 采 用 随 机 编 排 算 法, 而 随 机 编 排 算 法 的 核 心 问 题 就 是 [2,3] 考 生 的 随 机 排 序 问 题. 传 统 的 随 机 编 排 算 法 思 路 是 根 据 考 生 规 模 n, 每 次 随 机 产 生 [1,n] 之 间 的 一 个 随 机 数 x, 然 后 根 据 计 算 规 则 把 x 转 化 成 具 体 的 考 场 号 和 座 位 号. 由 于 座 位 号 是 不 能 重 复 安 排 的, 所 以 每 产 生 一 个 随 机 数, 都 要 进 行 冲 突 检 测, 判 断 该 数 是 否 已 经 产 生 过. 如 果 已 经 产 生 过, 则 重 新 产 生, 直 到 所 有 考 生 都 安 排 完 毕 为 止. 在 这 种 算 法 下 面, 收 稿 日 期 :2010-11-11 项 目 来 源 : 全 国 国 际 商 务 英 语 考 试 中 心 资 助 项 目 作 者 简 介 : 陈 锐 浩 (1977-), 男, 广 东 潮 州 人, 硕 士, 工 程 师, 研 究 方 向 为 软 件 工 程.
14 深 圳 职 业 技 术 学 院 学 报 第 10 卷 由 于 每 次 都 要 进 行 冲 突 检 测, 而 且 越 到 后 面, 冲 突 会 更 频 繁, 算 法 执 行 时 间 的 增 长 和 f(n 2 ) 的 增 长 率 相 同. 由 于 系 统 是 B/S 系 统, 所 有 运 算 都 在 服 务 器 端 运 行, 而 且 是 运 行 完 毕 之 后 才 显 示 出 结 果, 对 于 一 些 考 生 多 的 考 点, 采 用 该 算 法 安 排 考 场 的 时 候, 由 于 频 繁 操 作 访 问 数 据 库, 运 算 时 间 长, 会 出 现 连 接 超 时 的 情 况, 所 以 在 不 影 响 效 果 的 情 况 下, 设 计 一 个 快 速 实 用 的 算 法 是 十 分 必 要 的. 算 法 设 计 遵 循 一 下 原 则 : 1) 正 确 性 : 考 场 编 排 是 考 务 管 理 中 最 关 键 的 一 环, 如 果 出 现 数 据 异 常, 将 导 致 考 试 组 织 混 乱, 所 以 一 定 要 保 证 该 算 法 是 正 确 的, 能 满 足 具 体 问 题 的 需 求. 2) 高 效 率 :B/S 系 统 所 有 运 算 都 在 服 务 器 端 运 行, 如 果 某 算 法 需 要 频 繁 的 读 写 数 据 库, 将 会 影 响 系 统 的 性 能 和 提 高 出 错 的 可 能 性. 所 以, 设 计 时 把 数 据 库 的 读 写 次 数 作 为 算 法 效 率 的 评 价 指 标. 以 分 治 法 的 思 想, 把 考 生 以 考 点 为 单 位 分 开, 分 别 进 行 考 场 编 排, 这 样 问 题 规 模 就 小 多 了. 为 了 对 该 算 法 进 行 描 述, 我 们 需 要 定 义 一 些 符 号 和 函 数. 其 中 有 些 函 数, 如 考 场 号 计 算 函 数 座 位 号 计 算 函 数, 在 考 试 信 息 管 理 中 是 经 常 用 到 的. 设 考 生 集 为, 中 共 有 n 个 考 生, 分 别 为 S 1,,S n. 考 场 号 计 算 函 数 定 义 为 GetRoom(i), 座 位 号 计 算 函 数 定 义 为 GetSeat(i), 参 数 i 为 考 生 的 随 机 排 序 号. 设 计 的 考 场 编 排 算 法 描 述 如 下 : 设 某 考 点 的 考 生 集 为 =S i i=1,2,, n. 1) 为 中 每 一 个 考 生 成 一 个 随 机 数 R(S i ), R(S i ) 不 重 复 出 现. 2) 以 R(S i ) 为 关 键 字 对 考 生 集 进 行 排 序, 生 成 的 有 序 结 果 集 记 为. 3) 打 开 记 录 集, 遍 历 记 录 集, 调 用 GetRoom(i) 和 GetSeat(i) 方 法 生 成 考 生 Si 的 考 场 号 和 座 位 号. 并 且 更 新 每 一 位 考 生 的 信 息. 4) 考 点 编 排 状 态 设 置 为 已 编. 通 过 步 骤 1) 和 2), 原 有 的 考 生 报 考 顺 序 被 随 机 打 乱,3) 是 该 算 法 的 关 键 步 骤, 实 现 具 体 的 考 场 安 排. 3 算 法 的 实 现 3.1 算 法 步 骤 算 法 的 第 一 和 第 二 个 步 骤 是 为 每 一 个 考 生 生 成 一 个 随 机 数, 并 得 到 一 个 随 机 的 记 录 集, 生 成 随 机 数 的 目 的 是 为 了 对 记 录 集 进 行 随 机 排 序. 如 果 新 增 一 个 字 段 来 存 放 为 每 一 个 考 生 生 成 随 机 数, 必 然 要 重 复 更 新 数 据 库, 这 样 效 率 明 显 不 高. 我 们 的 目 的 是 得 到 一 个 随 机 排 序 的 记 录 集, 所 以, 可 以 利 用 SqlServer 自 带 的 NEWID() 函 数. 其 使 用 方 式 为 : SELECT * FROM 表 名 ORDER BY NewID() NEWID 建 立 一 个 uniqueidentifier 类 型 的 唯 一 值.NewID() 在 扫 描 每 条 记 录 的 时 候 都 生 成 一 个 值, 而 生 成 的 值 是 随 机 的, 没 有 大 小 写 顺 序, 所 以 最 终 结 果 再 按 这 个 排 序, 排 序 的 结 果 当 然 就 是 无 序 的. 通 过 这 句 话 我 们 就 实 现 了 1) 和 2) 2 个 步 骤, 比 传 统 的 实 现 方 式 方 便 了 很 多. 算 法 的 第 三 步 是 生 成 考 场 号 和 座 位 号, 这 是 系 统 的 核 心. 为 了 减 少 频 繁 的 数 据 库 修 改, 采 用 了 DataSet 加 SqlCommandBuilder [4,5] 的 组 合 实 现 批 量 更 新. DataSet 是 ADO.NET 结 构 的 主 要 组 件, 它 是 从 数 据 源 中 检 索 到 的 数 据 在 内 存 中 的 缓 存, 由 一 组 DataTable 对 象 组 成, 它 通 过 DataAdapter 使 用 数 据 源 中 的 数 据 生 成 和 填 充 DataSet 中 的 每 个 DataTable. SqlCommandBuilder 类 位 于 命 名 空 间 System.Data.SqlClient, 其 作 用 是 自 动 生 成 单 表 命 令, 用 于 将 对 DataSet 所 做 的 更 改 与 关 联 的 SQL Server 数 据 库 的 更 改 相 协 调. 实 现 的 时 候, 只 要 设 置 了 SqlDataAdapter 的 SelectCommand 属 性, 就 可 以 创 建 一 个 SqlCommandBuilder 对 象 来 自 动 生 成 用 于 单 表 更 新 的 Transact-SQL 语 句, 然 后, SqlCommandBuilder 将 生 成 其 他 任 何 未 设 置 的 Transact-SQL 语 句. 每 当 设 置 了 SqlDataAdapter 属 性, SqlCommandBuilder 就 将 其 本 身 注 册 为 RowUpdating 事 件 的 侦 听 器. 一 次 只 能 将 一 个
第 1 期 陈 锐 浩 : 全 国 国 际 商 务 英 语 考 试 考 场 编 排 算 法 的 设 计 及 实 现 15 SqlDataAdapter 与 一 个 SqlCommandBuilder 对 象 ( 或 相 反 ) 互 相 关 联. 为 了 生 成 INSERT,UPDATE 或 DELETE 语 句, SqlCommandBuilder 会 自 动 使 用 SelectCommand 属 性 来 检 索 所 需 的 元 数 据 集. 在 分 配 考 生 考 场 号 和 座 位 号 的 时 候, 如 果 每 分 配 一 位 考 生 就 更 新 一 下 数 据 库, 势 必 会 频 繁 的 操 作 数 据 库, 影 响 系 统 性 能, 如 果 一 个 考 点 有 500 个 考 生, 那 就 要 执 行 500 次 数 据 库 更 新 操 作, 这 显 然 不 符 合 现 实 的 需 求, 不 但 容 易 引 起 数 据 库 冲 突, 引 发 错 误, 而 且 执 行 效 率 也 比 较 差, 所 以 这 个 时 候 就 必 须 利 用 SqlCommandBuilder 来 进 行 批 量 更 新, 利 用 它 可 以 把 DataSet 的 数 据 都 修 改, 最 后 一 并 交 给 数 据 库, 而 不 是 每 一 步 操 作 都 访 问 数 据 库. 采 用 C# 语 言 实 现 的 代 码 如 下 : /// 根 据 考 点 代 码 进 行 考 场 设 置 /// <param name="kaodian"> 考 点 代 码 </param> protected void Arrange(int kaodian) try string StrConn = ConfigurationManager.ConnectionStrings["DB"].ConnectionString; SqlConnection Conn = new SqlConnection(StrConn); Conn.Open(); SqlCommandBuilder cb; DataSet Ds = new DataSet(); SqlDataAdapter Adapter = new SqlDataAdapter(); Adapter.SelectCommand = new SqlCommand(); Adapter.SelectCommand.CommandText = @"select ID,SignNum,UserName,Room,Seat from Baoming where Kaodian=" + kaodian+" order By NewID()";// 通 过 该 sql 语 句 得 到 一 个 随 机 编 排 的 记 录 集 Adapter.SelectCommand.Connection = Conn; Adapter.Fill(Ds, "Baoming");// 把 记 录 集 填 充 到 DataSet DataTable Dt = Ds.Tables[0]; int i, j; //j 代 表 考 生 的 序 号 for (i = 0; i < Ds.Tables["Baoming"].Rows.Count; i++) j = i + 1; // 由 于 i 是 从 0 开 始 的, 所 以 j=i+1 DataSet 中 第 i 行 就 是 第 j 个 考 生 DataRow DR = Ds.Tables["Baoming"].Rows[i]; //DR 为 DR["room"] = GetRoom(j); DR["seat"] = GetSeat(j); cb = new SqlCommandBuilder(Adapter); if (Ds.Tables["Baoming"].GetChanges()!= null) Adapter.Update(Ds, "Baoming"); Ds.AcceptChanges(); // 下 面 代 码 更 改 考 点 考 场 设 置 的 状 态, 防 止 重 复 编 排 SqlCommand Comm = new SqlCommand(); Comm.Connection = Conn; Comm.CommandType = CommandType.Text; Comm.CommandText = "update kaodian set ArrangeStatic=1 where kaodian=" + kaodian;
16 深 圳 职 业 技 术 学 院 学 报 第 10 卷 Comm.ExecuteNonQuery(); Repeater1.DataSource = Ds; // 把 执 行 后 的 结 果 输 出 在 Repeater 1 中 Repeater1.DataBind(); catch // 定 义 出 错 时 候 的 输 出 Response.Write(" 编 码 过 程 中 出 现 错 误 "); /// 根 据 排 序 得 到 考 场 号 /// <param name="i"> 序 号 </param> /// <returns> 考 场 号 </returns> protected string GetRoom(int i) int room; if (i % 30 == 0) else room = i / 30; room = i / 30 + 1; if (room >= 100) return room.tostring(); else if (room>=10 && room<100) else return "0"+ room.tostring(); return "00"+ room.tostring(); /// 根 据 排 序 得 到 座 位 号 /// <param name="i"> 序 号 </param> /// <returns> 座 位 号 </returns> protected string GetSeat(int i) int seat = i % 30; if (seat == 0) seat = 30; return seat.tostring(); 实 践 证 明, 利 用 SqlCommandBuilder 对 DataSet 进 行 批 量 修 改, 应 用 在 考 场 随 机 编 排 的 程 序 中, 不 仅 节 省 代 码 量, 节 省 时 间, 而 且 减 少 数 据 库 的 访 问 次 数, 提 高 执 行 效 率. 3.2 实 现 效 果 在 进 行 考 场 安 排 的 时 候, 以 分 治 法 的 思 想, 以 考 点 为 单 位 进 行 编 码, 把 问 题 规 模 变 小. 具 体 的 实 现 界 面 如 图 1 所 示, 系 统 管 理 员 进 入 二 级 考 务 管 理 之 后, 选 择 左 边 栏 目 的 考 前 数 据 维 护 就 可 以 出 现 图 1 所 示 的 页 面. 每 个 考 点 都 有 一 个 编 排 按 钮, 点 击 就 可 以 实 现 考 场 的 编 排, 如 果 已 经 编 排 完 毕, 现 实 的 是 查 看 的 文 字 连 接, 如 果 想 重 新 编 排, 点 一 下 状 态 列 的 已 编 按 钮 可 以 重 新 激 活 编 排 按 钮. 点 击 编 排 按 钮 之 后, 显 示 效 果 如 图 2 所 示.
第 1 期 陈 锐 浩 : 全 国 国 际 商 务 英 语 考 试 考 场 编 排 算 法 的 设 计 及 实 现 17 图 1 考 场 编 排 页 图 2 考 场 编 排 效 果 从 图 2 可 以 看 到,ID 列 的 值 是 随 机 排 序 的, 全 国 国 际 商 务 英 语 考 务 管 理 系 统 的 实 施, 提 高 该 值 原 来 在 数 据 库 中 是 设 置 为 自 动 编 号 的, 在 这 了 考 试 管 理 中 心 的 管 理 水 平 和 服 务 质 量. 系 统 在 考 里 它 完 全 打 乱 了, 这 样 我 们 就 得 到 了 随 机 编 排 的 场 编 排 方 面 的 算 法, 既 实 现 了 随 机 编 排 的 效 果, 又 效 果. 简 化 算 法 的 复 杂 度, 有 参 考 价 值. 目 前 该 系 统 已 经
18 深 圳 职 业 技 术 学 院 学 报 第 10 卷 成 功 运 行 了 3 年 多, 组 织 了 6 万 多 名 考 生 参 加 考 试, 总 体 使 用 效 果 较 好. 参 考 文 献 : [1] 王 希 常, 杨 志 强. 一 类 考 场 编 排 算 法 的 设 计 [J]. 山 东 师 范 大 学 学 报,2002,17(4):25-27. [2] 曾 棕 根. 随 机 排 序 的 一 种 算 法 及 其 在 准 考 证 号 生 成 中 的 应 用 [J]. 宁 波 职 业 技 术 学 院 学 报,2006,10(5): 83-86. [3] 冯 向 萍, 香 丽 芸. 新 疆 成 人 高 考 考 场 编 排 算 法 的 设 计 与 实 现 [J]. 昌 吉 学 院 学 报,2008(1):97-100. [4] 李 永 革, 潘 卫, 邢 红 梅. 深 入 理 解 ADO.NET 的 更 新 机 制 [J]. 计 算 机 应 用,2005,25(12):163-165. [5] 易 平. ADO. NET 中 DataSet 角 色 分 析 与 应 用 [J]. 计 算 机 与 数 字 工 程,2005,33(10):56-58. Design and Implementation of Classroom Arrangement Algorithm of China National Business English Examination CHEN Ruihao (Information Center, Shenzhen Polytechnic, Shenzhen, Guangdong 518055, China) Abstract: According to requirements of the examination room arrangement in National Business English Examination, an algorithm of random optimization with C # language is designed. A combination of DataSet and SqlCommandBuilder is used to achieve batch scheduling room number and seat number and minimize the frequency of database access, and procedures and effects of the algorithm are given. The algorithm proves to be reliable with high efficiency, and good performance. Key words: examination management; examination room arrangement; DataSet; SqlCommandBuilder