前言
前传(V1.0版本):https://blue16.cn/index.php/2023/10/07/684/
(新版只是优化了程序内部,其他内容都没变化,直接返回查看即可)
之前写了一个生成无课表的小程序,但由于我并不知道大学课程表那么复杂,导致疏忽了后面一个重要数据:周次范围
这就直接导致程序无法使用。简单来说,就是我之前只是用一个只包含0、1的表记录当前是否有课,这个本身不包含周次数据,如果要改动,必然要重新设计数据结构,重写算法。
不希望大家太累,我就在开会后仔细想了一下,同时再次分析了生成的csv文件,没想到还真想出来了。
由于优化了数据结构以及解析算法,这次的程序不仅仅能生成无课表,还能生成有课表!
效果
跑了两次代码,生成了无课表与有课表


分析过程
由于这一版改动较大,除了输入没变,输出算法和解析算法均进行了不同程度的修改。只不过这次修改,不仅仅是实现无课表那么简单,加个UI直接就可以写出类似与帮帮通课表的效果(一张课程表就够了,我又没权限调用教务系统的接口,但是这网站还是用的http协议,下次抓个包分析下?)
由于pdf转的csv会出现错位,因此为了完成这个暂时的任务,就是说先不管算法是否通用,我观察了许多人的课表:发现其他课都正常,但是其中有一个课程会出现一个节次范围对应两个课程详细的情况(“形势与政策”),而且大体相同,也就是下面的思路:
先遍历读取出所有课程明细,如果与节次范围相同,直接一一对应(但是不可能),如果多一个“形势与政策“,那就直接按照前一个节次范围记录,只是周次范围不一样。
按照这个思路,我开始进行了调试。输出的节次范围有20条,我预计应该输出21条课程明细,但是实际上输出了20条。
看到第20条,我才发现一个不对劲:
之前csv错位是一个假象,节次范围与课程详细是一一对应的!
那这个就好办了,然后我写了个结构:
Struct course{
//一行course
Range course_section
Range week_section1
Range week_section2//一个课程或许会有多个周期
……
};
Struct range{
//这里直接闭区间
Int min;
Int max;
};
当然,我不是用C++写的,实际上我又进行了修改:
无需定义range,直接保存range的string,要用的时候通过调用一个解析函数,自动提取上下界
然后数据直接用list嵌套的方式:[String course_section, [String week_section1,String week_section2……]]->一个课程项
具体算法我就不描述了,看代码即可,里面有注释。
项目GitHub地址:Blue16-WangFudi/freetimetable-generate: 一个由人工智能学院团委办公室部门开发的通过已有课表自动生成无课表的小工具 (github.com)
格式说明与使用方法
与V1.0版本相同,见:https://blue16.cn/index.php/2023/10/07/684/
只是V2.0加入了有课表生成功能,只需要将函数调用:output_member_empty改成output_member_full即可体验
由于暂时没啥用,我就没把这个功能直接启用,防止操作失误。
总结
大家可以轻松一点了,当然只要课程表格式不变,这个程序在任何部门都可以使用。




给来个牛股指标