Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
parkito
11 / 11 / 2
Регистрация: 22.03.2010
Сообщений: 692
#1

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

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

Здравствуйте. Помогите пожалуйста решить следующую задачу. Необходимо обойти ограничение перечислений, которое не позволяет кроме численного значения полей выводить их полное название. То есть если я сделаю так
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
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.08.2013, 22:50
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Обход ограниечения перечислений (C++):

Диапазон перечислений - C++
Как узнать диапазон перечислений? enum e2 {a = 3, b = 9}; В книге написано диапазон перечислений равен (0; 15) Говорится что...

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

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

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

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

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Dani
1393 / 637 / 57
Регистрация: 11.08.2011
Сообщений: 2,282
Записей в блоге: 2
Завершенные тесты: 1
22.08.2013, 23:07 #2
Запили свой собственный enum основанный на map например.
1
parkito
11 / 11 / 2
Регистрация: 22.03.2010
Сообщений: 692
22.08.2013, 23:08  [ТС] #3
Цитата Сообщение от Dani Посмотреть сообщение
Запили свой собственный enum основанный на map например.
поясните, пожалуйста.
0
alsav22
5420 / 4816 / 442
Регистрация: 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
parkito
11 / 11 / 2
Регистрация: 22.03.2010
Сообщений: 692
22.08.2013, 23:17  [ТС] #5
А без массива это можно организовать?
0
castaway
Эксперт С++
4884 / 3020 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
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
parkito
11 / 11 / 2
Регистрация: 22.03.2010
Сообщений: 692
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
castaway
Эксперт С++
4884 / 3020 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
22.08.2013, 23:37 #8
Чего ты не понял?
0
Dani
1393 / 637 / 57
Регистрация: 11.08.2011
Сообщений: 2,282
Записей в блоге: 2
Завершенные тесты: 1
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
parkito
11 / 11 / 2
Регистрация: 22.03.2010
Сообщений: 692
22.08.2013, 23:41  [ТС] #10
Цитата Сообщение от castaway Посмотреть сообщение
Чего ты не понял?
приведенный вами код нечего общего с решением задачи не имеет.

Dani, задача приведена в книге до изучения массивов и тем более классов. Я думал решение легче.
0
Dani
1393 / 637 / 57
Регистрация: 11.08.2011
Сообщений: 2,282
Записей в блоге: 2
Завершенные тесты: 1
22.08.2013, 23:42 #11
Цитата Сообщение от parkito Посмотреть сообщение
поясните, я не понял.
Это директива препроцессора такая. #a в ней значит то, нужно записать так вместо print ( avc ) -> std::cout << "avc" << endl;
1
castaway
Эксперт С++
4884 / 3020 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
22.08.2013, 23:44 #12
Цитата Сообщение от parkito Посмотреть сообщение
то вывод будет 0, а не art.
Нужно обойти это ограничение с помощь case
Цитата Сообщение от parkito Посмотреть сообщение
А без массива это можно организовать?
Мой код выведет не 0 1 2, а zero one two без использования массива. Если ты считаешь что он не имеет ничего общего тогда ты не правильно описал проблему.
0
iRomul
158 / 99 / 11
Регистрация: 17.10.2012
Сообщений: 480
Завершенные тесты: 1
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
parkito
11 / 11 / 2
Регистрация: 22.03.2010
Сообщений: 692
23.08.2013, 00:12  [ТС] #14
iRomul, я думаю, что вы написали, то что мне нужно. Только я не могу часть вашего кода интегрировать в программу. Если вам не трудно допишите программу, которая запрашивает букву.
0
alsav22
5420 / 4816 / 442
Регистрация: 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
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.08.2013, 00:33
Привет! Вот еще темы с ответами:

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

обход - C++
Король шахматной доски решил выяснить боеспособность своей армии. Посыльный объехал все клетки поля и сделал записи обо всех войсках,...

Обход ввода - C++
Народ привет. Я чёт не могу придумать способ один...сейчас объясню задумку) Вот допустим у нас есть прога которая выводит в строчку...

Обратный обход - C++
У меня есть реализация дерева и его прямой и симметричный обход. Как можно реализовать обратный обход? #include &quot;stdafx.h&quot; #include...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
23.08.2013, 00:33
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru