数据结构与算法教学编制_数据结构与算法面试题

2020-02-27 其他范文 下载本文

数据结构与算法教学编制由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“数据结构与算法面试题”。

目 录

1.需求分析.........................................错误!未定义书签。2.概要设计.........................................错误!未定义书签。3.详细设计.........................................错误!未定义书签。4.测试分析.........................................错误!未定义书签。课程设计总结.......................................错误!未定义书签。参考文献...........................................错误!未定义书签。

1.需求分析

根据课程之间的依赖关系制定课程安排计划,输入课程数及课程之间的关系。需要利用代码实现排序,以及对各个学期课程安排进行排序并输出。

1.1问题描述

大学的每个专业都要制定教学计划。假设任何专业都有固定的学习年限,每学年含两学期,每学期的时间长度和学分上限值均相等,每个专业开设的课程都是确定的,而且课程在开设时间的安排必须满足先修关系。每门课程有哪些先修课程是确定的,可以有任意多门,也可以没有。每门课恰好占一个学期。试在这样的前提下设计一个教学计划编制程序。

1.2设计思路

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

1.3设计环境、原理

设计环境和器材: 硬件:计算机;软件:Microsoft Visula C++。

设计原理说明:运用图的拓扑排序对课程先修排列的实现,并调用递归完成拓扑排序。

1.4实验目的培养学生用学到的书本知识解决实际问题的能力;培养实际工作所需要的动手能力;培养学生以科学理论和工程上能力的技术,规范地开发大型、复杂、高质量的应用软件和系统软件具有关键性作用。通过课程设计的实践,学生可以在程序设计方法、上机操作等基本技能和科学作风方面受到比较系统和严格的训练。

1.5实验内容

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

2.概要设计:

2.1流程图

void FindInDegree(ALGraph G, int indegree[])//求图中各节点的入度(如下左图)void CreatGraph(ALGraph *G)//构件图(如下右图)。

void TopologicalSort_1(ALGraph G,int numterm,int uplcredit)//有向图G采用邻接表存储结构(如下左图);

void TopologicalSort_2(ALGraph G,int numterm,int uplcredit)//有向图G采用邻接表存储结构(如下右图)。

主函数: void main()

2.2抽象数据类型图的定义 ADT Graph{

数据对象V:V是具有相同特性的数据元素的集合,称为顶点集.数据关系R: R={VR} VR={(v,w)|v,w∈V,(v,w)表示v和w之间存在直接先修关系} 基本操作P: void CreatGraph(ALGraph *);void FindInDegree(ALGraph , int *);void TopologicalSort_1(ALGraph G,int numterm,int maxcredit);void TopologicalSort_2(ALGraph G,int numterm,int maxcredit);}ADT Graph 栈的定义: ADT Stack{ 数据对象:D={ai|ai∈ElemSet,i=1,2,…n,n>=0} 数据关系:R1={﹤ai-1 ai﹥|ai-1,ai∈D,i=2,…,n} 基本操作: void InitStack(SqStack *S);int StackEmpty(SqStack S);void Push(SqStack *S, int);int Pop(SqStack *S, int *e);}ADT Stack 2.3主程序

int main()//主函数 {

int numterm;//学期总数

int uplcredit;//一个学期的学分上限

int selectway;

ALGraph G;

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

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

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

3.详细设计

3.1头结点、表结点、邻接表的定义

#define MAX_VERTEX_NUM 100 //最大课程总数 typedef struct ArcNode{ int adjvex;struct ArcNode *nextarc;}ArcNode;typedef struct VNode{ char name[24];

//课程名 int claid;

//课程号

int credit;

//课程的学分 int indegree;

//该结点的入度 int state;

//该节点的状态 ArcNode *firstarc;//指向第一条依附该顶点的弧的指针 }VNode,AdjList[MAX_VEXTEX_NUM];typedef struct{ AdjList vertices;int vexnum, arcnum;}ALGraph;邻接表的基本操作:

void CreatGraph(ALGraph *);创建邻接表

void FindInDegree(ALGraph , int *);求一个结点的入度

void TopologicalSort_1(ALGraph G,int numterm,int maxcredit);拓扑排序来编排课程

void TopologicalSort_2(ALGraph G,int numterm,int maxcredit);拓扑排序来编排课程

