《2023年数据结构实验 教学计划编制问题(精选多篇).docx》由会员分享,可在线阅读,更多相关《2023年数据结构实验 教学计划编制问题(精选多篇).docx(247页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、2023年数据结构实验 教学计划编制问题(精选多篇) 推荐第1篇:数据结构实验报告十教学计划编制问题 问题描述: 若用有向网表示教学计划,其中顶点表示某门课程,有向边表示课程之间的先修关系(如果A课程是B课程的先修课程,那么A到B之间有一条有向边从A指向B)。试设计一个教学计划编制程序,获取一个不冲突的线性的课程教学流程。(课程线性排列,每门课上课时其先修课程已经被安排)。 基本要求: (1) 输入参数:课程总数,每门课的课程号(固定占3位的字母数字串)和直接先修课的课程号。 (2) 若根据输入条件问题无解,则报告适当的信息;否则将教学计划输出到用户指定的文件中。 一、需求分析: 本程序需要基
2、于图的基本操作来实现 二、概要设计 : 抽象数据类型 : 为实现上述功能需建立一个结点类,线性表类,图类。 算法的基本思想 : 1、图的构建: 建立一个结点类,类的元素有字符型变量用来存储字母,整形变量用来存储位置,该类型的指针,指向下一个元素。建立一个线性表类,完成线性表的构建。建立一个图类,完成图的信息的读取,(如有n个点,则建立n个线性表,将每个结点与其指向的结点组成一个线性表,并记录线性表的长度)。 2、Topsort算法: 先计算每个点的入度,保存在数组中。找到第一个入度为0的点,将该点所连的各点的入度减一。再在这些点中找入度为0 的点。如果找到,重复上述操作。如果找不到,则跳出wh
3、ile循环,再搜索其他的点,看入度是否为0。再重复上述操作,如果所有的入度为0的点都被寻找到,但个数少于输入顶点的个数,说明该图存在环。 程序的流程 程序由三个模块组成: 输入模块: 读入图的信息(顶点和边,用线性表进行存储)。 处理模块:topsort算法。 输出模块:将结果输出。 三、详细设计 算法的具体步骤: cla Node/结点类 public: string node; int position; /位置 Node* next; bool visit; /是否被访问 Node()visit=false;next=NULL;position=0;node= ; ; cla Line
4、/线性表类 public: int num; Node* head; Node* rear; Node* fence; Line()num=0;head=fence=rear=new Node(); void insert(int v,string ch) /插入元素 Node* current=new Node(); current-node=ch; current-position=v; fence-next=current; fence=current; num+; ; cla Graph /图类 private: int numVertex; int numEdge; Line* li
5、ne; public: Graph(int v,int e)numVertex=v;numEdge=e;line =new Linev; void pushVertex() /读入点 string ch; for(int i=0;i cout cinch; linei.head-node=ch; linei.head-position=i; void pushEdge() /读入边 string ch1,ch2; int pos1,pos2; for(int i=0;i cout cinch1ch2; for(int j=0;j if(linej.head-node=ch1) pos1=j;
6、/找到该字母对应的位置 if(linej.head-node=ch2) pos2=linej.head-position; break; linepos1.insert(pos2,ch2); void topsort() /拓扑排序 int i; int *d=new intnumVertex; for(i=0;i di=0; /数组初始化 for(i=0;i Node* p=linei.head; while(p-next!=NULL) dp-next-position+; /计算每个点的入度 p=p-next; int top=-1,m=0,j,k; for(i=0;i if(di=0)
7、di=top; /找到第一个入度为0的点 top=i; while(top!=-1) j=top; top=dtop; coutnode Node* p=linej.head; while(p-next!=NULL) k=p-next-position; dk-; /当起点被删除,时后面的点的入度-1 if(dk=0) dk=top; top=k; p=p-next; cout coutnm; Graph G(n,m); G.pushVertex(); G.pushEdge(); G.topsort (); system(pause); return 0; 四、调试分析 略。 五、测试结果 本
8、实验的测试结果截图如下: 注:此处由于不会用文件流输入和输出,故在命令提示符上直接进行输入。 六、用户使用说明(可选) 1、本程序的运行环境为windows 操作系统,执行文件为Untitled1.exe 2、运行程序时 提示输入数据 并且输入数据然后回车就可以继续输入相应数据,最后即可得到结果。 七、实验心得(可选) 1、本实验是在图的遍历问题的基础上做的,图的构建大部分是采用图 的遍历问题中的代码(不过要将结点类中的char改为string型), 自己另外写了topsort函数,就完成了整个程序。 2、topsort函数中一开始采用的方法是找到一个入度为0的点,完成 相应的操作后,重新进行
9、搜索,后来改进代码,先搜索入度为0的 点后面连接的点,这样减少了算法复杂度。 附录(实验代码): #include #include using namespace std; cla Node/结点类 public: string node; int position; /位置 Node* next; bool visit; /是否被访问 Node()visit=false;next=NULL;position=0;node= ; ; cla Line /线性表类 public: int num; Node* head; Node* rear; Node* fence; Line()num=0
10、;head=fence=rear=new Node(); void insert(int v,string ch) /插入元素 Node* current=new Node(); current-node=ch; current-position=v; fence-next=current; fence=current; num+; ; cla Graph /图类 private: int numVertex; int numEdge; Line* line; public: Graph(int v,int e)numVertex=v;numEdge=e;line =new Linev; vo
11、id pushVertex() /读入点 string ch; for(int i=0;i cout cinch; linei.head-node=ch; linei.head-position=i; void pushEdge() /读入边 string ch1,ch2; int pos1,pos2; for(int i=0;i cout cinch1ch2; for(int j=0;j if(linej.head-node=ch1) pos1=j; /找到该字母对应的位置 if(linej.head-node=ch2) pos2=linej.head-position; break; li
12、nepos1.insert(pos2,ch2); void topsort() /拓扑排序 int i; int *d=new intnumVertex; for(i=0;i di=0; /数组初始化 for(i=0;i Node* p=linei.head; while(p-next!=NULL) dp-next-position+; /计算每个点的入度 p=p-next; int top=-1,m=0,j,k; for(i=0;i if(di=0) di=top; /找到第一个入度为0的点 top=i; while(top!=-1) j=top; top=dtop; coutnode No
13、de* p=linej.head; while(p-next!=NULL) k=p-next-position; dk-; /当起点被删除,时后面的点的入度-1 if(dk=0) dk=top; top=k; p=p-next; cout coutnm; Graph G(n,m); G.pushVertex(); G.pushEdge(); G.topsort (); system(pause); return 0; 推荐第2篇:数据结构课程设计教学计划编制 攀枝花学院课程设计论文 教学计划编制问题 摘 要 教学计划(课程计划)是课程设置的整体规划,它规定不同课程类型相互结构的方式,也规定了不
14、同课程在管理学习方式的要求及其所占比例,同时,对学校的教学、生产劳动、课外活动等作出全面安排,具体规定了学校应设置的学科、课程开设的顺序及课时分配,并对学期、学年、假期进行划分。 根据一定的教育目的和培养目标制定的教学和教育工作的指导文件。它决定着教学内容总的方向和总的结构,并对有关学校的教学、教育活动,生产劳动和课外活动校外活动等各方面作出全面安排,具体规定一定学校的学科设置、各门学科的教学顺序、教学时数以及各种活动等。教学计划、教学大纲和教科书互相联系,共同反映教学内容。 近代以来,特别是在实行学科课程的条件下,教学计划主要是学科的计划,或只是学科表。随着社会经济和科学技术的新发展,教育结
15、构不断发生变革,现代教育和教学理论主张对教学计划的结构实行改革。除了教学以外,生产劳动、科技活动、发展体力和增进健康的活动、艺术活动和社会活动等也应列入教学计划。下面就利用对此进行程序设计,已达到预期的目的。 关键字:数据结构,教学计划编制,抽象数据类型,程序设计 - 1攀枝花学院课程设计论文 教学计划编制问题 2.概要设计: 2.1流程图 void FindInDegree(ALGraph G, int indegree)/求图中各节点的入度(如下左图)void CreatGraph(ALGraph *G)/构件图(如下右图)。 void TopologicalSort_1(ALGraph
16、G,int numterm,int uplcredit) /有向图G采用邻接表存储结构(如下左图); void TopologicalSort_2(ALGraph G,int numterm,int uplcredit) /有向图G采用邻接表存储结构(如下右图)。 攀枝花学院课程设计论文 教学计划编制问题 主函数: void main() - 4攀枝花学院课程设计论文 教学计划编制问题 数据关系:R1=ai-1 ai|ai-1,aiD,i=2,n 基本操作: void InitStack (SqStack *S); int StackEmpty(SqStack S); void Push(Sq
17、Stack *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); scan
18、f(%d,&selectway); if(selectway=1) TopologicalSort_1(G,numterm,uplcredit); if(selectway=2) TopologicalSort_2(G,numterm,uplcredit); system(pause); return 0; 2.4本程序只有两个模块,调用关系简单 主程序模块拓扑排序模块 攀枝花学院课程设计论文 教学计划编制问题 4.详细设计 4.1头结点、表结点、邻接表的定义 #define MAX_VERTEX_NUM 100 /最大课程总数 typedef struct ArcNode int adjve
19、x; struct ArcNode *nextarc; ArcNode; typedef struct VNode char name24; /课程名 int claid; /课程号 int credit; /课程的学分 int indegree; /该结点的入度 int state; /该节点的状态 ArcNode *firstarc; /指向第一条依附该顶点的弧的指针 VNode,AdjListMAX_VEXTEX_NUM; typedef struct AdjList vertices; int vexnum, arcnum; ALGraph; 邻接表的基本操作: void CreatG
20、raph(ALGraph *); 创建邻接表 void FindInDegree(ALGraph , int * ); 求一个结点的入度 void TopologicalSort_1(ALGraph G,int numterm,int maxcredit); 拓扑排序来编排课程 void TopologicalSort_2(ALGraph G,int numterm,int maxcredit); 拓扑排序来编排课程 4.2栈的定义 #define STACk_INIT_SIZE 100 /存储空间的初时分配量 #define STACKINCREMENT 10 /存储空间的分配增量 - 78
21、9101112131415攀枝花学院课程设计论文 教学计划编制问题 6.调试分析 6.1实验过程中出现的问题及解决方法 我们在实验过程中遇到的最大难题是两个课程排序算法的编写。刚开始的时候没有任何的思路,网上也只有拓扑排序的算法,对于课程设计要求的排序算法没有任何头绪。经过请教老师和同学以及翻阅了一些相关书籍,并在网上的搜索有了排序算法的大体思路。经过三天的修改,终于写出了符合要求的排序算法。 6.2测试数据 学期总数:6;学分上限:10;该专业共开设12门课,课程号从01到12,学分顺序为2,3,4,3,2,3,4,4,7,5,2,3。 6.3测试结果(包含正确和错误的) 正确测试结果: 攀
22、枝花学院课程设计论文 教学计划编制问题 错误测试结果: 攀枝花学院课程设计论文 教学计划编制问题 6.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 两种编排方法都输出结果为: 第一学期学的课程有:高等数学 程
23、序设计基础; 第二学期学的课程有:普通物理 线性代数 汇编语言; 第三学期学的课程有:数值分析 计算机原理 离散数学; 第四学期学的课程有:数据结构; 攀枝花学院课程设计论文 教学计划编制问题 第五学期学的课程有:操作系统 语言的设计和分析; 第六学期学的课程有:编译原理。 7.实验分工 8.总结 刚开始学的时候确实有很多地方我很不理解,每次上课时老师都会给我们出不同的设计题目,对于我们一个初学者来说,无疑是一个具大的挑战,撞了几次壁之后,我决定静下心来,仔细去写程序。老师会给我们需要编程的内容一些讲解,顺着老师的思路,来完成自己的设计,我们可以开始运行自己的程序,可是好多处的错误让人看的可怕
24、,还看不出到底是哪里出现了错误,但是程序还是得继续下去,我多次请教了老师和同学,逐渐能自己找出错误,并加以改正。经过了这次课程设计,现在已经可以了解很多错误在英文里的提示,这对我来说是一个突破性的进步,眼看着一个个错误通过自己的努力在我眼前消失,觉得很是开心。此次的程序设计能够成功,是我和我的同学三个人共同努力作用的结果。在这一段努力学习的过程中,我们的编程设计有了明显的提高。 其实现在想起来,收获还真是不少,虽然说以前非常不懂这门语言,在它上面花费了好多心血,觉得它很难,是需用花费了大量的时间编写出来的。现在真正的明白了一些代码的应用,每个程序都有一些共同点,通用的结构,相似的格式。同时也对
25、教学编制问题有了进一步的认识。只要努力去学习,就会灵活的去应用它。 9.参考文献 1数据结构(C语言版),严蔚敏,清华大学出版社,2023。 攀枝花学院课程设计论文 教学计划编制问题 2数据结构题集,严蔚敏,清华大学出版社,2023。 3数据结构(C语言版),刘大有,高等教育出版社,2023。 4Data Structure with C+,William FordWilliam Topp,清华大学出版社,2023。 推荐第3篇:数据结构:教学计划的编制问题(实验10实验报告) 数据结构实验报告 实验十:教学计划的编制问题 姓名:戴铁泉 学号:20231410305 班级:物联网1001班 完
26、成日期:2023.05.21 一、问题描述: 若用有向网表示教学计划,其中顶点表示某门课程,有向边表示课程之间的先修关系(如果A课程是B课程的先修课程,那么A到B之间有一条有向边从A指向B)。试设计一个教学计划编制程序,获取一个不冲突的线性的课程教学流程。(课程线性排列,每门课上课时其先修课程已经被安排)。 基本要求 (1) 输入参数:课程总数,每门课的课程号(固定占3位的字母数字串)和直接先修课的课程号。 (2) 若根据输入条件问题无解,则报告适当的信息;否则将教学计划输出到用户指定的文件中。 二需求分析: 1、本程序需要基于图的基本操作来实现 三概要设计 抽象数据类型: 为实现上述功能需建
27、立一个结点类,线性表类,图类。 算法的基本思想: 1、 图的构建: 建立一个结点类,类的元素有字符型变量用来存储字母,整形变量用来存储位置,该类型的指针,指向下一个元素。建立一个线性表类,完成线性表的构建。建立一个图类,完成图的信息的读取,(如有n个点,则建立n个线性表,将每个结点与其指向的结点组成一个线性表,并记录线性表的长度)。 2、Topsort算法: 先计算每个点的入度,保存在数组中。找到第一个入度为0 的点,将该点所连的各点的入度减一。再在这些点中找入度为0 的点。如果找到,重复上述操作。如果找不到,则跳出while循环,再搜索其他的点,看入度是否为0。再重复上述操作,如果所有的入度
28、为0的点都被寻找到,但个数少于输入顶点的个数,说明该图存在环。 程序的流程: (1) 输入模块: 读入图的信息(顶点和边,用线性表进行存储)。 (2) 处理模块:topsort算法。 (3) 输出模块:将结果输出。 四详细设计: 算法的具体步骤: cla Node/结点类 public: string node; int position; /位置 Node* next; bool visit; /是否被访问 Node()visit=false;next=NULL;position=0;node= ; ; cla Line /线性表类 public: int num; Node* head;
29、Node* rear; Node* fence; Line()num=0;head=fence=rear=new Node(); void insert(int v,string ch) /插入元素 Node* current=new Node(); current-node=ch; current-position=v; fence-next=current; fence=current; num+; ; cla Graph /图类 private: int numVertex; int numEdge; Line* line; public: Graph(int v,int e)numVe
30、rtex=v;numEdge=e;line =new Linev; void pushVertex() /读入点 void pushEdge() /读入边 string ch1,ch2; int pos1,pos2; for(int i=0;i coutch; linei.head-node=ch; linei.head-position=i; coutch1ch2; for(int j=0;j linepos1.insert(pos2,ch2); if(linej.head-node=ch1) pos1=j; /找到该字母对应的位置 if(linej.head-node=ch2) pos2=
31、linej.head-position; break; void topsort() /拓扑排序 int i; int *d=new intnumVertex; for(i=0;i /数组初始化 for(i=0;i Node* p=linei.head; while(p-next!=NULL) dp-next-position+; /计算每个点的入度 p=p-next; int top=-1,m=0,j,k; for(i=0;i while(top!=-1) if(di=0) di=top; /找到第一个入度为0的点 top=i; j=top; top=dtop; coutnode m+; N
32、ode* p=linej.head; while(p-next!=NULL) k=p-next-position; dk-; /当起点被删除,时后面的点的入度-1 if(dk=0) dk=top; top=k; p=p-next; cout if(m /输出点的个数小于输入点的个数,不能完全遍历 cout delete d; ; int main() int n,m; coutnm; Graph G(n,m); G.pushVertex(); G.pushEdge(); G.topsort (); system(pause); return 0; 五调试分析: 将建立的线性表输出来检验图的信息
33、是否完全被读入,构建是否正确。 六测试结果: 七实验心得: 1、本实验是在图的遍历问题的基础上做的,图的构建大部分是采用图 的遍历问题中的代码(不过要将结点类中的char改为string型), 自己另外写了topsort函数,就完成了整个程序。 2、topsort函数中一开始采用的方法是找到一个入度为0的点,完成 相应的操作后,重新进行搜索,后来改进代码,先搜索入度为0的 点后面连接的点,这样减少了算法复杂度。 八、附件 教学计划的编制问题.cpp #include #include using namespace std; cla Node/结点类 public: string node;
34、int position; /位置 Node* next; bool visit; /是否被访问 Node()visit=false;next=NULL;position=0;node= ; ; cla Line /线性表类 public: int num; Node* head; Node* rear; Node* fence; Line()num=0;head=fence=rear=new Node(); void insert(int v,string ch) /插入元素 Node* current=new Node(); current-node=ch; current-positio
35、n=v; ; fence-next=current; fence=current; num+; cla Graph /图类 private: int numVertex; int numEdge; Line* line; public: Graph(int v,int e)numVertex=v;numEdge=e;line =new Linev; void pushVertex() /读入点 void pushEdge() /读入边 string ch; for(int i=0;i coutch; linei.head-node=ch; linei.head-position=i; stri
36、ng ch1,ch2; int pos1,pos2; for(int i=0;i coutch1ch2; for(int j=0;j linepos1.insert(pos2,ch2); if(linej.head-node=ch1) pos1=j; /找到该字母对应的位置 if(linej.head-node=ch2) pos2=linej.head-position; break; void topsort() /拓扑排序 int i; int *d=new intnumVertex; for(i=0;i /数组初始化 for(i=0;i Node* p=linei.head; while
37、(p-next!=NULL) dp-next-position+; /计算每个点的入度 p=p-next; int top=-1,m=0,j,k; for(i=0;i while(top!=-1) if(di=0) di=top; /找到第一个入度为0的点 top=i; j=top; top=dtop; coutnode m+; Node* p=linej.head; while(p-next!=NULL) k=p-next-position; dk-; /当起点被删除,时后面的点的入度-1 if(dk=0) dk=top; top=k; p=p-next; cout /输出点的个数小于输入点
38、的个数,不能完全遍历 cout delete d; ; int main() int n,m; coutnm; Graph G(n,m); G.pushVertex(); G.pushEdge(); G.topsort (); system(pause); return 0; 推荐第4篇:教学计划编制问题 目 录 1 课题需求描述 .2 1.1 教学计划编制问题 .2 1.2 进制转换 .2 2 总体功能与数据结构设计 .3 2.1 总体功能结构 .3 2.2 数据结构设计 .4 3 算法设计和程序设计 .6 3.1 教学计划编制问题 .6 3.2 进制转换问题 .9 4 调试与测试 .23
39、4.1 教学计划编制问题调试结果 .23 4.2 进制转换问题调试结果 .25 5 设计总结 .27 6 程序代码 .29 1 课题需求描述 1.1 教学计划编制问题 大学的每个专业都要制订教学计划。假设任何专业都有固定的学习年限,每学年含两学期,每学期的时间长度和学分上限均相等。每个专业开设的课程都是确定的,而且课程在开设时间的安排必须满足先修关系。每门课程有哪些先修课程是确定的,可以有任意多门,也可以没有。每门课恰好占一个学期。在这样的前提下设计一个教学计划编制程序。通过输入实际的课程及先后关系。结合每学期的学分及课程数,制定好学习计划。在输入相关数据后,程序会安排好每学期的课程。 1.2 进制转换 进制数制是人们利用符号