Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как из Enum вывести названия элементов? 
:(
    Опции темы
Proger10
Дата 15.9.2015, 23:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 312
Регистрация: 16.12.2008

Репутация: нет
Всего: нет



Есть пара Enum'ов:

Код

enum Country { RUSSIA, NORWAY, USA };
enum Capitals { MOSCOW, OSLO, NEWYORK };

Country country;
Capitals capitals;


Реально ли по значению ("индексу") вывести название переменной? Или перечислить все названия стран. И более сложный вопрос: реально ли по стране в, именно таком коде, вывести название столицы? Я, честно говоря, не очень работал с этими перечислениями, каким образом можно делать такие штуки? Я бы их в массивы, честно говоря, скинул и не мучался бы, но очень нужно именно с Enum'ами smile Может кто подсказать?

Это сообщение отредактировал(а) Proger10 - 15.9.2015, 23:23
PM MAIL   Вверх
feodorv
Дата 16.9.2015, 03:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(Proger10 @  15.9.2015,  23:22 Найти цитируемый пост)
Я бы их в массивы, честно говоря, скинул и не мучался бы, но очень нужно именно с Enum'ами
Самый простой вариант:
Код
enum Country { RUSSIA, NORWAY, USA };
enum Capitals { MOSCOW, OSLO, WASHINGTON };

const char *countryList[] =
{
  "Russia", "Norway", "USA"
};

const char *capitalList[] = 
{
  "Moscow", "Oslo", "Washington"
}

Country country;
Capitals capitals;
Правда, такой подход требует аккуратности (например, последовательность и число стран в енуме и списке должно совпадать; то же для столиц).


Цитата(Proger10 @  15.9.2015,  23:22 Найти цитируемый пост)
Или перечислить все названия стран.
Код
for( Country c = RUSSIA; c < USA; ++c) cout << countryList[c] << endl;



Цитата(Proger10 @  15.9.2015,  23:22 Найти цитируемый пост)
И более сложный вопрос: реально ли по стране в, именно таком коде, вывести название столицы?
Код
void printCapital( Country country )
{
  cout << "Capital of " << countryList[country] << " is " << capitalList[country] << "." << endl;
}


Это сообщение отредактировал(а) feodorv - 16.9.2015, 03:37


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
math64
Дата 16.9.2015, 10:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 12
Всего: 72



Цитата(feodorv @  16.9.2015,  03:35 Найти цитируемый пост)
Правда, такой подход требует аккуратности (например, последовательность и число стран в енуме и списке должно совпадать; то же для столиц).

Обеспечить это можно примерно так:
Код

#define CONTRIES \
  COUNTRY(RUSSIA, Moscow), \
  COUNTRY(NORWAY, Oslo), \
  COUNRY(USA, Washington)

#define COUNTRY(country, capital) country
enum Country {
  COUNTRIES
};
#undef COUNTRY

#define COUNTRY(country, capital) capital
enum Capitals {
  COUNTRIES
};
#undef COUNTRY

#define COUNTRY(country, capital) { #country, #capital }
struct CountryInfo {
  const char* country; 
  const char* capital; 
} countryInfos[] = {
  COUNTRIES
};
#undef COUNTRY

for( Country c = RUSSIA; c < USA; ++c)
  cout << countryInfos[c].country <<  countryInfos[c].capital << endl;


PM   Вверх
borisbn
Дата 16.9.2015, 10:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



Цитата(feodorv @  16.9.2015,  03:35 Найти цитируемый пост)
for( Country c = RUSSIA; c < USA; ++c)

1) Такое не компилируется
Цитата
error: no match for 'operator++' (operand type is 'Country')

2) Выведет только Россию и Норвегию, а США останется за бортом (хотя... может Вы так и задумывали ))
Чтобы вывело всё нужно
Цитата
for( Country c = RUSSIA; c <= USA; ++c)



--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Proger10
Дата 16.9.2015, 12:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 312
Регистрация: 16.12.2008

Репутация: нет
Всего: нет



У меня, кстати, такой подход:
Цитата(borisbn @  16.9.2015,  10:46 Найти цитируемый пост)

