1、1,第四章 流程控制语句,2,本章主要内容:,4.3 switch 语句多分支语句,4.4 for语句 (当型循环),4.5 while 语句 (当型循环),4.6 do-while语句 (直到型循环),4.7 跳转语句,4.2 if 语句双分支语句,4.1 概述,3,【教学目的与要求】理解程序设计的三种基本结构,掌握各种语句的语法规则和用法。 【教学重点与难点】各种语句的语法规则和用法。 【教学方法】讲授与上机相结合。,4,流程控制语句用来控制程序的执行过程。,选择:用来解决实际应用中按不同情况进行不同处理的问题。包括:if语句 和 switch语句。,循环:用来解决实际应用中需要重复处理的
2、问题。包括:for语句、while语句 和 do语句。,跳转:用来改变顺序向下执行的正常顺序。包括:goto 、continue 、break 和 return语句。,顺序:通过输入输出语句、函数调用语句、表达式语句、空语句和复合语句来实现。,4.1 概述,5,顺序结构,按照语句书写的顺序执行,包括:表达式语句空语句复合语句输入输出,6,表达式语句,任何一个表达式加上分号-表达式语句 举例:x = 10 - x = 10;x + y - x + y;a = 1, b = 2, c = 3 - a = 1, b = 2, c = 3;,7,空语句,只有一个分号,不执行任何动作 举例:;for (
3、 k = 1; k 10; k+ ) ;,8,复合语句,将两条或两条以上语句放在一对花括号 中构成。 在语法上,复合语句被解释成一条语句。 举例: if ( x y ) int t = x ; x = y ; y = t ; elsecout x t y endl;,9,案例:圆的半径为负数怎么办,计算圆的面积时,如果用户输入的半径是负数怎么办?cin radius ; if ( radius 0 ) cout “圆的半径为负数,程序即将退出.n“;exit(1); ,#include ,10,4.2 if语句条件语句,用来描述根据某个条件来选择执行路径的情况。 两种基本格式: if语句的单分
4、支格式 if语句的双分支格式 if语句的嵌套,11,单分支 if 语句,格式:if(表达式) 语句,表达式为任意表达式,若有多条语句,则要构成复合语句,执行:计算 表达式的值,若为真(不为0),则执行语句;否则不执行语句,表达式,语句,真,假,12,单分支 if 语句的使用,例4-1:从键盘上输入一个字符,若该字符为大写字母,则把它变为小写字母,否则为其本身。 提示:如何判断字符为大写字母?如何将大写字母转换为小写字母?,ch = A & ch = Z,ch = ch + (a A) ;,13,#include void main() char ch;cin ch;if (ch = A ,ch
5、 = (ch = A & ch = Z) ? (ch+32) : ch,返回,知识延伸1:如何将小写字母转换为大写字母?,知识延伸2:如何进行数字字符与数字的转换?,14,双分支 if 语句,if (表达式) 语句1 else 语句2,表达式,语句1,语句2,真,假,入口,出口,执行:,若表达式的值不为0,执行语句1,否则执行语句2,格式:,15,双分支 if 语句的使用,例4-2:从键盘上输入一个整数x,求x的绝对值并输出。 提示:绝对值的求法,16,#include void main() int x, absx;cout x;if ( x = 0 ) absx = x;else absx
6、 = -x;cout “x=“ x endl;cout “|x|=” absx endl; ,知识延伸:应当充分利用系统为我们提供的功能实现,17,例4-3:输入年份,判断是否为闰年,若是,回答“Yes”,否则回答“No”。,什么样的年份是闰年?,能被4整除,但不能被100整除:是闰年,能被400整除: 是闰年,闰年问题,( year % 4= =0 & year % 100!=0) | ( year % 400= =0 ),18,#include void main() int year;cout year;,bool isLeapYear = ( year % 4 = 0 ,19,嵌套的两
7、种形式:(1) 嵌套 ifelse(2) 嵌套 else if,三、if 语句的嵌套(处理多分支问题),20,if (表达式1),if (表达式3)语句1;,if (表达式2),else 语句2 ;,else 语句3 ;,else 语句4;,外层,内层,中层,若表达式1的值为非0 ,即真,则执行中层ifelse结构;否则,执行语句4。执行中层时,若表达式2的值为非0 ,即真,则执行内层ifelse结构;否则,执行语句3。执行内层时,若表达式3的值为非0 ,即真,则执行语句1;否则,执行语句2。,(1) 嵌套 ifelse,21,if_else 嵌套流程图,22,if(表达式1) 语句1; el
8、se if (表达式2) 语句2; else if (表达式3) 语句3; else if (表达式n) 语句n; else 语句n+1 ; /*前面n个条件均不成立,执行语句n+1*/,(2)嵌套 else if,23,else_if 嵌套流程图,24,例4-4: 编写程序计算函数,嵌套 if 语句的使用,方法1:三个并列的if结构设计 方法2:else_if 嵌套结构设计 方法3:if_else 嵌套结构设计,25,方法1: 三个并列的if 结构-源程序,#include void main() int x, y;cout x;if ( x 3 ) y = x * x + 4;if ( x
9、 0 ,26,方法2 :else_if 嵌套结构-源程序:,/ X3,/ 0X=3,/ X=0,#include void main() int x, y;cout x;if ( x 3 )y = x * x + 4;else if ( x 0 )y = x; elsey = x * x - 4; cout “y=“ y endl; ,27,方法3:if_else嵌套结构设计,#include void main() int x, y;cout x;if ( x 0 )if ( x = 3 )y = x;else y = x * x + 4;elsey = x * x - 4; cout “y
10、=“ y endl; ,28,格式:,switch (表达式) case 常量表达式1:语句序列1;case 常量表达式2:语句序列2; case 常量表达式n:语句序列n;default:语句序列n+1; ,switch 语句是多分支选择语句,4.3 switch 语句(开关语句),29,先计算switch后表达式的值M,必须是整数(字符常量、枚举常量); 依次计算每个常量表达式的值M1, M2。 M与 M1,M2比较,若找到一个匹配的值就从该语句开始,依次向下执行。否则,执行default后面的语句组。,执行:,注意:,语句序列中可以有若干条语句,不用复合语句序列;,多个case标号可以共
11、用一条语句;,大括号,可以配合break语句使用;,30,cin N;,cout x;,31,cin N;,cout x;,32,例4-5:输入成绩,若:90 100 :A70 89 :B60 69 :C 60 :D,33,#include void main() int score;cout score;switch ( score / 10 ) case 10:case 9: cout “nA”;case 8:case 7: cout “nB” ; case 6: cout “nC” ; default: cout “nD” ; ,break;,break;,break;,float sc
12、ore;,int(score) / 10,34,程序举例,1、P81 (4-2-3) 2、P82 (4-2-2) 3、P86 (4-3-3) 4、P87 (4-3-1),返回,35,一、 for 语句*,二、 while语句*,三、 do - while 语句*,主要学习语句的执行过程、使用方法,循环:重复执行一段语句,循环语句,36,格式:,for( 表达式1;表达式2;表达式3)语句,表达式2,语句,表达式1,表达式3,表达式1:作为初始化,先计算表达式1的值; 再计算表达式2,如果值为真,执行语句,再计算表达式3,重复; 如果表达式2的值为假,退出循环,继续执行下面的语句。,执行:,真,
13、假,表达式2:作为循环控制条件,表达式3:每次都要做, 改变循环变量,4.4 for语句,37,for ( 循环变量赋初值;循环条件;循环变量增值 )语句,for (s = 0, i = 1;i = 100;i+)s += i;,注意:,这三个表达式都可以省略,但分号不能省 for(;),不能构成死循环,死循环只能用ctrl+break 强行中止,for 循环最常见格式:,38,例4-6:求n! ( n的值由键盘输入 ),#include void main() int n;double s;cout n;s = 1.0;for ( int i = 1; i = n; i+ )s *= i;c
14、out n “!=” s endl; ,39,例4-7:输入一个整数,判断其是否为素数,#include void main() int x, i;cin x;for ( i = 2; i x; i+ )if ( x % i = 0 ) break;if ( i = x )cout “Yesn”;else cout “Non”; ,阅读P94例4-4-4 思考: 如何输出前50个素数?,int temp= int( sqrt(x);,i = temp;,bool isPrime = true; for ( i = 2; i x; i+ )if ( x % i = 0 ) isPrime = f
15、alse;break; if ( isPrime )cout “Yesn”; else cout “Non”;,40,例4-8: 打印一九九乘法表。,#include void main() int i, j;for ( i=1 ; i = 9; i+) for ( j = 1; j = i; j+)cout setw(3) j “*“ i “=“ i*j;cout n;cout endl; ,1*1=1 1*2=2 2*2=4 1*3=3 2*3=6 3*3=9 1*4=4 2*4=8 3*4=12 4*4=16 1*9=9 2*9=18 3*9=27 4*9=36 .,循环嵌套,内循环 外
16、循环,41,* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *,1、n*n的矩形,2、n*n的下三角形:ji,3、n*n的上三角形:j=n-i+1,4、等腰三角形: for ( j = 1; j n-i+1; j+ )cout “ “;for ( j = 1; j = 2*i-1; j+ )cout “* “;,5、n行的菱形,#include void main() int i, j, n;coutn;for ( i=1; i=n; i+ )for ( j=1 ; j = n ; j+ )cout“*
17、 “;coutendl; coutendl; ,* * * * * * * * * * * * * * * * * * * * *,* * * * * * * * * * * * * * * *,* * * * * * * * * * * * * * * * * * * * * * *,* * * * * * * * * * * * * * * * * * * * *,知识扩展:如何打印图形?,42,for ( i=n-1; i=1; i- )for ( j=1; jn-i+1; j+ )cout“ “;for ( j=1; j=2*i-1; j+ )cout“* “;coutendl; co
18、utendl; ,5、打印菱形,#include void main() int i, j, n;coutn;n=n/2+1;for ( i=1; i=n; i+ ) for ( j=1; jn-i+1; j+ )cout“ “;for ( j=1; j=2*i-1; j+ )cout“* “;coutendl; ,43,例4-9:求1!+2!+3!+n!,#include void main() int i, j, n;long int s = 0,m;cin n;for ( i =1; i = n; i+) m = 1;for ( j = 1; j = i; j+) m *= j;s +=
19、 m;cout s endl; ,提示:可以只用一层循环 自己试一试,m=1;,m *= i;,#include void main() int i, n;long int s = 0,m=1;cin n;for ( i =1; i = n; i+) m *= i;s += m;cout s endl; ,44,#include 10 s=0; void main() 20 for(i=1;i=3;i+) int i,j; 30 m=1;long int m, s; 40 for(j=1;j=i;j+) 50 m*=j;60 s+=m;70 coutsendl;,10,20,30,40,50,
20、60,m=1,s=0,i=1,j=1,m =1*1,s= 0+ 1,i=2,j=1,m=1,m =1*1,j=2,m =1*2,s= 1+ 2,i=3,j=1,j=2,j=4,m=1,m =1*1,m =1*2,m =2*3,s= 3+ 6,70,s= 9,i=4,外走一内走遍,j=2,j=3,j=3,45,#include void main() int i, j, n, m;long s = 0, t;cin n m;for ( i = 1; i = n; i+=2) t = 1;for ( j = 1; j = m; j+)t *= i;s += t;cout s “n”; ,例4-10
21、: 1m+3 m +5 m +7 m +. n m,46,格式:while(表达式)语句,执行:先求表达式的值,若为真,则执行语句;否则退出循环。,注意:,语句:一条语句,表达式后面不能有分号,4.5 while 语句,47,例4-11:求1+2+3+100的和,#include void main() int s, i;s = 0; / s为累加和 i = 1; / i为循环控制变量 while ( i = 100 ) / 循环条件 s += i ; i+;cout s endl; ,48,例4-12: 编程求 的近似值, 公式 /4 1-1/3+1/5-1/7+1/9-,#include
22、#include void main( ) int s;float n , t , pi ;s = 1 ; n = 1; t = 1; pi = 0;while ( fabs(t) = 1e-6 ) pi = pi + t ; n = n + 2;s = -s; t = s / n;pi = 4 * pi ;cout “ pi=” pi “n”; ,分析: 题目仍可以看成是累加求和 不同的是, 相加的每一项正负相间, 公式是无穷的, 所以我们规定当 相加项的绝对值小于0.000001 (即106 )时停止计算,1,1,-1,3,-1/3,1,0,1,0.67,1/5,5,1,返回,49,格式,
23、do 语句 while (表达式),执行:,先执行语句,再计算表达式的值, 若非0,再执行语句,否则退出循环。,do后若有多条语句,需使用复合语句,循环体至少执行一次,不同于while语句,注意:,;,4.6 do-while语句,50,while 语句与do-while语句,#include void main() int sum, i;sum = 0;cin i; while ( i = 100 ) sum += i ;i+; cout sum endl; ,#include void main() int sum, i;sum = 0; cin i;do sum += i ; i+; w
24、hile ( i = 100 );cout sum endl; ,输入:101,输出:0,输出:101,输入:101,51,三种循环语句的比较:,for和 while语句是先判断循环条件再执行循环体,而do循环是先执行循环体,然后再判断,依次反复进行下去,直到循环条件的值为假时止,所以,for和 while的循环体可能一次也不执行;而do语句的循环体至少执行一次。,一般情况下,它们之间可以相互转换,编程时可以任选使用,通常使用for循环较简单。,在任一种循环的循环体内都可以使用break语句使之终止循环的执行,使用continue语句结束一次循环体的执行。,52,循环结构小结,一、 for 语
25、句*,二、 while语句*,四、 循环的嵌套,三、 do - while 语句*,书中例题:P91(4-4-2) 、 P97(4-5-2) 、P100(4-5-3)、 P103(4-6-1),53,用来改变顺序向下执行的正常顺序.包括:goto 、 break 、 continue和 return语句,4.7 跳转语句,一、 goto 语句 格式:goto 语句标号; (注:语句标号后加:号) 功能:无条件转向语句。如: goto loop;,54,二、break 语句,只用于switch语句和循环中,用在循环中, 用来中止循环,提前跳出循环体,for ( i= 0;i 10; i+) if
26、 ( i % 2 )break;cout setw(5) i; ,例:,结果:0,i%2 != 0,55,三、continue 语句,只能用在循环语句中,continue通常与if语句结合,注意:与break语句的区别,continue:结束本次循环,继续下次循环 break :中止循环的进行,例:,for (i = 0;i 10; i+) if ( i % 2 ) continue;cout setw(5) i; ,结果:0 2 4 6 8,56,累加 累乘 判素数,返回,算法小结:,57,统计整数的位数,#include #include using namespace std; void
27、 main() int number; / 输入的整数int digit; / 每个数字位int count = 0; / 位数cout number;number = abs ( number );while ( number ) digit = number % 10; cout digit t;count +; number = number / 10;cout “n该数一共有“ count “位。“ endl; ,58,使用迭代法求Fibonacci 数列,Fibonacci 数列:0,1,1,2,3,5,8,13 算法分析: 确定变量:三个,分别保存相邻的三项,f1, f2, f3
28、求新的一项:利用前两项, f3 = f1 + f2; 更新变量 f1 和 f2,以求下一项。 利用循环: for 语句,59,#include void main() int f1, f2, f3;cout “Fibonacci 数列的前20项为:n“;f1 = 0; f2 = 1; / 第一项和第二项cout setw(10) f1 setw(10) f2; for ( int i = 3; i = 20; i+ )f3 = f1 + f2; / 利用前两项求后一项cout setw(10) f3;if ( i % 5 = 0 ) / 每行输出5项cout endl;f1 = f2; / 更新前两项,为求下一项做准备 f2 = f3; ,60,作业,习题4.1 2、4、5、8、104.2 2、3、4、6、8、9,