高校自动排课系统
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
//简化版高校自动排课系统
//排课任务简化后包含:年级专业(教学班级,如计科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
using namespace std;
//原始数据文件中的每一行数据的数据结构
struct schedule {
string grade_special; //年级专业
string course; //课程名称
string teacher; //任课教师
string total_hour; //总学时
string teach_hour; //讲课学时
string experiment_hour; //实验学时
string practice_hour; //课程实践学时
string credit; //学分
string week_hour; //周学时
string start_stop; //起止周
string speciality_orientation; //专业方向
string person_num; //人数
};
//排课任务的数据结构
struct arrange {
arrange(string gs, string c, string t, int ct = -1) : grade_special(gs), course(c), teacher(t),
classroom_time(ct) {}
string grade_special;//年级专业
string course;//课程名称
string teacher;//任课教师
//string classroom;//上课地点
//string time;//上课时间
int classroom_time;//上课地点、时间
};
//教师倒排表数据结构,通过教师姓名找到该教师的排课情况
struct teacher_inverted {
teacher_inverted(string tea, int cl = -1, int ar = -1) : teacher(tea), class_loc(cl), arrange_loc(ar) {}
string teacher;
int class_loc;
int arrange_loc;
};
//教室倒排表数据结构,通过教室名称查找该教室的排课情况
struct classroom_inverted {
classroom_inverted(string cr, int cl = -1, int ar = -1) : classroom(cr), class_loc(cl), arrange_loc(ar) {}
string classroom;
int class_loc;
int arrange_loc;
};
int main(int argc, char** argv) {
if (argc != 3) {
cout << "程序调用格式错误!\n调用格式:csp 排课计划文件可用教室文件\n";
return 0;
}
ifstream infile(argv[1]);
vector
string s;
getline(infile, s);
while (getline(infile, s)) {
schedule sch;
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();
vector
vector
string gs(""); //教学班级
for (auto it = 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
for (unsigned i = 0; i < arranges.size(); ++i) {
for (unsigned j = 0; j < arranges[i].size(); ++j) {
string tea = arranges[i][j].teacher;
if (tea == "未定") continue;
unsigned k = 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.push_back(teacher_inverted(tea, i, j));
teachers.push_back(ti);
}
}
}
const int N = 256;