学期授课计划编制Word文档下载推荐.doc
- 文档编号:7019639
- 上传时间:2023-05-07
- 格式:DOC
- 页数:16
- 大小:330.50KB
学期授课计划编制Word文档下载推荐.doc
《学期授课计划编制Word文档下载推荐.doc》由会员分享,可在线阅读,更多相关《学期授课计划编制Word文档下载推荐.doc(16页珍藏版)》请在冰点文库上搜索。
=0){
printf("
------------------------------------------------\n"
ALGraphf;
//图的邻接表存储;
printf("
请输入学期总数:
"
scanf("
%d"
&
term_num);
请输入每学期的学分上限:
credit_lim);
CreateGraph(f);
Display(f);
TopologicalSort(f);
\n按1继续,按0结束:
scanf("
CONTINUE);
}
return0;
}
2.栈模块
typedefenum{DG}GraphKind;
//{有向图,有向网,无向图,无向网};
typedefstructArcNode{//弧结构;
intadjvex;
//该弧所指向的顶点的位置;
structArcNode*nextarc;
//指向下一条弧的指针;
InfoType*info;
//网的权值指针;
}ArcNode;
//表结点;
typedefstruct{
VertexTypedata;
//顶点信息;
ArcNode*firstarc;
//第一个表结点的地址,指向第一条依附该顶点的弧的指针;
}VNode,AdjList[MAX_VERTEX_NUM];
AdjListvertices,vertices2;
//分别存课程名和学分;
intvexnum,arcnum;
intkind;
}ALGraph;
intLocateVex(ALGraphG,VertexTypeu){
inti;
for(i=0;
i<
G.vexnum;
++i)
if(strcmp(u,G.vertices[i].data)==0)
returni;
return-1;
StatusCreateGraph(ALGraph&
G){
inti,j,k;
VertexTypev1,v2;
//顶点信息;
ArcNode*p;
//指向第一条依附某顶点的弧的指针;
请输入教学计划的课程数:
"
scanf("
G.vexnum);
请输入课程先修关系数(弧的数目):
G.arcnum);
请输入%d个课程的代表值(如:
c01):
\n"
G.vexnum);
++i){
%s"
G.vertices[i].data);
G.vertices[i].firstarc=NULL;
}
请输入%d个课程的学分值:
(G).vexnum);
G.vertices2[i].data);
请顺序输入每条弧的弧尾和弧头(以空格作为间隔):
for(k=0;
k<
G.arcnum;
++k){
scanf("
%s%s"
v1,v2);
i=LocateVex(G,v1);
j=LocateVex(G,v2);
p=(ArcNode*)malloc(sizeof(ArcNode));
//新建一个节点;
p->
adjvex=j;
info=NULL;
nextarc=G.vertices[i].firstarc;
G.vertices[i].firstarc=p;
returnOK;
voidDisplay(ALGraphG){
switch(G.kind){
caseDG:
printf("
有向图\n"
%d个顶点:
printf("
%s"
\n%d条弧:
G.arcnum);
i++){
p=G.vertices[i].firstarc;
voidFindInDegree(ALGraphG,intindegree[]){
ArcNode*p;
i++)
indegree[i]=0;
while(p){
indegree[p->
adjvex]++;
p=p->
nextarc;
}
typedefintSElemType;
#defineSTACK_INIT_SIZE10
#defineSTACKINCREMENT2
typedefstructSqStack{
SElemType*base;
SElemType*top;
intstacksize;
}SqStack;
StatusInitStack(SqStack*S){
(*S).base=(SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType));
if(!
(*S).base)
exit(OVERFLOW);
(*S).top=(*S).base;
(*S).stacksize=STACK_INIT_SIZE;
voidClearStack(SqStack*S){//清空栈的操作
S->
top=S->
base;
StatusStackEmpty(SqStackS){
if(S.top==S.base)
returnTRUE;
else
returnFALSE;
3.排序模块
StatusPop(SqStack*S,SElemType*e){
if((*S).top==(*S).base)
returnERROR;
*e=*--(*S).top;
StatusPush(SqStack*S,SElemTypee){
if((*S).top-(*S).base>
=(*S).stacksize){
(*S).base=(SElemType*)realloc((*S).base,((*S).stacksize+STACKINCREMENT)*sizeof(SElemType));
if(!
exit(OVERFLOW);
(*S).top=(*S).base+(*S).stacksize;
(*S).stacksize+=STACKINCREMENT;
*((*S).top)++=e;
Statuszxf(ALGraphG){
intz=0;
for(inti=0;
i<
G.vexnum;
i++){
z+=atoi(G.vertices2[i].data);
returnz;
typedefintpathone[MAX_CLASS_NUM];
typedefintpathtwo[MAX_CLASS_NUM];
StatusTopologicalSort(ALGraphG){
inti,k,count,indegree[MAX_VERTEX_NUM];
boolhas=false;
SqStackS;
pathonea;
pathtwob;
ArcNode*p;
FindInDegree(G,indegree);
InitStack(&
S);
for(i=0;
++i){
if(!
indegree[i])
Push(&
S,i);
}
count=0;
while(!
StackEmpty(S)){
Pop(&
S,&
i);
a[i]=*G.vertices[i].data;
//课程名;
b[i]=*G.vertices2[i].data;
//学分;
课程%s→学分%s"
G.vertices[i].data,G.vertices2[i].data);
++count;
for(p=G.vertices[i].firstarc;
p;
p=p->
nextarc){
k=p->
adjvex;
if(!
(--indegree[k]))
S,k);
if(count<
G.vexnum){
此有向图有回路\n"
returnERROR;
else{
为一个拓扑序列。
\n\n"
has=true;
intpattern=2;
//对各顶点求入度indegree[0..vernum-1];
ClearStack(&
=====================================================\n"
教学计划如下:
intxq=1;
//学期数;
intxfh;
//学分和;
intnow=0;
inttop=G.vexnum/term_num;
//平均每学期课程数;
intpjxf=zxf(G)/term_num;
//每学期平均学分;
while(xq<
=term_num+1){
intresult[20];
//某个学期的课程;
intm=0;
xfh=0;
now=0;
//当前学期课程数;
++i){
if(0==indegree[i])
}
if(xq==term_num+1&
&
!
printf("
还有课程未安排!
while(!
StackEmpty(S)&
xq<
=term_num){
intxf;
Pop(&
//弹出栈顶元素;
xf=atoi(G.vertices2[i].data);
//atoi:
字符串转换成整型数,xf:
学分;
xfh=xfh+xf;
now++;
if(xfh>
credit_lim){
ClearStack(&
break;
if(pattern==1){
if(xq!
=term_num/2&
now>
top){
ClearStack(&
now=0;
break;
if(pattern==2){
=1&
xq!
=term_num/2-1&
indegree[i]--;
//减为-1,避免被再次计入;
for(p=G.vertices[i].firstarc;
k=p->
indegree[k]--;
if(indegree[k]==0)
Push(&
result[m]=i;
m++;
if(xq<
第%d个学期的课程为:
xq);
for(intj=0;
j<
m;
j++){
课程%s"
G.vertices[result[j]].data);
xq++;
ClearStack(&
returnOK;
四、程序运行截图
程序开始运行界面
测试数据:
学期一共为2个学期,每个学期上限10学分,总共教学计划安排5门课,分别为c1课2学分,c2课6学分,c3课4学分,c4课6学分,c5课2学分。
必须先上c1课再上c2课,先上c3课再上c4课,根据总教学时间最少的要求排课,输出的排课结果为:
第一学期c5、c3,第二学期c4、c1。
还有c2没有安排,所以无法排课,排课失败。
学期一共为1个学期,每个学期上限10学分,总共教学计划安排3门课,分别为c1课2学分,c2课2学分,c3课2学分。
必须先上c1课再上c3课,根据总教学时间最少的要求排课,输出的排课结果为:
第一学期c2、c1、c3。
排课成功。
五、调试总结
1.由于对于指针的操作掌握的不是很熟练,导致越界访问现象频频发生,因此,今后自己应该加强对指针的掌握和使用,以便可以更加顺利的编程。
2.各操作时空复杂性比较合理,时空复杂度均为O(n),O
(1)。
3.本程序作业采用数据结构抽象的程序设计方法,使得设计时思路清晰,实现时调试顺利,各模块具有较好的可重复性,确实得到了一次良好的程序设计训练。
六、参考文献
[1]严蔚敏、吴伟民编著.《数据结构题集》(C语言版).北京:
清华大学出版社.1999
[2]严蔚敏、吴伟民编著.《数据结构》(C语言版).北京:
清华大学出版社.2007
七、程序清单
#include<
string.h>
stdio.h>
stdlib.h>
iomanip>
math.h>
//floor(),ceil(),abs()
#include<
iostream>
usingnamespacestd;
#defineTRUE1
#defineFALSE0
#defineOK1
#defineERROR0
#defineINFEASIBLE-1
typedefintStatus;
//Status是函数的返回类型;
typedefintBoolean;
#defineMAX_NAME10//顶点字符串的最大长度;
#defineMAX_CLASS_NUM100
intZ=0;
intX=0;
intterm_num,credit_lim,q=1;
typedefintInfoType;
typedefcharVertexType[MAX_NAME];
//字符串类型;
#defineMAX_VERTEX_NUM100
while(p){
%s→%s"
G.vertices[i].data,G.vertices[p->
adjvex].da
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 学期 授课 计划 编制