课程设计自动排课系统Word文档格式.docx
- 文档编号:5256261
- 上传时间:2023-05-04
- 格式:DOCX
- 页数:16
- 大小:119.71KB
课程设计自动排课系统Word文档格式.docx
《课程设计自动排课系统Word文档格式.docx》由会员分享,可在线阅读,更多相关《课程设计自动排课系统Word文档格式.docx(16页珍藏版)》请在冰点文库上搜索。
目前采取的方式是相同或相近的专业的班级组合。
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中添加一连接字符串:
<
addkey="
dsn"
value="
server=(local);
database=Paike;
UserID=sa;
password=123;
MaxPoolSize=1000"
/>
五、主要界面及相关代码分析(35分)
通过系统目标和数据分析创建好数据库后,接下来进行系统功能的开发和实现。
该系统流程图如图所示。
系统中采用的主要技术
1 用ASP.NET打开数据库的方法
ASP.NET程序中通过ADO.NET存取数据库的数据ADO.NET是以离线的数据为基础的,你可以在本地的机器上对数据集进行数据的添加、删除或修改,然后更新回真正的数据库。
具体实现过程为以下几步:
1.第一种方案
1)首先要导入名称空间
<
%@Importnamespace="
System"
%>
System.Data"
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来实现
value="
DataSource=(local);
UID=sa;
PWD=jianglian;
DATABASE=tkxt"
/>
2 异常的捕获与控制
为了提高系统的交互性与运行的可靠性,系统对各类操作异常和运行异常进行捕获与控制。
操作异常是利用ASP.NET提供的几个验证控件和设置下拉框来实现的,如录入试题时必须先选择章节、知识点、题型,采用下拉框的形式确保试题属于某一知识点;
运行异常捕获是使用try()…catch()的结构实现的。
如对数据库进行操作时,对用户输入的题目进行判断,若该题目存在,则提示数据已存在。
具体实现如下:
try
{mycommand.ExecuteNonQuery();
lblout.Text="
插入成功"
//插入成功
}
catch(SqlExceptionexc)
{if(exc.Number==2627)
数据已存在"
//数据已存在
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
GO
1.登录界面login.aspx
publicstring[]UserLogin(stringUserName,stringpassword)
{String[]CheckLogin;
intPermit=0;
stringUserID="
SqlParameter[]parameters={newSqlParameter("
@UserName"
SqlDbType.VarChar,50),
newSqlParameter("
@UserPassword"
@UserID"
SqlDbType.Char,10),
@result"
@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!
{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<
ds.Tables[0].Rows.Count;
i++)
{SqlCommandcoure=newSqlCommand("
selectCourseName,PeriodfromCourseGeneralwhereCourseID='
+ds.Tables[0].Rows[i][0]+"
"
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"
//调用存储过程,筛选出某门课程某个班级上
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)"
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<
k;
n++)//下面为更新插入数据库的操作{
SqlCommandcm=newSqlCommand("
DetectArrangeCollision"
cm.CommandType=CommandType.StoredProcedure;
cm.Parameters.Add(newSqlParameter("
@SureCourseID"
SqlDbType.Int,4));
@RoomID"
@TimeID"
@TermID"
cm.Parameters["
].Value=Convert.ToInt32(class1[n]).ToString().Trim();
if(Convert.ToInt32(field1[n])!
=0){
].Value=Convert.ToInt32(field1[n]);
else{
intn1=rnd.Next(j);
].Value=Convert.ToInt32(field1[n1]);
].Value=rnd.Next(24)+1;
].Value=Convert.ToInt32(ddl1.SelectedValue.ToString().Trim());
cm.ExecuteNonQuery();
}}
elseif(int.Parse(pr)==64)
{SqlCommandcmd=newSqlCommand("
while(dr.Read())
{field1[j]=dr[0].ToString();
SELECTSureCourseIDFROMChooseCoursewhereCourseIDin(selectCourseIDfromCourseGeneralwhereCourseGeneral.Period=64)"
while(dr1.Read())
{class1[k]=dr1[0].ToString();
m++)//随即调换class1数组里面的成员
{intx=rnd.Next(j);
for(intq=0;
q<
q++)//下面为更新插入数据库的操作
{for(intn=0;
n++){
DetectArrangeCollision1"
=0)
{intz=rnd.Next(j);
].Value=Convert.ToInt32(field1[z]);
}}}}
Response.Write("
script>
alert('
排课完毕!
)<
/script>
con.Close();
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 课程设计 自动 系统