Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Auto, extern, register, static, mutable 13 страница




cout << Jonathan << " " << Cortland;

на екран буде виведено числа 0 4.

Хоча перерахункові константи автоматично перетворяться в цілочисельні, зворотне перетворення автоматично не виконується. Наприклад, така настанова є некоректною

fruit = 1; // помилка

Ця настанова спричинить під час компілювання помилку, оскільки автоматичного перетворення цілочисельних значень в значення типу apple не існує. Відкоректувати попередню настанову можна за допомогою операції приведення типів:

fruit = (apple) 1; // Тепер все гаразд, але стиль не досконалий.

Тепер змінна fruit міститиме значення Golden_Del, оскільки ця apple-константа зв'язується із значенням 1. Як зазначено в коментарі, хоча ця настанова стала коректною, її стиль написання надто недосконалий, тобто його можна вибачити тільки за виняткових обставин.

Використовуючи ініціалізацію, можна вказати значення однієї або декількох перерахункових констант. Це робиться так: після відповідного елемента перерахунку ставиться знак рівності і потрібне ціле число. Під час використання ініціалізації наступному (після того, що ініціалізувало) елементу перерахунку присвоюється значення, що на одиницю перевищує попереднє значення ініціалізації. Наприклад, у процесі виконання такої настанови константі Winesap присвоюється значення 10:

enum apple {Jonathan Golden_Del, Red_Del, Winesap=10, Cortland, McIntosh};

Тепер всі символи перерахунку apple мають такі значення:

Jonathan  
Golden_Del  
Red_Del  
Winesap  
Cortland  
McIntosh  

Часто відносно перерахунків помилково вважають, що символи перерахунку можна вводити і виводити як рядки. Наприклад, такий фрагмент коду програми виконаний не буде:

// Слово "McIntosh" на екран таким чином не потрапить.

fruit = McIntosh;

cout << fruit;

Не забувайте, що символ McIntosh – це просто ім'я для певного цілочисельного значення, а не рядок. Отже, у процесі виконання попереднього коду програми на екрані відобразиться числове значення константи McIntosh, а не рядок "McIntosh". Звичайно, можна створити код введення та виведення символів перерахунку у вигляді рядків, але він виходить дещо громіздким. Ось, наприклад, як можна відобразити на екрані назви сортів яблук, пов'язаних із змінною fruit:

switch (fruit) {

case Jonathan: cout << "Jonathan";

break;

case Golden_Del: cout << "Golden Delicious";

break;

case Red_Del: cout << "Red Delicious";

break;

case Winesap: cout << "Winesap";

break;

case Cortland: cout << "Cortland";

break;

case McIntosh: cout << "McIntosh";

break;

}

Іноді для перекладу значення перерахунку у відповідний рядок можна оголосити масив рядків і використовувати значення перерахунку як індекс. Наприклад, наведений нижче код програми виводить назви трьох сортів яблук:

Код програми 9.11. Демонстрація перекладу значення перерахунку у відповідний рядок

#include <vcl>

#include <iostream> // Для потокового введення-виведення

#include <conio> // Для консольного режиму роботи

using namespace std; // Використання стандартного простору імен

 

enum apple {Jonathan, Golden_Del, Red_Del, Winesap,

Cortland, McIntosh};

 

// Масив рядків, пов'язаних з перерахунком apple.

char name[][20] = {

"Jonathan",

"Golden Delicious",

"Red Delicious",

"Winesap",

"Cortland",

"McIntosh"

};

 

int main ()

{

apple fruit;

 

fruit = Jonathan;

cout << name[fruit] << "\n";

 

fruit = Winesap;

cout << name[fruit] << "\n";

 

fruit = McIntosh;

cout << name[fruit] << "\n";

 

getch (); return 0;

}

Результати виконання цієї програми є такими:

Jonathan

Winesap

McIntosh

Використаний у цій програмі метод перетворення значення перерахунку в рядок можна застосувати до перерахунку будь-якого типу, якщо він не містить ініціалізацій. Для належного індексування елементів масиву рядків перерахункові константи повинні починатися з нуля, бути строго впорядкованими за збільшенням, і кожна наступна константа повинна бути більшою за попередню точно на одиницю.

Через те, що значення перерахунку необхідно вручну перетворювати в зручні для сприйняття людиною рядки, то вони, в основному, використовуються там, де таке перетворення не потрібне. Для прикладу розгляньте перерахунок, що використовують для визначення таблиці символів компілятора.

9.4.2. Створення нових імен для наявних типів даних

У мові програмування C++ дозволено визначати нові імена типів даних за допомогою ключового слова typedef. Під час використання typedef -імені новий тип даних не створюється, а тільки визначається нове ім'я для вже наявного типу даних. Завдяки typedef -іменам можна зробити машинозалежні програми більш переносними: для цього іноді достатньо змінити typedef -настанови. Цей засіб також дає змогу поліпшити читабельність коду програми, оскільки для стандартних типів даних за його допомогою можна використовувати описові імена. Загальний формат запису настанови typedef є таким:

typedef тип нове_ім'я;

У цьому записі елемент тип означає будь-який допустимий тип даних, а елемент нове_ім'я – нове ім'я для цього типу. При цьому зауважте: нове ім'я визначається Вами як доповнення до наявного імені типу, а не для його заміни.

Ключове слово typedef дає змогу створити нове ім'я для наявного типу даних.

Наприклад, за допомогою такої настанови можна створити нове ім'я для типу float:

typedef float balance;

Ця настанова є розпорядженням компіляторові розпізнавати ідентифікатор balance як ще одне ім'я для типу float. Після цієї настанови можна створювати float -змінні з використанням імені balance:

balance over_due;

У цьому записі оголошена змінна з плинною крапкою over_due типу balance, який є стандартним типом float, але таким, що має іншу назву.

9.4.3. Оператор "знак запитання"

Одним з найчудовіших операторів C++ є оператор "?", який можна використовувати як заміну if - else -настанов, що вживаються в такому загальному форматі:

if (умова)

змінна = вираз1;




Поделиться с друзьями:


Дата добавления: 2014-11-29; Просмотров: 393; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.034 сек.