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

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

Восстановить пароль Регистрация
 
parkito
 Аватар для parkito
11 / 11 / 2
Регистрация: 22.03.2010
Сообщений: 689
22.08.2013, 22:50     Обход ограниечения перечислений #1
Здравствуйте. Помогите пожалуйста решить следующую задачу. Необходимо обойти ограничение перечислений, которое не позволяет кроме численного значения полей выводить их полное название. То есть если я сделаю так
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
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Dani
1263 / 621 / 50
Регистрация: 11.08.2011
Сообщений: 2,236
Записей в блоге: 2
Завершенные тесты: 1
22.08.2013, 23:07     Обход ограниечения перечислений #2
Запили свой собственный enum основанный на map например.
parkito
 Аватар для parkito
11 / 11 / 2
Регистрация: 22.03.2010
Сообщений: 689
22.08.2013, 23:08  [ТС]     Обход ограниечения перечислений #3
Цитата Сообщение от Dani Посмотреть сообщение
Запили свой собственный enum основанный на map например.
поясните, пожалуйста.
alsav22
5284 / 4803 / 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
 Аватар для parkito
11 / 11 / 2
Регистрация: 22.03.2010
Сообщений: 689
22.08.2013, 23:17  [ТС]     Обход ограниечения перечислений #5
А без массива это можно организовать?
castaway
Эксперт С++
4867 / 3006 / 370
Регистрация: 10.11.2010
Сообщений: 11,055
Записей в блоге: 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
 Аватар для parkito
11 / 11 / 2
Регистрация: 22.03.2010
Сообщений: 689
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
Эксперт С++
4867 / 3006 / 370
Регистрация: 10.11.2010
Сообщений: 11,055
Записей в блоге: 10
Завершенные тесты: 1
22.08.2013, 23:37     Обход ограниечения перечислений #8
Чего ты не понял?
Dani
1263 / 621 / 50
Регистрация: 11.08.2011
Сообщений: 2,236
Записей в блоге: 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
 Аватар для parkito
11 / 11 / 2
Регистрация: 22.03.2010
Сообщений: 689
22.08.2013, 23:41  [ТС]     Обход ограниечения перечислений #10
Цитата Сообщение от castaway Посмотреть сообщение
Чего ты не понял?
приведенный вами код нечего общего с решением задачи не имеет.

Dani, задача приведена в книге до изучения массивов и тем более классов. Я думал решение легче.
Dani
1263 / 621 / 50
Регистрация: 11.08.2011
Сообщений: 2,236
Записей в блоге: 2
Завершенные тесты: 1
22.08.2013, 23:42     Обход ограниечения перечислений #11
Цитата Сообщение от parkito Посмотреть сообщение
поясните, я не понял.
Это директива препроцессора такая. #a в ней значит то, нужно записать так вместо print ( avc ) -> std::cout << "avc" << endl;
castaway
Эксперт С++
4867 / 3006 / 370
Регистрация: 10.11.2010
Сообщений: 11,055
Записей в блоге: 10
Завершенные тесты: 1
22.08.2013, 23:44     Обход ограниечения перечислений #12
Цитата Сообщение от parkito Посмотреть сообщение
то вывод будет 0, а не art.
Нужно обойти это ограничение с помощь case
Цитата Сообщение от parkito Посмотреть сообщение
А без массива это можно организовать?
Мой код выведет не 0 1 2, а zero one two без использования массива. Если ты считаешь что он не имеет ничего общего тогда ты не правильно описал проблему.
iRomul
 Аватар для iRomul
158 / 99 / 11
Регистрация: 17.10.2012
Сообщений: 474
Завершенные тесты: 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
 Аватар для parkito
11 / 11 / 2
Регистрация: 22.03.2010
Сообщений: 689
23.08.2013, 00:12  [ТС]     Обход ограниечения перечислений #14
iRomul, я думаю, что вы написали, то что мне нужно. Только я не могу часть вашего кода интегрировать в программу. Если вам не трудно допишите программу, которая запрашивает букву.
alsav22
5284 / 4803 / 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();
parkito
 Аватар для parkito
11 / 11 / 2
Регистрация: 22.03.2010
Сообщений: 689
23.08.2013, 00:36  [ТС]     Обход ограниечения перечислений #16
Вот такая задача
http://s2.ipicture.ru/uploads/201308...s/06Ny2Rzp.png
alsav22
5284 / 4803 / 442
Регистрация: 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;
    }
parkito
 Аватар для parkito
11 / 11 / 2
Регистрация: 22.03.2010
Сообщений: 689
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;
    }
спасибо. то что нужно
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.08.2013, 10:28     Обход ограниечения перечислений
Еще ссылки по теме:

C++ обход дерева
C++ Программирование с использованием перечислений, структур, объединений и полей бит
Диапазон перечислений C++
C++ Обход в ширину
Обход массива C++

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

Или воспользуйтесь поиском по форуму:
reisal78
 Аватар для reisal78
607 / 520 / 121
Регистрация: 28.04.2013
Сообщений: 1,466
23.08.2013, 10:28     Обход ограниечения перечислений #19
Цитата Сообщение от parkito Посмотреть сообщение
спасибо. то что нужно
По задачам из этого учебника можно почитать тут
Yandex
Объявления
23.08.2013, 10:28     Обход ограниечения перечислений
Ответ Создать тему
Опции темы

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