2022年数据结构c语言课程设计报告 2.pdf
C语言与数据结构课程设计报告学号姓名课程设计题目迷 宫 求 解2011 年 12 月名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 15 页 - - - - - - - - - 目录1 需求分析1.1 功能与数据需求1.1.1 题目要求的功能1.1.2 扩展功能1.2 界面需求1.3 开发环境与运行需求2 概要设计2.1 主要数据结构2.2 程序总体结构2.3 各模块函数说明3 详细设计3.1 算法分析与设计3.2 主要程序段设计4 测试5 使用说明5.1 应用程序功能的详细说明5.2 应用程序运行环境要求5.5 输入数据类型、格式和内容限制6 总结提高6.1 课程设计总结6.2 开发中遇到的问题和解决方法6.3 对自己完成课设完成情况的评价6.4 C语言与数据结构课程设计课程的意见与建议附录:程序源代码名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 15 页 - - - - - - - - - 1 需求分析1.1 功能与数据需求迷宫求解问题描述:以一个m n 的长方形表示迷宫, 0 和 1 分别表示迷宫中的通路和障碍。设计一个程序, 对任意设定的迷宫, 求出一条从入口到出口的通路,或得出没有通路的结论。1.1.1 题目要求的功能基本要求:首先实现一个以链表作存储结构的栈类型,然后编写一个求解迷宫的非递归程序。求得的通路以三元组(i,j,d)的形式输出,其中: (i,j)指示迷宫中的一个坐标, d 表示走到下一坐标的方向。如:对于下列数据的迷宫,输出的一条通路为:(1,1,1), (1,2,2), (2,2,2)(3,2,3), (3,1,2),。测试数据: 迷宫的测试数据如下: 左上角(1,1)为入口, 右下角(9,8)为出口。1 2 3 4 5 6 7 8 1.1.2 扩展功能(1)编写递归形式的算法,求得迷宫中所有可能的通路;(2)以方阵形式输出迷宫及其通路1.2 界面需求请求输入进入程序请求输入起始位置0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0 0 1 1 0 1 0 1 1 1 0 0 1 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1 0 1 0 1 1 1 1 0 0 1 1 1 0 0 0 1 0 1 1 1 0 0 0 0 0 0 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 15 页 - - - - - - - - - 请求输入终点位置输出方阵迷宫输出路径输出方阵路径1.3 开发环境与运行需求Visual C+6.02 概要设计2.1 主要数据结构定义模块函数模块主函数名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 15 页 - - - - - - - - - 2.3 各模块函数说明typedef struct int pos_xlength;/进栈坐标int pos_ylength;输入起始位置, 终点位置判断首节点是否为通路判断路径能否走通对坐标标记是否到达迷宫出口处左边是否存在通路下边是否存在通路右边是否存在通路上边是否存在通路存储路径,将路径入栈有解迷宫无解迷宫Y N Y N Y 输出迷宫选择路径名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 15 页 - - - - - - - - - int top; int base; Stack; /新建结构体void initStack(Stack *p)/ 初始化栈Push(Stack *p,int x,int y,int d) /入栈具体操作 Pop(Stack *p,int read2,int d) /出栈并读出前一步的坐标 initMaze(int Maze109)/建立迷宫Ways(Stack *p,int Maze109,int rukou_x,int rukou_y,int chukou_x,int chukou_y,int d) /具体路径的求解 menu();/调用菜单函数 main();/实现迷宫求解的主函数3 详细设计迷宫的过程可以模拟为一个搜索的过程:每到一处,总让它按左、右、上、下4 个方向顺序试探下一个位置;如果某方向可以通过,并且不曾到达,则前进一步,在新位置上继续进行搜索;如果4 方向都走不通或曾经到达过,则退回一步,在原来的位置上继续试探下一位置。每前进或后退一步,都要进行判断:若前进到了出口处,则说明找到了一条合适的通路;若退回到了入口处,则说明不存在合法的通路到达出口。用一个二维指针数组迷宫表示迷宫,数组中每个元素取值“0”(表示通路)或“1”(表示墙壁)。迷宫的入口点在位置(1,1)处,出口点在位置(m,n)处。设计一个模拟走迷宫的算法,为其寻找一条从入口点到出口点的通路。二维数组的第0 行、第 m+1行、第 0 列、第 m+1列元素全置成“1”, 表示迷宫的外墙;第1 行第 1列元素和第m行第 m列元素置成“ 0”, 表示迷宫的入口和出口;假设当前所在位置是(x,y )。沿某个方向前进一步,它可能到达的位置最多有4。4 测试名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 15 页 - - - - - - - - - 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 15 页 - - - - - - - - - 5 使用说明5.1 应用程序功能的详细说明按提示输入数字 1 进入迷宫,输入迷宫入口,迷宫出口5.2 应用程序运行环境要求Microsoft Visual C+6.05.5 输入数据类型、格式和内容限制输入的数据都是整型( int ),输入迷宫的数据间要用空格或回车隔开6 总结提高6.1 课程设计总结要能很好的掌握编程,仅仅通过简单的程序的编写是无法达成的,需要大量积累和深入研究才有可能。就从这个迷宫问题求解来说,在迷宫求路径就需要使用链表的栈 ,靠出栈和进栈来存取路径数据.在程序的编写中也不能一味的向已有的程序进行模仿,而要自己摸索 ,去寻找最好的解决方法,只有带着问题去反复进行实践 ,才能更熟练的掌握和运用,当然,对现有的程序也要多去接触,因为有些程序是我们无法在短时间内想出来的.最重要的一点是持之以恒,要经常性的复习原来接触的程序,这样才能保证我们有足够的经验去面对程序问题 . 6.2 开发中遇到的问题和解决方法问题: 在开始时迷宫求解的路径无法显示寻找路径所走的方向等问题。解决方法:在栈中增加一个变量d 来表示方向, 在寻找路径的时候判断下一个坐标点和本坐标点的关系。在(x)行不变的情况下: (y+1)列加一则表示坐标往右走了一步记为1、(y-1 )列减一则表示坐标往左走了一步记为3;在(y)名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 15 页 - - - - - - - - - 不变的情况下:( x+1)行加一则表示坐标往下走了一步记为2、(x-1 )行减一则表示坐标往上走了一步记为4;6.3 对自己完成课设完成情况的评价经过本次课程设计,我深刻地明白了理论与实践应用相结合的重要性,并努力克服自己在分析复杂问题的弱点。这次课程设计同时也考验我的综合运用所学知识的能力和操作能力。参考用书:数据结构( C 语言),严蔚敏、吴伟民等,清华大学出版社,2010 年数据结构与算法分析(c+语言描述)第 2 版,黄达民编著,清华大学出版社 2006.11 6.4 C语言与数据结构课程设计课程的意见与建议希望老师能指导我们把所有的课程设计题目都做一遍,因为每一道题目所能体现的知识点是有限的,而且要想提高我们的编程能力还需要大量的练习。附录:程序源代码#include #include #include #include #define length 50 #define d direction /用 d 代表所走路径的方向int n=-1; int step=0; /记录步骤数typedef struct int pos_xlength;/进栈坐标int pos_ylength; int top; int base; Stack; /新建结构体void initStack(Stack *p) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 15 页 - - - - - - - - - p-top=p-base=0; / 初始化栈 . Push(Stack *p,int x,int y,int d) /入栈具体操作 step+; d=0; n=n+1; p-top=p-top+1; p-pos_xn=x; p-pos_yn=y; Pop(Stack *p,int read2,int d) /出栈并读出前一步的坐标 step+; d=0; n=n-1; p-top=p-top-1; read0=p-pos_xn; read1=p-pos_yn; initMaze(int Maze109)/ 建立迷宫函数 . int i; for (i=0;i=9;i+) Maze0i=1; for (i=0;i=10;i+) Mazei0=1; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 10 页,共 15 页 - - - - - - - - - for (i=0;i=9;i+) Maze10i=1; for (i=0;i=10;i+) Mazei9=1; Maze11=0;Maze12=0;Maze13=1;Maze14=0;Maze15=0;Maze16=0;Maze17=1;Maze18=0; Maze21=0;Maze22=0;Maze23=1;Maze24=0;Maze25=0;Maze26=0;Maze27=1;Maze28=0; Maze31=0;Maze32=0;Maze33=0;Maze34=0;Maze35=1;Maze36=1;Maze37=0;Maze38=1; Maze41=0;Maze42=1;Maze43=1;Maze44=1;Maze45=0;Maze46=0;Maze47=1;Maze48=0; Maze51=0;Maze52=0;Maze53=0;Maze54=1;Maze55=0;Maze56=0;Maze57=0;Maze58=0; Maze61=0;Maze62=1;Maze63=0;Maze64=0;Maze65=0;Maze66=1;Maze67=0;Maze68=1; Maze71=0;Maze72=1;Maze73=1;Maze74=1;Maze75=1;Maze76=0;Maze77=0;Maze78=1; Maze81=1;Maze82=1;Maze83=0;Maze84=0;Maze85=0;Maze86=1;Maze87=0;Maze88=1; Maze91=1;Maze92=1;Maze93=0;Maze94=0;Maze95=0;Maze96=0;Maze97=0;Maze98=0; Print( )/打印出迷宫界面int m,n,j,sum;int Maze109; printf(迷宫 (1 代表墙即不通 ,0 代表可通过 )n); printf( ); for(j=1;j=8;j+) printf(%4d,j); printf(n); for(m=0;m=10;m+) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 11 页,共 15 页 - - - - - - - - - for(n=0;ntop=p-base) printf( 找不到出口 n);return 0; Ways(p,Maze,x,y ,chukou_x,chukou_y ,d); return 1; menu() printf(tt*n); printf(tt* 欢迎进入课程设计*n); printf(tt* 迷宫求解程序*n); printf(tt* 菜单: *n); printf(tt* 进入迷宫 * 请输入 1 *n); printf(tt* 退出迷宫 * 请输入 2 *n); printf(tt*n); int main() Stack *p; Stack S; int Maze109; / 定义迷宫int elem_11,elem_21,a,j; int rukou_x,rukou_y,d=0; int chukou_x,chukou_y; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 13 页,共 15 页 - - - - - - - - - int sum=0; p=&S; initMaze(Maze); system(color 5f);/dos 窗口背景颜色函数menu();/调用菜单函数printf(请输入您的选择 :); scanf(%d,&a); if(a=1) Print( ) /打印迷宫图 .;printf(请输入入口坐标 :); scanf(%d,&elem_10); scanf(%d,&elem_11); rukou_x=elem_10;rukou_y=elem_11; printf(请输入出口坐标 :); /迷宫入口坐标 . scanf(%d,&elem_20); scanf(%d,&elem_21); chukou_x=elem_20;chukou_y=elem_21;/迷宫出口坐标 . if(elem_1010|elem_119|elem_2010|elem_219| elem_100|elem_110|elem_200|elem_210) printf( 输入的入口或出口坐标错误n); /首先判断输入坐标是否正确else printf(n); printf( 说明(x,y,z)x,y 代表坐标点 ;n); printf(z 代表上个坐标到达这个坐标所走的方向,0 为初始值,1234分别代表向右、下、左、上方向n); printf( 查找路径的具体步骤 :n); initStack(p); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 14 页,共 15 页 - - - - - - - - - Push(p,rukou_x,rukou_y ,d); Ways(p,Maze,rukou_x,rukou_y ,chukou_x,chukou_y ,d); system(pause); system(cls); return main(); else printf(欢迎您的再次光临 ,再见 !n); system(pause); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 15 页,共 15 页 - - - - - - - - -