高校自动排课系统.docx

上传人:b****8 文档编号:9943155 上传时间:2023-05-22 格式:DOCX 页数:18 大小:21.46KB
下载 相关 举报
高校自动排课系统.docx_第1页
第1页 / 共18页
高校自动排课系统.docx_第2页
第2页 / 共18页
高校自动排课系统.docx_第3页
第3页 / 共18页
高校自动排课系统.docx_第4页
第4页 / 共18页
高校自动排课系统.docx_第5页
第5页 / 共18页
高校自动排课系统.docx_第6页
第6页 / 共18页
高校自动排课系统.docx_第7页
第7页 / 共18页
高校自动排课系统.docx_第8页
第8页 / 共18页
高校自动排课系统.docx_第9页
第9页 / 共18页
高校自动排课系统.docx_第10页
第10页 / 共18页
高校自动排课系统.docx_第11页
第11页 / 共18页
高校自动排课系统.docx_第12页
第12页 / 共18页
高校自动排课系统.docx_第13页
第13页 / 共18页
高校自动排课系统.docx_第14页
第14页 / 共18页
高校自动排课系统.docx_第15页
第15页 / 共18页
高校自动排课系统.docx_第16页
第16页 / 共18页
高校自动排课系统.docx_第17页
第17页 / 共18页
高校自动排课系统.docx_第18页
第18页 / 共18页
亲,该文档总共18页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

高校自动排课系统.docx

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

高校自动排课系统.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〈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〉teachers;//教师数组

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;

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

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

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

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

当前位置:首页 > IT计算机 > 电脑基础知识

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2