高校自动排课系统.docx

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

高校自动排课系统.docx

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

高校自动排课系统.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<iostream>

#include<fstream>

#include 

#include

#include

#include<bitset〉

#include 〈random〉

#include<iomanip>

usingnamespacestd;

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

structschedule {

stringgrade_special;//年级专业

ﻩstringcourse;//课程名称

string teacher;//任课教师

stringtotal_hour; //总学时

ﻩstringteach_hour;//讲课学时

ﻩstring experiment_hour;//实验学时

ﻩstringpractice_hour; //课程实践学时

stringcredit;//学分

ﻩstringweek_hour;//周学时

stringstart_stop;//起止周

ﻩstring speciality_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;//上课地点、时间

};

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

struct teacher_inverted{

ﻩteacher_inverted(string tea,int cl= -1,intar=-1) :

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

ﻩstringteacher;

ﻩintclass_loc;

ﻩintarrange_loc;

};

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

structclassroom_inverted{

classroom_inverted(string cr,intcl =-1,int ar = -1) :

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

string classroom;

ﻩintclass_loc;

intarrange_loc;

};

intmain(intargc,char**argv){

if(argc!

=3) {

ﻩcout〈〈”程序调用格式错误!

\n调用格式:

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

ﻩreturn0;

ﻩ}

ﻩifstream infile(argv[1]);

ﻩvector

ﻩstrings;

ﻩgetline(infile,s);

while(getline(infile,s)) {

ﻩschedulesch;

istringstream record(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();

vectorarranges; //整个系的排课安排

ﻩvector<arrange>arr;//一个班的排课安排

string gs("”);//教学班级

ﻩ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〈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()) {

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

ﻩﻩti。

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

ﻩﻩﻩteachers。

push_back(ti);

ﻩ}

ﻩ}

ﻩ}

constintN=256;

bitset〈N〉ct;//教室时段的分配状况

ﻩinfile。

open(argv[2]);;

ﻩvector<string〉classrooms;//教室数组

while (getline(infile,s)){

ﻩﻩclassrooms.push_back(s);

ﻩ}

ﻩinfile.close();

ﻩunsigned arrange_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));

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

ﻩﻩunsigned m = 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< teachers[i]。

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退出系统)";

ﻩunsigned choice=0;

cin〉〉choice;

if(-1 == choice){

ﻩcout 〈〈"正常退出系统\n”;

return 0;

}

ﻩelse if(1 == choice) {

unsigned i =0,j=0;

for (;i〈arranges.size();++i){

ﻩcout<< i〈<”。

 "<< arranges[i][0].grade_special<〈 ”\t”;

ﻩﻩif ((i+1)%4==0)cout〈〈"\n”;

ﻩcout〈〈”\n";

ﻩdo {

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

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

ﻩﻩcin>> i;

ﻩif (i==-1) {

ﻩﻩbreak;

ﻩ}

ﻩﻩelse if(i〉=arranges.size()) {

ﻩcout<〈 ”非法选择\n”;

ﻩcontinue;

ﻩ}

ﻩintclass_table[4][5];

ﻩfor(unsignedm=0;m 〈4;++m)

for(unsigned n=0;n〈5; ++n)

ﻩﻩclass_table[m][n]=-1;

ﻩfor(j =0;j

size();++j) {

ﻩﻩunsigned m= arranges[i][j]。

classroom_time%20;

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

ﻩﻩﻩ}

ﻩﻩstring time_slot[4]={ ”8:

00-9:

40","10:

00-11:

40",”14:

00—15:

40”,"16:

00-17:

40”};

ﻩﻩcout<〈setiosflags(ios_base:

left);

ﻩﻩﻩcout <<setw(54)<< ” "〈〈 arranges[i][0].grade_special〈<"班级课程表\n";

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

ﻩﻩcout〈〈setw(12) <〈""<<setw(24)〈<”星期一”〈〈setw(24)〈〈"星期二”<<setw(24)<〈 ”星期三”〈<setw(24) 〈〈"星期四"〈〈setw(24)<<"星期五"〈〈"\n";

ﻩﻩ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<<setw(12) << time_slot[m];

ﻩﻩﻩﻩelse

ﻩﻩﻩﻩcout<〈setw(12)〈<”";

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

ﻩﻩif (class_table[m][n]!

=-1) {

ﻩﻩﻩﻩﻩﻩj =class_table[m][n];

if(m1== 0)

ﻩﻩcout<〈 setw(24)<

course;

ﻩﻩﻩﻩelseif(m1==1)

ﻩﻩﻩcout〈〈setw(24) 〈〈classrooms[arranges[i][j]。

classroom_time/20];

ﻩﻩﻩﻩﻩﻩﻩelse

ﻩﻩﻩﻩﻩﻩﻩcout〈

ﻩ}

ﻩﻩﻩﻩelse

ﻩﻩﻩﻩcout 〈

ﻩﻩ}

ﻩﻩcout<<”\n”;

ﻩﻩ}

ﻩ}

ﻩﻩcout〈<"====================================================================================================================================\n”;

ﻩﻩcout〈〈resetiosflags(ios_base:

left);

ﻩ}while

(1);

ﻩ}

ﻩelseif(2 == choice) {

ﻩﻩunsignedi= 0,j= 0;

for(;i<teachers。

size();++i){

ﻩcout 〈〈i<〈 ”。

 ” <<teachers[i][0].teacher<<”\t";

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

ﻩ}

cout<<”\n”;

ﻩﻩdo{

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

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

ﻩcin>〉i;

if(i==—1){

ﻩbreak;

ﻩ}

ﻩelse if(i〉=teachers.size()){

ﻩﻩcout〈〈"非法选择\n";

ﻩﻩﻩcontinue;

ﻩﻩ}

ﻩﻩintclass_table[4][5];

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

ﻩﻩfor (unsigned n=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<< setiosflags(ios_base:

:

left);

ﻩcout<〈setw(54) 〈〈""<〈 teachers[i][0]。

teacher〈<”老师课程表\n”;

cout〈〈 ”====================================================================================================================================\n";

ﻩcout<〈 setw(12)〈<”" 〈< setw(24)〈〈 ”星期一"<

ﻩﻩ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〈< setw(12)<〈””;

ﻩﻩﻩ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〈

class_loc][teachers[i][j]。

arrange_loc]。

classroom_time/20];

ﻩﻩelse

ﻩﻩﻩﻩﻩﻩcout<〈setw(24)<

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

当前位置:首页 > 高中教育 > 高考

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

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