程序开发和结构化程序设计.ppt
《程序开发和结构化程序设计.ppt》由会员分享,可在线阅读,更多相关《程序开发和结构化程序设计.ppt(87页珍藏版)》请在三一办公上搜索。
1、第九章 程序开发和结构化程序设计,良好的行文格式自顶向下逐步求精的程序设计技术受限排列组合穷举法与试探法本章小结作业,良好的行文格式,程序的行文格式不好直接影响程序的可读性、清晰性和外观。,/*A*/#include int i;main()i=25+38;printf(“25+38=%d”,i);/*B*/#include int i;main()i=25+38;printf(“25+38=%d”,i);/*C*/#include int i;/*声明整型变量i*/int main(void)/*主函数*/i=25+38;/*求和运算*/printf(“25+38=%d”,i);/*打印*/
2、,if(b)S1 else S2,switch(expr)case a1:S1 case a2:S2.case an:sn/*switch*/,图1 函数定义 图2 IF语句 图3 SWITCH语句,int main(vido)DS DS./*main*/,do S while(b),for(expr1;expr2;expe3)S/*for*/,while(b)S/*while*/,图4 WHILE语句 图5 FOR语句 图6 DO语句,用合适的助记名来命名标识符,注释,自顶向下逐步求精的程序设计技术,自顶向下、逐步求精若想让计算机解题必须用清晰而无两义性的方式给它提供算法。要求:找出一个算法
3、,它能提供所解问题的从输入到输出所需的映象。选择一种程序语言写出程序,用计算机能接受的方式表述算法。关键是如何找出算法。因为写出程序,只是表述算法,应该没有困难。,求精实例,测定字母偶的出现频率三个齿轮啮合问题验证三角形外心定理,编程序,测定字母偶的出现频率,测定小写字符串中相邻字母偶出现频率。例如,针对the cat对th、he、ca、at计数。设有说明:int conmat2626;字母偶 he 的出现次数存入下标变量conmath-ae-a,首先把该问题分解成如下几步:1)初始化计数器数组conmat;2)统计每个字母偶的出现频率;3)输出统计结果。,求精上述PAD中的每一个步骤:初始化
4、数组conmat,显然应该一行一行的初始化;对于每行又应该一个元素一个元素的初始化。,初始化第c1行,考虑统计部分:假设被统计的字符串是从终端输入的,则显然我们应该把该字符串全部读入,并在读入的过程中边读边统计。用下图表示。,读(prevchar),while(!EOF),统计一次,def,读(thischar),再考虑具体统计算法,为统计字母偶的出现频率,显然在读入字符串的过程中应该始终保存两个字符 prevchar、thischar,并且当该两个字符都是字母时,相应计数单元加1;最后在读入下一个字符之前还应该把保存的两个字符向前串。,最后考虑输出部分,我们把结果输出成两个 2613 的表,
5、每个表元素是相应字母偶的出现次数:*a b c d e.mab.z*n o p q r.zab.z,打印一个表(第一个表),显然应该先打印表头再打印下边各行,打印表头,打印表体,beginch,endch,打印表头可以求精成先输出一个“*”;再顺次输出各个字符。顺次输出各个字符是一个循环。,打印表头,打印表体,beginch,endch,输出(*),输出(n),顺次输出各个字符,打印表体应该一行一行的打印,每行应该先打印行头,再打印本行各个元素;打印本行各个元素,应该一个元素一个元素的打印,是一个循环,打印表体,beginch,endch,输出(*),输出(n),输出一行,输出(c1),输出(
6、n),输出本行各个元素,三个齿轮啮合问题,设有三个齿轮互相衔接,求当三个齿轮的某两对齿互相衔接后到下一次这两对齿再互相衔接,每个齿轮最少各转多少圈。解:这是求最小公倍数的问题。每个齿轮需转圈数是三个齿轮齿数的最小公倍数除以自己的齿数。设三个齿轮的齿数分别为:na、nb、nc;啮合最小圈数分别为:ma、mb、mc;三齿轮齿数的最小公倍数为k3。,计算步骤表示为:,读入三齿轮齿数和输出结果,分别只是一次调用读或写函数,不必求精。,求精计算三齿数的最小公倍数k3。可以把该问题分解成 先求两个齿数na与nb的最小公倍数k2,然后再求k2与第三个齿数 nc 的最小公倍数k3,k3即为na、nb、nc三个
7、齿轮齿数的最小公倍数。设已经有求两个数的最小公倍数的函数 int lowestcm(int x,int y)则该求精过程可表示成。,求精求两个数的最小公倍数的函lowestcm。x、y的最小公倍数是x、y 的积除以x、y 的最大公约数。设已经有求两个数的最大公约数的函数 int gcd(int x,int y)则该求精过程可表示成:,采用展转相除法求两个数的最大公约数,函数int gcd(int x,int y)定义如下,函数gcd是一个递归函数,先采用分支求精过程、再采用递归求精过程,可以求精成下图,最后,分别计算啮合的最小圈数可以被求精成下图。,验证三角形外心定理,三角形三条边的垂直平分线
8、交于一点,该点是三角形外接圆的圆心。解:不失一般性,假设三角形的任意一条边都不平行于任意一个坐标轴。依据平面几何知识,该问题的验证步骤应该是:读入三点a,b,c的坐标(x1,y1)、(x2,y2)、(x3,y3);检验三点是否构成一个三角形;若三点构成三角形,则验证外心定理。,读入三点坐标只是一个读语句,不必求精,下边求精检验是否三角形和验证外心定理。,检验三点是否构成三角形使用一个bool型函数isTriange,可以求精成:求两点p1,p2确定的直线方程L12;判断若p3在L12上,则 isTriange 为false,否则isTriange为true。,求两点间直线方程可以写一个函数 l
9、ine(x1,y1,x2,y2,*a,*b)并求精成下图。,验证外心定理可以如下进行:求每条边的垂直平分线;验证该三条直线是否交于一点;若交于一点,则验证该点到三角形各顶点距离是否相等否则 错误命题。,求每条边的垂直平分线方程可以写一个求一条线段的垂直平分线方程的函数,然后分别三次调用该函数。,求一条边的垂直平分线方程可以先调用前述函数 line,求该边的直线方程;再求该边的中点,然后求过该中点的与该边垂直的直线方程,得下图,验证该三条直线是否交于一点编成一个函数isOnePoint,可以先求两条直线的交点,然后再判断第三条直线是否过该点。,设有一个函数 distance(x1,y1,x2,y
10、2)可以计算两点间距离,验证三条垂直平分线的交点到三角形各顶点距离是否相等,是一个布尔表达式。,受限排列组合穷举法与试探法,有这样一类问题,从若干元素的所有排列(或组合)中选取符合某种条件的一些排列(或组合)。八皇后问题Debruijn 问题,八皇后问题,这是一个古老而有趣的游戏。高斯()最早在1850年提出并研究过这个问题,但是没有完全解决。该问题是:在一个8*8格的国际象棋棋盘上放置八个皇后,使任意两个皇后都不能互相攻击。按国际象棋规则,两个皇后可以互相攻击。若在同一行上,或在同一列上,或在同一条斜线上(包括左高右低、右高左低),如图放置的八个皇后便不能互相攻击。编程序,求出所有符合要求的
11、布局。共有92种满足条件的布局,若除去对称的等类同布局,完全不同者有12种。这里不考虑剔除类同布局,求出全部92种布局。,解这类问题有两条途径:1.穷举法;2.试探法。下边以八皇后问题为例,分别介绍这两种方法。,在具体介绍这两种方法之前,先考虑八皇后问题的表示方法。用一个一维数组表示棋盘。Ai表示棋盘的第i列,若Ai中存放有数k表示第i列中第k行上放置了皇后。例:A3=6表示在棋盘的第3列第6行上放置一个皇后。A0是根据下边算法的需要,多设的一个元素。,八皇后 穷举法,本方法思路是,按某种顺序枚举出全部排列或组合。每当枚举出一种排列或组合之后,便用给定条件判断该种排列或组合是否符合条件。若符合
12、条件,则本种排列或组合被选中,可以输出或记录下来。若不符合条件,则把本种排列或组合舍掉。八个皇后的排列问题,最简单的方法是八重循环,可以编出如下穷举法程序。在下述算法中,用到检验函数check与输出函数out。为简单起见,先省略它们的具体实现细节。,int main(void)int a9,i1,i2,i3,i4,i5,i6,i7,i8;for(i1=1;i1=8;i1+)for(i2=1;i2=8;i2+)for(i3=1;i3=8;i3+)for(i4=1;i4=8;i4+)for(i5=1;i5=8;i5+)for(i6=1;i6=8;i6+)for(i7=1;i7=8;i7+)for(
13、i8=1;i8=8;i8+)a1=i1;a2=i2;a3=i3;a4=i4;a5=i5;a6=i6;a7=i7;a8=i8;if(check()out();,八皇后 试探法,按规律,从一满足条件的初始状态出发,逐步生成满足条件的子排列,不断增加子排列长度。增加子排列长度过程中,每增加一位,生成一个子排列后,便检验它是否满足条件。不满足条件,则换一个子排列即修改当前位置满足条件,则延长子排列,增加子排列长度。子排列的长度满足要求长度,便找到了一个解。若要求找一个解即可,这时便可以结束。若要求找所有解,这时可以输出或记录本解,然后按前述思路,继续修改排列,继续试探,找下个解,在上述试探过程中,修改
14、当前位置时:若当前位置上还有没被试探过的元素,则应该取下一个没被试探过的元素进行试探若当前位置上所有元素都被试探过了,则在当前位置上没办法再修改了这说明前边的某个位置有问题,放置的元素不对,显然应该向回退一位。回溯后,原来的上 一个位置变成了当前位置,则又变成修改当前位置的问题了。这时,同样还应该考虑取下一个没被试探过的元素进行试探,以及是否所有元素在当前位置上都被试探过了并回溯的问题。,如图所示,设要生成一个 n 位的串A;在每个位置上可选择的符号有 K 个;A 应该满足条件 r;m表示当前试探位置。试探法的算法描述为:1.初始时,从第一个位置开始试探,令 m=1;2.然后在第 m 位逐次取
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 程序 开发 结构 程序设计
链接地址:https://www.31ppt.com/p-6327623.html