高校自动排课系统Word格式文档下载.docx
- 文档编号:19583466
- 上传时间:2023-01-08
- 格式:DOCX
- 页数:14
- 大小:18.25KB
高校自动排课系统Word格式文档下载.docx
《高校自动排课系统Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《高校自动排课系统Word格式文档下载.docx(14页珍藏版)》请在冰豆网上搜索。
structschedule{
stringgrade_special;
//年级专业
stringcourse;
//课程名称
stringteacher;
//任课教师
stringtotal_hour;
//总学时
stringteach_hour;
//讲课学时
stringexperiment_hour;
//实验学时
stringpractice_hour;
//课程实践学时
stringcredit;
//学分
stringweek_hour;
//周学时
stringstart_stop;
//起止周
stringspeciality_orientation;
//专业方向
stringperson_num;
//人数
};
//排课任务的数据结构
structarrange{
arrange(stringgs,stringc,stringt,intct=-1):
grade_special(gs),course(c),teacher(t),classroom_time(ct){}
//stringclassroom;
//上课地点
//stringtime;
//上课时间
intclassroom_time;
//上课地点、时间
//教师倒排表数据结构,通过教师姓名找到该教师的排课情况
structteacher_inverted{
teacher_inverted(stringtea,intcl=-1,intar=-1):
teacher(tea),class_loc(cl),arrange_loc(ar){}
intclass_loc;
intarrange_loc;
//教室倒排表数据结构,通过教室名称查找该教室的排课情况
structclassroom_inverted{
classroom_inverted(stringcr,intcl=-1,intar=-1):
classroom(cr),class_loc(cl),arrange_loc(ar){}
stringclassroom;
intmain(intargc,char**argv){
if(argc!
=3){
cout<
<
"
程序调用格式错误!
\n调用格式:
csp排课计划文件可用教室文件\n"
;
return0;
}
ifstreaminfile(argv[1]);
vector<
schedule>
plan;
strings;
getline(infile,s);
while(getline(infile,s)){
schedulesch;
istringstreamrecord(s);
record>
>
sch.grade_special>
sch.course>
sch.teacher>
sch.total_hour>
sch.teach_hour
>
sch.experiment_hour>
sch.practice_hour>
sch.credit>
sch.week_hour>
sch.start_stop
sch.speciality_orientation>
sch.person_num;
plan.push_back(sch);
infile.close();
vector<
arrange>
arranges;
//整个系的排课安排
arr;
//一个班的排课安排
stringgs("
"
);
//教学班级
for(autoit=plan.begin();
it!
=plan.end();
++it){
if(gs!
=it->
grade_special){
if(!
arr.empty()){
arranges.push_back(arr);
//教学计划按教学班级顺序排列
arr.clear();
}
gs=it->
grade_special;
}
arr.push_back(arrange(it->
grade_special,it->
course,it->
teacher));
arranges.push_back(arr);
teacher_inverted>
teachers;
//教师数组
for(unsignedi=0;
i<
arranges.size();
++i){
for(unsignedj=0;
j<
arranges[i].size();
++j){
stringtea=arranges[i][j].teacher;
if(tea=="
未定"
)continue;
unsignedk=0;
for(;
k<
teachers.size();
++k){
if(teachers[k][0].teacher==tea){
teachers[k].push_back(teacher_inverted(tea,i,j));
break;
}
if(k==teachers.size()){
vector<
ti;
//一个教师的排课信息倒排表
ti.push_back(teacher_inverted(tea,i,j));
teachers.push_back(ti);
constintN=256;
bitset<
N>
ct;
//教室时段的分配状况
infile.open(argv[2]);
classrooms;
//教室数组
classrooms.push_back(s);
unsignedarrange_num=plan.size();
//待排课数目
unsignedclass_num=arranges.size();
//教学班级数目
unsignedclassroom_num=classrooms.size();
//教室数目
uniform_int_distribution<
unsigned>
u(0,classroom_num*20-1);
//为教室时段分配随机数
default_random_enginee(time(0));
class_loc(class_num,0);
//教学班级已分配状况
unsignedclass_cur=0;
//待分配的教学班级序号,轮流为每个班级排课,一次安排一个班的一门课
for(unsignedn=0;
n<
arrange_num;
++n){
unsignedk=u(e);
//如果某个班级的排课任务已经分配完成,则选择下一个班级继续排课
while(class_loc[class_cur]==arranges[class_cur].size()){
class_cur=(class_cur+1)%class_num;
//找到待排课任务的对应教师
stringtea=arranges[class_cur][class_loc[class_cur]].teacher;
unsignedi=0;
for(;
if(tea==teachers[i][0].teacher)break;
//找出与该教师无时间冲突的时段
do{
do{
while(ct.test(k)){k=(k+1)%(classroom_num*20);
unsignedm=0;
for(;
m<
class_loc[class_cur];
++m){
if(arranges[class_cur][m].classroom_time%20==k%20)break;
if(m==class_loc[class_cur])break;
//如果与前面已安排的该班级时间无冲突,则k可用
k=(k+1)%(classroom_num*20);
//如果有冲突则检查下一个教室时段是否可用
}while
(1);
if(i==teachers.size())break;
//教师未定
unsignedj=0;
teachers[i].size();
intm=arranges[teachers[i][j].class_loc][teachers[i][j].arrange_loc].classroom_time;
if(m!
=-1&
&
(m%20==k%20))break;
if(j==teachers[i].size())break;
//如果与该教师的时间无冲突,则k可用
k=(k+1)%(classroom_num*20);
}while
(1);
//排课
arranges[class_cur][class_loc[class_cur]].classroom_time=k;
ct.set(k);
//将当前班级的排课号+1
++class_loc[class_cur];
//将待排课班级号+1
class_cur=(class_cur+1)%class_num;
loop:
//输出
cout<
\t\t高校自动排课系统\n"
选择查询条件:
1.按班级2.按教师3.按教室\n"
请输入查询序号:
(输入-1退出系统)"
unsignedchoice=0;
cin>
choice;
if(-1==choice){
正常退出系统\n"
elseif(1==choice){
unsignedi=0,j=0;
cout<
."
<
arranges[i][0].grade_special<
\t"
if((i+1)%4==0)cout<
\n"
\n请输入待查询班级的序号:
(输入-1结束查询)"
cin>
i;
if(i==-1){
break;
elseif(i>
=arranges.size()){
cout<
非法选择\n"
continue;
intclass_table[4][5];
for(unsignedm=0;
4;
++m)
for(unsignedn=0;
5;
++n)
class_table[m][n]=-1;
for(j=0;
unsignedm=arranges[i][j].classroom_time%20;
class_table[m/5][m%5]=j;
stringtime_slot[4]={"
8:
00-9:
40"
"
10:
00-11:
14:
00-15:
16:
00-17:
};
setiosflags(ios_base:
:
left);
setw(54)<
班级课程表\n"
====================================================================================================================================\n"
setw(12)<
setw(24)<
星期一"
星期二"
星期三"
星期四"
星期五"
if(m%2==0)
cout<
else
------------------------------------------------------------------------------------------------------------------------------------\n"
for(unsignedm1=0;
m1<
3;
++m1){
if(m1==1)
cout<
time_slot[m];
else
for(unsignedn=0;
if(class_table[m][n]!
=-1){
j=class_table[m][n];
if(m1==0)
cout<
arranges[i][j].course;
elseif(m1==1)
classrooms[arranges[i][j].classroom_time/20];
else
arranges[i][j].teacher;
}
else
cout<
}
resetiosflags(ios_base:
elseif(2==choice){
teachers[i][0].teacher<
\n请输入待查询教师的序号:
=teachers.size()){
unsignedm=arranges[teachers[i][j].class_loc][teachers[i][j].arrange_loc].classroom_time/20;
老师课程表\n"
arranges[teachers[i][j].class_loc][teachers[i][j].arrange_loc].course;
classrooms[arranges[teachers[i][j].class_loc][teachers[i][j].arrange_loc].classroom_time/20];
arranges[teac
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 高校 自动 系统