switch多项选择结构

前面介绍了if单项选择结构和if/else双项选择结构。有时算法中包含一系列判断,用一个变量或表达式测试每一个可能的常量值,并相应采起不一样操做。C++提供的switch多项选择结构能够进行这种判断。

switch结构包括一系列case标记和一个可选default状况。图2.22中的程序用switch计算学生考试的每一级人数。ios

// Fig. 2.22:fig02 22.cpp
// Counting letter grades
#include < iostream.h>
int main()
{
int grade, // one grade
aCount = 0, // number of A's
bCount = 0, // number of B's
cCount = O, // number of C's
dCount = 0, // number of D's
fCount = 0; // number of F's

cout << "Enter the letter grades." << endl
<< "Enter the EOF character to end input." << endl;

while ( ( grade = cin.get() ) != EOF ) {

switch ( grade ) { // switch nested in while

case 'A': // grade was uppercase a
case 'a': // or lowercase a
++aCount;
break; // necessary to exit switch

case 'B': // grade was uppercase B
case 'b': // or lowercase b
++bCount;
break;

case 'C': // grade was uppercase C
case 'c': // or lowercase c
++cCount;
break;

case 'D': // grade was uppercase D
case 'd': // or lowercase d
++dCount;
break;

case 'F': // grade was uppercase F
case 'f': // or lowercase f
++fCount;
break;

case '\n': // ignore newlines,
case '\t': // tabs,
case ' ': // and spaces in input
break;

default: // catch all other characters
cout << "Incorrect letter grade entered."

<< "Enter a new grade." << endl;
break; // optional
}
}
cout << "\n\nTotals for each letter grade are:"
"\nA: "<< aCount
<< "\nB: " << bCount
<< "\nC: "<< cCount
<< "\nD: "<< dCount
<< "\nF: "<< fCount << endl;

return 0;
}
输出结果:
Enter the letter grades.
Enter the EOF character to end input.
A
B
C
C
A
D
F
C
E
Incorrect letter grade entered. Enter a new grade.
D
A
B
Totals for each letter grade are:
A: 3
B: 2
C: 3
D: 2
F: 1
图2.22 使用switch举例

 

程序中,用户输入一个班表明成绩的字母。在while首部中:程序员

while(   (grade=cin.get())   !=EOF)  

首先执行参数化赋值(grade=cin.get())。cin.get()函数从键盘读取一个字符,并将这个字符存放在整型变量grade中。cin.get()中使用的圆点符号将在第6章中介绍。字符一般存放在char类型的变量中,可是,C++的一个重要特性是能够用任何整数数据类型存放字符,由于它们在计算机中表示为1个字节的整数。这样,咱们根据使用状况,能够把把字符看成整数或字符。例如,下列语句:算法

cout << "The character(" <<'a' << ") has the value "

<< static_cast  ('a') << endl;

打印字符a及其整数值以下所示:express

The character (a) has the value 97

整数97是计算机中该字符的数字表示。现在许多计算机都使用ASCII(AmericanStandardCodefor编程

lnformationInterehange,美国标准信息交换码)字符集(character set),其中97表示小写字母“a”。附录中列出了ASCII字符及其十进制值的列表。函数

赋值语句的整个值为等号左边变量指定的值。这样,赋值语句grade=cin.get()的值等于cin.get()返回的值,赋给变量grade。性能

赋值语句能够用于同时初始化多个变量。例如:测试

a = b = c = O;spa

首先进行赋值c=o(由于:运算符从右向左结合),而后将c=0的值赋给变量b(为0),最后将b=(c=0)的值赋给变量a(也是0)。程序中,赋值语句grade=cin.get()的值与EOF值(表示文件结束的符号)比较。咱们用EOF(一般取值为-1)做为标记值。用户输入一个系统识别的组合键,表示文件结束,没有更多要输入的数据。EOF是<iostream.h>头文件中定义的符号化整型常量。若是grade的取值为EOF,则程序终止。咱们选择将这个程序中的字符表示为int,由于EOF取整数值(一般取值为-1)。code

可移植性提示2.2

表示文件结束的组合键与系统有关。

可移植性提示2.3

测试符号化常量EOF而不是测试-1能使程序更容易移植。ANSI标准要求EOF取负整数值,但不必定是-1。这样,EOF在不一样系统中可能取不一样的值。

在UNIX和许多其余系统中.表示文件结束的输入以下:

<ctrl-d>

即同时按ctrl键和d键。而在DEC公司的VAX VMS或Microsoft公司的MS-DOS等系统中,表示文件结束的输人以下:

<ctrl-z>

