《第4章 基本控制结构.ppt》由会员分享,可在线阅读,更多相关《第4章 基本控制结构.ppt(60页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第第4章章程序设计方法学基础程序设计方法学基础基本控制结构基本控制结构哈尔滨工业大学哈尔滨工业大学4.1算法的概念和描述方法算法的概念和描述方法n4.1.1算法的概念算法的概念 n4.1.2算法的描述方法算法的描述方法4.1.1算法的概念算法的概念n算法(算法(Algorithm)为解决一个具体问题而采取的确定的有限的操作步骤,仅指为解决一个具体问题而采取的确定的有限的操作步骤,仅指计算机能执行的算法计算机能执行的算法n计算机中的问题求解计划计算机中的问题求解计划通过程序员按照某种算法编写的计算机程序(通过程序员按照某种算法编写的计算机程序(Computer Program)来实现的)来实现的
2、设计出正确的算法是编写正确的计算机程序的前提条件设计出正确的算法是编写正确的计算机程序的前提条件n程序设计是一门艺术,主要体现在程序设计是一门艺术,主要体现在算法设计算法设计结构设计结构设计n揭示面向过程的程序本质的公式揭示面向过程的程序本质的公式算法算法+数据结构数据结构=程序程序N.Wirth(图灵奖1984)Pascal创始人定义待操作的数据在计算机内存中是如何存储和组织的,选择恰当的数据结构可以提高程序的运行或存储效率对在数据上的操作的描述,不同的算法可能有不同的时间或空间效率4.1.1算法的概念算法的概念n算法的特性算法的特性有穷性(有穷性(Finiteness)在合理的时间内完成在
3、合理的时间内完成确定性(确定性(Definiteness)无歧义,能有效执行,且能得到确定的结果无歧义,能有效执行,且能得到确定的结果有效性(有效性(Effectiveness)允许没有输入或有多个输入(允许没有输入或有多个输入(Input)必须有一个或多个输出必须有一个或多个输出(Output)4.1.1算法的概念算法的概念n常用的算法描述方法常用的算法描述方法自然语言(自然语言(Natural Language)伪码(伪码(Pseudocode)表示)表示传统的流程图(传统的流程图(Flowchart)N-S结构化流程图结构化流程图4.1.2算法的描述方法算法的描述方法4.1.2算法的描述
4、方法算法的描述方法n以买苹果为例,已知单价每斤以买苹果为例,已知单价每斤y元,问买元,问买x斤苹果,需多斤苹果,需多少钱?少钱?step1:输入x和 y;step2:根据公式t=x*y计算总价;step3:输出总价t。Begin Input x,y t=x*y Output t End 自然语言自然语言描述描述伪码伪码描述描述通俗易懂,符合人的日通俗易懂,符合人的日常思维习惯,但不易直常思维习惯,但不易直接转化为程序接转化为程序书写无固定格式和规范,书写无固定格式和规范,灵活,介于自然语言和灵活,介于自然语言和计算机语言之间,易于计算机语言之间,易于转换为计算机程序转换为计算机程序4.1.2算
5、法的描述方法算法的描述方法n关键:关键:建立问题的数学模型(建立问题的数学模型(Mathematical Model)即数学建模)即数学建模n计算思维计算思维运用计算机科学的基础概念进行问题求解、系统设计及人类运用计算机科学的基础概念进行问题求解、系统设计及人类行为理解等涵盖计算机科学之广度的一系列思维活动行为理解等涵盖计算机科学之广度的一系列思维活动简单地说,计算思维其实就是在寻找一个问题的解的过程中简单地说,计算思维其实就是在寻找一个问题的解的过程中的思维方式的思维方式4.2计算机的问题求解计算机的问题求解4.3顺序结构顺序结构n顺序结构:最简单、最常用的程序结构顺序结构:最简单、最常用的
6、程序结构n复合语句:复合语句:以两数交换为例以两数交换为例4.34.3顺序结构顺序结构n【例例4.1】已知苹果的单价是每千克已知苹果的单价是每千克p元,问:买元,问:买q千克千克的苹果,需要多少钱?的苹果,需要多少钱?#include int main(void)int p;int q;int t;scanf(%d,%d,&p,&q);t=q*p;printf(%dn,t);return 0;4.4选择结构选择结构n4.4.1选择结构的基本形式选择结构的基本形式n4.4.2条件语句条件语句n4.4.3开关语句开关语句n4.4.4最佳编码原则:正确使用关系和逻辑运算符最佳编码原则:正确使用关系和
7、逻辑运算符4.4.1选择结构的基本形式选择结构的基本形式变是唯一的不变变是唯一的不变n人生常常要面临许多叉路口,不同的抉择将有可能完全改变你人人生常常要面临许多叉路口,不同的抉择将有可能完全改变你人生的轨迹生的轨迹n只要我们能够准确识别,未雨绸缪,积极应变,就一定能做到从只要我们能够准确识别,未雨绸缪,积极应变,就一定能做到从容应对各种变化,把危机转化为机遇。容应对各种变化,把危机转化为机遇。n选择结构选择结构n根据给定的判定条件,判断结果,并根据判断的结果来控制程序的流程根据给定的判定条件,判断结果,并根据判断的结果来控制程序的流程n选择结构(分支结构)选择结构(分支结构)单分支单分支选择结
8、构(选择结构(Single Selection)双分支双分支选择结构(选择结构(Double Selection)多分支多分支选择结构(选择结构(Multiple Selection)n单分支单分支选择结构(选择结构(Single Selection)面临的选择是:面临的选择是:要么执行一个操作,要么跳过它要么执行一个操作,要么跳过它4.4.1选择结构的基本形式选择结构的基本形式变是唯一的不变变是唯一的不变n双分支双分支选择结构(选择结构(Double Selection)面临的选择是:面临的选择是:在两个不同的操作中选择其中的一个来执行在两个不同的操作中选择其中的一个来执行n多分支多分支选择
9、结构(选择结构(Multiple Selection)4.4.1选择结构的基本形式选择结构的基本形式变是唯一的不变变是唯一的不变if-else单分支单分支单分支单分支双分支双分支双分支双分支多分支多分支多分支多分支ifelse-if4.4.2条件语句条件语句无处不在的抉择无处不在的抉择n【例4.2】从键盘输入两个整型数,编程比较并输出两个数中的较大值。n确定问题的输入和输出n建立问题的数学模型n算法描述4.4.2条件语句条件语句无处不在的抉择无处不在的抉择n【例4.2】从键盘输入两个整型数,编程比较并输出两个数中的较大值。4.4.2条件语句条件语句无处不在的抉择无处不在的抉择#include
10、int main(void)int a,b,max;scanf(%d,%d,&a,&b);if(a=b)max=a;elsemax=b;printf(max=%dn,max);return 0;#include int main(void)int a,b;scanf(%d,%d,&a,&b);if(a=b)printf(max=%dn,a);elseprintf(max=%dn,b);return 0;n【例4.2】从键盘输入两个整型数,编程比较并输出两个数中的较大值。4.4.2条件语句条件语句无处不在的抉择无处不在的抉择#include int main(void)int a,b,max;s
11、canf(%d,%d,&a,&b);max=a=b?a:b;printf(max=%dn,max);return 0;#include int main(void)int a,b;scanf(%d,%d,&a,&b);printf(max=%dn,a=b?a:b);/直接打印条件表达式的值直接打印条件表达式的值 return 0;4.4.2条件语句条件语句无处不在的抉择无处不在的抉择n如何如何表示表示真假值?真假值?真真 1假假 0n如何如何判断判断真假值?真假值?非非0 真真0 假假4.4.2条件语句条件语句无处不在的抉择无处不在的抉择4.4.2条件语句条件语句无处不在的抉择无处不在的抉择n
12、逻辑非逻辑非 算术算术 关系关系 逻辑与逻辑与 逻辑或逻辑或 赋值赋值n圆括号优先级最高圆括号优先级最高n【例4.3】从键盘任意输入一个年份year,编程判断其是否为闰年,如果是闰年,则输出“Yes!”,否则输出“No!”。n闰年需要满足下列两个条件中的任意一个。n(1)能被4整除,但不能被100整除。n(2)能被400整除。4.4.2条件语句条件语句无处不在的抉择无处不在的抉择#include int main(void)int year,leap;scanf(%d,&year);leap=(year%4=0)&(year%100!=0)|(year%400=0);if(leap)/若若le
13、ap的值为非的值为非0,即为真,即为真printf(Yes!n);elseprintf(No!n);return 0;n【例4.3】从键盘任意输入一个年份year,编程判断其是否为闰年,如果是闰年,则输出“Yes!”,否则输出“No!”。4.4.2条件语句条件语句无处不在的抉择无处不在的抉择#include int main(void)int year;scanf(%d,&year);if(year%4=0)&(year%100!=0)|(year%400=0)printf(Yes!n);elseprintf(No!n);return 0;n【例4.4】从键盘任意输入一个百分制成绩,编程计算并
14、输出其对应的五分制成绩。4.4.3开关语句开关语句条条道路通罗马条条道路通罗马#includeint main(void)int score;char grade;printf(Please input score:);scanf(%d,&score);if(score=90&score=80&score=70&score=60&score=0&score 60)grade=E;if(score 100)printf(Input error!n);else printf(grade:%cn,grade);return 0;n【例4.4】从键盘任意输入一个百分制成绩,编程计算并输出其对应的五分制
15、成绩。4.4.3开关语句开关语句条条道路通罗马条条道路通罗马#includeint main(void)int score;char grade;scanf(%d,&score);if(score 100)printf(Input error!n);else if(score=90)grade=A;else if(score=80)grade=B;else if(score=70)grade=C;else if(score=60)grade=D;else grade=E;printf(grade:%cn,grade);return 0;n【例4.4】从键盘任意输入一个百分制成绩,编程计算并输出
16、其对应的五分制成绩。4.4.3开关语句开关语句条条道路通罗马条条道路通罗马#include int main(void)int score;scanf(%d,&score);if(score100)printf(Input error!n);else if(score=90)printf(%d-An,score);else if(score=80)printf(%d-Bn,score);else if(score=70)printf(%d-Cn,score);else if(score=60)printf(%d-Dn,score);else printf(%d-En,score);return
17、 0;4.4.3开关语句开关语句条条道路通罗马条条道路通罗马n【例4.4】从键盘任意输入一个百分制成绩,编程计算并输出其对应的五分制成绩。4.4.3开关语句开关语句条条道路通罗马条条道路通罗马#include int main(void)int score,mark;scanf(%d,&score);mark=score100?-1:score/10;switch(mark)case 10:case 9:printf(%d-An,score);break;case 8:printf(%d-Bn,score);break;case 7:printf(%d-Cn,score);break;case
18、 6:printf(%d-Dn,score);break;case 5:case 4:case 3:case 2:case 1:case 0:printf(%d-En,score);break;default:printf(Input error!n);return 0;n【例4.4】从键盘任意输入一个百分制成绩,编程计算并输出其对应的五分制成绩。4.4.3开关语句开关语句条条道路通罗马条条道路通罗马1.每个每个case后的常量后的常量的类型应与的类型应与switch后后括号内表达式的类型括号内表达式的类型一致,并且一致,并且switch后后括号内表达式的值只括号内表达式的值只能为整型、字符型
19、或能为整型、字符型或枚举类型的常量。枚举类型的常量。2.switch语句与语句与break语句配合使用,才能语句配合使用,才能形成真正意义上的多形成真正意义上的多分支分支3.改变改变case标号出现标号出现的次序,不会影响程的次序,不会影响程序的运行结果序的运行结果4.4.4最佳编码原则:正确使用关系和逻辑运算符最佳编码原则:正确使用关系和逻辑运算符1.不要忽略编译器给出的任何警告信息不要忽略编译器给出的任何警告信息2.不能直接用相等关系运算符判断两个浮点数相等不能直接用相等关系运算符判断两个浮点数相等3.不要将数学表达式直接翻译成不要将数学表达式直接翻译成C表达式表达式4.避免浮点数逻辑运算
20、符的避免浮点数逻辑运算符的“短路短路”特性带来的副作用特性带来的副作用5.在在switch语句中,加入语句中,加入default分支分支if(fabs(a-b)EPS)/浮点数比较相等浮点数比较相等if(fabs(a)b c 的值是真是假?的值是真是假?4.5循环结构循环结构周而复始的循环之道周而复始的循环之道n4.5.1循环的控制方式循环的控制方式n4.5.2计数控制的循环计数控制的循环n4.5.3条件控制的循环条件控制的循环n4.5.4最佳编码原则:结构化程序设计最佳编码原则:结构化程序设计4.5.14.5.1循环的控制方式循环的控制方式当型循环是先测试循环条件,后执行循环体直到型循环是先
21、执行循环体,然后测试循环条件4.5.2 4.5.2 计数控制的循环计数控制的循环n实现计数控制的实现计数控制的forfor语句语句4.5.2 4.5.2 计数控制的循环计数控制的循环#include int main(void)int n;int sum=0;/累加和变量初始化为累加和变量初始化为0 scanf(%d,&n);for(int i=1;i=n;i+)sum=sum+i;/做累加运算做累加运算 printf(sum=%dn,sum);return 0;【例4.5】从键盘输入整型变量n的值,然后计算并输出1+2+3+n的值。4.5.2 4.5.2 计数控制的循环计数控制的循环#inc
22、lude int main(void)int n;long p=1;/因是累乘计算,故初始化为因是累乘计算,故初始化为1 scanf(%d,&n);for(int i=1;i=n;i+)p=p*i;/做累乘运算做累乘运算 printf(%d!=%ldn,n,p);return 0;【例4.6】从键盘输入整型变量n的值,然后计算并输出123n(即n!)的值。4.5.2 4.5.2 计数控制的循环计数控制的循环#include int main(void)int n;long sum=0;/累加求和变量初始化为累加求和变量初始化为0 long p=1;/累乘求积变量初始化为累乘求积变量初始化为1
23、scanf(%d,&n);for(int i=1;i=n;i+)p=p*i;/计算累加项(即通项)计算累加项(即通项)sum=sum+p;/将累乘后将累乘后p的值即的值即i!进行累加求和进行累加求和 printf(sum=%ldn,n,p);return 0;【例4.7】编程从键盘输入整型变量n的值,然后计算并输出1n所有数的阶乘值(1!,2!,3!,n!)的累加和,即1!+2!+3!+n!。4.5.2 4.5.2 计数控制的循环计数控制的循环【例4.7】编程从键盘输入整型变量n的值,然后计算并输出1n所有数的阶乘值(1!,2!,3!,n!)的累加和,即1!+2!+3!+n!。4.5.2 4.
24、5.2 计数控制的循环计数控制的循环【例4.8】利用单独计算累加通项的方法,编程计算1!+2!+3!+n!。4.5.2 4.5.2 计数控制的循环计数控制的循环【例4.8】利用单独计算累加通项的方法,编程计算1!+2!+3!+n!。#include int main(void)int n;long sum=0;/累加求和变量初始化为累加求和变量初始化为0 long p=1;scanf(%d,&n);for(int i=1;i=n;i+)/外层循环外层循环 p=1;/每次循环之前都要将累乘求积变量每次循环之前都要将累乘求积变量p重新初始化为重新初始化为1 for(int j=1;j=i;j+)/
25、内层循环内层循环 p=p*j;/累乘求积累乘求积 sum=sum+p;/将累乘后将累乘后p的值即的值即i!进行累加求和进行累加求和 printf(sum=%ldn,sum);/以长整型格式输出以长整型格式输出n的阶乘值的阶乘值 return 0;4.5.3条件控制的循环条件控制的循环n循环次数未知、由条件或标记值控制的循环结构,通常用循环次数未知、由条件或标记值控制的循环结构,通常用while语语句或句或do-while语句来实现。语句来实现。n【例例4.9】祖冲之与圆周率。祖冲之与圆周率。祖冲之一生钻研自然科学,其主要贡献在数学、祖冲之一生钻研自然科学,其主要贡献在数学、天文历法和机械制造三
26、个方面天文历法和机械制造三个方面他在刘徽开创的探索圆周率的精确方法基础上,他在刘徽开创的探索圆周率的精确方法基础上,首次将圆周率精算到小数点后第七位,即在首次将圆周率精算到小数点后第七位,即在3.1415926和和3.1415927之间,他提出的之间,他提出的“祖祖率率”对数学的研究具有重大贡献对数学的研究具有重大贡献直到直到16世纪,阿拉伯数学家阿尔世纪,阿拉伯数学家阿尔卡西才打破卡西才打破了这一纪录。了这一纪录。4.5.3条件控制的循环条件控制的循环n利用利用 ,编程计算,编程计算 的近似值,的近似值,直到最后一项的绝直到最后一项的绝对值小于对值小于1010-4-4时为止时为止。4.5.3
27、条件控制的循环条件控制的循环#include#include int main(void)double sum=0,term=1,sign=1.0;int count=0,n=1;do term=sign/n;term=sign/n;/计计算通算通项项 sum=sum+term;count+;sign=-sign;n=n+2;while(fabs(term)=1e-4);printf(pi=%.8fncount=%dn,sum*4,count);return 0;#include#include int main(void)double sum=0,term=1,sign=1.0;int co
28、unt=0,n=1;while(fabs(term)=EPS)term=sign/n;term=sign/n;/计计算通算通项项 sum=sum+term;count+;sign=-sign;n=n+2;while(fabs(term)=1e-4);printf(pi=%.8fncount=%dn,sum*4,count);return 0;4.5.3条件控制的循环条件控制的循环n【例例4.10】从键盘读入一些非负整数并且将其累加求和。当程序从键盘读入一些非负整数并且将其累加求和。当程序读入负数时,结束键盘输入,输出累加求和的结果以及累加的项读入负数时,结束键盘输入,输出累加求和的结果以及累加
29、的项数。数。#include int main(void)int n,sum=0,i=0;/sum和和i均初始化均初始化为为0 printf(Input n:);scanf(%d,&n);/循循环环之前先之前先输输入一个入一个n的的值值 while(n=0)/测试测试n值值,若,若n是小于是小于0的的标记值标记值,则结则结束束输输入入 sum=sum+n;/先先测试测试n值值,满满足要求后再足要求后再执执行累加运算行累加运算 i+;printf(Input n:);scanf(%d,&n);printf(sum=%d,count=%dn,sum,i);return 0;4.5.4最佳编码原则最
30、佳编码原则:结构化程序设计结构化程序设计n一个比较流行的定义是:一个比较流行的定义是:结构化程序设计结构化程序设计(Structured Programming)是一种程序设计的原则和方法)是一种程序设计的原则和方法它限制和避免使用它限制和避免使用goto语句,采用语句,采用“自顶向下、逐步求精自顶向下、逐步求精”方法进行程序设计方法进行程序设计按照这种原则和方法设计出的程序的特点为:按照这种原则和方法设计出的程序的特点为:l结构清晰结构清晰 容易阅读容易阅读 容易修改容易修改 容易验证容易验证l按照结构化程序设计的要求设计出的语言按照结构化程序设计的要求设计出的语言结构化程序设计语言结构化程
31、序设计语言l按照结构化程序设计语言(或结构化程序设计思想)设计的程序按照结构化程序设计语言(或结构化程序设计思想)设计的程序结构结构化程序化程序n结构化程序设计的目标结构化程序设计的目标为了得到一个好结构的程序为了得到一个好结构的程序有无有无goto语句,并不是程序结构好坏的标志语句,并不是程序结构好坏的标志4.5.4最佳编码原则最佳编码原则:结构化程序设计结构化程序设计n1goto 语句的利与弊语句的利与弊尽量避免使用尽量避免使用goto语句,尤其是不要使用过多的语句,尤其是不要使用过多的goto语句标号(最多语句标号(最多1个),个),因为过多的因为过多的goto语句标号会破坏程序的语句标
32、号会破坏程序的“单入口、单出口单入口、单出口”结构。结构。为避免使用过多为避免使用过多goto语句标号导致的程序结构混乱,一般只允许在一个语句标号导致的程序结构混乱,一般只允许在一个“单单入口、单出口入口、单出口”的模块内部使用的模块内部使用goto语句向下跳转,不允许回跳,尤其不允语句向下跳转,不允许回跳,尤其不允许交叉使用许交叉使用goto语句语句n通常,仅如下两种情形可以使用通常,仅如下两种情形可以使用goto语句:语句:n(1)跳出多重循环。)跳出多重循环。goto语句是快速跳出多重循环的一条捷语句是快速跳出多重循环的一条捷径。径。n(2)跳向共同的出口位置,进行退出前的错误处理工作。
33、这)跳向共同的出口位置,进行退出前的错误处理工作。这样,将所有错误都指向同一个标号处的语句来处理,可以使程样,将所有错误都指向同一个标号处的语句来处理,可以使程序结构更清晰,且代码更集中。序结构更清晰,且代码更集中。4.5.4最佳编码原则最佳编码原则:结构化程序设计结构化程序设计void Init(void)char*p1=NULL;char*p2=NULL;char*p3=NULL;p1=(char*)malloc(256);if(p1=NULL)goto Exit;p2=(char*)malloc(256);if(p2=NULL)goto Exit;p3=(char*)malloc(256
34、);if(p3=NULL)goto Exit;/*正常处理的代码正常处理的代码*/Exit:if(p1!=NULL)free(p1);if(p2!=NULL)free(p2);if(p3!=NULL)free(p3);return;goto语句还适合什么情况下使用?语句还适合什么情况下使用?跳跳向共同的出口位置(向共同的出口位置(转向同一语句标号转向同一语句标号),进行退出前),进行退出前的错误处理的错误处理4.5.4最佳编码原则最佳编码原则:结构化程序设计结构化程序设计n2.break语句的利与弊语句的利与弊4.5.4最佳编码原则最佳编码原则:结构化程序设计结构化程序设计4.5.4最佳编码原
35、则最佳编码原则:结构化程序设计结构化程序设计n【例例4.11】从键盘输入从键盘输入10个数,将其中的非负整数累加求和。当个数,将其中的非负整数累加求和。当程序读入负数时,结束键盘输入,输出累加求和的结果。程序读入负数时,结束键盘输入,输出累加求和的结果。#include int main(void)int i,n;int sum=0;for(i=0;i=10时时退出循退出循环环,循,循环结环结构的第一个出口构的第一个出口 printf(Input n:);scanf(%d,&n);if(n 0)break;/退出循退出循环环,循,循环结环结构的第二个出口构的第二个出口 sum=sum+n;pr
36、intf(sum=%dn,sum);return 0;4.5.4最佳编码原则最佳编码原则:结构化程序设计结构化程序设计n【例例4.11】从键盘输入从键盘输入10个数,将其中的非负整数累加求和。当个数,将其中的非负整数累加求和。当程序读入负数时,结束键盘输入,输出累加求和的结果。程序读入负数时,结束键盘输入,输出累加求和的结果。#include int main(void)int i,n;int sum=0;int flag=1;/置置标标志志变变量初量初值为值为真真 for(i=0;i10&flag;i+)/i10且且标标志志变变量量为为真真时继续时继续循循环环,否,否则则退出循退出循环环 p
37、rintf(Input n:);scanf(%d,&n);if(n 0)flag=0;/置置标标志志变变量量为为假假 else sum=sum+n;printf(sum=%dn,sum);return 0;4.5.4最佳编码原则最佳编码原则:结构化程序设计结构化程序设计n【例例4.11】从键盘输入从键盘输入10个数,将其中的非负整数累加求和。当个数,将其中的非负整数累加求和。当程序读入负数时,结束键盘输入,输出累加求和的结果。程序读入负数时,结束键盘输入,输出累加求和的结果。#include#include int main(void)int n;int sum=0;bool flag=tru
38、e;/置置标标志志变变量初量初值为值为真真 for(int i=0;i10&flag;i+)/i10且且标标志志变变量量为为真真时继续时继续,否,否则则退出循退出循环环 printf(Input n:);scanf(%d,&n);if(n 0)flag=false;/置置标标志志变变量量为为假假 else sum=sum+n;printf(sum=%dn,sum);return 0;n2.continue语句的利与弊语句的利与弊4.5.4最佳编码原则最佳编码原则:结构化程序设计结构化程序设计n2.continue语句的利与弊语句的利与弊4.5.4最佳编码原则最佳编码原则:结构化程序设计结构化程
39、序设计n2.continue语句的利与弊语句的利与弊在某些想要跳过一些处理语句的时候,使用在某些想要跳过一些处理语句的时候,使用continue语句的确是比较方语句的确是比较方便的便的4.5.4最佳编码原则最佳编码原则:结构化程序设计结构化程序设计4.5.4最佳编码原则最佳编码原则:结构化程序设计结构化程序设计n结构化程序设计方法是一种进行程序设计的原则和方法,按照这种原结构化程序设计方法是一种进行程序设计的原则和方法,按照这种原则和方法设计的程序具有结构清晰、容易阅读、容易修改的特点,它则和方法设计的程序具有结构清晰、容易阅读、容易修改的特点,它关注的焦点是程序结构的好坏。关注的焦点是程序结
40、构的好坏。n所谓的所谓的“好结构好结构”的程序,是指程序的程序,是指程序“结构清晰、容易阅读、容易修结构清晰、容易阅读、容易修改、容易验证改、容易验证”,好结构的程序最大的优点是能提高程序的可读性和,好结构的程序最大的优点是能提高程序的可读性和可维护性。一旦效率与可维护性。一旦效率与“好结构好结构”发生矛盾,那么宁可在可容忍的范发生矛盾,那么宁可在可容忍的范围内降低效率,也要确保好的结构。围内降低效率,也要确保好的结构。4.5.4最佳编码原则最佳编码原则:结构化程序设计结构化程序设计n结构化程序设计nStructured ProgrammingD.E.Knuth(图灵奖1974)12限制和避免
41、使用goto语句采用“自顶向下逐步求精”方法进行程序设计采用顺序、选择和循环三种基本控制结构作为程序设计的基本单元34严格遵循“单入口单出口”的原则,无死循环,无死语句结构清晰容易阅读容易修改容易验证原则方法特点4.5.4最佳编码原则最佳编码原则:结构化程序设计结构化程序设计n如何获得好结构的程序呢?如何获得好结构的程序呢?(1)采用顺序、选择和循环三种基本结构作为程序设计的基本单元,用这三种)采用顺序、选择和循环三种基本结构作为程序设计的基本单元,用这三种基本结构编写的程序在语法结构上具有如下基本结构编写的程序在语法结构上具有如下4个特性:个特性:只有一个入口。只有一个入口。只有一个出口。只有一个出口。无不可达语句,即不存在永远都执行不到的语句。无不可达语句,即不存在永远都执行不到的语句。无死循环,即不存在永远都执行不完的循环。无死循环,即不存在永远都执行不完的循环。(2)少用和慎用)少用和慎用goto、break和和continue语句,因为它们会以不同的方式改语句,因为它们会以不同的方式改变程序的控制流程,易导致不期望的结果发生。变程序的控制流程,易导致不期望的结果发生。本章知识树本章知识树Q&A