培养计划编制【c++ qt】

培养计划编制

Table of Content

github地址->源码地址


概述

题目

源自SCUT

本科培养计划编制是一个复杂的问题,要考虑课程之间的先修关系、实践环节、各学期教学任务的平衡、必修课和选修课学分要求、总学分的要求等等。现要求根据实际情况制定你所在专业的教学计划。要求有以下环节:
F1. 明确专业教学环节,一般包括包括公共基础课、专业必修课、专业选修课、通选课、实践课程、各类实习、毕业设计、军训等。
F2. 明确各教学环节的具体内容,每门课的学分、课时(有些课程还包括实验课时)、课程之间的选修关系。
F3. 明确各个教学环节的学分要求,以及总学分要求。
F4. 设计算法并实施,制订科学可行的培养计划,并用表格方式进行结果展示。

解决思路

1. 明确教学环节

  1. 找到培养计划中的专业所有课程,明确其类型:公共基础课、专业基础课、专业选修课、实践必修课和实践选修课
  2. 对体育课、通识课、毕业实习和毕业设计环节预分配
    2. 明确各教学的具体内容
  3. 根据逻辑和经验为课程设置前置课程prereq
  4. 分别将公共基础课、专业基础课、专业选修课、实践必修课和实践选修课的类型属性type设置为1 2 3 4 5
  5. 将课程信息(id, name, credit, hours, category, prereq)存入一个txt文件,一行一门课
    3. 明确学分要求
  6. 对于各个教学环节的学分要求,我们让用户自行输入,本项目设置默认值(70, 45, 23, 28, 4)。
  7. 总学分即5类环节需修学分的总和(毕业学分要求)
  8. 最终输出的培养计划中,我们只做推荐,不做强制安排。即,每学期推荐课程总学分可能会相对高,里面的选修课按照自己的兴趣和实际来选,我们只做推荐,所以学会分虚高。
    4. 表格展示
  9. 程序执行后,会得到8个学期的课程推荐内容,将其按照学期顺序输入结果文件semesterCourses.txt
  10. 最终用qt读取文件并解析内容,输出到表格即可

结果效果展示

结合qt的最终效果展示:

最终效果

semesterCourses.txt展示:

结果文件

注意:Windows上,把文本文件改成ASNI编码,qt默认编码为System,否则会导致中文乱码


核心算法

核心函数概况

  1. loadCourses函数

    • 传入courses.txt的文件路径,打开文件并读取课程信息。
    • 按行读取文件,并将课程各属性按顺序存入Course的属性中。
    • 其中,前置课程类型为向量,同时,输入流读取每一门前置课程,将对应课程的入度 + 1
  2. TopologicalSort函数
    BFS进行拓扑排序,得到拓扑序列sortedCourses

  3. assignCourses

    1. 对特殊课程预分配
    • 体育课、通选课(前4、5个学期,每个学期一节)
    • 毕业实习、毕业设计(分别安排在第7、8学期)
    1. 遍历拓扑序列sortedCourses,并按划分到5个向量 diffTypeCourses 中,此时,每一个向量中有序,但拓扑序列被打乱

    2. 给 5 类课程设置学期平均学分avgCredit和最高学分maxCredit。平均学分使得课程能够均匀分布,最高学分使得学分不会太高
      根据经验设置 avgCredit 和 maxCredit,如:

      • 公共基础课集中在前 3 个学期
      • 专业选修课集中在 4-7 学期
      • 实践选修课集中在5-6学期
    3. 每次分配课程需要对课程前置课程的安排情况进行检查

    4. 安排成功的课程记录在二维向量vector<vector<string>> semesters(8) 中,每个学期的课程安排为一个向量

    5. 将结果写入文件semesterCourses.txt,同样输入的有每学期各类课程的总学分以及8学期的总学分

qt部分函数

  1. loadtxtIntoTable
    在运行项目时,调用该函数,直接显示courses.txt到ui表格中。
    实现很简单,按行读取即可,和loadCourses函数相仿

  2. appendOneRow
    每读取一行,将各属性传入该函数,该函数将在表格最后添加一行,并设置单元格内容

  3. getTrainingPlan
    按顺序调用三个核心函数,并将从ui上获取的4类课程应修学分,将其传入assignCourses函数即可。
    另外,调用下一个函数,将semesterCourses.txt内容导在表格上即可

  4. loadResultTxtIntoTable
    将结果文件导入在ui上的结果表格

    • 要求前面 7 行为固定的行,即每学期的总学分、总学时和 5 类课程总学分
    • 后面的课程按照最多的那一学期的课程数来排,动态增加行数
    • 解析每学期的课程(格式:(ID)type Cname),并根据 type 设置不同的单元格颜色(1红 2黄 3蓝 4绿 5白)
    • 最后再输出 8 学期的 5 类课程总学分
  5. on_searchCourse_clicked
    获取ui传来的关键词,遍历表格匹配关键词,最后定位单元格并对单元格高亮显示

  6. on_editCourse_clicked
    “修改课程”被点击时,“确认修改”按钮才开启。同时不可更改的表格变为除了id都能更改的表格

  7. on_confirmButton_clicked
    “确认修改”被点击后,遍历表格所有行,并将单元格信息一一存储到vector<Course> updatedCourses
    updatedCourses作为参数调用updateCourseInFile,使得可进行课程信息文件的修改

  8. updateCourseInFile
    打开结果文件semesterCourses.txt并清空其数据,并将新数据写进去

  9. on_deleteCourse_clicked()
    选中一行后才能进行删除。删除ui上的记录,并更新courseIDs(移除被删除的id),并传入这个id调用函数updateCourseFile

  10. updateCourseFile
    删除后对.txt文件进行更新。按行读取文件内容,匹配id,未匹配成功的写入courses.txt,反之,不写入(相当于删除)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值