用户经过键盘输入成绩。按Enter(或Return)键时,cin.get()函数一次读取一个字符。若是输入的字符不是文件结束符,则进入switch结构。关键字switch后面是括号中的变量名grade,称为控制表达式(controlling expression)。控制表达式的值与每一个case标记比较。假设用户输入成绩c,则c自动与switch中的每一个case比较。若是找到匹配的(case'C:'),则执行该case语句。对于字母C的case语句中.cCount加1,并用break语句当即退出switch结构。注意,与其余控制结构不一样的是,有多个语句的case没必要放在花括号中。

break语句使程序控制转到switch结构后面的第一条语句。break语句使switch结构中的其余case不会一块儿运行。若是switch结构中不用break语句,则每次结构中发现匹配时,执行全部余下case中的语句(这个特性在几个case要完成相同操做时有用,见图2.22的程序)。若是找不到匹配,则执行default case并打印一个错误消息。

每一个case有一个或几个操做。switch结构与其余结构不一样,多个语句的case没必要放在花括号中。图2.23显示了通常的swish多项选择结构(每一个case用一个break语句)的流程图。

从流程图中能够看出,case末尾的每一个break语句使控制当即退出switch结构。注意,流程图(除了小圆框和流程以外)也只能包含矩形框和菱形框。这是咱们强调的操做/判断编程模型。程序员的任务就是根据算法须要用堆栈和嵌套两种方法组合其余几种控制结构,而后填入算法所要的操做和判断,从而生成程序。嵌套控制结构很常见,但程序中不多出现嵌套swilch结构。

常见编程错误2.19

switch结构中须要break语句时而忘记使用break语句是十逻辑措误。

常见编程错误2.20

省略switch结构中case字样与测试值之间的空格可能形成逻辑错误。例如,写成case3:而不是写成case 3:只会生成一个无用标号(详见第18章)。这样,switch结构的控制表达式取值为3时,switch结构不会进行相应操做。

编程技巧2.26

应在switch结构中提供default case。switch语句中没有显式测试的case在没有default case时自动忽略。而包括default case则能够提醒程序员须要处理异常条件,但有时也不须要default处理。

编程技巧2.27

尽管swish结构中的case语句和default case语句能够按任何顺序出现,但比较好的编程习惯是把default case放在最后。

编程技巧2.18

把default case放在switch结构中的最后不须要break语句。有些程序更加上这个break以使程序更清晰,并

和其余case对称。

在图2.22中的switch结构中,第46到第49行:

case ' ': 

case '	': 

case ' ' : 

break; 

使程序跳过换行符、制表符和空白字符。一次读取一个字符可能形成一些问题。要让程序读取字符,就要按键盘上的Enter键将字符发送到计算机中,在要处理的字符后面输入换行符。这个换行符一般须要特殊处理,才能使程序正确工做。经过在switch结构中包含case语句,能够防止在每次输入中遇到换行符、制表符或空格时default case打印错误消息。

常见编程错误2.21

一次读取一个字符时不处理输入中遇到的换行符和其余空白字符可能形成逻辑错误。

注意几个标号列在一块儿时(如图2.22中的case'D':case 'd':)表示每case发生一组相同的操做。

使用switch结构时,记住它只用于测试常量整型表达式(constant integral expression),即求值为一个常量整数值的字符常量和整型常量的组合。字符常量表示为单引号中的特定字符(如,'A'),而整型常量表示为整数值。

本书介绍面向对象编程时,会介绍实现switch逻辑的更精彩方法。咱们使用多态方法生成比使用switch逻辑的程序更清晰、更简洁、更易维护和扩展的程序。

C++之类可移植语言应有更灵活的数据类型长度,不一样应用可能须要不一样长度的整数。C++提供了几种表示整数的数据类型。每种类型的整数值范围取决于特定的计算机硬件。除了类型int和char外,C++还提供short(short int的缩写)和long(long int的缩写)类型。short整数的取值范围是±32767。

对于大多数整数计算,使用long类型的整数已经足够。long整数的取值范围是±2147483647。在大多数系统中,int等价于short或long。int的取值范围在short和long的取值范围之间。char数据类型能够表示计算机字符集中的任何字符,char数据类型也能够表示小整数。

可移植性提示 2.4

因为int的长度随系统不一样而不一样,所以若是要处理超过±32767的数值,应使用long整数,以便在几个不一样计算机系统中运行。

性能提示2.7

在内存有限或要求执行速度的面向性能的状况中,能够考虑用较小的整数长度。

性能提示 2.8

若是操做程序的机器指令不如天然长度整数那么有效(例如要进行符号扩展),则用较小的整数长度会使程序减慢。

常见编程错误2.22

在switch结构中提供相同的case标号是个语法错误。

考研英语历年真题http://www.kyjxy.com/yingyu/zhenti/

考研法规http://www.kyjxy.com/yuanxiao/zhengce/
考研复试指南http://www.kyjxy.com/fushi/zhinan/

相关文章
相关标签/搜索