Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/6: Рейтинг темы: голосов - 6, средняя оценка - 5.00
15 / 14 / 10
Регистрация: 22.03.2010
Сообщений: 695
1

Обход ограниечения перечислений

22.08.2013, 22:50. Показов 1199. Ответов 18
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте. Помогите пожалуйста решить следующую задачу. Необходимо обойти ограничение перечислений, которое не позволяет кроме численного значения полей выводить их полное название. То есть если я сделаю так
C++
1
2
enum a {art, iu, jb, oy, kyji, mjg};
cout<<art;
то вывод будет 0, а не art.
Нужно обойти это ограничение с помощь
C++
1
case
. Но как это сделать, пока не могу придумать

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include<iostream>
using namespace std;
enum a {art, iu, jb, oy, kyji, ijg};
int main()
{   setlocale(LC_ALL, "Rus");
    char b;
    cout<<"Введи первую букву --> ";
    cin>>b;
switch(b)
    { case 'a': cout<<"Имя "<<art; break;
 
    }
    cin.get();
    cin.get();
    return 0;
    }
Нужно чтобы вывод был таким
C++
1
2
"Введи первую букву --> a
Имя art
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.08.2013, 22:50
Ответы с готовыми решениями:

Диапазон перечислений
Как узнать диапазон перечислений? enum e2 {a = 3, b = 9}; В книге написано диапазон...

Узнать количество перечислений в enum
Добрый день! Как узнать количество перечислений в ABCDEF. enum ABCDEF{ P1, P2, P3 };...

Начальное значение для переменных-перечислений
enum {purchasing, selling, noAction} action; При таком объявлении, начальное значение action в 10...

Вопрос о разумном использовании структур\перечислений\объединений
Доброго времени суток, Форумчане! Цель работы - написание что-то типа базы данных. Допустим я...

18
1405 / 647 / 135
Регистрация: 11.08.2011
Сообщений: 2,299
Записей в блоге: 2
22.08.2013, 23:07 2
Запили свой собственный enum основанный на map например.
1
15 / 14 / 10
Регистрация: 22.03.2010
Сообщений: 695
22.08.2013, 23:08  [ТС] 3
Цитата Сообщение от Dani Посмотреть сообщение
Запили свой собственный enum основанный на map например.
поясните, пожалуйста.
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
22.08.2013, 23:13 4
Так не подойдёт?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
    enum a {art, iu, jb, oy, kyji, ijg};
    char str[][5] = {"art", "iu", "jb", "oy", "kyji", "ijg"};
 
    setlocale(LC_ALL, "Rus");
    char b;
    cout<<"Введи первую букву --> ";
    cin>>b;
switch(b)
    { case 'a': cout<<"Имя "<<str[art]; break;
 
    }
    cin.get();
    cin.get();
1
15 / 14 / 10
Регистрация: 22.03.2010
Сообщений: 695
22.08.2013, 23:17  [ТС] 5
А без массива это можно организовать?
0
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
22.08.2013, 23:31 6
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
 
#define print( a )  std::cout << #a << std::endl
 
enum { zero, one, two };
 
int main()
{
    print( zero );
    print( one );
    print( two );
}
0
15 / 14 / 10
Регистрация: 22.03.2010
Сообщений: 695
22.08.2013, 23:34  [ТС] 7
Цитата Сообщение от castaway Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
 
#define print( a )  std::cout << #a << std::endl
 
enum { zero, one, two };
 
int main()
{
    print( zero );
    print( one );
    print( two );
}
поясните, я не понял.
0
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
22.08.2013, 23:37 8
Чего ты не понял?
0
1405 / 647 / 135
Регистрация: 11.08.2011
Сообщений: 2,299
Записей в блоге: 2
22.08.2013, 23:39 9
Цитата Сообщение от parkito Посмотреть сообщение
А без массива это можно организовать?
можно.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#include <iostream>
#include <map>
#include <string>
 
using namespace std;
 
class My_enum
{
public:
    My_enum() : prev(-1) {}
    void add(const string& name, int value);
    void add(const string& name);
    int get_record(const string&) const;
    
    class Invalid
    {
    public:
        Invalid(const string& _s) : data(_s) {}
        const string& what() const { return data; }
    private:
        string data;
    };
 
private:
    std::map<string, int> database;
    int prev;
};
 
void My_enum::add(const string& name)
{
    ++prev;
    add(name, prev);
}
 
void My_enum::add(const string& name, int value)
{
    if (database.find(name) != database.end())
        throw My_enum::Invalid("Duplicate name");
    database[name] = value;
}
 
int My_enum::get_record(const string& name) const
{
    if (database.find(name) == database.end())
        throw Invalid("Unknown name of record");
    return database.at(name);
}
 
int main()
try
{
    My_enum temp;
    temp.add("abc");
    temp.add("b");
    temp.add("bcde", 52);
    cout << temp.get_record("abc") << " " << "bcde" << " " << temp.get_record("bcde") << endl;
}
catch(My_enum::Invalid& e)
{
    cout << "Error: " << e.what() << endl;
}
1
15 / 14 / 10
Регистрация: 22.03.2010
Сообщений: 695
22.08.2013, 23:41  [ТС] 10
Цитата Сообщение от castaway Посмотреть сообщение
Чего ты не понял?
приведенный вами код нечего общего с решением задачи не имеет.

