您的位置  > 互联网

结构化程序设计综合训练

33 2、教材:  本课程为实验课程,主要以学生的三字实验为主。  实验指导书:ftp:// # n 8 /*# n 8 /*迷宫列数迷宫列数*/*/ {int x,y;}item; /* {int x,y;}项目; /*坐标坐标*/*/int mze[m+2][n+2]int mze[m+2][n+2];;/*/*Maze 迷宫*/ */ 3434 (2) 测试方向表示:在上述迷宫表示的情况下,每个点有 88 个可以尝试的方向。 设当前点的坐标为(测试,设当前点的坐标为(xx,,yy),与其相邻),根据重点。 为了方便起见,可以根据该点的相邻方向来获得该点的坐标。 为了方便找到新点的坐标,我们可以从正东开始,顺时针方向寻找新点的坐标。 从正东开始顺时针方向的88个方向的坐标增量被放置在一个结构体数组中。 每个方向的坐标增量放在一个结构体数组move[8]move[8]中,其中xx表示横坐标的增量,yy表示纵坐标的增量。

表示垂直坐标增量。 {int x,y;}项目; /* {int x,y;}项目; /*坐标坐标*/*/item move[8]={{0,1}, {1,1},{1, 0},{1,-1},{0,-1}, {-1 ,-1},项目移动[8]={{0,1}, {1,1},{1,0}, {1,-1},{0,-1}, {-1,-1 },{-1,0},{-1,1} };{-1,0},{-1,1} };3535 (3) 保存到达的每个点的位置和方向的数据结构测试。  采用回溯法,从入口处开始,向某个方向继续测试。 采用回溯法,从入口开始,向某个方向继续测试。 测试,如果能通过,就到达新的点,否则测试另一个未测试的方向。 如果你能通过,你就会到达一个新的点,否则测试另一个未经测试的方向。 如果各个方向都没有路径,则沿着原路径返回上一个方向。 如果各个方向都没有路径,则沿着原路径返回到上一个点,换到一个未测试的路径继续测试,直到找到一个点,换到一个未测试的路径继续测试,直到找到出口,或者测试所有路径。 经过测试,没有找到返回出口的路径,或者尝试了所有路径,都没有找到返回出口点的路径。 在试用过程中,为了保证到达某一点时没有退出点。

