您好,欢迎访问三七文档
ok第二章基本控制结构程序设计结构化程序设计的特点是任何程序都可由三种基本结构及其组合来描述。本章将介绍C++分支结构和循环结构的设计方法。还将介绍一些常用算法。1ok第二章基本控制结构程序设计2.2分支结构程序设计2.7枚举类型2.6常用算法的应用实例2.4转向语句2.3循环结构程序设计2.8输入输出文件简介2.5结构化程序设计思想(选读)2.1算法的概念与表示方法2ok2.1.3算法描述的三种基本结构3循环结构1顺序结构2分支结构算法的基本结构:对算法的理论研究和实践表明,任何算法的描述都可以分解为三种基本结构或它们的组合,这三种基本结构是顺序结构、分支结构和循环结构。3ok2.2分支结构程序设计对程序的运行流程进行控制,主要通过执行专门用来控制流程的语句来实现。分支语句是基本流程控制语句之一。C++提供三种分支语句。2.2.1if语句2.2.2if语句的嵌套2.2.4swich语句2.2.3条件运算符“?:”4ok2.2.1if语句if语句基本格式:1、if(表达式)语句1;2、if(表达式)语句1;else语句2;【例2.4】输入一个年份,判断是否闰年。【例2.5】从键盘上输入三个整数,输出其中的最大数。5ok嵌套if语句:if语句中,如果内嵌语句又是if语句,就构成了嵌套if语句。if语句可实现二选一分支,而嵌套if语句则可以实现多选一的多路分支情况。嵌套有两种形式,嵌套在else分支中:if(表达式1)语句1;elseif(表达式2)语句2;elseif…else语句n;嵌套在if分支中:if(表达式1)if(表达式2)语句1;else语句2;2.2.2if语句的嵌套【例2.6】用嵌套if语句完成【例2.5】的任务。6okelse和if的配对关系:C++规定了if和else的“就近配对”原则,即相距最近且还没有配对的一对if和else首先配对。按上述规定,第二种嵌套形式中的else应与第二个if配对。如果根据程序的逻辑需要改变配对关系,则要将属于同一层的语句放在一对“{}”中。如第二种嵌套形式中,要让else和第一个if配对,语句必须写成:if(表达式1){if(表达式2)语句1;}else语句2;第二种嵌套形式较容易产生逻辑错误,而第一种形式配对关系则非常明确,因此从程序可读性角度出发,建议尽量使用第一种嵌套形式。2.2.2if语句的嵌套7ok配对关系实例://语句1:if(n%3==0)if(n%5==0)coutn″是15的倍数″endl;elsecoutn″是3的倍数但不是5的倍数″endl;//语句2:if(n%3==0){if(n%5==0)coutn″是15的倍数″endl;}elsecoutn″不是3的倍数″两个语句的差别只在于一个“{}”,但表达的逻辑关系却完全不同。【例2.7】某商场购物优惠活动【例2.8】求一元二次方程的根。8ok2.2.3条件运算符“?:”三元运算符:三元运算符条件运算符“?:”可以用来简化if语句表达。其构成的表达式格式为:表达式1?表达式2:表达式3例如:inta=6,b=7;min=ab?a:b;//min=6min=ab?++a:++b;//min=7a=7b=7min=ab?a++:b++;//min=6a=7b=7ok表达式3[f][t]分支条件运算符表达式2表达式19ok2.2.4switch语句开关语句(switch语句)用来实现多选一:switch(表达式){case常量表达式1:《语句序列1》《break;》……case常量表达式n:《语句序列n》《break;》《default:语句序列》}其中表达式作为判断条件,称为条件表达式,取值只能是整型、字符型、布尔型或枚举型等开关值,而不能是实型这样的连续值,这也是开关语句之所以得名的原因。各常量表达式是取值为常量的表达式,类型与条件表达式相同。各语句序列可以是一个语句也可以是一组语句。10ok2.2.4switch语句开关语句的执行流程是:求表达式的值,而后在常量表达式中找与之相等的分支作为执行入口,并从该分支的语句序列开始执行下去,直到遇到break语句或开关语句的结束括号“}”为止。如果表达式的值与所有常量表达式的值均不相等时,若有default分支,则执行其语句序列,否则跳出switch语句,执行后续语句。11ok2.2.4switch语句动作状态1break动作状态2break动作状态nbreak默认处理合并合并[t][t][t][f][f][f]带break的switch语句case1?case2?casen?12ok2.2.4switch语句开关语句注意要点:(1)各个case(包括default)分支出现的次序可以任意,通常将default放在最后。(2)break语句可选,如果没有break语句,每一个case分支都只作为开关语句的执行入口,执行完该分支后,还将接着执行其后的所有分支。因此,为保证逻辑的正确实现,通常每个case分支都与break语句联用。但有例外,见例2.9。(3)从形式上看,switch语句的可读性比嵌套if语句好,但不是所有多选一的问题都可由开关语句完成,这是因为开关语句中限定了条件表达式的取值类型。13ok2.2.4switch语句(4)每个常量表达式的取值必须各不相同,否则将引起歧义。(5)允许多个常量表达式对应同一个语句序列。例如:charscore;cinscore;switch(score){case′A′:case′a′:cout″excellent″;break;case′B′:case′b′:cout″good″;break;default:cout″fair″;}14okok【例2.9】运输货物实行分段计费。采用不带break的开关语句实例【例2.10】设计一个计算器程序,实现加、减、乘、除运算。2.2.4switch语句15ok循环控制语句是基本流程控制语句之一。C++提供三种循环语句:2.3.1while语句2.3.4循环的嵌套2.3.3for语句2.3.2do-while语句2.3循环结构程序设计16ok2.3.1while语句while语句也称为当循环。语句格式为:while(表达式)循环体语句;【例2.11】求1+2+3+4+…+100的值。循环体while语句[t][f]17ok2.3.1while语句注意:在有循环语句的程序中,通常循环开始前对循环条件进行初始化;而在循环体语句中要包含修改循环条件的语句,否则循环将不能终止而陷入死循环。C++表达方式灵活,例2.11中的循环语句还可以写成:while(i=n)sum+=i++;或者while(sum+=i++,i=n);//循环体为空语句这两种表达方式与例2.11中的循环语句从执行结果看是完全等价的。需要说明的是,虽然C++可以让代码最大限度优化,但往往造成可读性降低,因此程序设计者只需理解这种表达方法的意义,而设计时主要追求的目标应是可读性。18ok2.3.2do-while语句do-while语句称为直到循环,格式为:do循环体语句while(表达式)循环体do...while语句[t][f]19ok2.3.2do-while语句do/while语句和while语句的区别:do/while语句至少执行一次循环体后再判断循环条件是否满足;while语句先判断条件是否满足,然后才执行循环体。可能一次也不执行。多数情况下可以互相替代。【例2.12】用迭代法求a的平方根近似值。【例2.13】输入一段文本,统计文本的行数、单词数及字符数。20ok2.3.3for语句for循环语句的格式:for(表达式1;表达式2;表达式3)循环体语句ok初始化循环体初始化for语句[t][f]先求表达式1的值再求表达式2的值先求表达式3的值再求表达式2的值执行过程为:先求表达式1的值,再求表达式2的值,判断表达式2的值,如果为真,则执行循环体语句,之后求表达式3的值,然后再计算表达式2的值,再判断表达式2的值,决定是否执行循环体,如此重复,直到表达式2的值为假,结束该循环语句。21okfor语句、while语句、do/while语句比较:inti=1,sum=0;//循环初始条件while(i=4){sum+=i;i++;//修改循环条件}inti=1,sum=0;//循环初始条件do{sum+=i;i++;//修改循环条件}while(i=4);inti,sum=0;for(i=1;i=4;i++){sum+=i;}/*习惯上:表达式1:循环初始条件;表达式2:循环终止条件;表达式3:修改循环条件*/ok22okfor语句的应用for语句的几点说明:(1)for语句属于先判断型,与while语句完全等同。(2)for语句中的三个表达式都是包含逗号表达式在内的任意表达式。如【例2.11】中的循环部分用for语句可描述为:for(i=1,sum=0;i=100;i++)sum+=i;(3)for语句中的三个表达式可部分或全部省略,但两个分号不能省略。如上述语句还可写为:i=1;sum=0;for(;i=100;){sum+=i;i++;}实际上,表达式2也可省略,形如for(;;){…}这种情况下,约定表达式2的值为1,即等同for(;1;){…}死循环,用break跳出。23okfor语句的应用【例2.14】运行结果:01123581321345589144233377610987159725844181那么怎样才能从兔子问题推导出Fibonacci数列呢?设本月底兔子数为a,上月底兔子数b,两月前月底兔子数为c。那么两月前的所有兔子,包括老兔子和当月新生的兔子本月都可以生小兔子,即本月新生兔子总数是两月前的兔子数c,所以本月兔子总数a等于上月兔子数b与两月前兔子数c(即本月新生兔子数)之和,即:a=b+c;这就是Fibonacci数列。【例2.14】设计程序输出Fibonacci数列的前20项24okfor语句的应用也可以另设计一个算法:安排四个变量:兔子总数s,成年兔数量a,一月兔数量b,初生兔数量c;a=a+b;//本月成年兔为上月一月兔与成年兔之和b=c;//本月一月兔数量为上月初生兔c=a;//本月底初生兔数量为本月成年兔数量s=a+b+c;//本月底兔总数代入初值:a=0;b=0;c=1;就可以进行递推。【例2.15】输入一个不超过9位的整数,将其反向后输出。25ok2.3.4循环的嵌套【例2.16】打印九九表。嵌套循环:当循环语句中的循环体中又有循环语句时,就构成了嵌套循环。嵌套层次一般不超过3层,以保证可读性。【例2.17】打印如下图形。*******************************************************26ok2.4转向语句break语句return语句goto语句continue语句27ok2.4转向语句break语句只能用在switch语句和循环语句中,用来跳出switch语句或提前终止循环,转去执行switch语句或循环语句之后的语句。在for循环中可以用break结束循环:for(;;){…if(表达式)break;…}在多重循环中,break语句只能终止其所在的循环语句。Break语句:【例2.18】给定正整数m,判定其是否为素数。28ok2.4转向语句例:for(i=10;i20;i++){if(i%3==0)break;//遇到i是3的倍数,提前终止循环;couti‘\t’;//i不是3的倍数才输出}该程序段执行后输出:101129Break语句:ok2.4转向语句continue语句只能用在循环语句中,用来终止本次循环。当程序执行到continue语句时,将跳过其后尚未执行的循环体语句,开始下一次循环。下一次循环是否执行仍然取决于循环条件的判断。continue语句与break语句的区别在于,continue语句
本文标题:概念C++第二章
链接地址:https://www.777doc.com/doc-2302633 .html