学期授课计划编制教材Word格式.docx

上传人:b****6 文档编号:19727020 上传时间:2023-01-09 格式:DOCX 页数:22 大小:206.49KB
下载 相关 举报
学期授课计划编制教材Word格式.docx_第1页
第1页 / 共22页
学期授课计划编制教材Word格式.docx_第2页
第2页 / 共22页
学期授课计划编制教材Word格式.docx_第3页
第3页 / 共22页
学期授课计划编制教材Word格式.docx_第4页
第4页 / 共22页
学期授课计划编制教材Word格式.docx_第5页
第5页 / 共22页
点击查看更多>>
下载资源
资源描述

学期授课计划编制教材Word格式.docx

《学期授课计划编制教材Word格式.docx》由会员分享,可在线阅读,更多相关《学期授课计划编制教材Word格式.docx(22页珍藏版)》请在冰豆网上搜索。

学期授课计划编制教材Word格式.docx

intCONTINUE=1;

while(CONTINUE!

=0){

------------------------------------------------\n"

ALGraphf;

//图的邻接表存储;

请输入学期总数:

"

scanf("

%d"

&

term_num);

请输入每学期的学分上限:

credit_lim);

CreateGraph(f);

Display(f);

TopologicalSort(f);

\n按1继续,按0结束:

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;

//指向第一条依附某顶点的弧的指针;

请输入教学计划的课程数:

"

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){

%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:

有向图\n"

%d个顶点:

%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));

(*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;

FindInDegree(G,indegree);

InitStack(&

S);

++i){

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;

nextarc){

k=p->

adjvex;

(--indegree[k]))

S,k);

if(count<

G.vexnum){

此有向图有回路\n"

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&

&

!

还有课程未安排!

StackEmpty(S)&

xq<

=term_num){

intxf;

//弹出栈顶元素;

xf=atoi(G.vertices2[i].data);

//atoi:

字符串转换成整型数,xf:

学分;

xfh=xfh+xf;

now++;

if(xfh>

credit_lim){

break;

if(pattern==1){

if(xq!

=term_num/2&

now>

top){

now=0;

if(pattern==2){

=1&

xq!

=term_num/2-1&

indegree[i]--;

//减为-1,避免被再次计入;

indegree[k]--;

if(indegree[k]==0)

result[m]=i;

m++;

if(xq<

第%d个学期的课程为:

xq);

for(intj=0;

j<

m;

j++){

课程%s"

G.vertices[result[j]].data);

xq++;

四、程序运行截图

程序开始运行界面

测试数据:

学期一共为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

%s→%s"

G.vertices[i].data,G.vertices[p->

adjvex].data);

(*S).base=(SElemType*)r

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

当前位置:首页 > 成人教育 > 专升本

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

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