Dani, задача приведена в книге до изучения массивов и тем более классов. Я думал решение легче.
0
1405 / 647 / 135
Регистрация: 11.08.2011
Сообщений: 2,299
Записей в блоге: 2
22.08.2013, 23:42 11
Цитата Сообщение от parkito Посмотреть сообщение
поясните, я не понял.
Это директива препроцессора такая. #a в ней значит то, нужно записать так вместо print ( avc ) -> std::cout << "avc" << endl;
1
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
22.08.2013, 23:44 12
Цитата Сообщение от parkito Посмотреть сообщение
то вывод будет 0, а не art.
Нужно обойти это ограничение с помощь case
Цитата Сообщение от parkito Посмотреть сообщение
А без массива это можно организовать?
Мой код выведет не 0 1 2, а zero one two без использования массива. Если ты считаешь что он не имеет ничего общего тогда ты не правильно описал проблему.
0
163 / 104 / 14
Регистрация: 17.10.2012
Сообщений: 488
23.08.2013, 00:07 13
Может имелось ввиду это:
C++
1
2
3
4
5
6
7
enum example_enum {x, y, z}
example_enum foo;
switch(foo) {
  case x: cout << "x"; break;
  case y: cout << "y"; break;
  case z: cout << "z"; break;
}
Будет выведено название элемента перечисления.
1
15 / 14 / 10
Регистрация: 22.03.2010
Сообщений: 695
23.08.2013, 00:12  [ТС] 14
iRomul, я думаю, что вы написали, то что мне нужно. Только я не могу часть вашего кода интегрировать в программу. Если вам не трудно допишите программу, которая запрашивает букву.
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
23.08.2013, 00:33 15
parkito, зачем здеь, вообще, перечисление? Задача такая?

Добавлено через 2 минуты
Осталось только вот так ещё написать, до кучи:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
setlocale(LC_ALL, "Rus");
    char b;
    cout<<"Введи первую букву --> ";
    cin>>b;
switch(b)
    {   case 'a': cout<<"Имя " <<"art";  break;
        case 'i': cout<<"Имя " <<"iu";   break;
        case 'j': cout<<"Имя " <<"jb";   break;
        case 'o': cout<<"Имя " <<"oy";   break;
        case 'k': cout<<"Имя " <<"kyji"; break;
        case 'm': cout<<"Имя " <<"mjg";  break;
    }
    cin.get();
    cin.get();
1
15 / 14 / 10
Регистрация: 22.03.2010
Сообщений: 695
23.08.2013, 00:36  [ТС] 16
Вот такая задача
http://s2.ipicture.ru/uploads/... Ny2Rzp.png
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
23.08.2013, 01:41 17
Так что-ли (если дописать код iRomul)? Задание не понятно для чего, или я его не понимаю. Должно быть два switch() и дополнительная переменная перечисления. Вот оно, всё есть...
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    setlocale(LC_ALL, "Rus");
    
    enum example_enum {xxx, yyy, zzz};
    example_enum foo;
    
    char b;
    cout << "Введи первую букву --> ";
    cin >> b;
    switch(b) {
      case 'x': foo = xxx; break;
      case 'y': foo = yyy; break;
      case 'z': foo = zzz; break;
    }
    switch(foo) {
      case xxx: cout << "xxx"; break;
      case yyy: cout << "yyy"; break;
      case zzz: cout << "zzz"; break;
    }
1
15 / 14 / 10
Регистрация: 22.03.2010
Сообщений: 695
23.08.2013, 01:45  [ТС] 18
Цитата Сообщение от alsav22 Посмотреть сообщение
Так что-ли (если дописать код iRomul)? Задание не понятно для чего, или я его не понимаю. Должно быть два switch() и дополнительная переменная перечисления. Вот оно, всё есть...
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    setlocale(LC_ALL, "Rus");
    
    enum example_enum {xxx, yyy, zzz};
    example_enum foo;
    
    char b;
    cout << "Введи первую букву --> ";
    cin >> b;
    switch(b) {
      case 'x': foo = xxx; break;
      case 'y': foo = yyy; break;
      case 'z': foo = zzz; break;
    }
    switch(foo) {
      case xxx: cout << "xxx"; break;
      case yyy: cout << "yyy"; break;
      case zzz: cout << "zzz"; break;
    }
спасибо. то что нужно
0
944 / 687 / 230
Регистрация: 28.04.2013
Сообщений: 1,926
23.08.2013, 10:28 19
Цитата Сообщение от parkito Посмотреть сообщение
спасибо. то что нужно
По задачам из этого учебника можно почитать тут
1
23.08.2013, 10:28
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.08.2013, 10:28
Помогаю со студенческими работами здесь

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

Подсчет числа слов в предложении с использованием перечислений. Найти ошибку в коде
где в коде ошибка? // подсчет чила слов в предложении с использованием перечислений.cpp:...

Разница между понятиями "Обход в прямом направлении" и "Итерационный прямой обход"
Ребятаа, обьясните чем различается: Обход в прямом направлении и Итерационный прямой обход ...

Выражение должно относиться к целочисленному типу или типу перечислений без области видимости
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; using namespace std; class lVector { int Vector1;...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru