高校自动排课系统.docx

上传人:b****3 文档编号:4752215 上传时间:2022-12-08 格式:DOCX 页数:14 大小:18.48KB
下载 相关 举报
高校自动排课系统.docx_第1页
第1页 / 共14页
高校自动排课系统.docx_第2页
第2页 / 共14页
高校自动排课系统.docx_第3页
第3页 / 共14页
高校自动排课系统.docx_第4页
第4页 / 共14页
高校自动排课系统.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

高校自动排课系统.docx

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

高校自动排课系统.docx

高校自动排课系统

//简化版高校自动排课系统

//排课任务简化后包含:

年级专业(教学班级,如计科13)、课程名称、任课教师、上课地点和时间

//教学班级简化为不分人数,不分专业方向。

//上课教室简化为不分理论课、实验课,不分教室容纳人数,不分是否多媒体。

//上课时段简化为:

一周五天,周一到周五,白天上课,上午四节,下午四节,

//1~2(8:

00~9:

400)、3~4(10:

00~11:

40)、5~6(14:

00~15:

40)、7~8(16:

00~17:

40)

//为了便于处理,将五天的所有上课时段用数字0~19表示

//上课地点和时间组合成一个整数数组(位集,bitset),每20个为1组为一个教室的上课时段安排

//约束条件:

1、教学班级的上课时间不能冲突

//2、每个教室不能同时安排多个教学班级上课

//3、任课教师的上课时间不能冲突

//

#include

#include

#include

#include

#include

#include

#include

#include

usingnamespacestd;

//原始数据文件中的每一行数据的数据结构

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){}

stringgrade_special;//年级专业

stringcourse;//课程名称

stringteacher;//任课教师

//stringclassroom;//上课地点

//stringtime;//上课时间

intclassroom_time;//上课地点、时间

};

//教师倒排表数据结构,通过教师找到该教师的排课情况

structteacher_inverted{

teacher_inverted(stringtea,intcl=-1,intar=-1):

teacher(tea),class_loc(cl),arrange_loc(ar){}

stringteacher;

intclass_loc;

intarrange_loc;

};

//教室倒排表数据结构,通过教室名称查找该教室的排课情况

structclassroom_inverted{

classroom_inverted(stringcr,intcl=-1,intar=-1):

classroom(cr),class_loc(cl),arrange_loc(ar){}

stringclassroom;

intclass_loc;

intarrange_loc;

};

intmain(intargc,char**argv){

if(argc!

=3){

cout<<"程序调用格式错误!

\n调用格式:

csp排课计划文件可用教室文件\n";

return0;

}

ifstreaminfile(argv[1]);

vectorplan;

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>arranges;//整个系的排课安排

vectorarr;//一个班的排课安排

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);

vector>teachers;//教师数组

for(unsignedi=0;i

for(unsignedj=0;j

stringtea=arranges[i][j].teacher;

if(tea=="未定")continue;

unsignedk=0;

for(;k

if(teachers[k][0].teacher==tea){

teachers[k].push_back(teacher_inverted(tea,i,j));

break;

}

}

if(k==teachers.size()){

vectorti;//一个教师的排课信息倒排表

ti.push_back(teacher_inverted(tea,i,j));

teachers.push_back(ti);

}

}

}

constintN=256;

bitsetct;//教室时段的分配状况

infile.open(argv[2]);;

vectorclassrooms;//教室数组

while(getline(infile,s)){

classrooms.push_back(s);

}

infile.close();

unsignedarrange_num=plan.size();//待排课数目

unsignedclass_num=arranges.size();//教学班级数目

unsignedclassroom_num=classrooms.size();//教室数目

uniform_int_distributionu(0,classroom_num*20-1);//为教室时段分配随机数

default_random_enginee(time(0));

vectorclass_loc(class_num,0);//教学班级已分配状况

unsignedclass_cur=0;//待分配的教学班级序号,轮流为每个班级排课,一次安排一个班的一门课

for(unsignedn=0;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(;i

if(tea==teachers[i][0].teacher)break;

}

//找出与该教师无时间冲突的时段

do{

do{

while(ct.test(k)){k=(k+1)%(classroom_num*20);}

unsignedm=0;

for(;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;

for(;j

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";

cout<<"选择查询条件:

1.按班级2.按教师3.按教室\n";

cout<<"请输入查询序号:

(输入-1退出系统)";

unsignedchoice=0;

cin>>choice;

if(-1==choice){

cout<<"正常退出系统\n";

return0;

}

elseif(1==choice){

unsignedi=0,j=0;

for(;i

cout<

if((i+1)%4==0)cout<<"\n";

}

cout<<"\n";

do{

cout<<"\n请输入待查询班级的序号:

(输入-1结束查询)";

cin>>i;

if(i==-1){

break;

}

elseif(i>=arranges.size()){

cout<<"非法选择\n";

continue;

}

intclass_table[4][5];

for(unsignedm=0;m<4;++m)

for(unsignedn=0;n<5;++n)

class_table[m][n]=-1;

for(j=0;j

unsignedm=arranges[i][j].classroom_time%20;

class_table[m/5][m%5]=j;

}

stringtime_slot[4]={"8:

00-9:

40","10:

00-11:

40","14:

00-15:

40","16:

00-17:

40"};

cout<

:

left);

cout<

cout<<"====================================================================================================================================\n";

cout<

for(unsignedm=0;m<4;++m){

if(m%2==0)

cout<<"====================================================================================================================================\n";

else

cout<<"------------------------------------------------------------------------------------------------------------------------------------\n";

for(unsignedm1=0;m1<3;++m1){

if(m1==1)

cout<

else

cout<

for(unsignedn=0;n<5;++n){

if(class_table[m][n]!

=-1){

j=class_table[m][n];

if(m1==0)

cout<

elseif(m1==1)

cout<

else

cout<

}

else

cout<

}

cout<<"\n";

}

}

cout<<"====================================================================================================================================\n";

cout<

:

left);

}while

(1);

}

elseif(2==choice){

unsignedi=0,j=0;

for(;i

cout<

if((i+1)%4==0)cout<<"\n";

}

cout<<"\n";

do{

cout<<"\n请输入待查询教师的序号:

(输入-1结束查询)";

cin>>i;

if(i==-1){

break;

}

elseif(i>=teachers.size()){

cout<<"非法选择\n";

continue;

}

intclass_table[4][5];

for(unsignedm=0;m<4;++m)

for(unsignedn=0;n<5;++n)

class_table[m][n]=-1;

for(j=0;j

unsignedm=arranges[teachers[i][j].class_loc][teachers[i][j].arrange_loc].classroom_time/20;

class_table[m/5][m%5]=j;

}

stringtime_slot[4]={"8:

00-9:

40","10:

00-11:

40","14:

00-15:

40","16:

00-17:

40"};

cout<

:

left);

cout<

cout<<"====================================================================================================================================\n";

cout<

for(unsignedm=0;m<4;++m){

if(m%2==0)

cout<<"====================================================================================================================================\n";

else

cout<<"------------------------------------------------------------------------------------------------------------------------------------\n";

for(unsignedm1=0;m1<3;++m1){

if(m1==1)

cout<

else

cout<

for(unsignedn=0;n<5;++n){

if(class_table[m][n]!

=-1){

j=class_table[m][n];

if(m1==0)

cout<

elseif(m1==1)

cout<

else

cout<

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

当前位置:首页 > 法律文书 > 调解书

copyright@ 2008-2022 冰豆网网站版权所有

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