课程设计自动排课系统.docx

上传人:b****8 文档编号:9115468 上传时间:2023-05-17 格式:DOCX 页数:18 大小:169.26KB
下载 相关 举报
课程设计自动排课系统.docx_第1页
第1页 / 共18页
课程设计自动排课系统.docx_第2页
第2页 / 共18页
课程设计自动排课系统.docx_第3页
第3页 / 共18页
课程设计自动排课系统.docx_第4页
第4页 / 共18页
课程设计自动排课系统.docx_第5页
第5页 / 共18页
课程设计自动排课系统.docx_第6页
第6页 / 共18页
课程设计自动排课系统.docx_第7页
第7页 / 共18页
课程设计自动排课系统.docx_第8页
第8页 / 共18页
课程设计自动排课系统.docx_第9页
第9页 / 共18页
课程设计自动排课系统.docx_第10页
第10页 / 共18页
课程设计自动排课系统.docx_第11页
第11页 / 共18页
课程设计自动排课系统.docx_第12页
第12页 / 共18页
课程设计自动排课系统.docx_第13页
第13页 / 共18页
课程设计自动排课系统.docx_第14页
第14页 / 共18页
课程设计自动排课系统.docx_第15页
第15页 / 共18页
课程设计自动排课系统.docx_第16页
第16页 / 共18页
课程设计自动排课系统.docx_第17页
第17页 / 共18页
课程设计自动排课系统.docx_第18页
第18页 / 共18页
亲,该文档总共18页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

课程设计自动排课系统.docx

《课程设计自动排课系统.docx》由会员分享,可在线阅读,更多相关《课程设计自动排课系统.docx(18页珍藏版)》请在冰点文库上搜索。

课程设计自动排课系统.docx

课程设计自动排课系统

2008~2009学年度《WEB程序设计》

课程设计

 

班级:

05网络3班

学号:

姓名:

周秋艳

 

2008年12月17日

基于WEB的高校教师排课系统

一、用户需求分析(10分)

学校教务的管理作为高校教育信息化工作中的一项重要工作,如何构建一个具有开放性、实用性和灵活性的平台,是一个值得探讨的课题。

其中,作为学校教务重点环节之一的排课系统也尤为重要。

先前,在统筹安排各班级上课的时间需要人工实现,而且经常会出现同时有多个班级要使用教室的冲突。

既耗时又耗精力,随着计算机技术的不断发展,计算机技术在各领域的充分完美应用,以学校的教务管理为该系统的应用背景,开发一个教室智能排课系统。

此系统开发主要包括后台数据库的建立和前端应用程序的开发两个方面。

系统采用VisualBasic6.0开发工具和SQLServer2000作为后台数据库开发的应用软件。

该系统实现上机时间的安排,课程的安排,教室的安排,以及它们之间的不冲突和资源的高效利用;这更切合学院教学需要,降低了排课管理工作的工作量和节省了时间,同时课程安排完成后,学院可迅速获得课表情况信息,为教学工作带来方便。

本系统界面友好,操作简单,使用方便。

二、系统总体设计(15分)

1.系统功能描述

1.1基本信息管理:

教师、教室、班级、课程、教学任务等数据的输入、编辑功能;

1.2数据处理:

自动排课、课表修改、删除功能;

1.3数据输出:

桌面查询教师、教室、班级课程表,报表打印教师、教室、班级课程表;

1.4帮助:

指导用户使用该系统及其他相关说明。

2系统功能设计

分析目前市场上流行的各种排课软件,它们都具有比较完善的功能,但在真正的排课算法上都会有些问题,因为排课算法最关键的问题是如何解决各式各样的冲突。

在做需求分析的过程中,通过调查得知目前排课人员对排课算法的主要要求有:

2.1怎样的合班组合能避免冲突?

 目前采取的方式是相同或相近的专业的班级组合。

2.2什么地方有空能排课?

 对教室和班级而言是查空,对教师而言是有无排课需求。

2.3有两个以上的空哪一个更好?

 是要考虑离散和平衡问题。

2.4排课前如何考虑教师宏观利用问题?

 例如:

多媒体大班课:

大学英语、高等数学尽量排在上午,

思想道德修养、马克思主义哲学原理等尽量排在下午。

 2.5对于数量巨大的信息,系统仍具有较快的响应速度和较小的系统开销。