3.2栈的定义

#define STACk_INIT_SIZE 100 //存储空间的初时分配量 #define STACKINCREMENT 10

//存储空间的分配增量

typedef int ElemType;typedef struct { AdjList vertices;int vexnum, arcnum;}ALGraph;基本操作:

void InitStack(SqStack *S);栈的初始化

int StackEmpty(SqStack S);判断栈是否为空

void Push(SqStack *S, int);入栈操作

int Pop(SqStack *S, int *e);出栈操作

3.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// 函数结果状态代码 #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define INFEASIBLE-1 typedef int Status;// Status是函数的类型,其值是函数结果状态代码,如OK等

typedef int Boolean;// Boolean是布尔类型,其值是TRUE或FALSE #define MAX_NAME 10 /* 顶点字符串的最大长度 */ #define MAXCLASS 100 int Z=0;int X=0;int xqzs,q=1,xfsx;typedef int InfoType;typedef char VertexType[MAX_NAME];/* 字符串类型 */ /* 图的邻接表存储表示 */ #define MAX_VERTEX_NUM 100 typedef enum{DG}GraphKind;/* {有向图,有向网,无向图,无向网} */ typedef struct ArcNode { int adjvex;/* 该弧所指向的顶点的位置 */ struct ArcNode *nextarc;/* 指向下一条弧的指针 */ InfoType *info;/* 网的权值指针)*/ } ArcNode;/* 表结点 */ typedef struct { VertexType data;/* 顶点信息 */ ArcNode *firstarc;/* 第一个表结点的地址,指向第一条依附该顶点的弧的指针 */ } VNode,AdjList[MAX_VERTEX_NUM];/* 头结点 */ typedef struct { AdjList vertices,verticestwo;int vexnum,arcnum;/* 图的当前顶点数和弧数 */ int kind;/* 图的种类标志 */ }ALGraph;/* 图的邻接表存储的基本操作 */ int LocateVex(ALGraph G,VertexType u){ /* 初始条件: 图G存在,u和G中顶点有相同特征 */ /* 操作结果: 若G中存在顶点u,则返回该顶点在图中位置;否则返回-1 */ int i;for(i=0;iadjvex=j;p->info=NULL;/* 图 */ p->nextarc=(*G).vertices[i].firstarc;/* 插在表头 */(*G).vertices[i].firstarc=p;} return OK;} void Display(ALGraph G){ /* 输出图的邻接矩阵G */ int i;ArcNode *p;switch(G.kind){ case DG: printf(“有向图n”);} printf(“%d个顶点:n”,G.vexnum);for(i=0;iadjvex].data);p=p->nextarc;} printf(“n”);}

void FindInDegree(ALGraph G,int indegree[]){ /* 求顶点的入度,算法调用 */ int i;ArcNode *p;for(i=0;iadjvex]++;p=p->nextarc;} } } typedef int SElemType;/* 栈类型 */ /*栈的顺序存储表示 */ #define STACK_INIT_SIZE 10 /* 存储空间初始分配量 */ #define STACKINCREMENT 2 /* 存储空间分配增量 */ typedef struct SqStack { SElemType *base;/* 在栈构造之前和销毁之后,base的值为NULL */ SElemType *top;/* 栈顶指针 */ int stacksize;/* 当前已分配的存储空间,以元素为单位 */ }SqStack;/* 顺序栈 */ /* 顺序栈的基本操作 */ Status InitStack(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;return OK;} Status StackEmpty(SqStack S){ /* 若栈S为空栈,则返回TRUE,否则返回FALSE */ if(S.top==S.base)return TRUE;else return FALSE;} Status Pop(SqStack *S,SElemType *e){ /* 若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR */ if((*S).top==(*S).base)return ERROR;*e=*--(*S).top;return OK;} Status Push(SqStack *S,SElemType e){ /* 插入元素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;return OK;} typedef int pathone[MAXCLASS];typedef int pathtwo[MAXCLASS];Status TopologicalSort(ALGraph G){ /* 有向图G采用邻接表存储结构。若G无回路,则输出G的顶点的一个拓扑序列并返回OK, */ /* 否则返回ERROR。*/ int i,k,j=0,count,indegree[MAX_VERTEX_NUM];SqStack S;pathone a;pathtwo b;ArcNode *p;FindInDegree(G,indegree);/* 对各顶点求入度indegree[0..vernum-1] */ InitStack(&S);/* 初始化栈 */ for(i=0;inextarc){ /* 对i号顶点的每个邻接点的入度减1 */ k=p->adjvex;if(!(--indegree[k]))/* 若入度减为0,则入栈 */ Push(&S,k);} } if(count

