教学编制问题c语言数据结构实现.docx

上传人:b****6 文档编号:5181494 上传时间:2022-12-13 格式:DOCX 页数:14 大小:21.28KB
下载 相关 举报
教学编制问题c语言数据结构实现.docx_第1页
第1页 / 共14页
教学编制问题c语言数据结构实现.docx_第2页
第2页 / 共14页
教学编制问题c语言数据结构实现.docx_第3页
第3页 / 共14页
教学编制问题c语言数据结构实现.docx_第4页
第4页 / 共14页
教学编制问题c语言数据结构实现.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

教学编制问题c语言数据结构实现.docx

《教学编制问题c语言数据结构实现.docx》由会员分享,可在线阅读,更多相关《教学编制问题c语言数据结构实现.docx(14页珍藏版)》请在冰豆网上搜索。

教学编制问题c语言数据结构实现.docx

教学编制问题c语言数据结构实现

数据结构

课程设计报告

主题:

教学计划编制问题

班级:

计科四班

姓名:

熊金莲

指导老师:

郭艳

内容概要

(1)题目要求

(2)教学计划编制问题的要点

(3)函数模块及各函数可实现的功能简介

(4)具体的源代码

(5)使用说明

(6)实验心得

一:

题目要求如下:

大学的每个专业都要制定教学计划。

假设任何专业都有固定的学习年限,每学年含两学期,每学期的时间长度和学分上限值均相等。

每个专业开设的课程都是确定的,而且课程在开设时间的安排必须满足先修关系。

每门课程有哪些先修课程是确定的,可以有任意多门,也可以没有。

每门课恰好占一个学期。

试在这样的前提下设计一个教学计划编制程序。

要求

(1)输入参数包括:

学期总数,一学期的学分上限,每门课的课程号(固定占3位的字母数字串)学分和直接先修课的课程号。

(2)允许用户指定下列两种编排策略之一:

一是使学生在各学期中的学习负担尽量均匀;二是使课程尽可能地集中在前几个学期中。

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

计划的表格格式自行设计。

二:

教学计划编制问题的要点:

根据问题描述及要求,可知设计中需要定义先修关系的AOV网图中的顶点及弧边的结构体,在运行结果中将图的信息显示出来,利用先修关系将课程排序,最后解决问题——输出每学期的课程。

1)采用第二种策略:

使课程尽可能地集中在前几个学期中;

2)根据教学计划中的课程及其关系和学分定义图的顶点和

边的结构体

3)创建图CreateGraph():

结合先修关系的AOV网,显示代号所对应课程及课程的先修课程

4)拓扑排序TopologicalOrder(G):

将课程排序后并决定出每学期所学课程,输出图G的信息Display(G):

将图的顶点和弧边输出

三:

程序模块及可实现的功能简介:

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

typedefstructArcNode

{

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

structArcNode*next;//指向下一条弧的指针

}ArcNode;

typedefcharVertexType[MAXOfNAME];

typedefstruct//链接表

{

VertexTypedata;//顶点信息

intgrades;//存储学分信息

ArcNode*first;//指向第一条依附该顶点的弧的指针

}VNode,AdjList[MAX_VER];//头结点

typedefstruct

{

AdjListver;//vertices存储课程名

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

}ALGraph;

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

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

