`
insertyou
  • 浏览: 901865 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

考场自动安排工具开发手记

 
阅读更多

昨天教务的一个同事,提出有没有办法可以对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 实现,根据预先设置好的同一批次科目数,将不存在冲突的考试科目安排在一起。

整个程序的源代码,在共享里,欢迎大家交流。多多提出意见。

分享到:
评论

相关推荐

    期末考试考场自动安排工具

    "期末考试考场自动安排工具"是一款专为教育机构设计的高效解决方案,旨在简化期末考试的组织工作,尤其针对大规模考试的考场安排问题。这款工具能够处理由电子表格导出的CSV格式考试名单数据,通过自动化算法,快速...

    VBA考场自动安排系统.rar

    以下是一些可能包含在"考场安排系统.xls"中的核心知识点: 1. **数据结构**:可能使用了Excel的表格或工作表来存储考生信息,包括姓名、性别、班级、成绩等。这些数据结构是VBA程序的基础,用于检索和处理信息。 2...

    学生成绩自动统计、分析、考场自动安排系统

    学生成绩自动统计、分析、考场自动安排系统

    考场安排软件

    总的来说,"考场安排软件"是教育信息化进程中的重要工具,它利用现代技术解决了传统教学管理中的痛点,提升了考试组织效率,让教师能将更多精力集中在教学质量的提升上。在未来,我们期待看到更多创新功能的加入,使...

    监考系统与考场安排系统

    监考系统与考场安排系统是教育管理领域中的重要组成部分,主要负责高效、公正地组织考试活动。这样的系统通常包括多个模块,旨在优化考试流程,确保考试的公平性和安全性。下面将详细阐述监考系统和考场安排系统的...

    中小学考场安排软件

    中小学考场安排软件是一款专为我国中小学设计的智能化考试管理工具,旨在优化考试组织工作,提高工作效率,确保考试公平公正。这款软件集成了多种功能,包括考场设置、考生分配、监考人员调度等,以实现科学化、自动...

    毕业设计源码考场安排系统JSP

    总的来说,这个系统为学习JSP开发提供了实践平台,同时对理解和解决实际的考场安排问题也有所启示。尽管它可能存在设计上的不完善,但它提供的源码分析和改进机会对于提升编程技能和解决问题的能力非常宝贵。

    Excel考场监考随机安排 6.2版.rar

    1、自定义监考员场次(孕妇、老教师、带小孩的老师、因特殊情况请假的等)、限制不考和必考监考科目(监考教师不安排所教科目的监考,因需要参加当场的考试、考完所教科目后,留出一场次评卷时间等); 2、可以...

    学生学籍成绩及考场安排信息管理系统

    总结来说,《学生学籍成绩及考场安排信息管理系统》是一款全面覆盖学籍管理、成绩管理和考场安排等关键教育管理环节的工具,其高效、安全、易用的特点,无疑将极大地提升教育机构的管理水平,促进教育信息化的发展。

    VFP自动编排考场座号小程序_vfp排考号_vfp考场编排_VFP自动编排考场座号小程序_vfp编排考场_

    VFP(Visual FoxPro)是一种基于关系数据库管理系统的老牌编程工具,由Microsoft开发。它以其易用性、高效性和灵活性而受到许多用户的喜爱,尤其是在处理数据管理和小型应用程序开发方面。在教育领域,VFP常被用来...

    考试考场分配项目

    【考试考场分配项目】是一个基于Java Web技术与SQL Server数据库的教育管理软件,主要用于实现教师、学生和管理员的登录管理,以及考试考场的自动化分配功能。这个系统包含了附件下载等辅助功能,旨在提高教育机构...

    基于PHP的考场座位安排应用系统的研究.pdf

    本研究旨在设计和开发一个基于 PHP 的考场座位安排应用系统,以解决传统的考试方式中存在的种种问题,如人工分配的考场座位、学生在寻找考场时遇到的问题等。该系统的主要目的是使传统的考试方式计算机化,帮助工作...

    python随机考场安排器

    N人数的随机安排考场,同一学校老师不能出现在同一考场,一个考点不能出现三个同一学校的老师。导入为excel文件,生成也为excel文件。

    考场安排-利用永中office制作

    电子表格共有两个工作表,其中,第一个工作表是写要求的。第二个工作表是存放考生的班级姓名排名考号的。...按考生的排名,按照所输入的一定规则安排考场。不过这个是永中office的宏编写的,需要手动运行宏。

    VBA考场编排系统,自动化教务管理

    目前市面上的考场编排系统都是只能自动编排考场,而无法对考编自动分类,本软件恰恰自动化解决了这个问题,大大提高了工作效率。本考场编排系统是一款功能算不上强大,但是一定算得上短小精悍,运行环境仅需要安装...

    分班与考场安排1.3.1

    能按要求自动生成考号。可打印每考场的首尾考号、考场地点,能制作打印准考证,且可使用电子照片。能制作打印桌贴。 为了安全,本软件需登录后方可进行关键部分的操作,默认登录用户名:teacher ; 密码:666666,...

    考生考场分配算法

    在教育领域,尤其是在组织大规模考试时,如何公平、高效地分配考生到各个考场是一个重要的问题。考生考场分配算法就是为了解决这个问题而设计的一种优化策略。这个算法的主要目标是确保考试过程的公正性,减少作弊的...

Global site tag (gtag.js) - Google Analytics