不数据结构教学计划编制问题a.docx

上传人:b****5 文档编号:11548509 上传时间:2023-03-19 格式:DOCX 页数:30 大小:151.37KB
下载 相关 举报
不数据结构教学计划编制问题a.docx_第1页
第1页 / 共30页
不数据结构教学计划编制问题a.docx_第2页
第2页 / 共30页
不数据结构教学计划编制问题a.docx_第3页
第3页 / 共30页
不数据结构教学计划编制问题a.docx_第4页
第4页 / 共30页
不数据结构教学计划编制问题a.docx_第5页
第5页 / 共30页
点击查看更多>>
下载资源
资源描述

不数据结构教学计划编制问题a.docx

《不数据结构教学计划编制问题a.docx》由会员分享,可在线阅读,更多相关《不数据结构教学计划编制问题a.docx(30页珍藏版)》请在冰豆网上搜索。

不数据结构教学计划编制问题a.docx

不数据结构教学计划编制问题a

1采用类c语言定义相关的数据类型

typedefcharVertexType[MAX_NAME];

intTotalTerms;//学期总数

intMaxScores;//学分上限

typedefstructArcNode

{

intadjvex;//该弧所指向的顶点的位置弧的节点结构

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

}ArcNode;

/*查找图中某个顶点位置*/

intLocateVex(ALGraphG,VertexTypeu)

/*输出图G的信息*/

voidDisplay(ALGraphG)

*求顶点的入度*/

voidFindInDegree(ALGraphG,intindegree[])

structName

{charc[20];

}name;

voidpuanduan(VertexTypestr,structNamename[],intn)

/*栈定义*/

typedefintSElemType;//栈类型

#defineStack_NUM20//存储空间初始分配量

#defineStack_MoreNUM5//存储空间分配增量

typedefstructSqStack

*拓扑排序*/

intTopoSort(ALGraphG,AdjListTemp,structNamename[])

2.各模块的伪码算法

(1)-图的邻接表存储表示-

intadjvex;该弧所指向的顶点的位置弧的节点结构

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

}ArcNode;链表结点

typedefstruct链接表

{VertexTypedata;顶点信息

intgrades;存储学分信息

ArcNode*firstarc;指向第一条依附该顶点的弧的指针

}VNode,AdjList[MAX_VERTEX_NUM];头结点

typedefstruct

{AdjListvertices;vertices存储课程名

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

}ALGraph;

voidOUTPUT()

输出菜单

(2)采用邻接表存储结构

输出提示,按提示操作程序

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

");