for(h=0;h

{

printf("%s的先修课程:

",G.ver[h].data);

scanf("%s",va);getchar();

while(va[0]!

='0')

{

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

j=h;//弧尾

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

p->AdjOfV=j;

p->next=G.ver[i].first;//插在表头

G.ver[i].first=p;

scanf("%s",va);

getchar();

}

}?

3)、输出图的顶点和边

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

for(i=0;i

printf("\n%d条弧边:

\n",G.arcnum);

for(i=0;i

{p=G.ver[i].first;

while(p)

{printf("%s---->%s\n",G.ver[i].data,G.ver[p->AdjOfV].data);

p=p->next;

}

}?

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

?

?

?

?

?

?

intTopologicalOrder(ALGraphG,AdjListR,structNamename[])

{

inti,k,j=0,count,indegree[MAX_VER];

SqStackS;

ArcNode*p;

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

InitStack(S);//初始化栈

for(i=0;i

if(!

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

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

while(!

StackEmpty(S))

{

Pop(S,i);

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

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

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

for(p=G.ver[i].first;p;p=p->next)//对i号顶点的每个邻接点的入度减1

{

k=p->AdjOfV;

if(!

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

Push(S,k);

}

}

if(count

{

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

return0;

}

elseprintf("为一个拓扑序列");

printf("\n");

intq=1,Z=0;

while(q<=TotalOfTerms)

{

intC=R[Z].grades;

printf("\n第%d个学期应学课程:

",q);

while(C<=MaxScores)

{

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

if(Z

{

CmpOfStr(R[Z].data,name,N);/*让C1~C12分别与12门课程对应起来*/

++Z;

}

}

printf("\n");

if(q==TotalOfTerms)printf("\nOKOver!

");

q++;

}

return1;/**/

}

拓扑排序要点:

依次将入度为0的顶点存入InDegree中,对每个顶点求入度,并存入数组InDegree[i]中(i=0…n),初始化栈Stack,Counter=0,对以i号顶点为尾弧的每个邻接点的入度减1,并将入度减1后为零的顶点号压入栈中,输出i,计数器加1(Counter++),推出栈顶的一个元素(入度为零的顶点号)至i,输出i,计数器加1(Counter++),堆栈是否为空?

,n个顶点全输出,依次将入度为0的顶点存入InDegree中

5)根据学分上限决定出每学期应学课程,其中R[]中存储的是经过拓扑排序后的课程先后顺序。

?

?

?

?

?

?

?

?

?

?

?

intq=1,Z=0;

while(q<=TotalOfTerms)

{

intC=R[Z].grades;

printf("\n第%d个学期应学课程:

",q);

while(C<=MaxScores)

{C=C+R[Z+1].grades;

if(Z

{

CmpOfStr(R[Z].data,name,N);/*让C1~C12分别与12门课程对应起来*/

++Z;}

}

printf("\n");

if(q==TotalOfTerms)printf("\nOKOver!

");

q++;

}

四:

具体的源代码

本程序分为三部分

A:

:

:

:

:

:

:

:

:

SeqStack.h

1)#defineStackofNUM20//存储空间初始分配量

2)#defineStackforMore5//存储空间分配增量

3)typedefstructSqStack

4){

5)int*a;

6)int*top;

7)intsize;//分配的存储空间

8)}SqStack;

9)intInitStack(SqStack&S)/*栈的初始化*/

10){

11)S.a=(int*)malloc(StackofNUM*sizeof(int));

12)if(!

S.a)exit(-1);

13)S.top=S.a;

14)S.size=StackofNUM;

15)return1;

16)}

17)intStackEmpty(SqStackS)/*判断栈是否为空*/

18){

19)if(S.top==S.a)return1;

20)elsereturn0;

21)}

22)intPush(SqStack&S,intx)/*入栈*/

23){

24)if(S.top-S.a>=S.size)

25){

26)S.a=(int*)realloc(S.a,(S.size+StackforMore)*sizeof(int));

27)if(!

S.a)exit(-1);

28)S.top=S.a+S.size;

29)S.size+=StackforMore;

30)}

31)*S.top++=x;

32)return1;

33)}

34)intPop(SqStack&S,int&x)/*出栈*/

35){

36)if(S.top==S.a)return0;

37)x=*--S.top;

38)return1;

39)}

B:

:

:

:

:

:

:

:

:

ALGraph.h

40)#defineMAXOfNAME3//最多字符个数

41)#defineMAX_VER100//最大顶点数

42)typedefstructArcNode

43){

44)intAdjOfV;//该弧所指向的顶点的位置

45)structArcNode*next;//指向下一条弧的指针

46)}ArcNode;

47)typedefcharVertexType[MAXOfNAME];

48)typedefstruct//链接表

49){

50)VertexTypedata;//顶点信息

51)intgrades;//存储学分信息

52)ArcNode*first;//指向第一条依附该顶点的弧的指针

53)}VNode,AdjList[MAX_VER];//头结点

54)typedefstruct

55){

56)AdjListver;//vertices存储课程名

57)intvexnum,arcnum;//图的当前顶点数和弧数

58)}ALGraph;

59)intTotalOfTerms;//学期总数

60)intMaxScores;//学分上限

61)intLocateVex(ALGraphG,VertexTypeu)/*查找图中某个顶点位置*/

62){

63)inti;

64)for(i=0;i

65)if(strcmp(u,G.ver[i].data)==0)returni;

66)return-1;

67)}

68)intCreateGraph(ALGraph&G)/*采用邻接表存储结构*/

69){

70)inti,j,h;

71)VertexTypeva;

72)ArcNode*p;

73)printf("请输入教学计划的课程数:

");

74)scanf("%d",&G.vexnum);

75)getchar();

76)printf("请输入各个课程的先修课程的总和(弧总数):

");

77)scanf("%d",&G.arcnum);

78)getchar();

79)printf("请输入%d个课程的课程号(最多%d个字符,字母+数字如C10):

",G.vexnum,MAXOfNAME);

80)for(i=0;i

81){

82)scanf("%s",&G.ver[i].data);

83)getchar();

84)G.ver[i].first=NULL;

85)}

86)printf("请输入%d个课程的学分值:

",G.vexnum);

87)for(i=0;i

88){

89)scanf("%d",&G.ver[i].grades);getchar();

