5.2 选择结构
微视频
典型的选择结构流程图如图5-3所示。条件判断语句要求程序员指定一个(或多个)要评估或测试的条件,以及条件为真时要执行的语句(必需的)和条件为假时要执行的语句(可选的)。C++语言默认任何非零和非空条件的值为true,零或null为false。C++语言提供的条件判断语句如表5-1所示。
图5-3 选择结构流程图
表5-1 C++语言提供的条件判断语句
5.2.1 if语句
仅有if语句用来判断所给定的条件是否满足,根据判定结果(真或假)决定所要执行的操作。if语句选择结构的一般形式如下:
if(条件表达式) { 语句块; }
如果条件表达式为true,则if语句内的代码块被执行。如果条件表达式为false,则跳过语句块,执行大括号后面的语句。使用if语句应注意以下几点:
(1)if关键字后的一对小括号不能省略。小括号内的表达式要求结果为布尔型或可以隐式转换为布尔型的表达式、变量或常量,即表达式返回的一定是布尔值true或false。
(2)if表达式后的一对大括号内为语句块。程序中的多条语句使用一对大括号括住,就构成了语句块。if语句中的语句块如果为一条语句,大括号可以省略;如果为一条语句以上,大括号一定不能省略。
(3)if语句表达式后一定不要加分号。如果加上分号代表条件成立后执行空语句,在调试程序时不会报错,只会警告。if语句执行流程图如图5-4所示。
图5-4 if语句执行流程图
【实例5.2】编写程序,从键盘输入3个整数,把这3个数由小到大排序,并将结果输出(源代码\ch05\5.2.txt)。
#include <iostream> using namespace std; int main() { int x, y, z, t; cout << "请输入三个数字:" << endl; cin >>x>>y>>z; if(x > y) { /*交换x,y的值*/ t = x;x = y;y = t; } if(x > z) { /*交换x,z的值*/ t = z;z = x;x = t; } if(y > z) { /*交换z,y的值*/ t = y;y = z;z = t; } cout << "从小到大排序:" <<x << ',' <<y << ',' <<z << endl; }
程序运行结果如图5-5所示。
图5-5 例5.2的程序运行结果
5.2.2 if…else语句
if…else语句是一种二分支选择结构,其一般形式如下:
if(条件表达式) { 语句块1;} else { 语句块2;}
if…else语句的功能是先判断表达式的值,如果为真,执行语句块1,否则执行语句块2。其中,语句块1和语句块2只有一条语句时,可以省略大括号。if…else语句执行流程图如图5-6所示。
图5-6 if…else语句执行流程图
【实例5.3】编写程序,从键盘输入一个整数,判断该整数的奇偶性,并输出判断结果(源代码\ch05\5.3.txt)。
#include <iostream> using namespace std; int main() { int n; cout << "请输入一个正整数n:" << endl; cin >>n; if(n%2==0) /* 如果n能被2整除,n为偶数*/ cout << n << "是偶数" << endl; else /*否则,n为奇数*/ cout << n << "是奇数" << endl; }
保存并运行程序,如果输入偶数,运行结果如图5-7所示;如果输入奇数,运行结果如图5-8所示。
图5-7 输入偶数时的运行结果
图5-8 输入奇数时的运行结果
5.2.3 嵌套if…else语句
在C++语言中,嵌套if…else语句是合法的,这意味着用户可以在一个if或else if语句内使用另一个if或else if语句。嵌套if语句的一般形式如下:
if(表达式1) { if(表达式2) {语句块1; } /*表达式2为真时执行 */ else {语句块2; } /*表达式2为假时执行 */ } else { if(表达式3) {语句块3; } /*表达式3为真时执行 */ else {语句块4; } /*表达式3为假时执行 */ }
嵌套if…else语句的功能是先执行表达式1,如果返回值为true,再判断表达式2,如果表达式2返回值为true,则执行语句块1,否则执行语句块2;表达式1返回值为false,再判断表达式3,如果表达式3返回值为true,则执行语句块3,否则执行语句块4。嵌套if…else语句执行流程图如图5-9所示。
图5-9 嵌套if…else语句执行流程图
【实例5.4】编写程序,根据输入的员工销售金额,输出相应的业绩等级。具体等级划分规则:8000元以上为业绩优秀,6000~8000元为业绩良好,4000~6000元为业绩中等,3000~4000元为业绩完成,3000元以下为业绩未完成(源代码\ch05\5.4.txt)。
#include <iostream> using namespace std; int main() { /* 定义变量 */ float sales; /* 输入销售金额 */ cout << "请输入销售金额:" << endl; cin >>sales; /* 判断流程 */ if(sales < 3000) { cout <<"业绩未完成"<< endl; } else { if(sales <= 4000) { cout <<"业绩完成"<< endl; } else { if(sales <= 6000) { cout <<"业绩中等"<< endl; } else { if(sales <= 8000) { cout <<"业绩良好"<< endl; } else { cout<<"业绩优秀"<<endl; } } } } return 0; }
程序运行结果如图5-10所示。这里输入销售金额为10 000,则返回的结果为“业绩优秀”。
图5-10 例5.4的程序运行结果
☆大牛提醒☆
在if…else语句中嵌套if…else语句的形式十分灵活,可在else的判断下继续使用嵌套if…else语句的方式。
在C++语言中,还可以在if…else语句中else后跟if语句的嵌套,从而形成if…else if…else的结构。这种结构的一般形式如下:
if(表达式1) 语句块1; else if(表达式2) 语句块2; else if(表达式3) 语句块3; … else 语句块n;
该流程控制语句的功能是先执行表达式1,如果返回值为true,则执行语句块1;否则再判断表达式2,如果返回值为true,则执行语句块2;否则再判断表达式3,如果返回值为true,则执行语句块3……否则执行语句块n,它的执行流程图如图5-11所示。
图5-11 嵌套else if语句执行流程图
【实例5.5】编写程序,对【实例5.4】的代码进行改写,使用嵌套else if语句的形式对销售金额进行判断,并输出相应的业绩评比结果(源代码\ch05\5.5.txt)。
#include <iostream> using namespace std; int main() { /* 定义变量 */ float sales; /* 输入销售金额 */ cout << "请输入销售金额:" << endl; cin >>sales; /* 判断流程 */ if(sales < 3000) { cout<<"业绩未完成"<<endl; } else if(sales <= 4000) { cout<<"业绩完成"<<endl; } else if(sales <= 6000) { cout<<"业绩中等"<<endl; } else if(sales <= 8000) { cout<<"业绩良好"<<endl; } else { cout<<"业绩优秀"<<endl; } return 0; }
程序运行结果如图5-12所示。这里输入销售金额为10 000,则返回的结果为“业绩优秀”,这与【实例5.4】返回的结果是一样的。
图5-12 例5.5的程序运行结果
☆大牛提醒☆
在编写程序时要注意书写规范,一个if语句块对应一个else语句块,这样在书写完成后既便于阅读又便于理解。
5.2.4 switch语句
一个switch语句允许测试一个变量等于多个值时的情况。每个值称为一个case,且被测试的变量会对每个switch case进行检查。一个switch语句相当于一个if…else嵌套语句,因此它们相似度很高,几乎所有的switch语句都能用if…else嵌套语句表示。
switch语句与if…else嵌套语句最大的区别在于,if…else嵌套语句中的条件表达式是一个逻辑表达的值,即结果为true或false,而switch语句后的表达式值为整型、字符型或字符串型并与case标签中的值进行比较。
switch语句选择结构的一般形式如下:
switch(表达式) { case 常量表达式1: 语句块1; break; /* 可选的 */ case 常量表达式2: 语句块2; break; /* 可选的 */ case 常量表达式3: 语句块3; break; /* 可选的 */ … /* 可以有任意数量的case语句*/ default : /*可选的*/ 语句块n+1; }
switch语句的功能是先计算表达式的值,当表达式的值等于常量表达式1的值时,执行语句块1;当表达式的值等于常量表达式2的值时,执行语句块2;……;当表达式的值等于常量表达式n的值时,执行语句块n,否则执行default后面的语句块n+1。当执行到break语句时跳出switch结构。switch语句执行流程图如图5-13所示。
图5-13 switch语句执行流程图
switch语句必须遵循以下规则。
(1)switch语句中的表达式是一个常量表达式,必须是一个整型或枚举类型。
(2)在一个switch中可以有任意数量的case语句。每个case后跟一个要比较的值和一个冒号。
(3)case后的表达式必须与switch中的变量具有相同的数据类型,且必须是一个常量或字面量。
(4)当被测试的变量等于case中的常量时,case后跟的语句将被执行,直至遇到break语句为止。
(5)当遇到break语句时,switch终止,控制流将跳转到switch语句后的下一行。
(6)不是每一个case都需要包含break。如果case语句不包含break,控制流将会继续执行后续的case,直至遇到break为止。
(7)一个switch语句可以有一个可选的默认值,出现在switch的结尾。默认值可用于在上面所有case都不为真时执行一个任务。默认值中的break语句不是必需的。
【实例5.6】编写程序,使用switch语句根据成绩等级反馈成绩评论信息(源代码\ch05\ 5.6.txt)。
#include <iostream> using namespace std; int main() { /* 定义变量 */ char grade; /* 提示信息 */ cout << "成绩等级选择: A B C D" << endl; cout << "您输入的成绩等级是:" << endl; /*输入选择*/ cin >> grade; /* 根据用户输入反馈成绩评论*/ switch (grade) { case 'A': cout << "很棒!" << endl; break; case 'B': cout << "做得好" << endl; break; case 'C': cout << "您通过了" << endl; break; case 'D': cout << "最好再试一下" << endl; break; default: cout << "无效的成绩" << endl; } cout << "您的成绩是:" <<grade<<endl; }
保存并运行程序,这里根据提示输入成绩等级,然后按Enter键,即可返回该成绩的反馈信息。例如输入B,该成绩的反馈信息为“做得好”,如图5-14所示。
图5-14 例5.6的程序运行结果
这里通过输入端,输入成绩等级,然后根据用户的选择进行判断,若为A,则返回“很棒!”;若为B,则返回“做得好”;若为C,则返回“您通过了”;若为D,则返回“最好再试一下”;若输入D以外的结果,则返回“无效的成绩”。
5.2.5 嵌套switch语句
除正常使用switch语句外,还可以把一个switch作为一个外部switch语句序列的一部分,即可以在一个switch语句内使用另一个switch语句。即使内部和外部switch的case常量包含共同的值,也没有矛盾。
嵌套switch语句选择结构的一般形式如下:
switch(ch1) { case 'A': printf("这个A是外部switch的一部分" ); switch(ch2) { case 'A': printf("这个A是内部switch的一部分" ); break; case 'B': /*内部B case代码*/ } break; case 'B': /*外部B case 代码*/ }
【实例5.7】编写程序,定义变量a和b,使用嵌套switch语句输出a和b的值(源代码\ ch05\ 5.7.txt)。
#include <iostream> using namespace std; int main() { /* 局部变量定义 */ int a = 10; int b = 20; switch(a){ case 10: cout <<"这是外部switch的一部分"<<endl; cout <<"a值是"<<a<<endl; switch(b){ case 20: cout <<"这是内部switch的一部分"<<endl; cout <<"b值是"<<b<<endl; } } }
程序运行结果如图5-15所示。
图5-15 例5.7的程序运行结果