数据结构课程设计教学计划编制资料.docx

上传人:b****6 文档编号:7068828 上传时间:2023-01-16 格式:DOCX 页数:23 大小:170.32KB
下载 相关 举报
数据结构课程设计教学计划编制资料.docx_第1页
第1页 / 共23页
数据结构课程设计教学计划编制资料.docx_第2页
第2页 / 共23页
数据结构课程设计教学计划编制资料.docx_第3页
第3页 / 共23页
数据结构课程设计教学计划编制资料.docx_第4页
第4页 / 共23页
数据结构课程设计教学计划编制资料.docx_第5页
第5页 / 共23页
点击查看更多>>
下载资源
资源描述

数据结构课程设计教学计划编制资料.docx

《数据结构课程设计教学计划编制资料.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计教学计划编制资料.docx(23页珍藏版)》请在冰豆网上搜索。

数据结构课程设计教学计划编制资料.docx

数据结构课程设计教学计划编制资料

摘要

教学计划(课程计划)是课程设置的整体规划,它规定不同课程类型相互结构的方式,也规定了不同课程在管理学习方式的要求及其所占比例,同时,对学校的教学、生产劳动、课外活动等作出全面安排,具体规定了学校应设置的学科、课程开设的顺序及课时分配,并对学期、学年、假期进行划分。

根据一定的教育目的和培养目标制定的教学和教育工作的指导文件。

它决定着教学内容总的方向和总的结构,并对有关学校的教学、教育活动,生产劳动和课外活动校外活动等各方面作出全面安排,具体规定一定学校的学科设置、各门学科的教学顺序、教学时数以及各种活动等。

教学计划、教学大纲和教科书互相联系,共同反映教学内容。

近代以来,特别是在实行学科课程的条件下,教学计划主要是学科的计划,或只是学科表。

随着社会经济和科学技术的新发展,教育结构不断发生变革,现代教育和教学理论主张对教学计划的结构实行改革。

除了教学以外,生产劳动、科技活动、发展体力和增进健康的活动、艺术活动和社会活动等也应列入教学计划。

下面就利用对此进行程序设计,已达到预期的目的。

关键字:

数据结构,教学计划编制,抽象数据类型,程序设计

 

1.需求分析

根据课程之间的依赖关系制定课程安排计划,输入课程数及课程之间的关系。

需要利用代码实现排序,以及对各个学期课程安排进行排序并输出。

1.1问题描述

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

假设任何专业都有固定的学习年限,每学年含两学期,每学期的时间长度和学分上限值均相等,每个专业开设的课程都是确定的,而且课程在开设时间的安排必须满足先修关系。

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

每门课恰好占一个学期。

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

1.2设计思路

首先利用拓扑排序对课程先后顺序进行分析,邻接表位主要存储结构,栈为主要辅助结构,给出课程之间的先后关系比如AOV网,然后进行拓扑排序,但当又向图中存在环时,无法查找该图的一个拓扑排序,当图中的所有顶点全部输出,表示对该图排序成功,实现拓扑排序算法时,相应的建立邻接表存储AOV网,为了避免重复检测入度为零的顶点,建立一个栈来对入度为零的顶点进行存放。

根据课程的先后关系,对个学期的课程进行排序,输出。

1.3设计环境、原理

设计环境和器材:

硬件:

计算机;软件:

MicrosoftVisulaC++。

设计原理说明:

运用图的拓扑排序对课程先修排列的实现,并调用递归完成拓扑排序。

1.4实验目的

培养学生用学到的书本知识解决实际问题的能力;培养实际工作所需要的动手能力;培养学生以科学理论和工程上能力的技术,规范地开发大型、复杂、高质量的应用软件和系统软件具有关键性作用。

通过课程设计的实践,学生可以在程序设计方法、上机操作等基本技能和科学作风方面受到比较系统和严格的训练。

1.5实验内容

针对计算机系本科课程,根据课程之间的依赖关系(如离散数学应在数据结构之前开设)制定课程安排计划,并满足各学期课程数目大致相同。

 

2.概要设计:

2.1流程图

