高校自动排课系统.docx
- 文档编号:23928227
- 上传时间:2023-05-22
- 格式:DOCX
- 页数:18
- 大小:21.46KB
高校自动排课系统.docx
《高校自动排课系统.docx》由会员分享,可在线阅读,更多相关《高校自动排课系统.docx(18页珍藏版)》请在冰豆网上搜索。
高校自动排课系统
//简化版高校自动排课系统
//排课任务简化后包含:
年级专业(教学班级,如计科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〈vector> #include #include〈random〉 #include〈iomanip〉 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]); 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 vector〈arrange〉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); vector〈vector for(unsignedi=0;i size();++i){ for(unsignedj=0;j stringtea=arranges[i][j].teacher; if(tea==”未定”)continue; unsignedk=0; for(;k size();++k){ if(teachers[k][0]。 teacher==tea){ teachers[k]。 push_back(teacher_inverted(tea,i,j)); break; } } if(k==teachers。 size()){ vector〈teacher_inverted〉ti;//一个教师的排课信息倒排表 ti。 push_back(teacher_inverted(tea,i,j)); teachers。 push_back(ti); } } } constintN=256; bitset infile。 open(argv[2]);; vector〈string>classrooms;//教室数组 while(getline(infile,s)){ classrooms.push_back(s); } infile.close(); unsignedarrange_num=plan。 size();//待排课数目 unsignedclass_num=arranges。 size();//教学班级数目 unsignedclassroom_num=classrooms。 size();//教室数目 uniform_int_distribution default_random_enginee(time(0)); vector 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(;i〈teachers.size();++i){ 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; for(;j size();++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〈arranges。 size();++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〈arranges[i].size();++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< grade_special<<”班级课程表\n"; 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〈〈setw(24)<〈arranges[i][j]。 course; elseif(m1==1) cout< classroom_time/20]; else cout〈 teacher; } else cout〈 } cout<〈”\n"; } } cout〈<"====================================================================================================================================\n"; cout〈 : left); }while (1); } elseif(2==choice){ unsignedi=0,j=0; for(;i size();++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〈teachers[i].size();++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<〈setw(54)〈<""<〈teachers[i][0]。 teacher<〈"老师课程表\n”; 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<〈setw(24)<〈arranges[teachers[i][j]。 class_loc][teachers[i][j].arrange_loc].course; elseif(m1==1) cout〈〈setw(24)<〈classrooms[arranges[teachers[i][j].class_loc][teachers[i][j].arrange_loc]。 classroom_time/20]; else cout<
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 高校 自动 系统
![提示](https://static.bdocx.com/images/bang_tan.gif)