不数据结构教学计划编制问题a.docx
- 文档编号:6550469
- 上传时间:2023-05-10
- 格式:DOCX
- 页数:30
- 大小:151.37KB
不数据结构教学计划编制问题a.docx
《不数据结构教学计划编制问题a.docx》由会员分享,可在线阅读,更多相关《不数据结构教学计划编制问题a.docx(30页珍藏版)》请在冰点文库上搜索。
不数据结构教学计划编制问题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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 教学计划 编制 问题