三、系统功能模块分析(25分)

详细分析各功能模块之间的关系,以及各功能模块下的子模块构成。

1系统总体模块分析如下

各类基本信息1信息管理排课所需信息

已排课表信息

3输出排课

教师模块

登录模块注销模块

管理员模块

2登陆子模块分析如下

用户输入用户名,密码,并选择自己的角色

点击进入

用户succeedfailed

 

3管理员子模块分析如下

教师

班级

 

1.1添加教室

需添加信息

课程

1.3删除

详细信息教学任务

查询关键字

1.2查询学院

专业系别

教室类型

需删除信息

4教师子模块分析如下

查看自己被分配的课程

课程详细信息

5注销子模块分析如下

点击注销

返回到登录页面

四、数据库设计和建立(15分)

1、与前面功能模块的划分相一致的建立合理的关系数据库,详细说明各关系表的属性与描述(每张关系表适当添加说明)。

数据库名称是PK,此数据库包含10张关系表,它们分别是:

表1:

ChooseCourse

表2:

ClassInfo

表3:

CourseGeneral

表4:

Department

表5:

RoomInfo

表6:

Speciality

表7:

TermInfo

表8:

TimeInfo

表9:

Timetabel

表10:

UserInfo

2、建立数据库及表之间的关系图。

3、说明系统与数据库的连接方式。

此系统使用的数据库是SQLServer2000,连接数据库时用的方法是在系统配置文件Web.config中添加一连接字符串:

五、主要界面及相关代码分析(35分)

通过系统目标和数据分析创建好数据库后,接下来进行系统功能的开发和实现。

该系统流程图如图所示。

系统中采用的主要技术

1 用ASP.NET打开数据库的方法

ASP.NET程序中通过ADO.NET存取数据库的数据ADO.NET是以离线的数据为基础的,你可以在本地的机器上对数据集进行数据的添加、删除或修改,然后更新回真正的数据库。

具体实现过程为以下几步:

1.第一种方案

1)首先要导入名称空间

<%@Importnamespace="System"%>

<%@Importnamespace="System.Data"%>

<%@Importnamespace="System.Data.SqlClient"%>

2)建立与数据库的连接

SqlConnectionmyconnection;

myconnection=newSqlConnection("server=localhost;uid=sa;pwd=;database=数据库名称");

3)在此数据连接上,执行SQL语句,返回所需的数据集

Stringcmd="select*from数据表名称";

SqlDataAdaptermycommand=newSqlDataAdapter(cmd,myconnection);

DataSetds=newDataSet();

mycommand.Fill(ds,reg);

数据连接成功后,利用Sql的插入(INSERT)、删除(DELETE)和更新(UPDATE)命令就可以很方便地实现数据库的管理。

2.第二种方案

当然我们也可以通过配置web.config来实现

2 异常的捕获与控制

为了提高系统的交互性与运行的可靠性,系统对各类操作异常和运行异常进行捕获与控制。

操作异常是利用ASP.NET提供的几个验证控件和设置下拉框来实现的,如录入试题时必须先选择章节、知识点、题型,采用下拉框的形式确保试题属于某一知识点;运行异常捕获是使用try()…catch()的结构实现的。

如对数据库进行操作时,对用户输入的题目进行判断,若该题目存在,则提示数据已存在。

具体实现如下:

try

{mycommand.ExecuteNonQuery();

lblout.Text="插入成功";//插入成功

}

catch(SqlExceptionexc)

{if(exc.Number==2627)

lblout.Text="数据已存在";//数据已存在

else

lblout.Text="errornumberis:

"+exc.Number+exc.Message;//其它错误

}

其中lblout为一个label控件。

3 自动排课的算法分析

用户在自动排课时,可对排课提出多方面的要求,如从教师,教室,时间,课时数目等方面,同时满足多方面的要求并非易事;另外在数据量不是很大的时候要实现自动排课的成功率难度较大,因此排课的算法的优劣直接影响到所排课程的好坏,本系统采用随机排课方式,但是解决了排课算法中的冲突问题。

(排课的具体实现代码在界面与代码分析中)

4 排课算法冲突解决方法分析

排课算法中的主要的冲突是教室冲突和教室冲突。

