Академический Документы
Профессиональный Документы
Культура Документы
слово
слово
type
ZnakZodiaka=(Oven,Strelec,Kozerog,Bliznecy,Vesy);
Описание переменных скалярного типа, объявленные в разделе type, производится
при помощи имен типов:
type
Planeta = (Mercury,Venera,Earth,Mars); var Solnsystem: Planeta;
Таким образом, переменная Solnsystem может принимать следующие значения:
Mercury, Venera, Earth или Mars. Также переменные, имеющие перечисляемый тип,
могут быть объявлены в разделе var:
var
Solnsystem: Mercury,Venera,Earth,Mars;
Как мы видим, имена типов здесь уже не присутствуют, и переменные представляют
собой совокупность значений перечисляемого типа. К переменным рассматриваемого
типа можно применить оператор присваивания «:=»
Solnsystem:= Mercury;
Последовательность значений перечисляемого типа нумеруется автоматически,
начиная с нуля:
type
Planeta = (Mercury,Venera,Earth,Mars);
В этом примере Mercury имеет значение 0, Venera — значение 1, Earth — значение 2,
Mars — значение 3.
Примеры диапазонов:
type
diap=0..255;
type
bukv=’A’..’Z’;
Минимальное значение констант называется нижней границей отрезка, который
определяет интервальный тип, а максимальное значение — верхней границей
отрезка. Обязательное условие: нижняя граница всегда должны быть строго меньше
верхней границы отрезка, иначе программа будет работать некорректно, либо вовсе
не работать.
C++ содержит довольно много встроенных типов данных. Но этих типов бывает не всегда
достаточно для того, что мы хотим сделать. Итак, C++ содержит возможности, позволяющие
программистам создавать свои собственные типы данных. Эти типы данных
называются пользовательскими типами данных.
Возможно, самый простой пользовательский тип данных – это перечислимый
тип. Перечислимый тип (также называемый перечислением или enumeration, enum) – это
тип данных, в котором каждое возможное значение определяется как символьная константа
(называемая перечислителем, enumerator). Перечисления определяются с помощью
ключевого слова enum. Давайте посмотрим на пример:
// Определение нового перечисления с именем Color
enum Color
// Это перечислители
// Они определяют все возможные значения, которые этот тип может содержать
color_black,
color_red,
color_blue,
color_green,
color_white,
color_cyan,
color_yellow,
Color house(color_blue);
red,
green
};
enum Feeling
happy,
tired,
};
Значения перечислителей
Каждому перечислителю в зависимости от его позиции в списке перечисления
автоматически присваивается целочисленное значение. По умолчанию первому
перечислителю присваивается целочисленное значение 0, а каждому последующему
перечислителю присваивается значение на единицу больше, чем у предыдущего
перечислителя:
enum Color
{
color_black, // присвоено значение 0
};
enum Animal
animal_cat = -3,
animal_dog, // присвоено -2
animal_pig, // присвоено -1
animal_horse = 5,
animal_giraffe = 5, // имеет то же значение, что и animal_horse
animal_chicken // присвоено 6
};
color_black, // присвоено 0
color_red, // присвоено 1
color_blue, // присвоено 2
color_green, // присвоено 3
color_white, // присвоено 4
color_cyan, // присвоено 5
color_yellow, // присвоено 6
color_magenta // присвоено 7
};
Color color{};
color_black,
color_red,
// ...
};
// ...
color_black,
color_red,
// ...
};
Печать перечислителей
Как вы видели выше, попытка напечатать перечислимое значение с
помощью std::cout приводит к печати целочисленного значения перечислителя. Так как же
распечатать сам перечислитель в виде текста? Один из способов сделать это – написать
функцию и использовать оператор if или switch:
enum Color
color_black, // присвоено 0
color_red, // присвоено 1
color_blue, // присвоено 2
color_green, // присвоено 3
color_white, // присвоено 4
color_cyan, // присвоено 5
color_yellow, // присвоено 6
color_magenta // присвоено 7
};
{
switch (color)
case color_black:
break;
case color_red:
break;
case color_blue:
break;
case color_green:
break;
case color_white:
break;
case color_cyan:
break;
case color_yellow:
std::cout << "Yellow";
break;
case color_magenta:
break;
default:
if (!openFile())
return -1;
if (!readFile())
return -2;
if (!parseFile())
return -3;
return 0; // успех
success,
error_opening_file,
error_reading_file,
error_parsing_file
};
ParseResult readFileContents()
if (!openFile())
return error_opening_file;
if (!readFile())
return error_reading_file;
if (!parsefile())
return error_parsing_file;
return success;
Это намного легче читать и понимать, чем использовать магические числа в качестве
возвращаемого значения. Кроме того, вызывающий может проверить возвращаемое значение
функции по соответствующему перечислителю, что легче понять, чем проверять
возвращаемый результат на совпадение с определенным целочисленным значением.
if (readFileContents() == success)
// сделать что-то
else
#include <string>
enum ItemType
itemtype_sword,
itemtype_torch,
itemtype_potion
};
switch (itemType)
case itemtype_sword:
return "Sword";
case itemtype_torch:
return "Torch";
case itemtype_potion:
return "Potion";
}
// На всякий случай, если в будущем добавим новый элемент и забудем обновить
эту функцию
return "???";
int main()
std::cout << "You are carrying a " << getItemName(itemType) << '\n';
return 0;
sorttype_forward,
sorttype_backwards
};
if (type == sorttype_forward)