while(q

4.用户使用和说明

使用VC++,打开sjjg.cpp文件,接着编译,无错误,然后重建也没有错误,最后执行该文件。显示如下图:

要求输入学期总数、一个学期的学分上限、需要编排课程总数、课程名、课程号、该课程的学分,按照出现的每一步来输入该课程设计所提供的相关数据。然后还要输入课程先修课程总数,依据教科书图7.26,可以算出有16种关系,分别输出如下图所示。接着程序会根据这些数据,自动生成建立好的邻接表,用户可以根据系统显示的选择编排策略进行选择,有两种编排策略,最后结果体现在实验的正确测试结果里(如上图)。

5.调试分析

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

我们在实验过程中遇到的最大难题是两个课程排序算法的编写。刚开始的时候没有任何的思路,网上也只有拓扑排序的算法,对于课程设计要求的排序算法没有任何头绪。经过请教老师和同学以及翻阅了一些相关书籍,并在网上的搜索有了排序算法的大体思路。经过三天的修改,终于写出了符合要求的排序算法。

5.2测试数据

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

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

正确测试结果:

错误测试结果:

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

输入的内容如下: 课程编号

课程名称

学分

先决条件 01

程序设计基础

无 02

离散数学

01 03

数据结构

01,02 04

汇编语言

01 05 语言的设计和分析

03,04 06

计算机原理 07

编译原理

05,03 08

操作系统

03,06 09

高等数学

无 10

线性代数

09 11

普通物理

09 12

数值分析

09,10,01 两种编排方法都输出结果为: 第一学期学的课程有:高等数学程序设计基础; 第二学期学的课程有:普通物理 线性代数 汇编语言; 第三学期学的课程有:数值分析 计算机原理 离散数学; 第四学期学的课程有:数据结构;

第五学期学的课程有:操作系统 语言的设计和分析; 第六学期学的课程有:编译原理。

6.总结

刚开始学的时候确实有很多地方我很不理解,每次上课时老师都会给我们出不同的设计题目,对于我们一个初学者来说,无疑是一个具大的挑战,撞了几次壁之后,我决定静下心来,仔细去写程序。老师会给我们需要编程的内容一些讲解,顺着老师的思路,来完成自己的设计,我们可以开始运行自己的程序,可是好多处的错误让人看的可怕,还看不出到底是哪里出现了错误,但是程序还是得继续下去,我多次请教了老师和同学,逐渐能自己找出错误,并加以改正。经过了这次课程设计,现在已经可以了解很多错误在英文里的提示,这对我来说是一个突破性的进步,眼看着一个个错误通过自己的努力在我眼前消失,觉得很是开心。此次的程序设计能够成功,是我和我的同学三个人共同努力作用的结果。在这一段努力学习的过程中,我们的编程设计有了明显的提高。

其实现在想起来,收获还真是不少,虽然说以前非常不懂这门语言,在它上面花费了好多心血,觉得它很难,是需用花费了大量的时间编写出来的。现在真正的明白了一些代码的应用,每个程序都有一些共同点,通用的结构,相似的格式。同时也对教学编制问题有了进一步的认识。只要努力去学习,就会灵活的去应用它。

7.参考文献

[1]《数据结构》(C语言版),严蔚敏,清华大学出版社,2003。[2]《数据结构题集》,严蔚敏,清华大学出版社,2005。[3]《数据结构》(C语言版),刘大有,高等教育出版社,2004。[4]《Data Structure with C++》,William Ford.William Topp,清华大学出版社,2003。

《数据结构与算法教学编制.docx》
将本文的Word文档下载,方便收藏和打印
推荐度:
数据结构与算法教学编制
点击下载文档
相关专题 数据结构与算法面试题 数据结构 算法 数据结构与算法面试题 数据结构 算法
[其他范文]相关推荐
    [其他范文]热门文章
      下载全文