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

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

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

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

22.08.2013, 22:50. Просмотров 579. Ответов 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
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.08.2013, 22:50     Обход ограниечения перечислений
Посмотрите здесь:

Диапазон перечислений - 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: определяет точку входа для консольного...

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

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Dani
1300 / 637 / 56
Регистрация: 11.08.2011
Сообщений: 2,280
Записей в блоге: 2
Завершенные тесты: 1
22.08.2013, 23:07     Обход ограниечения перечислений #2
Запили свой собственный enum основанный на map например.
parkito
11 / 11 / 2
Регистрация: 22.03.2010
Сообщений: 692
22.08.2013, 23:08  [ТС]     Обход ограниечения перечислений #3
Цитата Сообщение от Dani Посмотреть сообщение
Запили свой собственный enum основанный на map например.
поясните, пожалуйста.
alsav22
5416 / 4812 / 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();
parkito
11 / 11 / 2
Регистрация: 22.03.2010
Сообщений: 692
22.08.2013, 23:17  [ТС]     Обход ограниечения перечислений #5
А без массива это можно организовать?
castaway
Эксперт С++
4881 / 3017 / 370
Регистрация: 10.11.2010
Сообщений: 11,076
Записей в блоге: 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 );
}
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 );
}
поясните, я не понял.
castaway
Эксперт С++
4881 / 3017 / 370
Регистрация: 10.11.2010
Сообщений: 11,076
Записей в блоге: 10
Завершенные тесты: 1
22.08.2013, 23:37     Обход ограниечения перечислений #8
Чего ты не понял?
Dani
1300 / 637 / 56
Регистрация: 11.08.2011
Сообщений: 2,280
Записей в блоге: 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;
}
parkito
11 / 11 / 2
Регистрация: 22.03.2010
Сообщений: 692
22.08.2013, 23:41  [ТС]     Обход ограниечения перечислений #10
Цитата Сообщение от castaway Посмотреть сообщение
Чего ты не понял?
приведенный вами код нечего общего с решением задачи не имеет.

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

Обход лабиринта - C++
Добрый вечер. Стоит задача обойти лабиринт, заданный матрицей (вводятся размерности и начальное положение), т. е. посетить каждую клетку,...

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

Обход массива - C++
Добрый день. такое вот задание : 1. Заполнить значения элементов, чтобы они образовали циклический односвязный список в соответствии с...

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

Обход матрицы - C++
есть двумерная матрица 4х4 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 0 ее рандомно перемешиваем. потом берем...


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

Или воспользуйтесь поиском по форуму:
alsav22
5416 / 4812 / 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();
Yandex
Объявления
23.08.2013, 00:33     Обход ограниечения перечислений
Ответ Создать тему
Опции темы

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