voidFindInDegree(ALGraphG,intindegree[])//求图中各节点的入度(如下左图)voidCreatGraph(ALGraph*G)//构件图(如下右图)。

voidTopologicalSort_1(ALGraphG,intnumterm,intuplcredit)//有向图G采用邻接表存储结构(如下左图);

voidTopologicalSort_2(ALGraphG,intnumterm,intuplcredit)//有向图G采用邻接表存储结构(如下右图)。

主函数:

voidmain()

2.2抽象数据类型图的定义

ADTGraph{

数据对象V:

V是具有相同特性的数据元素的集合,称为顶点集.

数据关系R:

R={VR}

VR={(v,w)|v,w∈V,(v,w)表示v和w之间存在直接先修关系}

基本操作P:

voidCreatGraph(ALGraph*);

voidFindInDegree(ALGraph,int*);

voidTopologicalSort_1(ALGraphG,intnumterm,intmaxcredit);

voidTopologicalSort_2(ALGraphG,intnumterm,intmaxcredit);

}ADTGraph

栈的定义:

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.3主程序

intmain() //主函数

{

  intnumterm;  //学期总数

  intuplcredit;//一个学期的学分上限

  intselectway;

  ALGraphG;

  printf("请输入学期总数:

\n");

  scanf("%d",&numterm);

  printf("请输入一个学期的学分上限:

\n");

  scanf("%d",&uplcredit);

  CreatGraph(&G);

  printf("请选择编排策略:

1.课程尽可能集中到前几个学期;2.课程尽量均匀分布\n");

  scanf("%d",&selectway);

  if(selectway==1)

  TopologicalSort_1(G,numterm,uplcredit);

  if(selectway==2)

  TopologicalSort_2(G,numterm,uplcredit);

  system("pause");

  return0;

}

2.4本程序只有两个模块,调用关系简单

主程序模块→拓扑排序模块

 

4.详细设计

4.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;

邻接表的基本操作:

voidCreatGraph(ALGraph*);

创建邻接表

voidFindInDegree(ALGraph,int*);

求一个结点的入度

voidTopologicalSort_1(ALGraphG,intnumterm,intmaxcredit);

拓扑排序来编排课程

voidTopologicalSort_2(ALGraphG,intnumterm,intmaxcredit);

拓扑排序来编排课程

4.2栈的定义

#defineSTACk_INIT_SIZE100//存储空间的初时分配量

#defineSTACKINCREMENT10   //存储空间的分配增量

typedefintElemType;

typedefstruct

{

AdjListvertices;

intvexnum,arcnum;

}ALGraph;

基本操作:

voidInitStack(SqStack*S);

栈的初始化

intStackEmpty(SqStackS);

判断栈是否为空

voidPush(SqStack*S,int);

入栈操作

intPop(SqStack*S,int*e);

出栈操作

4.3主程序和其他算法:

#include

#include

#include//malloc()等

#include//INT_MAX等

#include//EOF(=^Z或F6),NULL

#include//atoi()52

#include//eof()

#include//floor(),ceil(),abs()

#include//exit()

#include//cout,cin//函数结果状态代码

#defineTRUE1

#defineFALSE0

#defineOK1

#defineERROR0

#defineINFEASIBLE-1

typedefintStatus;//Status是函数的类型,其值是函数结果状态代码,如OK等

typedefintBoolean;//Boolean是布尔类型,其值是TRUE或FALSE

#defineMAX_NAME10/*顶点字符串的最大长度*/

#defineMAXCLASS100

intZ=0;

intX=0;

intxqzs,q=1,xfsx;

typedefintInfoType;

typedefcharVertexType[MAX_NAME];/*字符串类型*/

/*图的邻接表存储表示*/

#defineMAX_VERTEX_NUM100

typedefenum{DG}GraphKind;/*{有向图,有向网,无向图,无向网}*/

typedefstructArcNode

{

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

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

InfoType*info;/*网的权值指针)*/

}

ArcNode;/*表结点*/

typedefstruct

{

VertexTypedata;/*顶点信息*/

ArcNode*firstarc;/*第一个表结点的地址,指向第一条依附该顶点的弧的指针*/

}

VNode,AdjList[MAX_VERTEX_NUM];/*头结点*/

typedefstruct

{

AdjListvertices,verticestwo;

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

intkind;/*图的种类标志*/

}ALGraph;/*图的邻接表存储的基本操作*/

intLocateVex(ALGraphG,VertexTypeu)

{/*初始条件:

图G存在,u和G中顶点有相同特征*/

/*操作结果:

若G中存在顶点u,则返回该顶点在图中位置;否则返回-1*/

inti;

for(i=0;i

if(strcmp(u,G.vertices[i].data)==0)

returni;

return-1;

}

StatusCreateGraph(ALGraph*G)

{/*采用邻接表存储结构,构造没有相关信息的图G(用一个函数构造4种图)*/

inti,j,k;

VertexTypeva,vb;

ArcNode*p;

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

");

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

printf("请输入拓扑排序所形成的课程先修关系的边数:

");

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

printf("请输入%d个课程的代表值(<%d个字符):

\n",(*G).vexnum,MAX_NAME);

for(i=0;i<(*G).vexnum;++i)/*构造顶点向量*/

{scanf("%s",(*G).vertices[i].data);

(*G).vertices[i].firstarc=NULL;

}

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

\n",(*G).vexnum,MAX_NAME);

for(i=0;i<(*G).vexnum;++i)/*构造顶点向量*/

{scanf("%s",(*G).verticestwo[i].data);

}

printf("请顺序输入每条弧(边)的弧尾和弧头(以空格作为间隔):

\n");

for(k=0;k<(*G).arcnum;++k)/*构造表结点链表*/

{scanf("%s%s",va,vb);

i=LocateVex(*G,va);/*弧尾*/

j=LocateVex(*G,vb);/*弧头*/

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

p->adjvex=j;

p->info=NULL;/*图*/

p->nextarc=(*G).vertices[i].firstarc;/*插在表头*/

(*G).vertices[i].firstarc=p;

}

returnOK;

}

voidDisplay(ALGraphG)

{/*输出图的邻接矩阵G*/

inti;

ArcNode*p;

switch(G.kind)

{

caseDG:

printf("有向图\n");

}

printf("%d个顶点:

\n",G.vexnum);

for(i=0;i

printf("%s",G.vertices[i].data);

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

\n",G.arcnum);

for(i=0;i

p=G.vertices[i].firstarc;

while(p)

{

printf("%s→%s",G.vertices[i].data,G.vertices[p->adjvex].data);

p=p->nextarc;

}

printf("\n");

}

}

voidFindInDegree(ALGraphG,intindegree[])

{/*求顶点的入度,算法调用*/

inti;

ArcNode*p;

for(i=0;i

indegree[i]=0;/*赋初值*/

for(i=0;i

{

p=G.vertices[i].firstarc;

while(p)

{indegree[p->adjvex]++;

p=p->nextarc;

}

}

}

typedefintSElemType;/*栈类型*/

/*栈的顺序存储表示*/

#defineSTACK_INIT_SIZE10/*存储空间初始分配量*/

#defineSTACKINCREMENT2/*存储空间分配增量*/

typedefstructSqStack

{

SElemType*base;/*在栈构造之前和销毁之后,base的值为NULL*/

SElemType*top;/*栈顶指针*/

intstacksize;/*当前已分配的存储空间,以元素为单位*/

}SqStack;/*顺序栈*/

/*顺序栈的基本操作*/

StatusInitStack(SqStack*S)

{/*构造一个空栈S*/

(*S).base=(SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType));

if(!

(*S).base)

exit(OVERFLOW);/*存储分配失败*/

(*S).top=(*S).base;

(*S).stacksize=STACK_INIT_SIZE;

returnOK;

}

StatusStackEmpty(SqStackS)

{/*若栈S为空栈,则返回TRUE,否则返回FALSE*/

if(S.top==S.base)

returnTRUE;

else

returnFALSE;

}

StatusPop(SqStack*S,SElemType*e)

{/*若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR*/

if((*S).top==(*S).base)

returnERROR;

*e=*--(*S).top;

returnOK;

}

StatusPush(SqStack*S,SElemTypee)

{/*插入元素e为新的栈顶元素*/

if((*S).top-(*S).base>=(*S).stacksize)/*栈满,追加存储空间*/

{

(*S).base=(SElemType*)realloc((*S).base,((*S).stacksize+STACKINCREMENT)*sizeof

(SElemType));

if(!

(*S).base)

exit(OVERFLOW);/*存储分配失败*/

(*S).top=(*S).base+(*S).stacksize;

(*S).stacksize+=STACKINCREMENT;

}

*((*S).top)++=e;

returnOK;

}

typedefintpathone[MAXCLASS];

typedefintpathtwo[MAXCLASS];

StatusTopologicalSort(ALGraphG)

{/*有向图G采用邻接表存储结构。

若G无回路,则输出G的顶点的一个拓扑序列并返回OK,*/

/*否则返回ERROR。

*/

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

SqStackS;

pathonea;

pathtwob;

ArcNode*p;

FindInDegree(G,indegree);/*对各顶点求入度indegree[0..vernum-1]*/

InitStack(&S);/*初始化栈*/

for(i=0;i

if(!

indegree[i])

Push(&S,i);/*入度为0者进栈*/

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

while(!

StackEmpty(S))

{/*栈不空*/

Pop(&S,&i);

a[i]=*G.vertices[i].data;

b[i]=*G.verticestwo[i].data;

printf("课程%s→学分%s",G.vertices[i].data,G.verticestwo[i].data);

/*输出i号顶点并计数*/

++count;

for(p=G.vertices[i].firstarc;p;p=p->nextarc)

{/*对i号顶点的每个邻接点的入度减1*/

k=p->adjvex;

if(!

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

Push(&S,k);

}

}

if(count

{printf("此有向图有回路\n");

returnERROR;

}

else

{printf("为一个拓扑序列。

\n");

}

while(q<=xqzs)

{intC=0;

if(X<=G.arcnum)

{while(C<=xfsx)

{C+=*G.verticestwo[Z].data;

++Z;

}

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

",q);

while(X<=Z)

{cout<<*G.vertices[X].data<<"";

++X;

}

cout<

q++;

}

else

{cout<<"课程编制已经完成!

"<

returnOK;

}

}

returnOK;

}

voidmain()

{ALGraphf;

printf("教学计划编制问题的数据模型为拓扑排序AOV-网结构。

\n");

printf("以下为教学计划编制问题的求解过程:

\n");

printf("请输入学期总数:

");

scanf("%d",&xqzs);

printf("请输入学期的学分上限:

");

scanf("%d",&xfsx);

CreateGraph(&f);

Display(f);

TopologicalSort(f);

}

5.用户使用和说明

使用VC++,打开教学计划编制问题.cpp文件,接着编译,无错误,然后重建也没有错误,最后执行该文件。

显示如下图:

要求输入学期总数、一个学期的学分上限、需要编排课程总数、课程名、课程号、该课程的学分,按照出现的每一步来输入该课程设计所提供的相关数据。

然后还要输入课程先修课程总数,依据教科书图7.26,可以算出有16种关系,分别输出如下图所示。

接着程序会根据这些数据,自动生成建立好的邻接表,用户可以根据系统显示的选择编排策略进行选择,有两种编排策略,最后结果体现在实验的正确测试结果里(如上图)。

6.调试分析

6.1实验过程中出现的问题及解决方法

我们在实验过程中遇到的最大难题是两个课程排序算法的编写。

刚开始的时候没有任何的思路,网上也只有拓扑排序的算法,对于课程设计要求的排序算法没有任何头绪。

经过请教老师和同学以及翻阅了一些相关书籍,并在网上的搜索有了排序算法的大体思路。

经过三天的修改,终于写出了符合要求的排序算法。

6.2测试数据

学期总数:

6;学分上限:

10;该专业共开设12门课,课程号从01到12,学分顺序为2,3,4,3,2,3,4,4,7,5,2,3。

6.3测试结果(包含正确和错误的)

正确测试结果:

错误测试结果:

6.4测试数据及程序运行情况

输入的内容如下:

课程编号  课程名称   学分   

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

当前位置:首页 > 幼儿教育 > 幼儿读物

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

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