题目:教学计划编制问题(图的应用)
功能:大学的每个专业都要制定教学计划。假设任何专业都有固定的学习年限,每学年含两学期,每学期的时间长度和学分上限值均相等。每个专业开设的课程都是确定的,而且课程在开设时间的安排必须满足先修关系。每门课程有哪些先修课程是确定的,可以有任意多门,也可以没有。每门课恰好占一个学期。试在这样的前提下设计一个教学计划编制程序。
实现提示:
- 输入参数应包括:学期总数,一学期的学分上限,每门课的课程号(可以是固定占 3位的字母数字串)、学分和直接先修课的课程号。
- 应允许用户指定下列两种编排策略之一:一是使学生在各学期中的学习负担尽量均匀
- 是使课程尽可能地集中在前几个学期中。
- 若根据给定的条件问题无解,则报告适当的信息;否则将教学计划输出到用户指定 的文件中。计划的表格格式可以自己设计。可设学期总数不超过12,课程总数不超过100。如果输入的先修课程号不在该专业 开设的课程序列中,则作为错误处理。
数据结构类型定义:
typedef struct VNODE { }VexNode; //顶点表结点
typedef struct ARCNODE EdgeNode;//邻接表结点
typedef struct MESSAGE { }Message; //每学期的学期信息
typedef struct ALGRAPH { }ALGraph; //图
int Locate(char* ch) { }//将C1C2C3……等变为1 2 3…
void Creat_Graph1(ALGraph* G) { }//输入学期总数 学分上限 课程总数(顶点数量)
void Creat_Graph2(ALGraph* G) { }//从文件读取课程信息
void Top_Sort(VexNode g[], int n,VexNode temp){ }//用有入度域的aov网进行拓扑排序,输出并存到数组temp中
void Sort1(VexNode t, Message* s, int VexNum)//按各学期负担均匀输出并保存教学计划
void Sort2(VexNode* t,Message *s,int VexNum)//按课程尽可能集中在前几学期输出并保存教学计划
int main(){ }//主函数
测试数据:
学期总数:6,学分上限:10,学期总数:14,课程号从C01到C14.
课程的先修关系如下:
数据文件保存在D:\123\数据.txt中
运行结果:
实验代码:
注意注释!
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MaxClass 100 //课程总数不超过100
#define MaxSemester 12 //学期总数不超过12
// 邻接表表示
typedef struct ARCNODE EdgeNode; //邻接表结点
struct ARCNODE {
int AdjVex; //邻接点域
EdgeNode* Next; //指向下一个邻边节点的指针域
};
typedef struct VNODE {
//顶点表结点
char Date[3 + 1]; //课程编号 还要储存/0所以+1
int Credit; //节点学分(每门课学分)
EdgeNode* FirstEdge; //指向邻接表第一个邻边节点的指针域
int InDegree; //课程入度
}VexNode;
typedef struct MESSAGE {
//每学期的学期信息
int SemesterNum; //学期数
int MaxCredit; //每学期学分上限
}Message;
typedef struct ALGRAPH {
//图
VexNode* Vertics; //邻接表域
int VexNum; //节点数
int ArcNum; //边数
Message* ExtraInfo; //学期与课程信息
}ALGraph;
int Locate(char* ch) {
//将C1C2C3……等变为1 2 3...
return (2 == strlen(ch)) ? ch[1] - '1' : (ch[1] - '0') * 10 + ch[2] - '1';
}
void Creat_Graph1(ALGraph* G) {
//输入学期总数 学分上限 课程总数(顶点数量)
G->ExtraInfo = (Message*)malloc(sizeof(Message)); //初始化指针
printf("请输入: 学期总数 每学期学分上限 课程总数\n");
scanf(