我将再通过存储过程的来解决这样的冲突,下面介绍一学期16周,某一门课程32课时为例。

存储过程名为DetectArrangeCollision

CREATEPROCEDUREDetectArrangeCollision

@SureCourseIDint,

@RoomIDint,

@TimeIDint,

@TermIDint

as

declare@Arrange_idint

declare@UserIDchar(10)

select@UserID=ChooseCourse.UserIDfromTimetabelinnerjoin

ChooseCourseonTimetabel.SureCourseID=ChooseCourse.SureCourseID

whereChooseCourse.SureCourseID=@SureCourseID

select@Arrange_id=Arrange_idfromTimetabelwhere((RoomID

=@RoomIDandTimeID=@TimeID)or(Timetabel.SureCourseIDin(select

SureCourseIDfromChooseCoursewhereUserID=@UserID)

andTimeID=@TimeID))/*检查教室和教师冲突*/

if@Arrange_id<>null

begin

select*fromTimetabelwhereArrange_id=@Arrange_id/*查询出数据*/

end

else

begin

declare@currentIDint

select@currentID=count(*)

fromTimetabel

whereSureCourseID=@SureCourseIDandTermID=@TermID

if(@currentID<=0)/*查看数据库中是否有重复*/

insertintoTimetabelvalues(@TermID,@SureCourseID,@RoomID,@TimeID)

select*fromTimetabelwhereArrange_id=0

end

GO

1.登录界面login.aspx

publicstring[]UserLogin(stringUserName,stringpassword)

{String[]CheckLogin;intPermit=0;stringUserID="";

SqlParameter[]parameters={newSqlParameter("@UserName",SqlDbType.VarChar,50),

newSqlParameter("@UserPassword",SqlDbType.VarChar,50),

newSqlParameter("@UserID",SqlDbType.Char,10),

newSqlParameter("@result",SqlDbType.Char,10),

newSqlParameter("@Permit",SqlDbType.Int,4)};

parameters[0].Value=UserName;

parameters[1].Value=password;

parameters[2].Direction=ParameterDirection.Output;

parameters[3].Direction=ParameterDirection.Output;

parameters[4].Direction=ParameterDirection.Output;

introwsAffected;

RunProcedure("sp_UserLogin",parameters,outrowsAffected);

//result:

NoUser//success,ornouser,orpswerror,//Permit,如果角色还没分配怎么办

if(parameters[4].Value!

=DBNull.Value)

{Permit=Convert.ToInt32(parameters[4].Value);}

//设没有这个老师,2008.9.26

if(parameters[2].Value!

=DBNull.Value)

{UserID=Convert.ToString(parameters[2].Value);}

CheckLogin=newstring[]

{UserID,(String)(parameters[3].Value),Convert.ToString(Permit)};return(CheckLogin);}

2.自动排课界面

GenerateTimeTable.aspx

privatevoidPK_Click(objectsender,System.EventArgse)

