教学计划编制问题说明书.docx
《教学计划编制问题说明书.docx》由会员分享,可在线阅读,更多相关《教学计划编制问题说明书.docx(25页珍藏版)》请在冰豆网上搜索。
教学计划编制问题说明书
*******************
实践教学
*******************
兰州理工大学
计算机与通信学院
2012年春季学期
数据结构课程设计
题目:
教学计划编制问题
专业班级:
信计一班
姓名:
肖雄
学号:
********
******
成绩:
_______________
摘要
教学计划(课程计划)是课程设置的整体规划,它规定不同课程类型相互结构的方式,也规定了不同课程在管理学习方式的要求及其所占比例,同时,对学校的教学、生产劳动、课外活动等作出全面安排,具体规定了学校应设置的学科、课程开设的顺序及课时分配,并对学期、学年、假期进行划分。
根据一定的教育目的和培养目标制定的教学和教育工作的指导文件。
它决定着教学内容总的方向和总的结构,并对有关学校的教学、教育活动,生产劳动和课外活动校外活动等各方面作出全面安排,具体规定一定学校的学科设置、各门学科的教学顺序、教学时数以及各种活动等。
教学计划、教学大纲和教科书互相联系,共同反映教学内容。
近代以来,特别是在实行学科课程的条件下,教学计划主要是学科的计划,或只是学科表。
随着社会经济和科学技术的新发展,教育结构不断发生变革,现代教育和教学理论主张对教学计划的结构实行改革。
除了教学以外,生产劳动、科技活动、发展体力和增进健康的活动、艺术活动和社会活动等也应列入教学计划。
下面就利用对此进行程序设计,已达到预期的目的。
关键字:
数据结构,教学计划编制,抽象数据类型,程序设计
1.采用类c语言定义相关的数据类型
头结点、表结点、邻接表的定义
#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);
拓扑排序来编排课程
栈的定义
#defineSTACk_INIT_SIZE100//存储空间的初时分配量
#defineSTACKINCREMENT10 //存储空间的分配增量
typedefintElemType;
typedefstruct
{
AdjListvertices;
intvexnum,arcnum;
}ALGraph;
基本操作:
voidInitStack(SqStack*S);
栈的初始化
intStackEmpty(SqStackS);
判断栈是否为空
voidPush(SqStack*S,int);
入栈操作
intPop(SqStack*S,int*e);
出栈操作
2.各模块的伪码算法
voidFindInDegree(ALGraphG,intindegree[])
{/*求顶点的入度,算法调用*/
inti;
ArcNode*p;
for(i=0;iindegree[i]=0;/*赋初值*/
for(i=0;i{
p=G.vertices[i].firstarc;
while(p)
{indegree[p->adjvex]++;
p=p->nextarc;
}
}
}
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;iif(!
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");
}
3.函数的调用关系图
本程序只有两个模块,调用关系简单
主程序模块→拓扑排序模块
voidFindInDegree(ALGraphG,intindegree[])//求图中各节点的入度(如下左图)voidCreatGraph(ALGraph*G)//构件图(如下右图)。
voidTopologicalSort_1(ALGraphG,intnumterm,intuplcredit)//有向图G采用邻接表存储结构(如下左图);
voidTopologicalSort_2(ALGraphG,intnumterm,intuplcredit)//有向图G采用邻接表存储结构(如下右图)。
4.调试分析
4.1实验过程中出现的问题及解决方法
我们在实验过程中遇到的最大难题是两个课程排序算法的编写。
刚开始的时候没有任何的思路,网上也只有拓扑排序的算法,对于课程设计要求的排序算法没有任何头绪。
经过请教老师和同学以及翻阅了一些相关书籍,并在网上的搜索有了排序算法的大体思路。
经过三天的修改,终于写出了符合要求的排序算法。
4.2测试数据
学期总数:
6;学分上限:
10;该专业共开设12门课,课程号从01到12,学分顺序为2,3,4,3,2,3,4,4,7,5,2,3。
4.3测试结果(包含正确和错误的)
正确测试结果:
错误的测试结果
(注:
最好能给出一个测试实例)
4.4测试数据及程序运行情况
输入的内容如下:
课程编号 课程名称 学分 先决条件
01 程序设计基础 2 无
02 离散数学 3 01
03 数据结构 4 01,02
04 汇编语言 3 01
05 语言的设计和分析 2 03,04
06 计算机原理 3 11
07 编译原理 4 05,03
08 操作系统 4 03,06
09 高等数学 7 无
10 线性代数 5 09
11 普通物理 2 09
12 数值分析 3 09,10,01
两种编排方法都输出结果为:
第一学期学的课程有:
高等数学程序设计基础;
第二学期学的课程有:
普通物理线性代数汇编语言;
第三学期学的课程有:
数值分析计算机原理离散数学;
第四学期学的课程有:
数据结构;
5.源程序(带注释)
#include
#include//floor(),ceil(),abs()
#include
#include
#include//malloc()等
#include//INT_MAX等
#include//atoi()52
#include//eof()
#include//exit()
#include//cout,cin
//函数结果状态代码
intn;
typedefstruct/*定义结构体数组*/
{
charname[20];
intnumber;
}goods;
#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;iif(strcmp(u,G.vertices[i].data)==0)
returni;
return-1;
}
StatusCreateGraph(ALGraph*G)
{/*采用邻接表存储结构,构造没有相关信息的图G(用一个函数构造种图)*/
inti,j,k;
VertexTypeva,vb;
ArcNode*p;
printf("输入在教学计划内的课程总数:
");
scanf("%d",&(*G).vexnum);
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("输入以上课程有先修关系的类数:
");
scanf("%d",&(*G).arcnum);
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("构成的简单图:
");
printf("%d个顶点:
\n",G.vexnum);
for(i=0;iprintf("%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;iindegree[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;
}
voidClearStack(SqStack*S)//清空栈的操作
{
S->top=S->base;
}
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];
boolhas=false;
SqStackS;
pathonea;
pathtwob;
ArcNode*p;
FindInDegree(G,indegree);/*对各顶点求入度indegree[0..vernum-1]*/
InitStack(&S);/*初始化栈*/
for(i=0;iif(!
indegree[i])
{Push(&S,i);
//cout<<*G.vertices[i].data<}
/*入度为者进栈*/
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号顶点的每个邻接点的入度减*/
k=p->adjvex;
if(!
(--indegree[k]))/*若入度减为,则入栈*/
{Push(&S,k);
//cout<<*G.vertices[i].data<}
}
}
if(count{printf("此有向图有回路\n");
returnERROR;
}
else
{printf("为一个拓扑序列。
\n");
has=true;
}
/*
voidSave()
{
FILE
}
*/
//输出内容===========================================================
FindInDegree(G,indegree);/*对各顶点求入度indegree[0..vernum-1]*/
ClearStack(&S);
cout<<"***************************课程安排如下***************************"<intxq=1;//学期数
intxxf;
while(xq<=xqzs)
{
intresult[20];
intrtop=0;
intnn=0;
//intccount=0;
//学期学分计算
xxf=0;
for(i=0;i