数据结构课程设计报告书教学计划编制问题

数据结构课程设计报告书教学计划编制问题
数据结构课程设计报告书教学计划编制问题

数据结构课程设计报告书教学计划编制问题

题目:制定教学计划

1.内容摘要

摘要:首先利用拓扑排序对课程先后顺序进行分析,邻接表为主要存储结

构,栈为主要辅助结构。给出课程的先后关系,即AOV网,然后进行拓扑排序,但当有向图中存在环时,无法查找该图的一个拓扑排序。当图中所有定点全部输出,表示对该图排序成功。实现拓扑排序算法时,相应的建立邻接表存储AOV网。为了避免重复检测入度为零的顶点,建立一个栈来对入度为零的点进行存放。根据课程先后关系,对各个学期的课程进行拓扑排序,输出。

2.索引关键词

关键词:邻接表存储,栈的应用,拓扑排序。

目录

1.题目要求及设计要求------------------------------------------ 1

2.系统完成功能及功能框图----------------------------------- 2—4

3.核心算法及说明------------------------------------------ 5—21

4.运行及测试结论----------------------------------------- 22—23

5.参考资料-------------------------------------------------- 23

6.后记------------------------------------------------------- 23

第一部分:课程设计题目要求

1.1课程设计目的

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

1.2课程设计的实验环境

硬件要求能运行Windows 9.X操作系统的微机系统。

软件: Microsoft Visual C++ 6.0

第二部分:设计要求

1.输入参数包括:学期总数,一学期的学分上限,每门课的课程号(固定占3位的字母

数字串)学分和直接先修课的课程号。

2.允许用户指定下列两种编排策略之一:一是使学生在各学期中的学习负担尽量均匀;

二是使课程尽可能地集中在前几个学期中。

3.若根据给定的条件问题无解,则报告适当的信息;否则将教学计划输出到用户指定的

文件中。计划的表格格式自行设计。

测试数据:

学期总数:6

学分上限:10

该专业共开设12门课,课程号从C1--C12

学分顺序为2,3,4,3,2,3,4,4,7,5,2,3

第三部分:系统完成功能及功能框图

图1:某专业的学生必须学习的课程

图2:表示课程之间优先关系的有向图

C1,

C4

C5

C7

C2

C3

C8

C9

C12

C10 C11

C6

1

2

3

4

5

6

7

8

9

10

11

图3:邻接表

第四部分:详细设计

1.程序主要包括五个模块

1)、图的邻接表的存储表示,即结构体的定义

typedef char VertexType[MAX_NAME];

typedef struct ArcNode

{

int adjvex; // 该弧所指向的顶点的位置

struct ArcNode *nextarc; //指向下一条弧的指针

}ArcNode; // 链表结点

typedef struct //链接表

{

VertexType data; //顶点信息

int grades; //存储学分信息

ArcNode *firstarc; //指向第一条依附该顶点的弧的指针}VNode, AdjList[MAX_VERTEX_NUM]; // 头结点

typedef struct

{

AdjList vertices; //vertices 存储课程名

int vexnum, arcnum; // 图的当前顶点数和边数

}ALGraph;

2)、利用前插法,建立图的邻接链表

printf("请输入下列课程的先修课程(无先修课程输入0结束后也输入0)\n"); for (k=0;k

{

printf("%s的先修课程:",G.vertices[k].data);

scanf("%s",va);

while (va[0]!='0')

{

i = LocateVex(G, va);//弧头

j = k; //弧尾

p = (ArcNode*)malloc(sizeof(ArcNode));

p->adjvex = j;

p->nextarc = G.vertices[i].firstarc; // 插在表头

G.vertices[i].firstarc = p;

scanf("%s",va);

}

}

3)、输出图的顶点和边

printf("%d个顶点", G.vexnum);

for (i = 0;i < G.vexnum;++i)

printf("%4s", G.vertices[i].data);

printf(" \n%d条弧边:\n",G.arcnum);

for (i = 0;i < G.vexnum;i++)

{

p = G.vertices[i].firstarc;

while (p)

{

printf("%s--->%s\n",G.vertices[i].data,G.vertices[p->adjvex].data);

p = p->nextarc;

}

}

4)、通过栈实现拓扑排序

FindInDegree(G, indegree); // 对各顶点求入度

InitStack(S); // 初始化栈

for (i = 0;i < G.vexnum;++i) //建零入度顶点栈S

if (!indegree[i]) Push(S, i); // 入度为0者进栈

count = 0; // 对输出顶点计数

while (!StackEmpty(S))

{

Pop(S, i);

printf("%s(%d分),",G.vertices[i].data,G.vertices[i].grades);

Temp[j++] = G.vertices[i]; //将当前的拓扑序列保存起来

++count; // 输出i号顶点并计数

for (p =G.vertices[i].firstarc; p; p=p->nextarc)// 对i号顶点的每个邻接点的入度减1 {

k = p->adjvex;

if (!(--indegree[k])) // 若入度减为0,则入栈

Push(S, k);

}

}

if (count < G.vexnum)

{

printf("此有向图有回路无法完成拓扑排序");

return ERROR;

}

else printf( " 为一个拓扑序列");

printf("\n");

Return OK

Return ERROR

依次将入度为0的顶点存入InDegree中

对每个顶点求入度,并存入数组InDegree[i]中(i=0…n)

初始化栈Stack,Counter=0

对以i号顶点为尾弧的每个邻接点的入度减1,并将入度减1后为零的顶点号压入栈中,输出i,计数器加1(Counter++)

推出栈顶的一个元素(入度为零的顶点号)至i,输出i,计数器加1(Counter++)

