程序开发和结构化程序设计.ppt





《程序开发和结构化程序设计.ppt》由会员分享,可在线阅读,更多相关《程序开发和结构化程序设计.ppt(87页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第九章第九章 程序开发和结构化程序设计程序开发和结构化程序设计n n良好的行文格式良好的行文格式n n自顶向下逐步求精的程序设计技术自顶向下逐步求精的程序设计技术n n受限排列组合受限排列组合穷举法与试探法穷举法与试探法n n本章小结本章小结n n作业作业良好的行文格式良好的行文格式n n程序的行文格式不好直接影响程序的可读程序的行文格式不好直接影响程序的可读性、清晰性和外观。性、清晰性和外观。/*A*/#include int i;main()i=25+38;printf(“25+38=%d”,i);/*B*/#include int i;main()i=25+38;printf(“25+3
2、8=%d”,i );/*C*/#include int i;/*声明整型变量声明整型变量i*/int main(void)/*主函数主函数*/i=25+38;/*求和运算求和运算*/printf(“25+38=%d”,i);/*打印打印*/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/*fo
3、r*/while(b)S /*while*/图图4 WHILE语句语句 图图5 FOR语句语句 图图6 DO语句语句用合适的助记名来命名标识符用合适的助记名来命名标识符注释注释自顶向下逐步求精的程序设计技术自顶向下逐步求精的程序设计技术n n自顶向下、逐步求精自顶向下、逐步求精若想让计算机解题必须用清晰而无两义性的若想让计算机解题必须用清晰而无两义性的方式给它提供算法。要求:方式给它提供算法。要求:找出一个算法,它能提供所解问题的从输入到输找出一个算法,它能提供所解问题的从输入到输找出一个算法,它能提供所解问题的从输入到输找出一个算法,它能提供所解问题的从输入到输出所需的映象。出所需的映象。出
4、所需的映象。出所需的映象。选择一种程序语言写出程序,用计算机能接受的选择一种程序语言写出程序,用计算机能接受的选择一种程序语言写出程序,用计算机能接受的选择一种程序语言写出程序,用计算机能接受的方式表述算法。方式表述算法。方式表述算法。方式表述算法。关键是如何找出算法。因为写出程序,只是关键是如何找出算法。因为写出程序,只是表述算法,应该没有困难。表述算法,应该没有困难。求解一个问题求解一个问题粗略的解决方案粗略的解决方案细细 化化第一步子问题第一步子问题第二步子问题第二步子问题第第n步子问题步子问题.前处理前处理 结束条件结束条件后处理后处理进进展展一一步步前处理前处理后处理后处理条条件件处
5、理处理1处理处理2处理处理n.条件条件条件条件 条件条件前处理前处理后处理后处理递归递归条件条件递归递归顺序顺序 连接连接循环循环 分支分支 选择选择 递归递归求精实例求精实例n n测定字母偶的出现频率测定字母偶的出现频率n n三个齿轮啮合问题三个齿轮啮合问题n n验证三角形外心定理验证三角形外心定理编程序,测定字母偶的出现频率编程序,测定字母偶的出现频率测定小写字符串中相邻字母偶出现频率。测定小写字符串中相邻字母偶出现频率。测定小写字符串中相邻字母偶出现频率。测定小写字符串中相邻字母偶出现频率。例如,针对例如,针对例如,针对例如,针对the catthe cat对对对对th th、he he
6、、ca ca、atat计数。设有说明:计数。设有说明:计数。设有说明:计数。设有说明:int conmat2626;int conmat2626;字母偶字母偶字母偶字母偶 he he 的出现次数存入下标变量的出现次数存入下标变量的出现次数存入下标变量的出现次数存入下标变量conmath-ae-aconmath-ae-a首先把该问题分解成如下几步:首先把该问题分解成如下几步:1)初始化计数器数组)初始化计数器数组conmat;2)统计每个字母偶的出现频率;)统计每个字母偶的出现频率;3)输出统计结果。)输出统计结果。initial 初始化初始化statistical 统计统计out 输出输出求精
7、上述求精上述PAD中的每一个步骤:中的每一个步骤:初始化数组初始化数组conmat,显然应该一行一行的初始化;显然应该一行一行的初始化;对于每行又应该一个元素一个元素的初始化。对于每行又应该一个元素一个元素的初始化。初始化初始化第第c1行行 initial 初始化初始化 for(i=0;i26;i+)结束结束deffor(j=0;j26;j+)conmatij=0考虑统计部分:考虑统计部分:假设被统计的字符串是从终端输入的,则显然我们假设被统计的字符串是从终端输入的,则显然我们应该把该字符串全部读入,并在读入的过程中边读边应该把该字符串全部读入,并在读入的过程中边读边统计。用下图表示。统计。用
8、下图表示。读读(prevchar)statisticalwhile(!EOF)统计统计一次一次结结束束def读读(thischar)再考虑具体统计算法,为统计字母偶的出现频率,显然再考虑具体统计算法,为统计字母偶的出现频率,显然在读入字符串的过程中应该始终保存两个字符在读入字符串的过程中应该始终保存两个字符 prevchar、thischar,并且当该两个字符都是字母时,相应计数,并且当该两个字符都是字母时,相应计数单元加单元加1;最后在读入下一个字符之前还应该把保存的两;最后在读入下一个字符之前还应该把保存的两个字符向前串。个字符向前串。统计统计一次一次conmat prevchar thi
9、schar +结结束束 thischar,prevchar 都是字母都是字母prevchar=thischar最后考虑输出部分最后考虑输出部分,我们把结果输出成两个我们把结果输出成两个 2613 的的表,每个表元素是相应字母偶的出现次数:表,每个表元素是相应字母偶的出现次数:*a b c d e .mab .z*n o p q r .zab .z outone(a,m)输输出出a.m部分部分outone(n,z)输输出出n.z部分部分out 输输出出结结束束def打印一个表(第一个表),显然应该先打印表头再打印下边各行打印一个表(第一个表),显然应该先打印表头再打印下边各行 打印表头打印表头打
10、印表体打印表体outone结束结束beginch ,endch打印表打印表头头可以求精成先可以求精成先输输出一个出一个“*”;再;再顺顺次次输输出各个字符。出各个字符。顺顺次次输输出各个字符是一个循出各个字符是一个循环环。打印表头打印表头打印表体打印表体outone结束结束beginch ,endch输输出出(*)输输出出(n)顺次输出各个字符顺次输出各个字符 for(c1=beginch;c1=endch;c1+)输输出出(c1)打印表体应该一行一行的打印,打印表体应该一行一行的打印,每行应该先打印行头,再打印本行各个元素;每行应该先打印行头,再打印本行各个元素;打印本行各个元素,应该一个元
11、素一个元素的打印,是一个循环打印本行各个元素,应该一个元素一个元素的打印,是一个循环打印表体打印表体outone结束结束beginch ,endch输输出出(*)输输出出(n)for(c1=beginch;c1=endch;c1+)输输出出(c1)for(c1=a;c1=z;c1+)输出一行输出一行输出输出(c1)输出输出(n)输出本行各个元素输出本行各个元素 for(c2=beginch;c2=endch;c2+)输出输出conmatc1c2三个齿轮啮合问题三个齿轮啮合问题设有三个齿轮互相衔接,求当三个齿轮的某两对齿设有三个齿轮互相衔接,求当三个齿轮的某两对齿设有三个齿轮互相衔接,求当三个齿
12、轮的某两对齿设有三个齿轮互相衔接,求当三个齿轮的某两对齿互相衔接后到下一次这两对齿再互相衔接,每个齿互相衔接后到下一次这两对齿再互相衔接,每个齿互相衔接后到下一次这两对齿再互相衔接,每个齿互相衔接后到下一次这两对齿再互相衔接,每个齿轮最少各转多少圈。轮最少各转多少圈。轮最少各转多少圈。轮最少各转多少圈。解解解解:这是求最小公倍数的问题。每个齿轮需转圈数这是求最小公倍数的问题。每个齿轮需转圈数这是求最小公倍数的问题。每个齿轮需转圈数这是求最小公倍数的问题。每个齿轮需转圈数是三个齿轮齿数的最小公倍数除以自己的齿数。设是三个齿轮齿数的最小公倍数除以自己的齿数。设是三个齿轮齿数的最小公倍数除以自己的齿
13、数。设是三个齿轮齿数的最小公倍数除以自己的齿数。设三个齿轮的齿数分别为三个齿轮的齿数分别为三个齿轮的齿数分别为三个齿轮的齿数分别为:na:na、nbnb、nc nc;啮合最小圈数分别为啮合最小圈数分别为啮合最小圈数分别为啮合最小圈数分别为:ma:ma、mbmb、mc mc;三齿轮齿数的最小公倍数为三齿轮齿数的最小公倍数为三齿轮齿数的最小公倍数为三齿轮齿数的最小公倍数为k3 k3。计算步骤表示为:计算步骤表示为:开始开始读入三齿轮齿数读入三齿轮齿数求三齿数的最小公倍数求三齿数的最小公倍数 k3分别计算啮合的最小圈数分别计算啮合的最小圈数输出结果输出结果结束结束读入三齿轮齿数和输出结果,分别只是一
14、次调用读或写读入三齿轮齿数和输出结果,分别只是一次调用读或写函数,不必求精。函数,不必求精。求精计算三齿数的最小公倍数求精计算三齿数的最小公倍数k3。可以把该问题分解成。可以把该问题分解成 先求两个齿数先求两个齿数na与与nb的最小公倍数的最小公倍数k2,然后再求然后再求k2与第三个齿数与第三个齿数 nc 的最小公倍数的最小公倍数k3,k3即为即为na、nb、nc三个齿轮齿数的最小公倍数。三个齿轮齿数的最小公倍数。设已经有求两个数的最小公倍数的函数设已经有求两个数的最小公倍数的函数 int lowestcm(int x,int y)则该求精过程可表示成则该求精过程可表示成。求三齿数的求三齿数的
15、最小公倍数最小公倍数 k3=lowestcm(lowestcm(na,nb),nc)结束结束求精求两个数的最小公倍数的函求精求两个数的最小公倍数的函lowestcm。x、y的最小公倍数是的最小公倍数是x、y 的积除以的积除以x、y 的最的最大公约数。设已经有求两个数的最大公约数的函数大公约数。设已经有求两个数的最大公约数的函数 int gcd(int x,int y)则该求精过程可表示成:则该求精过程可表示成:int lowestcm(int x,int y)return x*y/gcd(x,y)结束结束def采用展采用展转转相除法求两个数的最大公相除法求两个数的最大公约约数,函数数,函数in
16、t gcd(int x,int y)定定义义如下如下 函数函数gcd是一个递归函数,先采用分支求精过程、再采用是一个递归函数,先采用分支求精过程、再采用递归求精过程,可以求精成下图递归求精过程,可以求精成下图int gcd(int x,int y)结束结束y0return gcd(y,x%y)return x最后,分别计算啮合的最小圈数可以被求精成下图最后,分别计算啮合的最小圈数可以被求精成下图。开始开始ma=na/k3mb=nb/k3mc=nc/k3结束结束验证三角形外心定理验证三角形外心定理n n三角形三条边的垂直平分线交于一点,该点是三角形三条边的垂直平分线交于一点,该点是三角形外接圆的
17、圆心。三角形外接圆的圆心。解:不失一般性,假设三角形的任意一条边都解:不失一般性,假设三角形的任意一条边都不平行于任意一个坐标轴。依据平面几何知识,不平行于任意一个坐标轴。依据平面几何知识,该问题的验证步骤应该是:该问题的验证步骤应该是:读入三点读入三点读入三点读入三点a,b,ca,b,c的坐标的坐标的坐标的坐标(x1,y1)(x1,y1)、(x2,y2)(x2,y2)、(x3,y3)(x3,y3);检验三点是否构成一个三角形;检验三点是否构成一个三角形;检验三点是否构成一个三角形;检验三点是否构成一个三角形;若三点构成三角形,则验证外心定理若三点构成三角形,则验证外心定理若三点构成三角形,则
18、验证外心定理若三点构成三角形,则验证外心定理 。开始开始验证外心定理验证外心定理结束结束是三角形是三角形读入三点读入三点a,b,c坐标坐标读入三点坐标只是一个读语句,不必求精读入三点坐标只是一个读语句,不必求精,下边求精,下边求精检验是否三角形和验证外心定理。检验是否三角形和验证外心定理。检验三点是否构成三角形使用一个检验三点是否构成三角形使用一个bool型函数型函数isTriange,可以求精成:,可以求精成:求两点求两点p1,p2确定的直线方程确定的直线方程L12;判断若判断若p3在在L12上,上,则则 isTriange 为为false,否则否则isTriange为为true 。求求p1
19、,p2两点直线方程两点直线方程L12:y=a*x+bisTriange结束结束w在在L12上上return falsereturn true求两点间直线方程可以写一个函数求两点间直线方程可以写一个函数 line(x1,y1,x2,y2,*a,*b)并求精成下图并求精成下图。line*b=y1-a*x1结束结束*a=(y2-y1)/(x2-x1)x1,y1,x2,y2:两点坐标:两点坐标*a,*b:直线方程系数:直线方程系数 验证外心定理可以如下进行:验证外心定理可以如下进行:求每条边的垂直平分线;求每条边的垂直平分线;验证该三条直线是否交于一点;验证该三条直线是否交于一点;若交于一点,若交于一
20、点,则验证该点到三角形各顶点距离是否相等则验证该点到三角形各顶点距离是否相等否则否则 错误命题。错误命题。验证验证外心定理外心定理求每条求每条边边的垂直平分的垂直平分线线方程方程结结束束三条直三条直线线交于一点交于一点印印 O.K该该点到三角形点到三角形各各顶顶点距离相等点距离相等印印 false求每条边的垂直平分线方程可以写一个求一条线段的垂直求每条边的垂直平分线方程可以写一个求一条线段的垂直平分线方程的函数,然后分别三次调用该函数平分线方程的函数,然后分别三次调用该函数。每条边的垂直每条边的垂直平分线方程平分线方程结束结束求边求边L12的垂直平分线:的垂直平分线:vline(ax,ay,b
21、x,by,&a_a,&a_b)求边求边L23的垂直平分线:的垂直平分线:vline(bx,by,cx,cy,&b_a,&b_b)求边求边L13的垂直平分线:的垂直平分线:vline(cx,cy,ax,ay,&c_a,&c_b)求一条边的垂直平分线方程可以先调用前述函数求一条边的垂直平分线方程可以先调用前述函数 line,求该边的直线方程,求该边的直线方程;再求该边的中点再求该边的中点,然后求过该中然后求过该中点的与该边垂直的直线方程,得下图点的与该边垂直的直线方程,得下图 vline直线方程直线方程:line(x1,y1,x2,y2,&ta,&tb)结束结束中点中点:x=(x1+x2)/2;y
22、=(y1+y2)/2垂直平分线方程:垂直平分线方程:*a=-1/ta;*b=y-(*ta)*xx1,y1,x2,y2:两点:两点*a,*b:垂线方程:垂线方程验证该三条直线是否交于一点编成一个函数验证该三条直线是否交于一点编成一个函数isOnePoint,可以,可以先求两条直线的交点,先求两条直线的交点,然后再判断第三条直线是否过该点。然后再判断第三条直线是否过该点。三条直线交于一点三条直线交于一点结束结束求求L12与与L23交点交点:*x=(b1-b2)/(a1-a2);*y=a1*(*x)+b1return falsereturn truefabs(a3*(*x)+b3-y)eps设有一个
23、函数设有一个函数 distance(x1,y1,x2,y2)可以计算两点间距离,验证三条垂直平分线的交点到三可以计算两点间距离,验证三条垂直平分线的交点到三角形各顶点距离是否相等,是一个布尔表达式。角形各顶点距离是否相等,是一个布尔表达式。distance结束结束 return sqrt(x2-x1)2+(y2-y1)2)x1,y1,x2,y2:两点坐标:两点坐标受限排列组合受限排列组合穷举法与试探法穷举法与试探法有这样一类问题,从若干元素的所有排列有这样一类问题,从若干元素的所有排列(或组合或组合)中选取符合某种条件的一些排列中选取符合某种条件的一些排列(或组合或组合)。n n八皇后问题八皇
24、后问题n nDebruijn Debruijn 问题问题八皇后问题八皇后问题 这是一个古老而有趣的游戏。高斯这是一个古老而有趣的游戏。高斯这是一个古老而有趣的游戏。高斯这是一个古老而有趣的游戏。高斯()()最早在最早在最早在最早在18501850年提年提年提年提出并研究过这个问题,但是没有完全解决。该问题是:出并研究过这个问题,但是没有完全解决。该问题是:出并研究过这个问题,但是没有完全解决。该问题是:出并研究过这个问题,但是没有完全解决。该问题是:在一个在一个在一个在一个8*88*8格的国际象棋棋盘上放置八个皇后,使任意格的国际象棋棋盘上放置八个皇后,使任意格的国际象棋棋盘上放置八个皇后,使
25、任意格的国际象棋棋盘上放置八个皇后,使任意两个皇后都不能互相攻击。两个皇后都不能互相攻击。两个皇后都不能互相攻击。两个皇后都不能互相攻击。按国际象棋规则,两个皇后可以互相攻击。若按国际象棋规则,两个皇后可以互相攻击。若按国际象棋规则,两个皇后可以互相攻击。若按国际象棋规则,两个皇后可以互相攻击。若l在同一行上,在同一行上,在同一行上,在同一行上,l或在同一列上或在同一列上或在同一列上或在同一列上,l或在同一条斜线上(包括左高右低、右高左低)或在同一条斜线上(包括左高右低、右高左低)或在同一条斜线上(包括左高右低、右高左低)或在同一条斜线上(包括左高右低、右高左低)*如图放置的八个皇后便不能互相
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 程序 开发 结构 程序设计

限制150内