Определение перечислимого типа:Перечислимый тип (перечисление) — это производный тип данных в C++, представляющий собой набор нескольких констант перечисления, определённых пользователем.

Формат определения: формат определения перечислимого типа таков:

enum <类型名> {<枚举常量表>};

Описание формата:

  • Ключевое слово enum — указывает, что следующий за ним идентификатор является именем перечислимого типа.
  • Таблица констант перечисления — состоит из констант перечисления. "Константы перечисления" или "члены перечисления" — это целочисленные величины, выраженные в форме идентификаторов и представляющие значения перечислимого типа. Таблица констант перечисления перечисляет все значения перечислимого типа. Константы перечисления разделяются запятыми и должны отличаться друг от друга. Тип значения совпадает с типом условного выражения.

Примеры применения:

enum color_set1 {RED, BLUE, WHITE, BLACK}; // 定义枚举类型color_set1
enum week {Sun, Mon, Tue, Wed, Thu, Fri, Sat}; // 定义枚举类型week

Важные замечания:

Константы перечисления представляют возможные значения, которые могут принимать переменные этого перечислимого типа. Система компиляции присваивает каждой константе перечисления целочисленное значение. По умолчанию это целое число является порядковым номером перечисленного элемента, начиная с 0. При определении перечислимого типа можно указать целочисленные значения для некоторых или всех констант перечисления. Константы перечисления, стоящие до указанного значения, всё ещё получают значения по умолчанию, а константы перечисления после указанного значения получают значения по принципу последовательного увеличения на 1. Значения констант перечисления могут повторяться. Например:

enum fruit_set {apple, orange, banana=1, peach, grape}
//枚举常量apple=0,orange=1, banana=1,peach=2,grape=3.
enum week {Sun=7, Mon=1, Tue, Wed, Thu, Fri, Sat};
//枚举常量Sun,Mon,Tue,Wed,Thu,Fri,Sat的值分别为7、1、2、3、4、5、6.

Константы перечисления могут быть представлены только как идентификаторы, а не как литеральные константы, такие как целочисленные или символьные типы. Например, следующее определение недопустимо:

enum letter_set {'a','d','F','s','T'}; //枚举常量不能是字符常量
enum year_set{2000,2001,2002,2003,2004,2005}; //枚举常量不能是整型常量

Его можно изменить к следующей форме, и определение станет допустимым:

enum letter_set {a, d, F, s, T};
enum year_set{y2000, y2001, y2002, y2003, y2004, y2005};

Использование переменных перечисления

Основная цель определения перечисляемых типов — повысить читаемость программы. Одним из наиболее распространённых и полезных применений перечисляемых типов является описание состояний; это будет рассмотрено в главе 9 «Классы потоков ввода-вывода».

Формат определения: после определения перечисляемого типа можно определить переменные этого перечисляемого типа, например:

color_set1 color1, color2;

Тип и переменные также можно определить одновременно (даже имя типа можно опустить), формат следующий:

enum {Sun,Mon,Tue,Wed,Thu,Fri,Sat} weekday1, weekday2;

Связанные операции

Значения переменных перечисления могут быть только значениями, перечисленными в таблице констант перечисления, которая является подмножеством целых чисел.

Переменные перечисления занимают такой же объём памяти, как и целые числа.

Переменные перечисления могут участвовать только в присваивании, операциях отношения и операциях вывода. При участии в операциях используются их собственные целочисленные значения. Например, при заданном определении:

enum color_set1 {RED, BLUE, WHITE, BLACK} color1, color2;
enum color_set2 { GREEN, RED, YELLOW, WHITE} color3, color4;

Тогда допустимые операции присваивания следующие:

color3=RED;           //将枚举常量值赋给枚举变量
color4=color3;        //相同类型的枚举变量赋值,color4的值为RED
int  i=color3;        //将枚举变量赋给整型变量,i的值为1
int  j=GREEN;         //将枚举常量赋给整型变量,j的值为0

Допустимые операции отношения: ==, <, >, <=, >=, != и т. д., например:

//比较同类型枚举变量color3,color4是否相等
if (color3==color4) cout<<"相等";
//输出的是变量color3与WHITE的比较结果,结果为1
cout<< color3<WHITE;

Переменные перечисления можно выводить напрямую, и выводится целочисленное значение переменной. Например:

cout<< color3;         //输出的是color3的整数值,即RED的整数值1

Пример

В кармане лежат несколько шаров пяти цветов: красного, желтого, синего, белого и черного. Каждый раз из кармана достают три шара разных цветов. Подсчитайте и выведите все возможные способы.

Анализ:Поскольку шар может быть только одного из пяти цветов, для представления цвета шара можно использовать перечислимый тип. Предположим, что вынуты шары i, j и k. Согласно условию задачи, i, j и k могут принимать по пять возможных значений, причем i≠j≠k. Можно использовать метод полного перебора, чтобы проверять каждую возможную комбинацию одну за другой, находить комбинации, удовлетворяющие требованиям, и выводить их.

Пример

#include<iostream> #include<iomanip> using namespace std; int main(){ enum color_set {red,yellow,blue,white,black}; //Объявить тип перечисления color color_set color; int i,j,k,counter=0,loop; //counter накапливает количество комбинаций с разными цветами for(i=red;i<=black;i++) { for(j=red;j<=black;j++) { if(i!=j){ //Первые два шара имеют разные цвета for(k=red;k<=black;k++) if(k!=i&&k!=j){ //Третий шар отличается от первых двух, что удовлетворяет требованию counter++; if((counter)%22==0){ //Выводить по 22 строки на экран cout<<"Нажмите Enter, чтобы продолжить"; cin.get(); } cout<<setw(15)<<counter; /*Ниже выводится каждый вариант извлечения шаров; одна строка представляет три цвета одного варианта*/ for(loop=1;loop<=3;loop++){ switch(loop){ case 1: color=(color_set) i; break; //Первый — i case 2: color=(color_set) j; break; //Второй — j case 3: color=(color_set) k; break; //Третий — k } switch(color){ case red: cout<<setw(15)<<"red"; break; case yellow:cout<<setw(15)<<"yellow";break; case blue: cout<<setw(15)<<"blue"; break; case white: cout<<setw(15)<<"white"; break; case black: cout<<setw(15)<<"black"; break; } } cout<<endl; // Вывести перевод строки после вывода одного способа } } } } cout<<"Всего:"<<counter<<"ways"<<endl; return 0; }

Важные замечания

  • Переменные перечислимого типа можно выводить напрямую, но нельзя вводить напрямую. Например: cout >> color3; //недопустимо
  • Нельзя напрямую присваивать константу переменной перечислимого типа. Например: color1=1; //недопустимо
  • Переменные разных перечислимых типов нельзя присваивать друг другу. Например: color1=color3; //недопустимо
  • Для ввода и вывода переменных перечислимого типа обычно используются операторы switch, преобразующие их в символы или строки; для другой обработки данных перечислимого типа также часто применяются операторы switch, чтобы обеспечить корректность и читаемость программы.