在尝试过程中,为了保证当到达某个点而没有办法时,能够正确返回到前一个点,需要使用一个数据结构(栈)来保存到达的每个点的信息。 地点和测试方向。 (stack)保存到达的每个点的位置和试验方向。  当你到达某个点,无路可走时,你需要从上一个点尝试下一个方向。 当你到达某个点,无路可走时,你需要从上一个点尝试下一个方向。 因此,压入堆栈的不仅仅是顺序到达每个点的试验。 因此,压入栈中的不仅仅是依次到达的每个点的坐标,还有从前一个点到这一点的方向号。 坐标,以及从前一点到这一点的方向号。 第3636章 }; { 数据[]; int 顶部; }; 37372) 功能细化  前面已经分析了系统的目标和主要功能,但这只是程序层次结构的最顶层部分,划分的功能相对抽象,需要进一步细化。 下面用层次图来表示各部分的功能以及函数之间的调用关系。  对于每个功能,需要进一步描述所完成的主要功能、输入输出以及内部数据结构和算法。

 下面仅对主控模块和寻路模块进行详细描述。 4040▪ 主控模块main():用于初始化各个数据和选择功能。 主控模块流程图如下: 开始搭建迷宫,找到路径,输出路径,继续? 关闭游戏结束 4242▪ 迷宫设置模块 int (*maze):用于设置迷宫及入口和出口。 迷宫中的入口和出口的值必须为1,否则将被重置。 成功时返回 1,失败时返回 0。 迷宫就是设置的迷宫。 (算法略) 4343▪ Find path int (*maze, *path):用于选择一条路径,如果找到则返回1,否则返回0。找到的路径存储在path 中。 算法的设计如下: – 防止重复到达某一点的注意事项: 为了避免无限循环的发生, 防止重复到达某一点的注意事项: 为了避免无限循环的发生,当到达某个点时(到达某个点(ii,,jj)时,设置后),将maze[i][j]maze[i][j]设置为-1-1,以便区分未到达的顶点。 算法结束前可以恢复未到达的原始顶点。 算法结束前可以恢复原来的迷宫。 宫。 - 算法描述 算法描述 4444 ①①堆栈初始化; 堆栈初始化; ②②将入口点坐标和初始尝试方向(设置为入口点坐标和初始尝试方向(设置为-1-1)入栈),将入口点压入栈点并设置入口点已走过; 设置为已步行; ③③ 设置未找到 设置未找到 已找到==0;; ④④(未找到(未找到&&&&栈不为空)栈不为空){*{*从栈顶元素的位置开始寻找下一个可以走的方向; 从栈顶元素的位置开始寻找下一个可以走的方向; if (if(求方向,求方向)) {{修改栈顶元素的方向值修改栈顶元素的方向值;;计算新点,计算新点, ,并设置为已通过并设置为已通过;;将新的点位置和初始试验方位值压入堆栈将新的点位置和初始试验方位值压入堆栈;;if(if(new point 是终点,新的点是终点)) end end;;}}else //else //没有方向可去。 没有方向可去,说明我们已经从这里开始了。 no way to go 表示从此时起没有出栈的路了;;}}⑤⑤if(if(find find)) print path print path;else ;else print print ""这个迷宫里没有路径,有这个迷宫里没有路";"; 4545▪ 路径输出 void (*path):输出找到的路径。

(算法略) 46463)界面设计  软件界面设计要以使用软件的人为中心,尽量从使用软件的角度来设计界面。  迷宫游戏的界面比较简单。 首先展示了系统功能、设计器以及系统使用说明。 然后问“你想开始游戏吗?”,回答“y”开始。 设置迷宫的界面中应提供帮助说明。 4747 编码  编码是使用高级语言来表达在设计阶段生成的算法。 编码就是用高级语言来表达设计阶段生成的算法。 在编码阶段,我们可以再次实现结构化编程的使用。 在编码阶段,我们可以再次认识到使用结构化编程技术的主要优点: 设计技术的主要优点: – 先使用全局,再使用局部,再使用整体。 程序通过细节逐步细化、先抽象后具体、先全局后局部、先整体后细节、先抽象后具体的逐步细化过程开发而成,层次结构清晰,易于阅读,程序也易于理解。经过细化过程开发的具有清晰的层次结构,易于阅读和理解; 理解; –– 不使用语句,只使用单入口、单出口的控制结构,使语句只使用单入口、单出口的控制结构,使得程序的静态结构及其动态执行的情况是相对一致,易于保证程序的静态结构与其动态执行的一致,易于保证程序在开发过程中的正确性和纠错性; 确保程序开发过程中的正确性和纠错性; – 控制结构 有明确的逻辑模式。 编写程序代码仅限于使用控制结构。 有明确的逻辑模式。 编写程序代码仅限于使用几种简单的方法来使程序易于测试。 只有几种简单的方法可以使程序易于测试。 程序易于测试; – 程序清晰度和模块化最大限度地提高了修改和重新设计软件等时可重用的代码量。

最大化重用代码的数量等。 4848▪ 因此,结构化编程技术确保我们得到结构化的程序。 这种程序易于编写、读取、修改和维护,减少了程序出错的机会,提高了程序的可靠性,保证了程序质量。  下面介绍编写程序时应注意的几个问题: 4949 全局变量 ▪ 全局变量的作用增加了函数之间数据连接的通道。 但全局变量的作用使得函数的全局变量的作用增加了函数之间数据连接的渠道。 但全局变量使得函数的通用性较差,因为函数执行时依赖于它所在的全局变量。 如果通用性降低了,因为函数执行时依赖于它所在的全局变量。 如果将函数移动到另一个文件,则还必须通过一个函数将相关的全局变量及其值一起移动到另一个文件中,并且还必须将相关的全局变量及其值一起移动。 但如果全局变量与其他文件的全局变量同名,就会出现问题并下去。 但如果全局变量与其他文件的全局变量同名,就会出现问题,降低程序的可靠性和通用性。 在编程时,划分模块时,要求模块的划分,降低了程序的可靠性和通用性。 在编程中,划分模块时,要求模块的“内聚性”强,与其他模块的“耦合性”强,与其他模块的“耦合性”弱。 即模块功能单一、功能弱。 也就是说,一个模块的功能应该单一,并且与其他模块的交互应该尽可能少。 然而,使用全局变量并不符合这个原则。

其他模块的相互影响应该尽可能的小,使用全局变量并不符合这个原则。 一般来说,需要将cc程序中的函数做成一个封闭体。 除了能够通过程序中的函数制作一个封闭体之外,除了能够通过“实参——形参”与外界进行交流之外,没有其他渠道。 这样的程序具有良好的可移植性和可读性,除了对外联系之外没有其他渠道。 这样的程序具有很强的可移植性和可读性。 。 ▪ 另外,使用过多的全局变量会降低程序的清晰度,人们往往很难清楚地判断每个时刻的每个全局变量。 价值。 当执行每个函数时,全局变量可能被改变并且每个全局变量在每个时刻的值可能被改变。 每个函数执行时全局变量的值可能会改变,程序很容易出错。 数值定量,程序容易出错。 ▪ 对于大型程序,模块很多,往往需要不同的人来完成不同的模块。 如果随机使用全局变量,更容易出现问题。 ,导致程序混乱。 因此,限制变量的随意使用更为重要,这样更容易出现问题,导致程序混乱。 因此,应该限制全局变量的使用。 使用全局变量。 5050 风格  结构化程序的特点之一是清晰度和可读性。 风格的作用 结构化程序的标志之一是清晰性和可读性。 样式的主要功能是使代码易于阅读,无论对于程序员自己还是其他人。 代码应该清晰、简单,对程序员来说具有直接、正确的含义。 对于其他人来说,代码应该清晰简单,具有简单的逻辑、自然的表达、常见的语言用法、有意义的名称和有用的帮助注释等。

一致性、有意义的名称、有用的注释等等。一致性非常重要。 如果每个人都坚持相同的风格,那么代码就非常重要。 如果每个人都遵循相同的风格,代码将更易于阅读。 很容易阅读。  下面将通过一些小程序设计例子来说明风格相关的规则。 下面将通过一些小程序设计例子来说明风格相关的规则。 灰色标记的代码段代表不良风格的规则,灰色标记的代码段代表不良风格的规则。 代码片段代表不良风格的代码片段。 代码片段。 5151 (1) 名称▪▪ 名称应非正式、简洁且易于记忆。 如果可能的话,名称应该非正式、简洁且易于记忆。 如果可能的话,它应该是可拼写的。 。 变量等的范围越大,其名称就越容易拼写。 变量等的范围越大,其名称应携带的信息就越多。 如果全局变量使用描述性语言,那么它们应该携带的信息就越多。 对全局变量使用描述性语言,对局部变量使用短名称。 全局变量可以出现在整个程序的任何地方,局部变量使用短名称。 全局变量可以出现在整个程序的任何地方,因此它们的名称应该具有足够的描述性,以便读者能够记住它们。 他们的名字应该具有足够的描述性,以便读者能够记住他们所做的事情。 为每个全局变量声明附加简短的注释没有任何意义。 在每个全局变量声明中附加一个简短的注释也很有帮助。

对于常规使用的局部变量来说,使用非常短的名称通常会很有帮助。 常规方式使用的局部变量可以使用很短的名称,如ii,,jj为循环变量,pp,,qq为指针,ss,,tt为字符串等。代表字符串等。 ▪ 命名有很多种现实中的惯例或当地惯例。 常见的有:指针集合。 现实中有很多命名约定或者当地的习惯。 常见的例子包括: 指针使用以“;”结尾的变量名全局变量使用以大写字母开头的变量名; 常量使用以大写字母结尾的变量名; 全局变量使用以大写字母开头的变量名; 常量使用完全大写的变量名等。命名约定使代码更容易理解。 变量名等全部用大写字母拼写。 命名约定使代码更容易理解。 5252 (2) 表达式和语句  同样,我们也应该以尽可能清晰的形式编写表达式和语句。 5353采用缩进程序结构,这是最省力的方法,使程序结构清晰。 比较: for(n++;n=))… >=))… if((>=)||(blif((>=)||(='A'&&(c))