高校自动排课系统

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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 plan;

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

vector arr; //一个班的排课安排

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> teachers; //教师数组

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; //一个教师的排课信息倒排表

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

teachers.push_back(ti);

}

}

}

const int N = 256;

相关文档
最新文档