教学计划编制问题(C语言)

该博客介绍了一个使用C语言解决教学计划编制问题的程序,该问题涉及到图的应用。程序考虑了学期总数、学分上限和课程间的先修关系,并提供了两种编排策略:学习负担均匀或课程集中。程序通过邻接表数据结构表示图,并实现了拓扑排序、教学计划输出等功能。测试数据包括6个学期,学分上限10,14门课程,课程号从C01到C14,数据存储在D:123数据.txt文件中。
摘要由CSDN通过智能技术生成

题目:教学计划编制问题(图的应用)

功能:大学的每个专业都要制定教学计划。假设任何专业都有固定的学习年限,每学年含两学期,每学期的时间长度和学分上限值均相等。每个专业开设的课程都是确定的,而且课程在开设时间的安排必须满足先修关系。每门课程有哪些先修课程是确定的,可以有任意多门,也可以没有。每门课恰好占一个学期。试在这样的前提下设计一个教学计划编制程序。
实现提示:

  1. 输入参数应包括:学期总数,一学期的学分上限,每门课的课程号(可以是固定占 3位的字母数字串)、学分和直接先修课的课程号。
  2. 应允许用户指定下列两种编排策略之一:一是使学生在各学期中的学习负担尽量均匀
  3. 是使课程尽可能地集中在前几个学期中。
  4. 若根据给定的条件问题无解,则报告适当的信息;否则将教学计划输出到用户指定 的文件中。计划的表格格式可以自己设计。可设学期总数不超过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(
评论 53
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一抹高傲的笑>

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值