考场自动安排工具开发手记
昨天教务的一个同事,提出有没有办法可以对169门考试(合计1744个学生)进行考试安排。因为是期末考试补考。因此其中很多考试存在学生冲突现象。
例如:
(英语翻译2-2<--->英语听力4-4) ID:200616031109
(英语专业四级培训-3<--->英语听力4-4) ID:200616031133
(英语翻译2-2<--->英语听力4-4) ID:200616031109
(英语专业四级培训-3<--->英语听力4-4) ID:200616031133
(英语翻译2-2<--->英语听力4-4) ID:200616031109
(英语专业四级培训-3<--->英语听力4-4) ID:200616031133
(英语听说2-2<--->大学英语听说4-2) ID:200616013260
(英语听说2-2<--->合同法案例实践-2) ID:200616041257
存在冲突的考试科目就不能安排在同一批次(也就是同一时间段内)
软件界面如图:
软件工作流程:
(1)导入CSV数据文件。
文件格式为:
[学号]-[姓名]-[考试科目]
CSV文件导入代码:
/// <summary>
/// 将csv格式文件导成dataset
/// </summary>
/// <param name="filePath">文件路径</param>
/// <param name="fileName">文件名</param>
/// <returns></returns>
public DataSet getCsv(string filePath, string fileName)
{
string strConn = "Driver={Microsoft Text Driver (*.txt; *.csv)};Dbq=";
strConn += filePath;
strConn += ";Extensions=asc,csv,tab,txt;";
OdbcConnection con = new OdbcConnection(strConn);
DataSet data = new DataSet();
string sql = "select * from " + fileName;
OdbcDataAdapter adp = new OdbcDataAdapter(sql, con);
con.Open();
adp.Fill(data, "csv");
return data;
}
(2)把导入的数据进行处理。
处理过程采用面向对象的思想,建立了一个考试类。
using System;
using System.Collections.Generic;
using System.Text;
using System.Collections;
namespace ExamManager
{
public class Exam
{
public class student
{
public string studentID;
public string studentName;
}
public string ExamName;//考试科目
public string ExamTime;//考试时间
public int Students;//学生数
public ArrayList StudentList = new ArrayList(); //学生列表
public void addStudent(string studentID,string studentName)
{
student s = new student();
s.studentID = studentID;
s.studentName = studentName;
StudentList.Add(s);
}
public bool CheckStudentIdList(int N_PC,Exam ex,ref StringBuilder sb_ct)
{
ArrayList studIdList = ex.StudentList;
for (int i = 0; i < studIdList.Count; i++)
{
for (int j = 0; j < StudentList.Count; j++)
{
//考生 冲突
if (((student)studIdList[i]).studentID == ((student)StudentList[j]).studentID)
{
//Console.WriteLine("冲突:(" + ex.ExamName + "<--->" + this.ExamName + ") ID:" + ((student)studIdList[i]).studentID);
sb_ct.Append("批次:"+N_PC.ToString()+ " 冲突:(" + ex.ExamName + "<--->" + this.ExamName + ") ID:" + ((student)studIdList[i]).studentID);
sb_ct.Append("/r/n");
return false;
}
}
}
return true;
}
}
}
该类主要负责将CSV文件进行处理,把同一考试科目的学生归集到一起。其次是负责将2个考试对象进行检测,看看是否存在冲突。算法采用双重循环,效率较低。呵呵
(3)考试安排
public void KSAP()
{
//安排考试
ks_pc.Clear();//
Hashtable tmp = (Hashtable)htExams.Clone();
int i = 0;
int N_PC = 0;//批次
StringBuilder sb = new StringBuilder();
StringBuilder sb_ct = new StringBuilder();//冲突
loop:
foreach (DictionaryEntry ht in tmp)
{
if (i > int.Parse(txtKM_MAX.Text))
{
i = 0;
N_PC++;
}
//从 考试表中 取出1个
Exam e = (Exam)ht.Value;
object obj = ks_pc[N_PC];
if (obj == null)
{
//单前批次还没添加过,直接添加 当前考试
ArrayList al = new ArrayList();
ks_pc[N_PC] = al;
al.Add(e);
tmp.Remove(ht.Key);//移除单前考试,不在加入
i++;
sb.Append("/r/n----------------------------------/r/n");
//Console.WriteLine("New N_PC=" + N_PC.ToString() + " Exam:" + e.ExamName);
sb.Append("批次=" + N_PC.ToString() + " Exam:" + e.ExamName+" 人数:"+e.StudentList.Count);
sb.Append("/r/n");
goto loop;
}
//sb_ct.Append("/r/n----------------" + N_PC.ToString() + "--------------/r/n");
bool flag = true;
ArrayList ks = (ArrayList)obj; //获取考试列表
for (int j = 0; j < ks.Count; j++)
{
//开始检测
Exam le = (Exam)ks[j];
if (le.CheckStudentIdList(N_PC,e, ref sb_ct) == false)
{
//发现 冲突,不能将该考试添加进去
flag = false;//跳过该考试
}
}
if (flag == true)
{
//不存在冲突,可以添加进去
ks.Add(e);
tmp.Remove(ht.Key);
i++;
//Console.WriteLine("N_PC=" + N_PC.ToString() + " Exam:" + e.ExamName);
sb.Append("批次=" + N_PC.ToString() + " Exam:" + e.ExamName + " 人数:" + e.StudentList.Count);
sb.Append("/r/n");
goto loop;
}
}
if (tmp.Count > 0)
{
N_PC++;
goto loop;
}
//汇总信息
sb.Append("----------------------------------/r/n");
for (int N = 0; N <= N_PC; N++)
{
ArrayList ks=(ArrayList)ks_pc[N];
int num = 0;
for (int j = 0; j < ks.Count; j++)
{
//开始检测
Exam le = (Exam)ks[j];
num += le.StudentList.Count;
}
sb.Append("批次:" + N.ToString() + " 总人数=" + num.ToString() + "/r/n");
}
sb.Append("----------------------------------");
txtMSG.Text = sb.ToString();
txtCT.Text = sb_ct.ToString();
}
考试安排也是采用了循环+goto 实现,根据预先设置好的同一批次科目数,将不存在冲突的考试科目安排在一起。
整个程序的源代码,在共享里,欢迎大家交流。多多提出意见。
转载于:https://www.cnblogs.com/hgndinfo/archive/2010/03/30/2713842.html
考场自动安排工具开发手记相关推荐
- matlab 生成plc程序,利用MATLABsimulink的自动代码生成工具开发PLC程序..docx
利用MATLABsimulink的自动代码生成工具开发PLC程序. 利用MATLAB/simulink的自动代码生成工具开发PLC程序MATLAB之控制系统 2010-07-07 15:17:43 阅 ...
- vue3+ts实战开发之swagger自动生成工具开发(二)
在上一篇文章我们讲述了如何去管理我们实际项目中关于请求部分的接口定义和封装,更推荐的是统一化.自动化.在本文中将重点阐述前端是如何集成这类的开发工具.如果你还没预览上一篇文章,请回到上一篇点击传送 一 ...
- Auto-Icon:一款自动代码生成工具 | 开发工程师必备
在这个春暖花开的日子,前端智能化的核心技术产品 imgcook.com 被 Thought Works 的 24 期技术雷达收录,ICON 识别的论文已正式发表,真可谓双喜临门. (https://d ...
- 图片验证码识别-自动登录工具开发
涉及工具技术 Tampermonkey jQuery Tesseract-OCR Flask Pillow 前言 开发软件系统时必然会有用户登陆的模块.每次验证自己的功能时,总是绕不开输入账号密码,这 ...
- [c#]图书ISBN信息批量查询工具开发手记
0.序言 之前帮朋友做了一个利用ISBN码批量查询图书信息的小工具,这个工具难度不大,对于书店.图书馆这些很多信息需要入库的单位而言有点作用,记录一下开发过程.先上程序截图: 1.程序原理 程序用到了 ...
- js 刷新页面但是不闪烁_前端开发还在手动刷新页面?手把手教你搭建一个自动刷新工具...
作为一名前端,开发web页面是我们的本职工作.在完成一个页面开发的过程中,保存代码然后手动刷新页面查看效果,这样的动作需要重复无数次,虽然一次这样的动作可能只要花费几秒钟的时间,但是次数多了也挺浪费时 ...
- 小工具开发笔记—IE自动填表器—第一篇:你好,世界
系列导航: 小工具开发笔记-IE自动填表器-第零篇:序 小工具开发笔记-IE自动填表器-第一篇:你好,世界 继上篇博文初步介绍了小工具,本文就作为开发笔记正文第一篇,来叙述一下如何使用C++开发一个完 ...
- Python 微信自动化工具开发系列02_自动获取微信多个好友聊天信息(2023年1月可用)
前言 一个需求需要利用Python+第三方库wxauto 用于微信上自动获取聊天信息,从而根据自己需求对信息自动进行二次处理, 比如自动回复,再比如自动发送文件或者其他.--- 记录于2022年07月 ...
- Python 微信自动化工具开发系列04_所有微信群的群文件自动同步拷贝到群名对应的新文件夹中(2023年1月可用)
前言 一个需求需要利用Python+第三方库wxauto 用于微信上自动获取聊天信息,从而根据自己需求对信息自动进行二次处理, 比如自动回复,再比如自动发送文件或者其他.--- 记录于2022年08月 ...
- 微信开发者工具开发小程序代码自动热加载/重载/部署
前言 微信小程序基础库 2.12.2 默认情况下,使用微信开发者工具开发小程序时,每次保存代码都会重启微信小程序,即每次都模拟器都返回到首页.有没有办法既更新模拟器中的小程序,又保持 在当前页呢?有的 ...
最新文章
- golang 包含 数组_golang 数组
- 2020年第十一届蓝桥杯 - 省赛 - C/C++大学生A组 - C.蛇形填数
- winCVS 使用方法
- 嵌入式Linux入门6:u-boot移植
- mysql+join的原理,Mysql连接join查询原理知识点
- 若依前端如何生成序号?
- Oracle中connect by...start with...的使用
- 浅谈C++ Lambda 表达式(简称LB)
- 最新第一波:全国信息化工程师软考-系统集成项目管理工程师(高级案例高分论文)
- OLED驱动芯片SSD1306解读
- PCB设计敷铜时的天线效应
- html中增加一个播放器,从零实现一个自定义 HTML5 播放器
- 【愚公系列】2022年02月 阿里云 无影云桌面产品测评
- 计算机连接网络显示有限访问权限,电脑WiFi连接总是提示有限的访问权限是什么意思...
- 王凯1987计算机系,王凯-专家人物-中国水网
- 笔记本显示器仅计算机,笔记本可以当屏幕用 笔记本屏幕当显示器用
- 动态路由ospf、DR和BDR
- 【测评】国外AR平台ENTITI测评-网页编辑器(1)
- openwrt支持wpa3加密
- 响应式微服务_低风险整体式微服务演进第二部分
热门文章
- 包你满意的Git命令大全,快来收藏!
- 超硬核详解SpringClould之Gateway网管【含源码例子】
- Vue学习之从入门到神经(两万字收藏篇)
- 27. 二叉搜索树与双向链表(C++版本)
- C++11 后置返回类型
- 47. 不用加减乘除做加法(C++版本)
- c语言程序改错:求两个整数的最小公倍数,【C语言】求两个整数的最大公约数、最小公倍数...
- 航空信息指挥调度系统_应急指挥中心指挥调度系统解决方案(一)
- windows 64位sed.exe_32位,64位,x86,x64到底是什么关系?差距居然这么大
- System.IndexOutOfRangeException: 无法找到表 0解决办法