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/

相關文章
相關標籤/搜索