1、第三章,控 制 语 句,第3章 控制语句,语句是c+程序中最小的可执行单元。一条语句由一个分号结束。语句可以很简单,也可以很复杂。 表达式语句是任何一个表达式加上一个分号。 声明语句: 空语句是指只有一个分号的语句(最简单的语句) 。,; int x,y,c,n,a,b; a=1+n*2; x=3,y=10,c=1; ab ? a+ : b+;,复合语句:用括起来的一组语句。复合语句也称为块(语句块),在语法上起一个语句的作用。对单个语句必须以“;”结束,对复合语句,其中的每个语句仍可以“;”结束,而整个复合语句以“”结束。, int i,j; i=10; j=i+50; ,3.1 顺序控制语
2、句 3.2 选择控制语句 3.3 循环控制语句3.4 跳转语句,31 顺序控制语句,所谓顺序结构,就是按照语句的顺序一条一条地执行。 顺序控制语句是一类简单语句,包括:表达式语句、空语句、声明语句、输入输出语句等。 输入输出 C+提供了I/O流类库 #include I/O流:在C+中,将数据从一个对象到另一个对象的流动抽象为流。数据的输入输出是通过I/O流来实现的。从流中获取数据的操作称为提取操作,向流中添加数据的操作称为插入操作。,311 输出,cout实现将数据输出到标准输出流(显示器)的操作 一般格式为: cout ; cout:类库中的预定义对象(代表标准输出) :预定义的插入符,向
3、输出流中插入字符,输出 字符 数字 字符串,#include void main( ) cout a ;cout 1 2 3 4 ;cout “Visual C+“ endl;double d=9.86;cout dendl; ,C+提供了一些操纵符可以直接嵌入到输入输出语句中来实现IO格式控制。,表31 常用的I0 类库操纵符,输出格式控制 八进制和十六进制数的输出(例3.2) dec操作符(以十进制形式输出) oct操作符(以八进制形式输出) hex操作符(以十六进制形式输出) 控制输出宽度(例33) setw操纵符可以指定每个数值占用的宽度 控制输出精度(例34) setprecisio
4、n操纵符可以设置显示数值的精度。,在使用 setprecision 和setw操纵符时要在程序开头include。,例3.2 #include void main( ) int n=100;cout “十进制:“ dec n endl;cout “八进制:“ oct n endl;cout “十六进制:“ hexn endl; ,十进制:100 八进制:144 十六进制:64,例3.3 #include #include void main() double f=123.45;cout setw(10) 1234567890 endl;cout setw(10) f endl;cout set
5、w(8) f endl;cout setw(6) f endl;cout setw(4) f endl; ,1234567890123.45123.45 123.45 123.45,setw只对下个输出有效,例3.4 #include#includevoid main()double d=123.456789;cout d endl; /缺省为6位有效数字cout setprecision(7) d endl;cout setprecision(8) d endl;cout setprecision(9) d endl;,123.457 123.4568 123.45679 123.45678
6、9,setw只对下个输出有效 setprecision一直有效 dec/oct/hex一直有效,cin读取键盘输入的字符和数字,并把它赋给指定的变量。一般格式为: cin ; cin:类库中的预定义对象(标准输入) :预定义的提取运算符,312 输入,例:,#include void main() char c1, c2, c3;cinc1; /Acinc2c3; 程序执行到A行时,等待用户输入数据。若输入: Abc ,则cin分别将字符A、b、c赋给变量c1、c2、c3。,例3.5#includevoid main( )int i,j;cout i j;cout i “+“ j “ i+j
7、endl;,i j =12 45 12+45=57,例:操纵符的应用 void main() int i, j, k, l;coutocti; /输入为八进制数cinhexj; /输入为十六进制数cink; /输入仍为十六进制数cindecl; /输入为十进制数cout”hex:i=”hexiendl;cout”dec:j=”decjt”k=”kendl;cout”oct:l=”octl;coutdecendl; /恢复十进制输出状态 ,32选择控制语句,C+中,语句默认都是顺序执行,如果碰到选择或循环语句,顺序执行的规则就要改变。 C+中的选择控制语句有 if语句 ifelse语句 ifel
8、se if语句 switch语句,321 if语句,语法形式if ( ) ;其功能是:当值为true(非0)时执行后面语句。,表达式称为条件表达式,可以是C+中的任意合法表达式,如:算术表达式、关系表达式、逻辑表达式、逗号表达式等。,语句称为内嵌语句,可以是单一语句、复合语句、空语句。,#include void main( ) int x;cout x;if(x0) x=-x;cout x endl; ,将用户输入的数值转换为绝对值,并输出,321 if else语句,语法形式:if ( ) ;else ; 其功能是:当为true(非0)时执行 ;当 为false(0)时执行。,#inclu
9、de void main( ) int x;cout x;if(x0) cout -x endl;else cout x endl; ,显示用户输入数值的绝对值,例3.8 以下程序判断输入的年份是否为闰年(凡是能被400整除的,或不能被100整除但能被4整除的年份为闰年): #include void main( ) int year,rem4,rem100,rem400;cout year;rem400=year%400;rem100=year%100;rem4=year%4;if(rem400=0)|(rem4=0)&(rem100!=0)cout year “是闰年“ endl;else
10、cout year “不是闰年“ endl; ,嵌套 if 语句中,如果内嵌语句又是if语句,就构成了嵌套if语句。 if语句可实现二选一,而嵌套if语句则可以实现多选一的情况。 当多个ifelse语句嵌套时,else与哪个if 匹配呢?,为解决语义上的这种歧义性,C+中规定,else总是与最后一个出现的还没有else与之匹配的if匹配。,if(ab) if(ac)cout“a”endl; elsecout“c”endl;,if(ab) if(ac)cout“a”endl; else cout“c”endl; ,if(ab)if(ac)cout“a”endl;elsecout“c”endl;,
11、323 if.else if语句,若嵌套在else分支中,可简写为if ();else if();else ifelse ;,#include void main( ) int x;cout x;if (x=90) cout =80) cout =70) cout =60) cout ”D” endl;else cout “E” endl; ,例3.9 以下程序将用户输入的分数转换成等级: A(90), B(8089), C(7079), D(6069), E(60).,例3.10 以下程序根据输入的x和y坐标值来判断是第几象限:#includevoid main( )int x,y;cout
12、 x y;if (x=0 & y=0)cout =0)cout “点“ x “,“ y “)在第二象限“ endl;else if(x0 & y0)cout “点(“ x “,“ y “)在第三象限“ endl;else cout “点(“ x “,“ y “)在第四象限“ endl;,x=0 y=0,x=0,x=0 y0,x0 y0,总结 是作为判断条件使用的表 达式,只能是返回值是布尔、数值、指针类型的表达式,(常用的是关系表达式或逻辑表 达式)。可以是简单语句,也可以是复合语句,条件,循环控制语句。,324 switch语句,switch语句也称为开关语句,用于有多重选择的场合,测试某一
13、个变量具有多个值时所执行的动作。 switch语句的语法形式为: switch() case:case:case:default:,各常量表达式的值不能相同,但次序没有规定。,值为整型、字符型、枚举型、布尔型,每个case分支可以有多条语句,但不必用 ,例3.11 输入课程代号后显示相应的学分: 数学(代号为m,8学分) 物理(代号为p,5学分) 化学(代号为c,5学分) 语文(代号为w,8学分) 英语(代号为e,6学分),#include void main( ) char ch; coutch;switch (ch) case m : case M :case w :case W :cou
14、t “8学分“ endl; break; case p :case P :case c :case C :cout “5学分” endl; break;case e:case E:cout“6学分”endl; break;default:cout“输入的课程代号不正确“endl; /end switch /end main,为什么case后没有任何语句?,break?,使用switch语句应注意下列问题: 表达式包括整型、字符型、布尔型或枚举型表达式。 各常量表达式的值不能相同,但次序没有要求。 每个case分支可以有多条语句,但不必用 。 每个 case 语句只是一个入口标号,并不能确定执行
15、的终止点,因此每个case分支的最后应该加break语句,用来结束整个switch结构,否则会从入口点开始一直执行switch结构的结束点。 当若干分支需要执行相同操作时,可以使多个case分支共用一组语句。,例3.12以下程序根据用户选择显示相应计算机语言:(涉及枚举类型,日后自学) #include void main( ) enum softwarevc=1,vb,vfp;int choice;cout choice;switch (choice)case vc:cout“Visual C+” endl; break;case vb:cout“Visusl Basic“ endl;bre
16、ak;case vfp:cout“Visual Foxpro“endl;break;default:cout“选择错误“endl; ,33 循环控制语句,提供重复处理的能力 ,当某一特定条件为true时,循环语句就重复执行 ,并且 每循环一次就会测试一下循环条件 ,如果为false 则循环结束 ,否则继续循环。 C+支持三种格式的循环控制语句: while语句 dowhile语句 for语句 三者可以完成类似的功能 ,不同的是它们控制循环的方式。,331 while语句,while语句的一般形式为:while();,while语句的执行流程图,求表达式的值,执行循环体 语句,表达式的 值为真?
17、,是,否,例3.13 #include void main( ) int digit,num;cout num;while (num!=0)digit=num%10; coutdigit;num=num/10;coutendl; ,以下程序将用户输入的整数反向显示出来,332 do语句,do语句的一般形式为:do;while(); 与while语句不同的是do循环中的 至少会执行一次,而while语句当条件第一次就不满足时,语句一次也不会被执行。,否,是,do-while语句的执行流程图,例3.14 采用do语句重新编写例3.13的程序 #include void main( ) int di
18、git,num;cout num;cout“反向显示结果:“;dodigit=num%10; coutdigit;num=num/10;while (num!=0)coutendl; ,对输入的正整数反向输出 while(num0) ,333 for语句,for语句通常用于预先知道循环次数的情况,其一般形式为:for(;) ;,可以是一个定义语句或表达式语句,一般用于对一组变量进行初始化或赋值。用于控制循 环,当它的值为true (非0)时,循环会继续下去, 而它一旦为false(0),则 终止循环。 在每次循环执行完成后执行 , 一般用于改变控制循环的量。 在为true时执行。,例: voi
19、d main() int sum=0;for(int i=0;i10;i+)sum=sum+i; ,for(初始化语句;表达式1;表达式2) 语句;,for(;num!=0;num=num/10) digit=num%10;coutdigit; ,例3.15 以下程序显示ASCH码为30到119的字符:#include#includevoid main ( )int i,n=0;for(i=30;i0 ,for(int i=30,n=0; i0 ,34 跳转语句,除了顺序执行和选择、循环控制外,有时需要中断一段程序的执行,跳转到其他地方继续执行,这时需用到跳转语句,包括 break语句 con
20、tinue语句 goto语句,341 break语句,break语句可以用在switch语句和循环语句中,用来跳出switch语句或提前终止循环,转去执行switch语句或循环语句之后的语句。,int i=0; int sum=0; while(true) cini;if(i=0)break;elsesum=sum+i; ,例3.16 以下程序从键盘读入用户输入的数,对其求和;当用户输入数0时,表示输入结束:#includevoid main()int sum=0,n;while(1) /永远循环coutn;if(n=0)break; /循环出口sum+=n;cout “总和:“ sum en
21、dl; ,342 continue语句,continue只用于循环语句。 当程序执行到continue语句时,将跳过其后尚未执行的循环体语句,开始下一次循环。下一次循环是否执行仍然取决于循环条件的判断。,int sum=0; for(int i=0;i100;i+) if(i%5=0)continue;elsesum=sum+i; ,例3.17 以下程序对用户输入的所有正数求和#include void main( ) int sum=0,n=1;while(n!=0) coutn;if(n0) continue;sum+=n;cout “总和:“ sum endl; ,continue语句与
22、break语句的区别在于,continue语句结束的只是本次循环,而break结束的是整个循环。,343 goto 语句,goto语句无条件转移程序的执行控制(也可以跳出循环和switch语句),它总是与一标号相匹配 其形式为:goto 标号; 标号是一个用户自定义的标识符, 定义标号时,由一个标识符后面跟一冒号组成。它可以处于 goto语句的前面,也可以处于其后面,但是标号必须与 goto语句处于同一个函数中。,例3.18 以下程序求出满足条件12+22+n21000的最大的n。#includevoid main( )int sum=0,n=0;while(1) sum+=n*n;if (s
23、um1000) goto end ;n+;end: cout “最大的n:“ n-1 endl; ,goto语句会导致程序结构混乱,可读性降低,而且它所完成的功能完全可以用算法的三种基本结构实现,因此一般不提倡使用goto语句。,例3.19 不使用goto语句重新编写例318的程序:#includevoid main()int sum=0,n=0;dosum+=n*n;n+;while (sum=1000)cout “最大的n:“ n-1 endl; ,但在某些特定场合下goto语句可能会显出价值,比如在多层循环嵌套中,要从深层地方跳出所有循环,如果用break语句,不仅要使用多次,而且可读性较差,这时goto语句可以发挥作用,