教学计划编制问题Word下载.docx
- 文档编号:21972951
- 上传时间:2023-02-02
- 格式:DOCX
- 页数:16
- 大小:232.42KB
教学计划编制问题Word下载.docx
《教学计划编制问题Word下载.docx》由会员分享,可在线阅读,更多相关《教学计划编制问题Word下载.docx(16页珍藏版)》请在冰豆网上搜索。
}ADTGraph
2.栈的定义:
ADTStack{
数据对象:
D={ai|ai∈ElemSet,i=1,2,…n,n>
=0}
数据关系:
R1={﹤ai-1ai﹥|ai-1,ai∈D,i=2,…,n}
基本操作:
voidInitStack(SqStack*S);
创建一个栈。
intStackEmpty(SqStackS);
清空栈。
voidPush(SqStack*S,int);
入栈。
intPop(SqStack*S,int*e);
出栈。
}ADTStack
2.主程序
intmain()
//主函数
{
intnumterm;
//学期总数
intuplcredit;
//一个学期的学分上限
intselectway;
ALGraphG;
printf("
请输入学期总数:
\n"
);
scanf("
%d"
&
numterm);
请输入一个学期的学分上限:
uplcredit);
CreatGraph(&
G);
请选择编排策略:
1.课程尽可能集中到前几个学期;
2.课程尽量均匀分布\n"
scanf("
selectway);
if(selectway==1)
TopologicalSort_1(G,numterm,uplcredit);
if(selectway==2)
TopologicalSort_2(G,numterm,uplcredit);
system("
pause"
return0;
}
3.本程序只有两个模块,调用关系简单.
主程序模块
↓
拓扑排序模块
三、详细设计
1.头结点,表结点,邻接表的定义
#defineMAX_VERTEX_NUM100//最大课程总数
typedefstructArcNode{
intadjvex;
structArcNode*nextarc;
}ArcNode;
typedefstructVNode{
charname[24];
//课程名
intclassid;
//课程号
intcredit;
//课程的学分
intindegree;
//该结点的入度
intstate;
//该节点的状态
ArcNode*firstarc;
//指向第一条依附该顶点的弧的指针
}VNode,AdjList[MAX_VEXTEX_NUM];
typedefstruct{
AdjListvertices;
intvexnum,arcnum;
}ALGraph;
邻接表的基本操作:
创建邻接表
求一个结点的入度
拓扑排序来编排课程
2.栈的定义:
#defineSTACk_INIT_SIZE100//存储空间的初时分配量
#defineSTACKINCREMENT10
//存储空间的分配增量
typedefintElemType;
基本操作:
栈的初始化
判断栈是否为空
入栈操作
出栈操作
3.主程序和其他算法
intmain()
//主函数
{intnumterm;
intuplcredit;
intselectway;
ALGraphG;
printf("
CreatGraph(&
if(selectway==1)
TopologicalSort_1(G,numterm,uplcredit);
if(selectway==2)
TopologicalSort_2(G,numterm,uplcredit);
system("
return0;
voidCreatGraph(ALGraph*G)//构件图
inti,m,n;
ArcNode*p;
请输入需要编排课程总数:
G->
vexnum);
for(i=1;
i<
=G->
vexnum;
i++)
请输入课程名\n"
%s"
vertices[i].name);
请输入课程号\n"
vertices[i].classid);
请输入该课程的学分\n"
vertices[i].credit);
vertices[i].indegree=0;
vertices[i].state=NOTSTUDY;
vertices[i].firstarc=NULL;
请输入课程先修关系总数:
"
arcnum);
请顺序输入每个课程先修关系(先修课程在前并以逗号作为间隔):
for(i=1;
i<
=G->
arcnum;
i++)
\n请输入存在先修关系的两个课程的序号:
%d,%d"
n,&
m);
while(n<
0||n>
G->
vexnum||m<
0||m>
vexnum)
输入的顶点序号不正确请重新输入:
p=(ArcNode*)malloc(sizeof(ArcNode));
if(p==NULL)
memoryallocationfailed,goodbey"
exit
(1);
p->
adjvex=m;
nextarc=G->
vertices[n].firstarc;
vertices[n].firstarc=p;
\n建立的邻接表为:
//输出建立好的邻接表
for(i=1;
%d:
->
G->
for(p=G->
vertices[i].firstarc;
p!
=NULL;
p=p->
nextarc)
%d->
p->
adjvex);
NULL"
voidInitStack(SqStack*S)
S->
base=(int*)malloc(STACK_INIT_SIZE*sizeof(int));
if(!
base)
ERROR"
top=S->
base;
stacksize=STACK_INIT_SIZE;
intStackEmpty(SqStack*S)
if(S->
top==S->
returnOK;
else
returnERROR;
voidPush(SqStack*S,inte)
top-S->
base>
=S->
stacksize)
base=(int*)realloc(S->
base,(S->
stacksize+STACKINCREMENT)*sizeof(int));
if(!
top=S->
base+S->
stacksize;
stacksize+=STACKINCREMENT;
*S->
top++=e;
intPop(SqStack*S,int*e)
top==S->
base)exit
(1);
*e=*--S->
top;
voidFindInDegree(ALGraphG,intindegree[])//求图中各节点的入度
inti;
=G.vexnum;
indegree[i]=0;
while(G.vertices[i].firstarc)
indegree[G.vertices[i].firstarc->
adjvex]++;
G.vertices[i].firstarc=G.vertices[i].firstarc->
nextarc;
voidTopologicalSort_1(ALGraphG,intnumterm,intuplcredit)
FILE*fp;
fp=fopen("
bianpai.txt"
"
w"
SqStackS;
intindegree[M];
//存放各节点的入度
inti,j,k,m,n;
intcount;
//课程编排数目计数器
intsumcredit;
//每个学期的课程学分累加器
FindInDegree(G,indegree);
G.vertices[i].indegree=indegree[i];
InitStack(&
S);
count=0;
k=0;
while(count!
=G.vexnum&
&
k<
=numterm)
sumcredit=0;
=G.vexnum;
i++)//入度为零的节点入栈,即无先修的课程入栈
if((G.vertices[i].indegree==0)&
(G.vertices[i].state==NOTSTUDY))
Push(&
S,i);
G.vertices[i].state=STUDY;
//避免入度为零节点重复入栈
StackEmpty(&
S)&
(sumcredit<
=uplcredit))
k=k+1;
第%d个学期学得课程有:
k);
sumcredit=0;
i++)//入度为零的节点入栈,即无先修的课程入栈
while((!
S))&
uplcredit))//栈非空&
学分总数小于学分上限
Pop(&
S,&
j);
sumcredit=sumcredit+G.vertices[j].credit;
if(sumcredit<
=uplcredit)
%s"
G.vertices[j].name);
fprintf(fp,"
count++;
for(p=G.vertices[j].firstarc;
p;
nextarc)//对j号顶点每个邻接点的入度减一
G.vertices[p->
adjvex].indegree--;
elsePush(&
S,j);
//将未输出的节点重新压入栈
if(count<
G.vexnum)
\n课程编排出错\n"
\n课程编排成功\n"
fclose(fp);
voidTopologicalSort_2(ALGraphG,intnumterm,intuplcredit)
FILE*fp;
fp=fopen("
ArcNode*p;
SqStackS;
intindegree[M];
inti,j,k,m,n;
intmaxnum;
intsumnum;
intcount;
intsumcredit;
FindInDegree(G,indegree);
for(i=1;
G.vertices[i].indegree=indegree[i];
InitStack(&
count=0;
k=0;
maxnum=G.vexnum/numterm+1;
sumnum=0;
while(count!
{
for(i=1;
i++)//入度为零的节点入栈,即无先修的课程入栈
Push(&
G.vertices[i].state=STUDY;
}
=uplcredit)&
(sumnum<
=maxnum))
i++)//入度为零的节点入栈,即无先修的课程入栈
while((!
uplcredit)&
maxnum))
//栈非空&
学分总数小于学分上限&
学期课程数目小于学期最大数目
//出栈
sumcredit=sumcredit+G.vertices[j].credit;
sumnum=sumnum+1;
if((sumcredit<
=uplcredit)&
(sumnum<
=maxnum))
fprintf(fp,"
count++;
G.vertices[p->
elsePush(&
if(count<
课程编排出错\n"
else
{
课程编排成功\n"
fclose(fp);
4.主函数调用关系图
Voidmain()
四、设计和调试分析
(1)实验过程中出现的问题及解决方法
我们在实验过程中遇到的最大难题是两个课程排序算法的编写。
刚开始的时候没有任何的思路,网上也只有拓扑排序的算法,对于课程设计要求的排序算法没有任何头绪。
翻阅了一些相关书籍,并在网上的搜索有了排序算法的大体思路。
经过多次修改,终于写出了符合要求的排序算法。
(2)实验体会
经过此次课程设计,我们认识到了理论与实践结合的重要性,仅仅只是从课本上学到算法原理是远远不够的。
在实践中,我们总会出现许多错误。
这就要求我们以一个脚踏实地的态度来处理问题。
我们深刻地认识到自己写程序的不足,使我们学到了好多有用的知识,让我们明白了C语言的语句用法。
五.用户使用和说明:
1.本程序的运行环境为DOS操作系统,由用户按提示进行操作。
2.使用codeblocks,打开教学计划编制问题.cpb文件,接着编译,无错误,然后重建也没有错误,最后执行该文件。
显示如下图:
要求输入学期总数、一个学期的学分上限、需要编排课程总数、课程名、课程号、该课程的学分,按照出现的每一步来输入该课程设计所提供的相关数据。
然后还要输入课程先修课程总数,依据教科书图7.26(p181),可以算出有16种关系,分别输出如下图所示。
接着程序会根据这些数据,自动生成建立好的邻接表,用户可以根据系统显示的选择编排策略进行选择,有两种编排策略,操作过程截图如下:
六、测试结果
测试数据和测试结果见五操作过程截图。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 教学计划 编制 问题