天天看點

枚舉類型

轉自:http://blog.csdn.net/lbsjs/article/details/178896

在程式設計中,有時會用到由若幹個有限資料元素組成的集合,如一周内的星期一到星期日七個資料元素組成的集合,由三種顔色紅、黃、綠組成的集合,一個工作 班組内十個職工組成的集合等等,程式中某個變量取值僅限于集合中的元素。此時,可将這些資料集合定義為枚舉類型。是以,枚舉類型是某類資料可能取值的集 合,如一周内星期可能取值的集合為:

  { Sun,Mon,Tue,Wed,Thu,Fri,Sat}

  該集合可定義為描述星期的枚舉類型,該枚舉類型共有七個元素,因而用枚舉類型定義的枚舉變量隻能取集合中的某一進制素值。由于枚舉類型是導出資料類型,是以,必須先定義枚舉類型,然後再用枚舉類型定義枚舉型變量。

 

  enum <枚舉類型名> 

  { <枚舉元素表> };

其中:關鍵詞enum表示定義的是枚舉類型,枚舉類型名由辨別符組成,而枚舉元素表由枚舉元素或枚舉常量組成。例如: 

enum weekdays 

{ Sun,Mon,Tue,Wed,Thu,Fri,Sat };

定義了一個名為 weekdays的枚舉類型,它包含七個元素:Sun、Mon、Tue、Wed、Thu、Fri、Sat。在編譯器編譯程式時,給枚舉類型中的每一個元素 指定一個整型常量值(也稱為序号值)。若枚舉類型定義中沒有指定元素的整型常量值,則整型常量值從0開始依次遞增,是以,weekdays枚舉類型的七個 元素Sun、Mon、Tue、Wed、Thu、Fri、Sat對應的整型常量值分别為0、1、2、3、4、5、6。

注意:在定義枚舉類型時,也可指定元素對應的整型常量值。例如,描述邏輯值集合{TRUE、FALSE}的枚舉類型boolean可定義如下:

enum boolean 

{ TRUE=1 ,FALSE=0 };

該定義規定:TRUE的值為1,而FALSE的值為0。

而描述顔色集合{red,blue,green,black,white,yellow}的枚舉類型colors可定義如下:

enum colors 

{red=5,blue=1,green,black,white,yellow};

該定義規定red為5 ,blue為1,其後元素值從2 開始遞增加1。green、black、white、yellow的值依次為2、3、4、5。此時,整數5将用于表示二種顔色red與yellow。通常兩個不同元素取相同的整數值是沒有意義的。

枚舉類型的定義隻是定義了一個新的資料類型,隻有用枚舉類型定義枚舉變量才能使用這種資料類型。

  8.1.2枚舉類型變量的定義

  定義枚舉類型變量有三種方法,即:先定義類型後定義變量,定義類型的同時定義變量,直接定義變量,現介紹如下:

1.先定義類型後定義變量

格式: <枚舉類型名> <變量1>〔,<變量2>,…,<變量n>〕;

例如:enum colors 

{red=5,blue=1,green,black,white,yellow};

colors c1,c2;

c1、c2 為colors類型的枚舉變量。

  2.定義類型的同時定義變量

  格式:enum <枚舉類型名> 

{ <枚舉元素表> } <變量1>〔,<變量2>,…,<變量n>〕;

例如:enum colors 

{red=5,blue=1,green,black,white,yellow}c1,c2;

  3.直接定義枚舉變量

  格式:enum 

  { <枚舉元素表> } <變量1>〔,<變量2>,…,<變量n>〕;

例如:enum 

{red=5,blue=1,green,black,white,yellow} c1=red,c2=blue;

由上例可以看出,定義枚舉變量時,可對變量進行初始化指派,c1的初始值為red,c2的初始值為blue。

  8.1.3 枚舉類型變量的引用

  對枚舉類型變量隻能使用2類運算:指派運算與關系運算。

1.指派運算

C++中規定,枚舉類型的元素可直接賦給枚舉變量,且同類型枚舉變量之間可以互相指派。如:enum weekdays //定義星期日到星期六為枚舉類型weekdays

{ Sun,Mon,Tue,Wed,Thu,Fri,Sat };

void main ( void )

{ weekdays day1,day2; //定義兩個枚舉型變量day1、day2

day1=Sun; //将元素Sun賦給枚舉變量day1

day2=day1; //枚舉變量day1賦給day2

cout<<day1<<endl; //輸出day1的值,即Sun的序号0

}

該例定義了兩個類型為weekdays的枚舉類型變量day1與day2,這兩個枚舉型變量隻能取集合 { Sun,Mon,Tue,Wed,Thu,Fri,Sat }中的一個元素,可用指派運算符将元素Sun賦給day1。枚舉變量day1的值可賦給同類枚舉變量day2。注意:

(1)不能用鍵盤通過"cin>>"向枚舉變量輸入元素值,例如:cin>>day1是錯誤的。是以,枚舉變量的值隻能通過初始化或指派運算符輸入。

(2)可用"cout<<"輸出枚舉變量,但輸出的是元素對應的序号值,而不是元素值。例如:cout<<day1; 用cout輸出day1中元素Sun對應的序号值0,而不是元素Sun。

  2.關系運算

枚舉變量可與元素常量進行關系比較運算,同類枚舉變量之間也可以進行關系比較運算,但枚舉變量之間的關系運算比較是對其序号值進行的。例如:

day1=Sun; //day1中元素Sun的序号值為0

day2=Mon; //day2中元素Mon的序号值為1

if (day2>day1) day2=day1; //day2>day1的比較就是序号值關系式:1>0的比較

if (day1>Sat) da1=Sat; //day1>Sat的比較就是序号值關系式:0>6的比較

day2與day1的比較,實際上是其元素Mon與Sun序号值1與0的比較,由于1>0成立,是以day2>day1條件為 真,day2=day1=Sun。同樣由于day1中元素Sun的序号值0小于Sat的序号值6,是以day1>Sat條件為假,day1的值不 變。

  【例8.1】先定義描述6種顔色的枚舉類型colors,然後再用該枚舉類型定義枚舉數組,任意輸入6個顔色号,轉換成對應的顔色枚舉量後輸入到枚舉數組中,最後輸出枚舉數組中對應的顔色。 

# include <iostream.h>

# include <stdlib.h> //使用exit(0)函數時必須包含stdlib.h頭檔案

enum colors //定義有6種顔色元素的枚舉類型colors

{ red, blue,green,black,white,yellow };

void main( void)

{ colors color[6]; //定義枚舉類型數組color[6]

int j,n;

cout<<"0:red,1:blue,2:green,3:black,4:white,5:yellow"<<endl;

cout<<" 請輸入6個顔色号:";

for (j=0;j<6;j++)

{ cin >> n; //輸入顔色号 

if (n<0 || n>5 ) 

{ cout << "輸入顔色值出錯,請重新輸入!";

exit(0);

}

else

switch(n) //将顔色号轉換成顔色元素存入數組

{ case 0 : color[j]=red; break;

case 1 : color[j]=blue; break;

case 2 : color[j]=green ; break;

case 3 : color[j]=black; break;

case 4 : color[j]=white; break;

case 5 : color[j]=yellow; break;

}

}

for (j=0 ;j<6;j++) //循環6次,輸出數組元素對應的顔色

{ switch (color[j])

{ case red : cout <<"red" ; break;

case blue: cout<<"blue" ; break;

case green : cout <<"green" ; break;

case black : cout<<"black" ; break;

case white : cout <<"white" ; break;

case yellow :cout <<"yellow" ; break;

}

cout<<'/t';

}

cout<<'/n';

}

程式執行時,螢幕提示:

0:red,1:blue,2:green,3:black,4:white,5:yellow

請輸入6個顔色号:0 1 2 3 4 5 

螢幕輸出:red blue green black white yellow

由于無法通過鍵盤直接向枚舉變量輸入枚舉元素值,是以程式中隻能先輸入枚舉元素的序号值,然後用開關語句将序号值轉換為元素值,并将元素值賦給枚舉數組 元素。同樣,由于用cout無法輸出枚舉數組中元素值,是以在輸出時,隻能用開關語句判斷輸出哪一個元素,然後用cout<<"元素"方式輸 出對應的元素值。

  【例8.2】定義一個描述三種顔色的枚舉類型{red、blue、green},輸出這三種顔色的全部排列結果。

解:這是三種顔色的全排列問題,用窮舉法即可輸出三種顔色的全部27種排列結果。

# include <iostream.h>

enum colors

{red , blue,green};

void show(colors color)

{ switch(color)

{ case red : cout<<"red";break; 

case blue : cout<<"blue";break;

case green : cout<<"green";break;

}

cout<<'/t';

}

void main(void)

{ colors col1,col2,col3;

for(col1=red ;col1<=green;col1=colors(int (col1) +1))

for(col2=red ;col2<=green;col2=colors(int (col2) +1))

for(col3=red ;col3<=green;col3=colors(int (col3) +1))

{ show(col1);

show(col2);

show(col3);

cout<<'/n';

}

}

程式通過三重循環窮舉出三種顔色所有的組合。for循環語句中,用枚舉變量col1為循環變量,col1取值從red開始到green為止,循環變量的 自加操作是通過表達式col1=colors(int (col1) +1) 來實作的,表達式中,先将col1轉換成整數,然後加1,再轉換成colors類型的枚舉值賦給col1變量。

本文轉自夏雪冬日部落格園部落格,原文連結:http://www.cnblogs.com/heyonggang/p/3186604.html,如需轉載請自行聯系原作者