{intj;intk;stringr;

con.Open();

SqlCommanddel=newSqlCommand("deleteTimetabelwhereTermID='"+Convert.ToInt32(ddl1.SelectedValue.ToString().Trim())+"'",con);

del.ExecuteNonQuery();//清空Timetabel表里面所有教师任课的信息

DataSetds=newDataSet();

SqlDataAdapterda=newSqlDataAdapter("SELECTCourseIDFROMCourseGeneral",con);

da.Fill(ds,"CourseID");

for(inti=0;i

{SqlCommandcoure=newSqlCommand("selectCourseName,PeriodfromCourseGeneralwhereCourseID='"+ds.Tables[0].Rows[i][0]+"'",con);

SqlDataReaderreader1=coure.ExecuteReader();

if(reader1.Read())

{stringcr=reader1.GetValue(0).ToString();

pr=reader1.GetValue

(1).ToString();}

reader1.Close();

if(int.Parse(pr)/16==2){

SqlCommandcmd=newSqlCommand("selectRoomIDfromRoomInfo",con);//调用存储过程,筛选出某门课程某个班级上

SqlDataReaderdr=cmd.ExecuteReader();

j=0;

k=0;

while(dr.Read()){

field1[j]=dr[0].ToString();

j++;}//获得该课程给定时间的每个可用场地,附值给数组field1[j]

dr.Close();

SqlCommandcmd1=newSqlCommand("SELECTSureCourseIDFROMChooseCoursewhereCourseIDin(selectCourseIDfromCourseGeneralwhereCourseGeneral.Period=32)",con);

SqlDataReaderdr1=cmd1.ExecuteReader();

while(dr1.Read()){

class1[k]=dr1[0].ToString();

k++;}//获得确定,附值给class1[k]

dr1.Close();

Randomrnd=newRandom();

for(intm=0;m<10;m++)//随即调换class1数组里面的成员{

intx=rnd.Next(j);//得0~k的随机数

r=field1[x];

field1[x]=field1[0];//第一个跟第x个调换

field1[0]=r;}

for(intn=0;n

SqlCommandcm=newSqlCommand("DetectArrangeCollision",con);

cm.CommandType=CommandType.StoredProcedure;

cm.Parameters.Add(newSqlParameter("@SureCourseID",SqlDbType.Int,4));

cm.Parameters.Add(newSqlParameter("@RoomID",SqlDbType.Int,4));

cm.Parameters.Add(newSqlParameter("@TimeID",SqlDbType.Int,4));

cm.Parameters.Add(newSqlParameter("@TermID",SqlDbType.Int,4));

cm.Parameters["@SureCourseID"].Value=Convert.ToInt32(class1[n]).ToString().Trim();

if(Convert.ToInt32(field1[n])!

=0){

cm.Parameters["@RoomID"].Value=Convert.ToInt32(field1[n]);}

else{

intn1=rnd.Next(j);

cm.Parameters["@RoomID"].Value=Convert.ToInt32(field1[n1]);}

cm.Parameters["@TimeID"].Value=rnd.Next(24)+1;

cm.Parameters["@TermID"].Value=Convert.ToInt32(ddl1.SelectedValue.ToString().Trim());

cm.ExecuteNonQuery();}}

elseif(int.Parse(pr)==64)

{SqlCommandcmd=newSqlCommand("selectRoomIDfromRoomInfo",con);//调用存储过程,筛选出某门课程某个班级上

SqlDataReaderdr=cmd.ExecuteReader();

j=0;k=0;

while(dr.Read())

{field1[j]=dr[0].ToString();

j++;}//获得该课程给定时间的每个可用场地,附值给数组field1[j]

dr.Close();

SqlCommandcmd1=newSqlCommand("SELECTSureCourseIDFROMChooseCoursewhereCourseIDin(selectCourseIDfromCourseGeneralwhereCourseGeneral.Period=64)",con);

SqlDataReaderdr1=cmd1.ExecuteReader();

while(dr1.Read())

{class1[k]=dr1[0].ToString();

k++;}//获得确定,附值给class1[k]

dr1.Close();

Randomrnd=newRandom();

for(intm=0;m<10;m++)//随即调换class1数组里面的成员

{intx=rnd.Next(j);//得0~k的随机数

r=field1[x];

field1[x]=field1[0];//第一个跟第x个调换

field1[0]=r;}

for(intq=0;q

{for(intn=0;n

SqlCommandcm=newSqlCommand("DetectArrangeCollision1",con);

cm.CommandType=CommandType.StoredProcedure;

cm.Parameters.Add(newSqlParameter("@SureCourseID",SqlDbType.Int,4));

cm.Parameters.Add(newSqlParameter("@RoomID",SqlDbType.Int,4));

cm.Parameters.Add(newSqlParameter("@TimeID",SqlDbType.Int,4));

cm.Parameters.Add(newSqlParameter("@TermID",SqlDbType.Int,4));

cm.Parameters["@SureCourseID"].Value=Convert.ToInt32(class1[n]).ToString().Trim();

if(Convert.ToInt32(field1[n])!

=0)

{intz=rnd.Next(j);

cm.Parameters["@RoomID"].Value=Convert.ToInt32(field1[z]);}

else{

intn1=rnd.Next(j);

cm.Parameters["@RoomID"].Value=Convert.ToInt32(field1[n1]);}

cm.Parameters["@TimeID"].Value=rnd.Next(24)+1;

cm.Parameters["@TermID"].Value=Convert.ToInt32(ddl1.SelectedValue.ToString().Trim());

cm.ExecuteNonQuery();}}}}

Response.Write("");

con.Close();}

 

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 经管营销 > 经济市场

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2