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

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

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

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

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

Dani, задача приведена в книге до изучения массивов и тем более классов. Я думал решение легче.
Dani
1264 / 622 / 50
Регистрация: 11.08.2011
Сообщений: 2,236
Записей в блоге: 2
Завершенные тесты: 1
22.08.2013, 23:42     Обход ограниечения перечислений #11
Цитата Сообщение от parkito Посмотреть сообщение
поясните, я не понял.
Это директива препроцессора такая. #a в ней значит то, нужно записать так вместо print ( avc ) -> std::cout << "avc" << endl;
castaway
Эксперт С++
4873 / 3012 / 370
Регистрация: 10.11.2010
Сообщений: 11,063
Записей в блоге: 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
Сообщений: 690
23.08.2013, 00:12  [ТС]     Обход ограниечения перечислений #14
iRomul, я думаю, что вы написали, то что мне нужно. Только я не могу часть вашего кода интегрировать в программу. Если вам не трудно допишите программу, которая запрашивает букву.
alsav22
5413 / 4809 / 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
11 / 11 / 2
Регистрация: 22.03.2010
Сообщений: 690
23.08.2013, 00:36  [ТС]     Обход ограниечения перечислений #16
Вот такая задача
http://s2.ipicture.ru/uploads/201308...s/06Ny2Rzp.png
alsav22
5413 / 4809 / 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
11 / 11 / 2
Регистрация: 22.03.2010
Сообщений: 690
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
630 / 543 / 127
Регистрация: 28.04.2013
Сообщений: 1,539
23.08.2013, 10:28     Обход ограниечения перечислений #19
Цитата Сообщение от parkito Посмотреть сообщение
спасибо. то что нужно
По задачам из этого учебника можно почитать тут
Yandex
Объявления
23.08.2013, 10:28     Обход ограниечения перечислений
Ответ Создать тему
Опции темы

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