for( Country c = RUSSIA; c <= USA; ++c)

выдаёт: "error: cannot increment expression of enum type 'Country'" 
(G++ 4.2.1, "Apple LLVM version 6.0 (clang-600.0.57) (based on LLVM 3.5svn)" )
а у вас работает? smile

PS И кто только придумал такой гемор использовать. Делали бы через массивы и проблем бы не знали, нет же "мы лёгких путей не ищем" smile)))

Это сообщение отредактировал(а) Proger10 - 16.9.2015, 12:37
PM MAIL   Вверх
feodorv
Дата 16.9.2015, 14:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(borisbn @  16.9.2015,  10:46 Найти цитируемый пост)
Такое не компилируется

Мда. Очень хотелось Country))) Тогда либо 
Код
for( int c = RUSSIA; c <= USA; ++c)
либо
Код
Country& operator++( Country& c )
{
  c = static_cast<Country>( c + 1 );
  return c;
}



Цитата(borisbn @  16.9.2015,  10:46 Найти цитируемый пост)
хотя... может Вы так и задумывали ))

 smile Нет, конечно))) Когда ответ задумывался, <= подразумевалось. Когда он писался, = забылось, сила привычки. Спасибо за замечания!

Добавлено через 1 минуту и 24 секунды
Цитата(Proger10 @  16.9.2015,  12:36 Найти цитируемый пост)
И кто только придумал такой гемор использовать.

Строгая типизация имеет свои преимущества)))


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
Proger10
Дата 16.9.2015, 14:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 312
Регистрация: 16.12.2008

Репутация: нет
Всего: нет



Цитата(feodorv @  16.9.2015,  14:12 Найти цитируемый пост)
for( int c = RUSSIA; c <= USA; ++c)

Аа, всё, понял ход мыслей. Спасибо за наводку!

PS И нафига студентам задают такую чушь. Сколько работаю в программировании - никогда не приходилось подобной ахинеей заниматься smile Если там ещё и идентификаторы будут идти с произвольным шагом - они повесятся, выучась на таких задачах smile
PM MAIL   Вверх
math64
Дата 16.9.2015, 16:20 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 12
Всего: 72



Если идентификаторы идут не по порядку - нужно правильно реализовывать operator++, например так:
Код

Country operator++(Country& c )
{
  switch(c) {
     case RUSSIA: return c = NORWAY;
     case NORWAY: return c = USA;
     case USA: default: return c = RUSSIA;
  }
}

Но опять, при добавлении страны, нужно не забыть добавить case

Это сообщение отредактировал(а) math64 - 17.9.2015, 10:35
PM   Вверх
volatile
Дата 16.9.2015, 16:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 16
Всего: 85



В enum значения могут идти не только не по порядку, но еще и повторяться.
имхо, enum для такого применения не предназначен.
map напрашивается в данном случае.

PM MAIL   Вверх
Dov
Дата 21.9.2015, 19:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


аСинизатор
***


Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

Репутация: 11
Всего: 88



Цитата(Proger10 @ 16.9.2015,  11:36)
У меня, кстати, такой подход:
Цитата(borisbn @  16.9.2015,  10:46 Найти цитируемый пост)

for( Country c = RUSSIA; c <= USA; ++c)

выдаёт: "error: cannot increment expression of enum type 'Country'" 

а у вас работает? smile

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

for(Country c = RUSSIA; c <= USA; c = Country(c + 1)) 



--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
Guinness
Дата 22.9.2015, 08:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 310
Регистрация: 21.6.2009
Где: Зеленоград

Репутация: 2
Всего: 10



Цитата(feodorv @  16.9.2015,  15:12 Найти цитируемый пост)
 Когда ответ задумывался, <= подразумевалось. 

Не обязательно использовать <=. Можно enum объявить следующим образом:
Код

enum Country { 
     Country_Start,
     RUSSIA = Country_Start, 
     NORWAY, 
     USA,
     Country_End
};

Тогда цикл for у нас получится более гибким:
Код

     for( int c = Country_Start; c < Country_End; ++c)

Но опять же, выше уже описали проблемы использования enum`а таким образом.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0555 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.