printf("请输入各个课程的先修课程的总和(弧总数):

");

printf("请输入%d个课程的课程号(最多%d个字符,数字+字母):

",G.vexnum,MAX_NAME);

printf("请输入下列课程的先修课程(无先修课程输入0结束后也输入0)\n");

(3)输出图G的信息

voidDisplay(ALGraphG)

printf("有向图\n");

printf("%d个顶点",G.vexnum);

拓扑排序

ArcNode*p;//对输出顶点计数

while(!

StackEmpty(S))

{Pop(S,i);

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

Temp[j++]=G.vertices[i];//将当前的拓扑序列保存起来

++count;//输出i号顶点并计数

for(p=G.vertices[i].firstarc;p;p=p->nextarc)//对i号顶点的每个邻接点的入度减1

{k=p->adjvex;

if(!

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

Push(S,k);

(4)voidmain()

初始化

strucNamename[N]={{"C1"},{"C2"},{"C3"},{"C4"},{"C5"},{"C6"},{"C7"},{"C8"},{"C9"},{"C10"},{"C11"},{"C12"}};

3函数调用关系图

-

4试调分析-

根据问题描述及要求,可知设计中需要定义先修关系的AOV网图中的顶点及弧边的结构体,在运行结果中将图的信息显示出来,利用先修关系将课程排序,最后解决问题——输出每学期的课程。

end

采用第二种策略:

使课程尽可能地集中在前几个学期中

根据教学计划中的课程及其关系和学分定义图的顶点和边的结构体

创建图CreateGraph():

结合先修关系的AOV网,采用邻接链表存储

菜单OUTPUT():

显示代号所对应课程及课程的先修课程

前插法

main

拓扑排序TopoSort(G):

将课程排序后并决定出每学期所学课程 

输出图G的信息Display(G):

将图的顶点和弧边输出

 

5测试结果

测试数据:

输入的内容如下:

课程编号   课程名称   学分   先决条件

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

学期总数:

6;学分上限:

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

两种编译都输出结果:

第一学期学的课程有:

高等数学

第二学期学的课程有:

普通物理线性代数计算机原理

第三学期学的课程有:

课程设计基础数据结构离散数学

第四学期学的课程有:

操作系统汇编语言语言的设计与分析

第五学期学的课程有:

编译原理数值分析

第六学期学的课程有:

总结

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

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

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

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

经过此次课程设计,自己解决编程中从在的问题,我们认识到了理论与实践结合的重要性,仅仅只是从课本上学到算法原理是远远不够的。

在实践中,我们总会出现许多错误。

这就要求我们以一个脚踏实地的态度来处理问题。

我们深刻地认识到自己写程序的不足,使我们学到了好多有用的知识,让我们明白了算法与编程的密切关系,使我们受益匪浅。

参考文献

1《数据结构》(c语言描述)冶金工业出版社

2《C程序设计》谭浩强

3王连相,冯锋编著.C/C++程序设计.北京:

中国科学技术出版社,2005

4严蔚敏,吴伟民编著.数据结构(C语言版).北京:

清华大学出版社,1997

5严蔚敏,吴伟民编著.数据结构题集(C语言版).北京:

清华大学出版社,

致谢

首先感谢我的指导老师张永老师,他在我的课程设计过程中提出了指导性的方案和架构,并指引我阅读相关的资料和书籍,使我在不熟悉的领域中仍能迅速掌握新的技术。

并且在课设期间多次亲身检查给出我程序中的不足,也为我拓宽思路,不至于我的程序过于单一,非常感谢张永老师

我的同学在设计完成后对程序的测试,没有他们,也许就难以发现一些潜在的错误,在此一并表示感谢。

附件1

1.源程序代码

(/*************************************************************************************

结构体文件

|结构体名|作用|备注

__________________________________________________________________________________

||用于在处理数据时保存各个信息|

||1.该门课程是否已经编排|动态数组

|CourseHead|2.给课程的直接先修课的个数|与CourseLink一起构成链表

||3.以该门课程为先修的后修课程结点|存储结构

||4.课程的名字5.课程号6.学分|

_________________________________________________________________________________

|CourseLink|CourseHead的链|动态结点

||1.课程在CourseHead的下标|与CourseHead一起构成链表

||2.下一个CourseLink的地址|存储结构

_________________________________________________________________________________

||保存符合要求的课程安排情况|动态结点,头结点不保存

|Topo|1.课程安排的平均性|课程安排情况,但是保存

||2.ArryInTopo型数组存储安排情况|课程安排平均的总数目

||3.下一中课程安排的结点地址|

__________________________________________________________________________________

||保存某一门课的开课时间|动态数组,

|ArryInTopo|1.该门课在CourseHead的下标|它在Topo的内部

||2.该课程的开课时间|

___________________________________________________________________________________

||保存可以选择的课程|动态结点

|Zero|1.课程在CourseHead的下标|在编程是因为递归的需要

||2.下一个课程结点的地址|即时地加上去的结构体

___________________________________________________________________________________

**************************************************************************************/

/*该结构体用于保存课程的学分和该课程在一维数组的下标

因为用到链表存储结构(表头是先修课程,链是与以该课程的为先修的课程)

所以有若下*/)

#include

#include

#include

#include

#include

#include

#include

#include

structCourseLink//该结构体用于具体运算

{//关联了课程的关系

intIndex;//该课程在一维数组的下标,绑定他与课程的关系

CourseLink*next;//下一门与他同一尾节点的课程

};

structCourseHead//表头结点的结构体

{

intflag;//标记该门课程是否已经编排

intpriornum;//给课程的直接先修课的个数

CourseLink*first;//以该门课程为先修的后修课程

charName[30];//课程的名字

charOfcourse[4];//课程号

floatScore;//学分

};

structArryInTopo

{

intIndex;//保存课程的序号

intTime;//保存课程的开课时间

};

structTopo

{

intlevel;//标记是否平均分配,也就是课程安排效果标记

ArryInTopo*toporesualt;//一个一维数组保存拓扑排序--保存课程的序号

Topo*next;//拓扑排序的下一种情况

};

 

structZero//保存可以选择的课程

{

intzero;//课程在原始数据里的下标

Zero*next;//下一个课程结点的地址

};

//**************函数介绍********************************************

voidInitData();//......................1调用一下两个函数完成数据初始化

voidInitData(intnum);//.................2由课程数目num来完成数据的细节

floatInitData(char*b);//..............2方便判断输入数据的准确性而已

voidStartTopoSort();//..................1初始化要用到的各个数据再调用下面这个函数

voidTopoSort(inttopotempsum,inttime);//.2递归函数,完成拓扑排序,用到以下四个函数

voidCheck(intindex);//...................3当选择course[index]时,相应的链表的

//3头结点的priornum项要减一

voidCheckBack(intindex);//...............3当退选course[index]时,相应的链表的

//3头结点的priornum项要加一

intZERO();//............................3统计该层递归可以选择的课程

//并且完成可选课程的记录

voidIfsuccessed();//......................3当课程安排成功时将课程安排记录保存

//并对课程安排做评价

voidPrint();//............................1根据客户要求输出相应的课程安排

voidprintf0();//..........................1界面

voidprintf1(int);//......................1负责输出课程信息,并且还调用下面

voidprintf2();//...........................2输出课程的联系

voidprintf1(FILE*);//......................1负责将课程信息写入文件,并且还调用下面

voidprintf2(FILE*);//...........................2将课程的联系写入文件

//**************函数介绍********************************************

intTime=0;//全局变量学期总数

floatMaxSource=0.0;//全局变量一学期的学分上限

intSourceNum=0;//全局变量课程总数

CourseHead*coursehead;//全局变量链表的有节点数组

Topo*topo;//全局变量保存课程的安排情况,

//头结点保存课程安排平均的总数目

ArryInTopo*topotemp;//全局变量数组临时保存某一种拓扑排序情况

Zero*ZeroTemp;//全局变量链式保存入度为零的课程的index

//随着递归的进行他的值也在变化

int*ClassInTime;//全局变量临时保存每一学期课程的数目

voidmain()

{

chari;

printf0();

do

{

printf("按任意非键开始,按退出!

\n\n");

i=getch();

fflush(stdin);//刷新输入流

if(i!

=27)

{

system("cls");//刷新屏幕

printf0();

InitData();//输入数据

StartTopoSort();//处理数据

Print();//按要求输出结果

}

if(i==27)

return;

}while(i!

=27);

}

//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@数据初始化全部完成

voidInitData()

{

Time=int(InitData("学期总数"));//输入学期总数

MaxSource=InitData("一学期的学分上限");//输入一学期的学分上限

SourceNum=int(InitData("课程总数"));//输入课程总数

InitData(SourceNum);//输入课程有关的各个信息

}

//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@数据初始化全部完成

floatInitData(char*b)//输入学期总数,一学期的学分上限,课程总数

{

intflag=0;

floata=0;

do

{

if(flag==1)

printf("请重新输入%s\n",b);

else

printf("请输入%s:

\n",b);

scanf("%f",&a);

fflush(stdin);

flag=1;

}while(a<=0.0);//严格检查输入数据的准确性

returna;

}

voidInitData(intnum)

/*输入课程有关的各个信息:

每门课的课程名Source->name[];

课程号(固定占3位的字母数字串)Source->OfSource[];

学分Source->Source;

直接先修课的课程号*/

{

inti=0,j=0;

intflag=0;//标记出错

coursehead=(CourseHead*)malloc(num*sizeof(CourseHead));

//为全局变量course和coursehead分配内存

CourseLink*courselink=NULL;

CourseLink*courselinktemp=NULL;

for(i=0;i

{

coursehead[i].Name[0]='\0';

coursehead[i].Ofcourse[0]='\0';

coursehead[i].Score=0;

coursehead[i].flag=0;

coursehead[i].first=NULL;

coursehead[i].priornum=0;

}

//为全局变量course和coursehead完成初始化

for(i=0;i

{

do

{

flag=0;

if(flag==1)

printf("输入的信息不符合要求,请检查后再输入!

\n请重新输入第%d门课程的课程名(限长12位),课程号(固定占3位),学分\n",i);

printf("请输入第%d门课程的课程名(限长14位),课程号(固定占3位),学分\n",i+1);

scanf("%s%s%f",coursehead[i].Name,coursehead[i].Ofcourse,&(coursehead[i].Score));

fflush(stdin);

//正确输入课程名

if(strlen(coursehead[i].Name)>28)

{

printf("警告!

课程名太长,请简写!

\n\n");flag=1;

}

//正确输入课程号

if(strlen(coursehead[i].Ofcourse)!

=3)

{

printf("警告!

课程号必须是是三位\n\n\n");flag=1;

}

for(j=0;flag==0&&j

if(strcmp(coursehead[i].Ofcourse,coursehead[j].Ofcourse)==0)

{

printf("警告!

已经有了一个同样的课程号!

\n\n");

flag=1;

break;

}

if(coursehead[i].Score>MaxSource||coursehead[i].Score<=0.0)

{

printf("警告!

学分必须是在0到最大限制%3.1f之间,请检查后再输入\n\n",MaxSource);flag=1;

}//正确输入学分

}while(flag==1);

//严格控制输入数据的正确性

}

printf1

(1);//输出已经输入的课程信息

//以下是输入课程的关系

intSort=0,NUM=0;//先修课的序号,先修课的的个数

chartemp[4];//保存输入的课程号

do

{

printf("请输入课程号与它的先修课的的个数(输入00结束):

\n");

scanf("%s%d",temp,&NUM);

fflush(stdin);

Sort=SourceNum;

for(i=0;i

if(strcmp(temp,coursehead[i].Ofcourse)==0)

{

Sort=i;

break;

}

if(NUM>=SourceNum)

printf("警告!

先修课数目值无意义!

\n\n

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

当前位置:首页 > 医药卫生 > 基础医学

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

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