堆栈是否为空?

n个顶点全输出

依次将入度为0的顶点存入InDegree中

5)、解决问题

根据学分上限决定出每学期应学课程,其中Temp[]中存储的是经过拓扑排序后的课程先后顺序。int q=1,Z=0;

while (q <= TotalTerms)

{

int C = Temp[Z].grades ;

printf("第%d个学期应学课程:",q);

while (C <= MaxScores)

{

C = C + Temp[Z+1].grades;

if (Z < G.vexnum) printf("%4s",Temp[Z].data);

++Z;

}

printf("\n");

if (q == TotalTerms)printf( "课程编制完成!");

q++;

}

2.主要设计程序如下:

#include

#include

#include

#include

#define TRUE 1

#define FALSE 0

#define OK 1

#define ERROR 0

#define MAX_NAME 3

#define MAXCLASS 100 //顶点字符串的最大长度

#define MAX_VERTEX_NUM 100 //最大顶点数

#define N 12

typedef char VertexType[MAX_NAME];

int TotalTerms ; //学期总数

int MaxScores; //学分上限

/* ----图的邻接表存储表示---- */

typedef struct ArcNode

{

int adjvex; // 该弧所指向的顶点的位置弧的节点结构struct ArcNode *nextarc; //指向下一条弧的指针

}ArcNode; // 链表结点

typedef struct //链接表

{

VertexType data; //顶点信息

int grades; //存储学分信息

ArcNode *firstarc; //指向第一条依附该顶点的弧的指针}VNode, AdjList[MAX_VERTEX_NUM]; // 头结点

typedef struct

{

AdjList vertices; //vertices 存储课程名

int vexnum, arcnum; // 图的当前顶点数和弧数

}ALGraph;

void OUTPUT()

{

int s;

printf("\t\t 教学计划编制菜单\n");

printf("\t\t课程代码| 课程名称|优先课程\n");

printf("\t\tC1 |程序设计基础| 无\n");

printf("\t\tC2 |离散数学| C1 \n");

printf("\t\tC3 |数据结构| C1,C2 \n");

printf("\t\tC4 |汇编语言| C1 \n");

printf("\t\tC5 |语言的设计和分析| C3,C4 \n");

printf("\t\tC6 |计算机原理| C11 \n");

printf("\t\tC7 |编译原理| C5,C3 \n");

printf("\t\tC8 |操作系统| C3,C6 \n");

printf("\t\tC9 |高等数学| 无\n");

printf("\t\tC10 |线性代数| C9 \n");

printf("\t\tC11 |普通物理| C9 \n");

printf("\t\tC12 |数值分析| C9,C10,C1 \n");

printf("press any numkey to continue:");

scanf("%d",&s);

}

/* 查找图中某个顶点位置*/

int LocateVex(ALGraph G, VertexType u)

{

int i;

for (i = 0;i < G.vexnum;++i)

if (strcmp(u,G.vertices[i].data)==0)

return i;

return -1;

}

{

i = LocateVex(G, va);//弧头

j = k; //弧尾

p = (ArcNode*)malloc(sizeof(ArcNode));

p->adjvex = j;

p->nextarc = G.vertices[i].firstarc; // 插在表头

G.vertices[i].firstarc = p;

scanf("%s",va);

}

}

return OK;

}

/* 输出图G的信息*/

void Display(ALGraph G)

{

int i;

ArcNode *p;

printf("有向图\n");

printf("%d个顶点", G.vexnum);

for (i = 0;i < G.vexnum;++i)

printf("%4s", G.vertices[i].data);

printf(" \n%d条弧边:\n",G.arcnum);

for (i = 0;i < G.vexnum;i++)

{

p = G.vertices[i].firstarc;

while (p)

{

printf("%s--->%s\n",G.vertices[i].data,G.vertices[p->adjvex].data);

p = p->nextarc;

}

}

}

/*求顶点的入度*/

void FindInDegree(ALGraph G, int indegree[]) {

int i;

ArcNode *p;

for (i = 0;i < G.vexnum;i++) indegree[i] = 0;

for (i = 0;i < G.vexnum;i++)

{

p = G.vertices[i].firstarc;

while (p)

{

indegree[p->adjvex]++;

p = p->nextarc;

}

}

}

struct Name

{

char c[20];

}name;

/*栈定义*/

typedef int SElemType; // 栈类型

#define Stack_NUM 20 //存储空间初始分配量#define Stack_MoreNUM 5 // 存储空间分配增量

typedef struct SqStack

{

SElemType *base;

SElemType *top;

int stacksize; //分配的存储空间

}SqStack;

/*栈的初始化*/

int InitStack(SqStack &S)

{

S.base = (SElemType *)malloc(Stack_NUM * sizeof(SElemType));

if (!S.base)

exit(-1);

S.top =S.base;

S.stacksize =Stack_NUM;

return OK;

}

/*判空*/

int StackEmpty(SqStack S)

{

if (S.top == S.base)

return TRUE;

else

return FALSE;

}

/*出栈*/

int Pop(SqStack &S, SElemType &e)

{

if (S.top == S.base)

return ERROR;

e = *--S.top;

return OK;

}

/*入栈*/

int Push(SqStack &S, SElemType e)

{

if (S.top - S.base >= S.stacksize)

{

S.base = (SElemType *) realloc ( S.base, (S.stacksize + Stack_MoreNUM) * sizeof(SElemType));

if ( !S.base ) exit(-1);

S.top =S.base +S.stacksize;

S.stacksize +=Stack_MoreNUM;

}

*S.top++ = e;

return OK;

}

相关主题
相关文档
最新文档