第3章 CHAPTER 3 语句与控制结构 C++程序由一系列语句组成,这些语句按照一定的控制结构组织起来,按逻辑顺序运行。控制结构包括不同选择分支的计算与处理,以及对相同语句组的循环执行。C++语言提供了判断、循环和转移等语句来控制程序。 学习目标  掌握if、switch分支语句的使用;  掌握for、while、do…while循环语句的使用,并能根据不同要求灵活选择不同的循环语句,熟练使用循环的嵌套;  掌握break、continue语句的联系和区别,根据不同场合正确地使用;  了解goto语句的转移用法。 3.1语句格式 C++的语句类似于自然语言中的句子,它由不同类型的数据组成。数据类型是程序中最基本的元素,而语句则是程序中可以独立执行的最小单元。C++的语句以分号作为结束标记,相当于自然语言中的句号。语句通常由表达式末尾加上分号构成,C++认为不执行任何操作的空语句是合法的。 例如: ;//不执行任何操作的空语句 a+b; //一般表达式语句 a=a+b; //赋值语句 空语句一般在循环结构中用来延迟一段时间,空语句的分号是必不可少的。分号的存在是语句成立的必要条件。 在C++中,声明变量的语句称为声明语句,声明语句可以出现在程序中任何可以出现语句的地方,这提高了变量声明的灵活性。但是在C语言中,变量的声明不是语句,只能在模块的首部集中声明。 某些情况下,可以用一对花括号将多条语句括起来组成一个块语句。 例如: { int a=6,b=3; a=(a+b)/2; cout<<"a="< 6using namespace std; 7main() 图33例31程序运行结果 8{ 9int n; 10cout<<"Please enter the score:"<>n; 12if (n>=60) //条件表达式为n>=60 13{ 14cout<<"通过"<=60)的判断条件是表达式n>=60,如果成立,则从第13行开始执行语句,输 出“通过”; 否则从第12行直接跳转到第16行。 图34if…else语句流程 3.3.2if…else语句 if…else语句的语法格式如下: if (条件表达式) 语句1; else 语句2; 其执行过程为: 首先计算条件表达式的值,如果值为true,则执行语句1; 否则执行语句2。if…else语句流程如图34所示。 else前面的部分称为if分支子句,else及其后的部分称为else分支子句; 虽然if分支的语句1和else分支的语句2在形式上是独立的两条语句,但是在语法上,从“if”开始到“语句2; ”结束的整体是一条不可分割if语句。 【例32】从键盘输入学生成绩,如果大于或等于60分,输出“通过”,否则输出“不通过”。 1/************************************************** 2程序文件名:Ex3_2.cpp 3if…else语句的使用 4**************************************************/ 5#include 6using namespace std; 7main() 8{ 9int n; 10cout<<"Please enter the score:"<>n; 12if (n>=60) 13{//第13~15行是语句1 14cout<<"通过"<=60成立,则从第13行开始执行语句1,输出“通过”; 否则从第17行开始执行语句2,输出“不通过”。if…else语句中的关键字“else”是必不可少的。 3.3.3嵌套if语句 如果遇到的问题有多重选择,仅使用if语句或if…else语句无法解决。为了解决多重选择问题,C++提供了嵌套的if语句。在if语句中,如果分支子句也是if语句,就构成了嵌套的if语句。 在形式上,嵌套的if语句有两种形式: 一种是嵌套在else分支中,另一种是嵌套在if分支中。 1. else分支的嵌套 else分支嵌套的if语句语法格式为: if(条件表达式1) 语句1; else if (条件表达式2) 语句2; … else if (条件表达式n) 语句n; else 语句n+1; else分支的嵌套图表示如图36所示。 图36else分支的嵌套 【例33】用嵌套if语句将百分制成绩按等级输出。 1/************************************************** 2程序文件名:Ex3_3.cpp 3嵌套if语句的使用 4**************************************************/ 5#include 6using namespace std; 7main() 8{ 9int n; //变量n用来存储从键盘输入的成绩 10char grade; 11cout<<"Please enter the score:"<>n; 13if (n<60) 14grade='E'; 15else if(n<70) 16grade='D'; 17else if(n<80) 18grade='C'; 19else if(n<90) 20grade='B'; 21else if(n<=100) 22grade='A'; 23else 24grade='F'; 25cout<<"The grade is "<=60) if(n>=70) if(n>=80) if(n>=90) grade='A'; else grade='B'; else grade='C'; else grade='D'; else grade='E'; 在使用if分支嵌套时,要注意else与if的匹配原则: else与上方离它最近的未匹配过的if相匹配。 3.3.4条件运算符 当if…else语句是简单语句时,可用条件运算符“?: ”来进行简化,其语法格式为: (条件表达式)?语句1: 语句2 例如,求两个数a和b中较大的值,使用if语句: if(a>b) max=a; //语句1 else max=b; //语句2 将if语句替换成等价的条件运算符为: max=(a>b)?a:b; 3.4switch语句 嵌套的if语句能够实现多分支选择,C++还提供了另外一种实现多分支选择的结构——switch语句。switch语句也称为开关语句,它根据给定的条件,从多个分支中选择一条语句作为执行的入口。switch语句虽然与嵌套的if语句功能类似,但是switch语句每次都计算同一表达式的值,而嵌套的if语句要分别计算各个if分支语句表达式的值,所以在处理多分支选择问题时,switch语句更加简便、直观。其语法格式如下: switch(表达式) { case 常量表达式1:[语句块1;][break;] case 常量表达式2:[语句块2;][break;] … case 常量表达式n:[语句块n;][break;] [default:语句块n+1;] } (1) switch后面圆括号中的“表达式”只能是整型、字符型、枚举型或布尔型等离散类型,而不能是实型(float、double型)等连续类型。 (2) “case”起到标号的作用,其后“常量表达式”的类型必须与“表达式”的类型匹配,并且所有case后常量表达式的值不能重复。 (3) 当“表达式”的值与某一个case后“常量表达式”的值相等时,就执行这个case后的语句; 如果所有case后“常量表达式”的值都不与“表达式”的值匹配时,就执行“default”后的语句。 (4) 符号“[ ]”表示其中的内容是可选的; 语句块、break和default都是可选的,语句块由一条语句或者一个复合语句组成。 switch语句的执行过程为: ① 计算switch后表达式的值; ② 将表达式的值依次与case后常量表达式的值相比较,如果表达式的值与某一常量表达式的值相等,则执行该case后的语句块,直到遇到break或switch语句的右花括号; ③ 如果表达式的值与case后所有常量表达式的值都不相等,则执行default后的语句; 如果switch语句不包含default,则不执行任何操作。 【例34】用switch语句将百分制成绩按等级输出。 1/************************************************** 2程序文件名:Ex3_4.cpp 3switch语句的使用 4**************************************************/ 5#include 6using namespace std; 7main() 8{ 9int n; 10cout<<"Please enter the score:"<>n; 12switch (n/10) 13{ 14case 10: 15cout<<"The grade is A"< 6using namespace std; 7main() 8{ 9int i,sum=0;// 将累加变量sum初始化为0 10for(i=1; i<=100; i++) // i为循环变量,循环次数为100 11{ 12sum += i; // 实现累加 13} 图310例35运行结果 14cout<<"sum= "< 6using namespace std; 7main() 8{ 9int i,j,k; 10for (i=0;i<=3;i++) //外重循环,循环4次,显示4行 11{ 12for (j=0;j<=2-i;j++) //内重循环 13{ 14cout<<" "; 15} 16for (k=0;k<=2*i;k++) //内重循环 17{ 18cout<<" *"; 19} 20cout<<"\n"; //外重循环中的语句 21} 22} 【程序解释】 (1) 在例36中,共有两重循环嵌套,第10行的for语句对应的是外重循环,主要控制对应图案显示的行数。 (2) 第12行和第16行的for语句对应的都是内重循环,分别显示每一行的空格符和“*”。 (3)第20行是外重循环的语句,用来实现每行输出结束后换行,其中“\n”的作用和endl的作用完全相同。 3.6while循环语句 3.6.1while语句 while循环语句也称为当型循环,当满足判断条件,则执行循环; 语句的语法格式如下: while(条件表达式) 循环体 其中,while是关键字; 条件表达式是C++中的一个合法表达式,表示是否执行循环体的判断条件。循环体可以是一条语句,也可以是复合语句。如果循环体是一条语句,则其两边有无花括号皆可; 如果循环体是复合语句,则复合语句必须被包含在一组花括号中。 图311while语句流程 while语句的执行过程为: ① 计算条件表达式的值,如果值为false或0,则结束循环,转到④; ② 如果条件表达式的值为true或非0,则执行循环体; ③ 转到①; ④ 执行while语句的后续语句。 while语句流程如图311所示。 【例37】用while语句计算1+2+3+…+100。 1/************************************************** 2程序文件名:Ex3_7.cpp 3while语句计算1+2+3+…+100 4**************************************************/ 5#include 6using namespace std; 7main() 8{ 9int i=1,sum=0; 10while(i<=100) // 判断i<100是否成立 11{ 12sum += i; // 实现累加 13i++; 14} 图312例37运行结果 15cout<<"sum= "< 6using namespace std; 7main() 8{ 9int i=1,sum=0; 10do // 不判断条件,先执行一次循环体 11{ 12sum += i; // 实现累加 13i++; 14} while(i<=100); //判断i<=100是否成立,分号不能漏掉 图314例38运行结果 15cout<<"sum= "<100) { break; } sum+=j; } sum=100; } 【例39】输出10~100的全部素数(素数i是指除1和i之外,不能被2~(i-1)的任何整数整除的数)。 1/************************************************** 2程序文件名:Ex3_9.cpp 3输出10~100的全部素数 4**************************************************/ 5#include 6using namespace std; 7main() 8{ 9int i=11, j, counter=0; 10for( ; i<=100; i+=2)//外循环:为内循环提供一个整数i 11{ 12for(j=2; j<=i-1; j++) //内循环:判断整数i是否是素数 13{ 14if(i%j==0) //i不是素数:因为能被2~(i-1)的某个数整除 15break; //强行结束内循环,执行第17行语句 16} 17if(counter%10==0) //输出10个数后换行 18cout<<"\n"; //换行 19if(j >= i) //整数i是素数:输出后计数器加1 20{ 21cout<<" "< 6using namespace std; 7main() 8{ 9cout<<"100~200不能被3和7整除的数为\n"; 10for(int i=100;i<=200;i++) 11{ 12if(i%3!=0&&i%7!=0) 13cout< 6using namespace std; 7main() 8{ 9int cock,hen,chick; 10cout<<" 鸡翁 鸡婆 鸡雏"< 6using namespace std; 7main() 8{ 9int num,sum=0,k,i=0; 10cout<<"请输入一个整数:"; 11cin>>num; 12cout<<"逆序为:"; 13while(num>0) 14{ 15k=num%10; 16cout< 6using namespace std; 7main(){ 8int n,cock,hen,chick,s=0; 9cout<<"请输入钱数:"; 10cin>>n; 11for(cock=0; cock<=n/5;cock++) 12{ 13hen=(n-7*cock)/4; 14chick=n-cock-hen; 15if (5*cock+3*hen+chick/3==n&&chick%3==0) 16{ 17if (hen >= 0 && cock>=0) 18{ 19s++; 20cout<<"鸡翁"< 6#include 7using namespace std; 8main( ) 9{ 10int n,k; 11cout<<"请输入兔子初始数量n:"; 12cin>>n; 13cout<<"请输入经历的月数k:"; 14cin>>k; 15double s=1.0*n; 16for (int i=1;i<=k;i++) 17{ 18s=s*1.72; 19} 20cout<<"经过"<b) a=b; b=c; c=a; cout<<"a="<=10) break; if(j%3==1) { j+=3; continue; } i=i+1; } cout< using namespace std; int sum,k; main() { for(sum=0,k=1;k<10;k++) { if(k%2==0) continue; sum+=k; } cout<<"sum="< using namespace std; main() { int a(18),b(21),m(0); switch(a%3) { case 0: m++;break; case 1: m++; switch(b%2) { default: m++; case 0: m++;break; } } cout<