1、第4章 C+的流程控制语句,本章主要内容: 1、C+语言的语句和程序结构 2、选择结构语句 3、循环结构语句 4、控制执行顺序的语句,2019/6/10,版权所有 南京理工大学 王芳,2,程序设计,概念:分析问题、确定算法、编写程序代码和程序调试的整个过程。 算法的常用表示方法:自然语言、流程图、结构化的流程图、伪代码等。,2019/6/10,版权所有 南京理工大学 王芳,3,选择结构语句if 语句,在C+语言中,if 语句有三种形式: 1、形式1if (表达式) 语句如果表达式的值为真(非零值),则执行语句,否则跳过语句,直接执行随后的语句。 语句可以是一条语句,也可以是复合语句。如:求某个
2、数的绝对值,可描述为:if (num0) num=-num;,2019/6/10,版权所有 南京理工大学 王芳,4,2、形式2if (表达式) 语句1else 语句2 如果表达式的值为真,则执行语句1,否则执行语句2。语句1与语句2中至少有一个被执行,然后继续执行随后的语句。 语句1与语句2都可以是一条语句,或为用 括起来的复合语句。如:求两个数的最大值:if (a1=a2) max=a1;else max=a2;,选择结构语句if 语句,2019/6/10,版权所有 南京理工大学 王芳,5,3、形式3if (表达式1) 语句1else if (表达式2) 语句2else if (表达式3)
3、语句3 else 语句n+1 如果表达式1的值为真,则执行语句1,程序转至整个if 语句后继续执行;若表达式的结果为假,则判断表达式2的值。若表达式2的值为真,则执行语句2,然后程序也是跳转到整个if 语句的后面执行;若为假则判断表达式3的依此类推。 这个语句可以实现多分支选择结构的程序设计。,选择结构语句if 语句,2019/6/10,版权所有 南京理工大学 王芳,6,例:求三个数中的最大值#include void main(void) int a1, a2, a3, max;cina1a2a3;if (a1=a2 ,选择结构语句if 语句,2019/6/10,版权所有 南京理工大学 王芳
4、,7,if 语句的嵌套,在if 语句的“if语句块”和“else语句块”中还可以包含 if 语句。,if (表达式1) .else.,if (表达式3 ) else.,if (表达式2 ) else.,注意:if 和else的配对C+语言规定:在嵌套的if 语句中,else子句总是与前面最近的、不带else 的if 相结合。,2019/6/10,版权所有 南京理工大学 王芳,8,例:将下列表达式用程序描述,请判断哪一个是正确的?-1 x0,A、if (x!=0)if (x0) y=1;else y=-1;else y=0;B、y=0;if (x=0)if (x) y=1;else y=-1;C
5、、if (x0) y=1;else y=0;,答案:A,2019/6/10,版权所有 南京理工大学 王芳,9,三目运算符:条件运算符,形式: 表达式1 ? 表达式2 : 表达式3含义:当表达式1的值为非零(真)时,取表达式2的值为此条件表达式的值;当表达式1的值为零(假)时,取表达式3的值为条件表达式的值。 例如: if (a=b) max=a;else max=b; 可以写成: max = (ab) ? a : b因此它是if ( ) else 语句的缩写形式。,2019/6/10,版权所有 南京理工大学 王芳,10,优先级: 算术运算符关系运算符逻辑运算符条件运算符赋值运算符逗号运算符,三
6、目运算符:条件运算符,条件运算符的优先级仅高于逗号运算符和赋值运算符,采用从右向左的运算顺序。,例如: ab?a:cd?c:d 相当于 ab?a:(cd?c:d),2019/6/10,版权所有 南京理工大学 王芳,11,switch 语句,switch结构与else if 结构是多分支选择的两种形式,它们的应用环境不同,else if结构用于对多条件并列测试,从中取一的情形;switch 结构用于单条件测试,从其多种结果中取一种的情形。 形式: switch (表达式) case 常量表达式1:语句1case 常量表达式2:语句2case 常量表达式n:语句ndefault:语句n+1 含义:
7、当表达式的值与某一个case后面的常量表达式的值相等时,就执行case后面的语句,并将流程转移到下一个case继续执行,直至switch语句结束;若所有的case中的常量表达式的值都没有与表达式的值相匹配,则执行default后面的语句。,说明:1、switch语句中可以不包含default,且default并不限定于最后。2、为了在执行某个case分支后,使流程跳出switch结构,即终止switch语句的执行,总是把break语句作为每个case 分支的最后一条语句。,2019/6/10,版权所有 南京理工大学 王芳,12,#include void main(void) int x=1,
8、 y=0, a=0, b=0;switch (x) case 1: switch (y)case 0: a+; break;case 1: b+; break;case 2: a+; b+; break;case 3: a+; b+;cout“a=“at“b=“bendl; ,结果:a=2 b=1,switch 语句,2019/6/10,版权所有 南京理工大学 王芳,13,for 语句,for语句的一般格式为:for (表达式1;表达式2;表达式3 )循环体语句其中: 表达式1:循环变量赋初值; 表达式2:循环条件,一般为关系表达式或逻辑表达式; 表达式3:循环变量增值,使循环趋于结束; 循环
9、体语句:若由多条语句,一定要用括起来。,2019/6/10,版权所有 南京理工大学 王芳,14,for语句的执行过程,循环变量赋初值x=1,执行循环体语句,执行表达式3 x+,Y,N,例1: #inlude void main(void) int x;for(x=1;x=5;x+)coutx;,2019/6/10,版权所有 南京理工大学 王芳,15,例2: #include void main(void) int x;for (x=25;x0;x-=5)coutx;,例3: #include void main(void) int x, y, s;for(x=0,y=0;x+y=10;+x,+
10、y) s=x+y;couts; ,for 语句,注:循环变量既可自动增加,如例1;也可以为负值,如例2;而且循环变量还可以不只一个,如例3。,2019/6/10,版权所有 南京理工大学 王芳,16,在for循环中,有些表达式可以省略: 一、缺一项 1、for (;循环条件;循环变量增值) 2、for (循环变量赋初值;循环变量增值) 3、for (循环变量赋初值;循环条件;) 二、缺两项 1、for (;循环变量增值) 2、for (循环变量赋初值;) 3、for (;循环条件;) 三、三项都缺for (;) 注意:根据C+语言的语法规定,不论省略那项,原有的分号不能省略,至于那些被省略语句的
11、功能,则应该用其它语句完成。,for 语句,可在for语句前赋初值,构成无穷循环,可用break结束,在循环体中使循环正常结束,2019/6/10,版权所有 南京理工大学 王芳,17,for循环的嵌套,例: #include void main(void) int i, j, k=0, m=0;for (i=0; i2; i+) for (j=0; j3; j+)k+;k-=j;m=i+j;cout“k=“kt“m=“mendl;,2019/6/10,版权所有 南京理工大学 王芳,18,while 语句,1、格式:while (循环条件)循环体语句 2、含义:当表达式为非零值(真)时,执行循环
12、体语句。 3、特点:先判断表达式,后执行语句。若条件不满足,循环体语句一次也不执行。例:输出1到5之间的整数 #include void main(void) int x=1;while (x=5) coutxt;x+;,while语句嵌套,和for语句类似,while语句也可以嵌套。 例:下面是一个猜字符的游戏。 #include void main(void) char ch, ch1;while (1) coutch;while (ch!=d)coutch;coutch1;if (ch1=y|ch1=Y) break;,2019/6/10,版权所有 南京理工大学 王芳,19,#inclu
13、de void main(void) char s;cin.get(s);while(s!=n)switch(s-2) case 0: case 1: couts;case 2: couts; break;case 3: couts;default: couts; break;cin.get(s);,答案:223347,while循环和switch 语句,若从键盘上输入2347后,请说出输出结果是什么?,2019/6/10,版权所有 南京理工大学 王芳,20,do-while语句用来实现直到型循环 格式:do 循环体语句while (循环条件); 含义:当循环条件为非零值(真)时,执行循环体语
14、句 和while 循环相比,如果循环条件开始就不符合要求,则while循环将一次也不执行,而do-while至少会执行一次循环语句。,do-while语句,对于do-while语句: 1、无论while后的表达式的值是什么,循环体总是先执行一次; 2、在循环体内应该改变while后的表达式中变量的值,使之最终能得到一个零值而退出循环。 3、do-while语句也能嵌套,它的特点和for、while语句相同。,2019/6/10,版权所有 南京理工大学 王芳,21,break语句和 continue语句,一、break语句 格式:break; 作用:在switch语句中用来立即终止执行switc
15、h语句。在for、while、do-while语句中,break可用来跳出循环体,提前结束循环,不再执行剩余的若干次循环,而转去执行该循环后面的语句。但是若是多重循环,break语句的作用只能退出离break最近的一层循环。 二、continue语句(结束本次循环) 格式:continue; 作用:能使当前正在进行的循环(for, while, do-while)跳过continue;后的循环体语句,立即开始下一次循环的判断。 三、break语句和continue语句的区别 continue语句只结束本次循环,而不是终止整个循环的执行。 break语句则是结束整个循环,不再判断执行循环的条件是
16、否成立,2019/6/10,版权所有 南京理工大学 王芳,22,例、请写出程序运行结果 #include void main(void) int k=0; int c=1;do switch (c+) case 1: k+; break;case 2: k-;case 3: k+=2; break;case 4: k=k%2; continue;case 5: k=k*10;default: k=k/3;k+; while(c7);cout“k=“kendl;,程序执行过程如下:,2019/6/10,版权所有 南京理工大学 王芳,23,格式:goto 语句标号; 其中: 语句标号:用标识符表示
17、,其命名规则和变量名相同,注意不能用整数作标号。作用:使程序转到某一标号处。 1、限制goto 的使用,因为滥用goto 语句将使程序的流程变得无规律,难读易错。但是C+ 并不禁止goto语句的使用,因为有的情况下用goto语句更加自然、效率更高。,goto语句以及用goto语句构成的循环,2019/6/10,版权所有 南京理工大学 王芳,24,例如: for () for () for ()if (mistake)goto error;error: /* 进行错误处理的语句*/ 2、然而必须限制goto语句的使用,规定goto只能用于函数内部的同名标号处,只允许用它跳出循环体,而不允许跳进循
18、环体,也不允许跳进switch 语句的内部。 3、break和continue不能用于if 语句和goto语句构成的循环体中。,goto语句以及用goto语句构成的循环,2019/6/10,版权所有 南京理工大学 王芳,25,例:用二分法求方程2x3-4x2+3x-6=0在(-10,10)之间的根,f(x1),fx2),f(x3),x1,x3,x2,x4,再取(x1,x3)的中点x4,若f(x4)与f(x1)同号,则得到更小的含根区间(x3,x4),如此反复,当xn与xn-1之差小于给定的误差时,便是所求的近似根。,二分迭代法的思想是先取f(x)=0的两个粗略解x1和x2。若f(x1)与f(x
19、2)符号相反,则方程f(x)=0在区间(x1,x2)中至少有一个根。若f(x)在区间(x1,x2)内单调,则(x1,x2)间应有一个实根。取x3=(x1+x2)/2 并在x1与x2中舍去函数值与f(x3)同号者,x3与剩下的一个粗略解组成一个新的小的含根区间。,x,f(x),2019/6/10,版权所有 南京理工大学 王芳,26,例:用牛顿迭代法求方程2x3-4x2+3x-6=0在1.5附近的根,牛顿迭代法又称牛顿切线法。它比一般的迭代法有更高的收敛速度。它的基本思想如下图所示:,x0,设x0是方程f(x)=0的精确解x*附近的一个猜测解,过点(x0, f(x0)作该点的切线。该切线方程为:y = f(x0) + f(x0)(x - x0) 它与x轴的交点为:x = x0 - f(x0)/f(x0) 这就是牛顿迭代法的迭代公式。这样,经过有限次迭代后,便可以求得符合误差要求的近似解。,f(x0),