90)}

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

92)for(h=0;h

93){

94)printf("%s的先修课程:

",G.ver[h].data);

95)scanf("%s",va);getchar();

96)while(va[0]!

='0')

97){

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

99)j=h;//弧尾

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

101)p->AdjOfV=j;

102)p->next=G.ver[i].first;//插在表头

103)G.ver[i].first=p;

104)scanf("%s",va);getchar();

105)}

106)}

107)return1;

108)}

109)voidDisplay(ALGraphG)/*输出图G的信息*/

110){

111)inti;

112)ArcNode*p;

113)printf("有向图\n");

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

115)for(i=0;i

116)printf("\n%d条弧边:

\n",G.arcnum);

117)for(i=0;i

118){p=G.ver[i].first;

119)while(p)

120){printf("%s---->%s\n",G.ver[i].data,G.ver[p->AdjOfV].data);

121)p=p->next;

122)}

123)}

124)}

125)voidFindInDegree(ALGraphG,intindegree[])/*求顶点的入度*/

126){

127)inti;

128)ArcNode*p;

129)for(i=0;i

130)for(i=0;i

131){

132)p=G.ver[i].first;

133)while(p)

134){indegree[p->AdjOfV]++;

135)p=p->next;

136)}

137)}

138)}

139)structName

140){

141)charc[20];

142)}name;

143)voidCmpOfStr(VertexTypestr,structNamename[],intn)/*让C1~C12分别与12门课程对应起来*/

144){

145)if(strcmp(str,name[0].c)==0)printf("程序设计基础");

146)if(strcmp(str,name[1].c)==0)printf("离散数学");

147)if(strcmp(str,name[2].c)==0)printf("数据结构");

148)if(strcmp(str,name[3].c)==0)printf("汇编语言");

149)if(strcmp(str,name[4].c)==0)printf("语言的设计和分析");

150)if(strcmp(str,name[5].c)==0)printf("计算机原理");

151)if(strcmp(str,name[6].c)==0)printf("编译原理");

152)if(strcmp(str,name[7].c)==0)printf("操作系统");

153)if(strcmp(str,name[8].c)==0)printf("高等数学");

154)if(strcmp(str,name[9].c)==0)printf("线性代数");

155)if(strcmp(str,name[10].c)==0)printf("普通物理");

156)if(strcmp(str,name[11].c)==0)printf("数值分析");

C:

:

:

:

:

:

:

:

:

:

:

:

:

:

:

:

:

:

教学计划编制问题.Cpp

#include

#include

#include

#include

#include"SeqStack.h"

#include"ALGraph.h"

#defineN12

intTopologicalOrder(ALGraphG,AdjListR,structNamename[])

{

inti,k,j=0,count,indegree[MAX_VER];

SqStackS;

ArcNode*p;

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

InitStack(S);//初始化栈

for(i=0;i

if(!

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

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

while(!

StackEmpty(S))

{

Pop(S,i);

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

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

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

for(p=G.ver[i].first;p;p=p->next)//对i号顶点的每个邻接点的入度减1

{

k=p->AdjOfV;

if(!

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

Push(S,k);

}

}

if(count

{

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

return0;

}

elseprintf("为一个拓扑序列");

printf("\n");

intq=1,Z=0;

while(q<=TotalOfTerms)

{

intC=R[Z].grades;

printf("\n第%d个学期应学课程:

",q);

while(C<=MaxScores)

{

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

if(Z

{

CmpOfStr(R[Z].data,name,N);/*让C1~C12分别与12门课程对应起来*/

++Z;

}

}

printf("\n");

if(q==TotalOfTerms)printf("\nOKOver!

");

q++;

}

return1;/**/

}

voidmain()

{

ALGraphG;

AdjListR;

structNamename[N]={{"C1"},{"C2"},{"C3"},{"C4"},{"C5"},{"C6"},{"C7"},{"C8"},{"C9"},{"C10"},{"C11"},{"C12"}};

printf("***************教学计划编制问题**************\n");

printf("请以课件9-2上课程先序图为例输入学期总数:

");

scanf("%d",&TotalOfTerms);

getchar();

printf("请输入学期的学分上限(8或9):

");

scanf("%d",&MaxScores);

getchar();

CreateGraph(G);

Display(G);

TopologicalOrder(G,R,name);

}

五:

说明:

本程序按照课件9-2所显示的那12门课程编排,示列6个学期,每学期不超过学分数示例输入9。

程序示例运行如下:

六:

实验心得:

经过此次课程设计,我深刻地认识到自己写程序的不足,认识到了仅仅只是从课本上学到算法原理是远远不够的,理论与实践结合才是最重要的。

实验中,我总是不经意间出现各种错误,这就要求

今后的我要以脚踏实地的

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 艺术

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1