数据结构课程设计教学计划编制问题报告Word格式文档下载.docx
- 文档编号:22347699
- 上传时间:2023-02-03
- 格式:DOCX
- 页数:11
- 大小:142.96KB
数据结构课程设计教学计划编制问题报告Word格式文档下载.docx
《数据结构课程设计教学计划编制问题报告Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计教学计划编制问题报告Word格式文档下载.docx(11页珍藏版)》请在冰豆网上搜索。
每门课程有哪些先修课程是确定的,可以有任意多门,也可以没有。
每门课恰好占一个学期。
试在这样的前提下设计一个教学计划编制程序。
1.2需求分析
根据问题描述及要求,可知设计中需要定义先修关系的AOV网图中的顶点及弧边的结构体,在运行结果中将图的信息显示出来,利用先修关系将课程排序,最后解决问题输出每学期的课程。
(1)用学分来实现每学期课程数大致相同;
(2)根据教学计划中的课程及其关系和学分来定义图的顶点及边的结构体。
(3)创建图CreateGraph():
结合先修关系的AOV网,采用邻接表存储。
(4)菜单OUTPUT():
显示代号所对应课程及课程的先修课程。
(5)拓扑排序TopoSort(G):
将课程排序后并决定出每学期所学课程。
(6)输出图G的信息Display(G):
将图的顶点和弧边输出。
1.3本程序包括2个模块:
主程序模块和拓扑排序模块。
2.本设计所采用的数据结构
(1)voidOUTPUT()//显示代号所对应课程及课程的先修课程
(2)intLocateVex(ALGraphG,VertexTypeu)
//查找图中某个顶点位置
(3)intCreateGraph(ALGraphG)//采用邻接表存储结构
(4)voidDisplay(ALGraphG)//输出图G的信息
(5)voidFindInDegree(ALGraphG,intindegree[])//求顶点的入度
(6)voidpuanduan(VertexTypestr,structNamename[],intn)
(7)intInitStack(SqStack&
S)//栈的初始化
(8)intStackEmpty(SqStackS)//判空
(9)intPop(SqStack&
S,SElemType&
e)//出栈
(10)intPush(SqStack&
S,SElemTypee)//入栈
(11)intTopoSort(ALGraphG,AdjListTemp,structNamename[])//拓扑排序
(12)voidmain()//主函数
3.功能模块详细设计
3.1详细设计思想
3.2核心代码
3.21.数据类型定义
(1)头结点,表结点,邻接表的定义
typedefcharVertexType[MAX_NAME];
intTotalTerms;
//学期总数
intMaxScores;
//学分上限
typedefstructArcNode
{
intadjvex;
//该弧所指向的顶点的位置弧的节点结构
structArcNode*nextarc;
//指向下一条弧的指针
}ArcNode;
//表结点
typedefstructVNode
VertexTypedata;
//顶点信息
intgrades;
//存储学分信息
ArcNode*firstarc;
//指向第一条依附该顶点的弧的指针
}VNode,AdjList[MAX_VERTEX_NUM];
//头结点
typedefstructALGraph//邻接表
AdjListvertices;
//vertices存储课程名
intvexnum,arcnum;
//图的当前顶点数和弧数
}ALGraph;
邻接表的基本操作:
voidCreatGraph(ALGraph*);
创建邻接表
voidFindInDegree(ALGraph,int*);
求一个结点的入度
intTopoSort(ALGraphG,AdjListTemp,structNamename[])//拓扑排序
(2)栈的定义:
typedefintSElemType;
//栈类型
#defineStack_NUM20
//存储空间初始分配量
#defineStack_MoreNUM5
//存储空间分配增量
typedefstructSqStack
SElemType*base;
SElemType*top;
intstacksize;
//分配的存储空间
}SqStack;
基本操作:
voidInitStack(SqStack*S);
栈的初始化
intStackEmpty(SqStackS);
判断栈是否为空
voidPush(SqStack*S,int);
入栈操作
intPop(SqStack*S,int*e);
出栈操作
3.22系统主要子程序详细设计
(1)主函数模块设计
voidmain()
ALGraphG;
AdjListTemp;
structNamename[N]={{"
C1"
},{"
C2"
C3"
C4"
C5"
C6"
C7"
C8"
C9"
C10"
C11"
C12"
}};
OUTPUT();
printf("
**********教学计划编制问题**********\n"
);
printf("
请输入学期总数:
"
);
scanf("
%d"
&
TotalTerms);
请输入学期的学分上限:
MaxScores);
CreateGraph(G);
Display(G);
TopoSort(G,Temp,name);
OK\n"
*c"
}
(2)拓扑排序模块设计
intTopoSort(ALGraphG,AdjListTemp,structNamename[])
inti,k,j=0,count,indegree[MAX_VERTEX_NUM];
SqStackS;
ArcNode*p;
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);
%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;
(--indegree[k]))//若入度减为0,则入栈
Push(S,k);
}
if(count<
G.vexnum)
{
此有向图有回路无法完成拓扑排序"
returnERROR;
elseprintf("
为一个拓扑序列"
\n"
intq=1,Z=0;
while(q<
=TotalTerms)
intC=Temp[Z].grades;
\n第%d个学期应学课程:
q);
while(C<
=MaxScores)
C=C+Temp[Z+1].grades;
if(Z<
puanduan(Temp[Z].data,name,N);
++Z;
if(q==TotalTerms)printf("
\n课程编制完成!
q++;
returnOK;
3.3程序运行结果
(1)主界面设计
显示课程代号所对应课程及先修课程。
(2)输入1-16的任意数回车
(3)按要求输入学期数,学分上限,课程数,课程号和各课程的学分:
(4)输入各课程先修课程,回车,运行结果:
4.课程设计心得、存在问题及解决方法
经过这次这次课程设计,我学到很多。
首先是一个总体思想,先确定总体结构。
用邻接表把图存储起来,然后用拓扑排序实现先修关系。
其中还用到了栈,进栈是要判断栈是否为满,若满则需要再开辟存储空间,如果开辟失败,存储也就失败了。
出栈要判断栈是否空,若空,则出栈失败,且返回错误。
一开始程序不能运行,后来才找见错误,原来我错加了“&
”符号,可见一点疏忽就会导致整个程序无法运行。
以后要更加细心的写程序啦!
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课程设计 教学计划 编制 问题 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)