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

上传人:b****5 文档编号:11773194 上传时间:2023-04-01 格式:DOCX 页数:16 大小:119.38KB
下载 相关 举报
课程设计自动排课系统.docx_第1页
第1页 / 共16页
课程设计自动排课系统.docx_第2页
第2页 / 共16页
课程设计自动排课系统.docx_第3页
第3页 / 共16页
课程设计自动排课系统.docx_第4页
第4页 / 共16页
课程设计自动排课系统.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

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

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

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

课程设计自动排课系统

2020~2020学年度《WEB程序设计》

课程设计

 

班级:

05网络3班

学号:

090205338

姓名:

周秋艳

 

2020年12月17日

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

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

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

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

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

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

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

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

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

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

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

1.1大体信息治理:

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

1.2数据处置:

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

1.3数据输出:

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

1.4帮忙:

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

2系统功能设计

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

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

2.1如何的合班组合能幸免冲突?

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

2.2什么地址有空能排课?

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

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

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

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

 例如:

多媒体大班课:

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

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

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

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

详细分析各功能模块之间的关系,和各功能模块下的子模块组成。

1系统整体模块分析如下

2排课

各类大体信息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程序中通过ADO.NET存取数据库的数据ADO.NET是以离线的数据为基础的,你能够在本地的机械上对数据集进行数据的添加、删除或修改,然后更新回真正的数据库。

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

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 异样的捕捉与操纵

为了提高系统的交互性与运行的靠得住性,系统对各类操作异样和运行异样进行捕捉与操纵。

操作异样是利用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

whereChooseCourse.SureCourseID=@SureCourseID

select@Arrange_id=Arrange_idfromTimetabelwhere((RoomID=@RoomIDandTimeID=@TimeID)or(Timetabel.SureCourseIDin(selectSureCourseIDfromChooseCoursewhereUserID=@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;

tput;

parameters[4].Direction=ParameterDirection.Output;

introwsAffected;

RunProcedure("sp_UserLogin",parameters,outrowsAffected);

//result:

NoUser//success,ornouser,orpswerror,//Permit,若是角色还没分派如何办

ife)

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

//设没有那个教师

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.自动排课界面

GenerateTimeTabl

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-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1