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

Как правильно впихнуть и использовать перечисления в структуре? - C++

Восстановить пароль Регистрация
 
FliXis
31 / 31 / 2
Регистрация: 17.09.2012
Сообщений: 155
17.09.2012, 21:19     Как правильно впихнуть и использовать перечисления в структуре? #1
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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
// Test_Project.cpp: определяет точку входа для консольного приложения.
//
 
#include "stdafx.h"
#include <iostream>
using namespace std;
 
///////////////////////////////////////////////////////////////////////
struct employee
{
    int number;
    float money;
 
    int d;
    int m;
    int y;
 
    enum etupe { laborer, secretary, manager, accountant, executive, researcher };
    etupe pro;
};
///////////////////////////////////////////////////////////////////////
 
int main ()
{
    system("chcp 1251 >nul");
 
    char ch='/', ch1='/';
    int ch2, ch3=0, ch4=0, ch5=0;
 
    employee worker1, worker2, worker3;
 
    do
    {
        cout << "Выберите сотрудника(1, 2, 3)\nЛибо введите \"4\" для вывода данных: ";
        cin >> ch2;
 
        switch(ch2)
        {
            case 1:
                {
                    cout << "\nПервый сотрудник.\n";
                    cout << "Введите номер и величину зарплаты: ";
                    cin >> worker1.number >> worker1.money;
                    cout << "Введите первую букву должности\n(laborer, secretary, manager, accountant, executive, researcher): ";
                    cin >> worker1.pro; //тест
                    cout << "Введите дату поступления на работу формата(день/месяц/год): ";
                    cin >> worker1.d >> ch1 >> worker1.m >> ch1 >> worker1.y; ch3++; cout << endl; continue;
                }
            case 2:
                {
                    cout << "\nВторой сотрудник.\n";
                    cout << "Введите номер и величину зарплаты: ";
                    cin >> worker2.number >> worker2.money;
                    cout << "Введите первую букву должности\n(laborer, secretary, manager, accountant, executive, researcher): ";
                    cin >> worker2.pro; //тест
                    cout << "Введите дату поступления на работу формата(день/месяц/год): ";
                    cin >> worker2.d >> ch1 >> worker2.m >> ch1 >> worker2.y; ch4++; cout << endl; continue;
                }
            case 3:
                {
                    cout << "\nТретий сотрудник.\n";
                    cout << "Введите номер и величину зарплаты: ";
                    cin >> worker3.number >> worker3.money;
                    cout << "Введите первую букву должности\n(laborer, secretary, manager, accountant, executive, researcher): ";
                    cin >> worker3.pro; //тест
                    cout << "Введите дату поступления на работу формата(день/месяц/год): ";
                    cin >> worker3.d >> ch1 >> worker3.m >> ch1 >> worker3.y; ch5++; cout << endl; continue;
                }
            case 4: 
                {
                    if(ch3>=0 && ch4>0 && ch5>0)
                    {
                        cout << endl << "Данные"; break; //тест
                    }
                    else
                    {
                        cout << "Вы ввели не все данные!"; break;
                    }
                }
            default: cout << "Вы ввели неверное значение!"; break;
        }
        cout << "\n\nПродолжить?(y/n): ";
        cin>> ch; cout << endl;
    }
    while(ch !='n');
 
 return 0;
}
Задание из книги Лафоре. 4 глава. Упражнение 7.
Добавьте поля типа enum etype(см. упражнение 6) и struct date(см. упражнение 5) в структуру employee из упражнения 4. Организуйте программу таким образом, чтобы пользователь вводил четыре пункта данных о каждом из трех сотрудников: его номер, величину зарплаты, его должность и дату принятия на работу. Программа должна хранить введенные значения в трех переменных типа employee и выводить их содержимое на экрна.
Задание было бы совершенно простым, если бы не заставляли в структуру впихивать перечисления enum etype.
Строка 18, 19 - инициализация перечисления и его определение.
Строка 45, 55, 65 - ругается на '>>'.


Как правильно это сделать?

Вроде как можно как-то перегрузить '>>', но дело в том, что я до перегрузок еще не дошел, кроме того, хотелось бы знать как это сделать простым способом обладая знаниями книги Лафоре на уровне четвертой главы и не старше. Если конечно автор книги сам не накосячил в описании задания...
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.09.2012, 21:19     Как правильно впихнуть и использовать перечисления в структуре?
Посмотрите здесь:

C++ Упражнение из Лафоре. Тема Перечисления. Как правильно сделать вывод?
насчет перечисления(зачем я объявляю переменную в перечислении? Приведите примеры где удобно использовать перечисление?) C++
«Структура в структуре» - как правильно называется? C++
Как использовать собственный класс в структуре struct до определения самого класса в тексте программы C++
Как правильно использовать GetModuleFileName? C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
igorrr37
 Аватар для igorrr37
1593 / 1221 / 118
Регистрация: 21.12.2010
Сообщений: 1,868
Записей в блоге: 7
17.09.2012, 22:02     Как правильно впихнуть и использовать перечисления в структуре? #2
std::cin >> reinterpret_cast<int&>(worker1.pro);
std::cin >> (int&)worker1.pro;
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
17.09.2012, 22:15     Как правильно впихнуть и использовать перечисления в структуре? #3
такой каст может глючить. размер енума вроде не обязательно соответствует размеру инта. может быть и меньше. точно не могу сказать.
правильнее было бы сделать свои операторы ввода вывода:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
EnumType IntToEnumType(int val)
{
   // тут проверки что у val корректное значение.
   return static_cast<EnumType>(val);
}
 
std::istream operator >> (std::istream& in, EnumType& e)
{
  int val = 0; // тут всякой шаблонной магией можно сделать так, чтобы был не int а какое-то другой, более правильный встроенный тип.
  in >> val;
  e = IntToEnumType(val);
  return in;
}
FliXis
31 / 31 / 2
Регистрация: 17.09.2012
Сообщений: 155
18.09.2012, 18:33  [ТС]     Как правильно впихнуть и использовать перечисления в структуре? #4
Большое спасибо, что откликнулись!
DU, я в кодинге полный профан, только начал изучать язык самостоятельно, посему, все что за пределами 4й главы книги Лафоре для меня пока еще непостижимо и сложно к пониманию.

igorrr37, попробовал применить, перестал компилятор жаловаться, но теперь возникла иная проблема, как я понимаю, вследствии использования данной строчки. Теперь ввод не прекращается. Тобишь, теперь как только я ввожу значение в эту переменную (worker1.pro например), то начинается сбой:

[img]http://i070.***********/1209/b7/1268c4fb2a82.png[/img]

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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
// Test_Project.cpp: определяет точку входа для консольного приложения.
//
 
#include "stdafx.h"
#include <iostream>
using namespace std;
 
///////////////////////////////////////////////////////////////////////
struct employee
{
    int number;
    float money;
 
    int d;
    int m;
    int y;
 
    enum etupe { laborer, secretary, manager, accountant, executive, researcher };
    etupe pro;
};
///////////////////////////////////////////////////////////////////////
 
int main ()
{
    system("chcp 1251 >nul");
 
    char ch='/', ch1='/';
    int ch2, ch3=0, ch4=0, ch5=0;
 
    employee worker1, worker2, worker3;
 
    do
    {
        cout << "Выберите сотрудника(1, 2, 3)\nЛибо введите \"4\" для вывода данных: ";
        cin >> ch2;
 
        switch(ch2)
        {
            case 1:
                {
                    cout << "\nПервый сотрудник.\n";
                    cout << "Введите номер и величину зарплаты: ";
                    cin >> worker1.number >> worker1.money;
                    cout << "Введите первую букву должности\n(laborer, secretary, manager, accountant, executive, researcher): ";
                    cin >> (int&)worker1.pro;
                    cout << "Введите дату поступления на работу формата(день/месяц/год): ";
                    cin >> worker1.d >> ch1 >> worker1.m >> ch1 >> worker1.y; ch3++; cout << endl; continue;
                }
            case 2:
                {
                    cout << "\nВторой сотрудник.\n";
                    cout << "Введите номер и величину зарплаты: ";
                    cin >> worker2.number >> worker2.money;
                    cout << "Введите первую букву должности\n(laborer, secretary, manager, accountant, executive, researcher): ";
                    cin >> (int&)worker2.pro;
                    cout << "Введите дату поступления на работу формата(день/месяц/год): ";
                    cin >> worker2.d >> ch1 >> worker2.m >> ch1 >> worker2.y; ch4++; cout << endl; continue;
                }
            case 3:
                {
                    cout << "\nТретий сотрудник.\n";
                    cout << "Введите номер и величину зарплаты: ";
                    cin >> worker3.number >> worker3.money;
                    cout << "Введите первую букву должности\n(laborer, secretary, manager, accountant, executive, researcher): ";
                    cin >> (int&)worker3.pro;
                    cout << "Введите дату поступления на работу формата(день/месяц/год): ";
                    cin >> worker3.d >> ch1 >> worker3.m >> ch1 >> worker3.y; ch5++; cout << endl; continue;
                }
            case 4: 
                {
                    if(ch3>0 && ch4>0 && ch5>0)
                    {
                        cout << endl << "Первый сотрудник под номером " << worker1.number << " Зарплата: " << worker1.money << " Должность: ";
                        switch(worker1.pro)
                        {
                            case 0: cout << "laborer"    << endl; break;
                            case 1: cout << "secretary"  << endl; break;
                            case 2: cout << "manager"    << endl; break;
                            case 3: cout << "accountant" << endl; break;
                            case 4: cout << "executive"  << endl; break;
                            case 5: cout << "researcher" << endl; break;
                        }
                        cout << "Дата устройства: " << worker1.d << ch1 << worker1.m << ch1 << worker1.y << endl;
 
                        cout << endl << "Второй сотрудник под номером " << worker2.number << " Зарплата: " << worker2.money << " Должность: ";
                        switch(worker2.pro)
                        {
                            case 0: cout << "laborer"    << endl; break;
                            case 1: cout << "secretary"  << endl; break;
                            case 2: cout << "manager"    << endl; break;
                            case 3: cout << "accountant" << endl; break;
                            case 4: cout << "executive"  << endl; break;
                            case 5: cout << "researcher" << endl; break;
                        }
                        cout << "Дата устройства: " << worker2.d << ch1 << worker2.m << ch1 << worker2.y << endl;
 
                        cout << endl << "Третий сотрудник под номером " << worker3.number << " Зарплата: " << worker3.money << " Должность: ";
                        switch(worker3.pro)
                        {
                            case 0: cout << "laborer"    << endl; break;
                            case 1: cout << "secretary"  << endl; break;
                            case 2: cout << "manager"    << endl; break;
                            case 3: cout << "accountant" << endl; break;
                            case 4: cout << "executive"  << endl; break;
                            case 5: cout << "researcher" << endl; break;
                        }
                        cout << "Дата устройства: " << worker3.d << ch1 << worker3.m << ch1 << worker3.y << endl;
                    }
                    else
                    {
                        cout << "Вы ввели не все данные!"; break;
                    }
                }
            default: cout << "Вы ввели неверное значение!"; break;
        }
        cout << "\n\nПродолжить?(y/n): ";
        cin>> ch; cout << endl;
    }
    while(ch !='n');
 
 return 0;
}
Строка 18, 19 - инициализация перечисления и его определение.
Строка 45, 55, 65 - применение конструкции reinterpret_cast<int&>(worker1.pro); или (int&)worker1.pro;
Строка 74, 86, 98 - дальнейше применение переменных.
igorrr37
 Аватар для igorrr37
1593 / 1221 / 118
Регистрация: 21.12.2010
Сообщений: 1,868
Записей в блоге: 7
18.09.2012, 20:20     Как правильно впихнуть и использовать перечисления в структуре? #5
вводи не первую букву должности а соответствующий номер: laborer'у соответсвует 0 и т.д., ведь дальше в коде идёт проверка именно на номер:
C++
1
2
3
4
5
6
7
8
9
switch(worker1.pro)
                        {
                            case 0: cout << "laborer"    << endl; break;
                            case 1: cout << "secretary"  << endl; break;
                            case 2: cout << "manager"    << endl; break;
                            case 3: cout << "accountant" << endl; break;
                            case 4: cout << "executive"  << endl; break;
                            case 5: cout << "researcher" << endl; break;
                        }
FliXis
31 / 31 / 2
Регистрация: 17.09.2012
Сообщений: 155
18.09.2012, 20:49  [ТС]     Как правильно впихнуть и использовать перечисления в структуре? #6
Цитата Сообщение от igorrr37 Посмотреть сообщение
вводи не первую букву должности а соответствующий номер: laborer'у соответсвует 0 и т.д., ведь дальше в коде идёт проверка именно на номер:
C++
1
2
3
4
5
6
7
8
9
switch(worker1.pro)
                        {
                            case 0: cout << "laborer"    << endl; break;
                            case 1: cout << "secretary"  << endl; break;
                            case 2: cout << "manager"    << endl; break;
                            case 3: cout << "accountant" << endl; break;
                            case 4: cout << "executive"  << endl; break;
                            case 5: cout << "researcher" << endl; break;
                        }
Это я там ошибся, а изменять сообщение могу только в течении 10ти минут. Потом переправил на:

C++
1
2
3
4
5
6
7
8
9
switch(worker1.pro)
                        {
                            case 'l': cout << "laborer"    << endl; break;
                            case 's': cout << "secretary"  << endl; break;
                            case 'm': cout << "manager"    << endl; break;
                            case 'a': cout << "accountant" << endl; break;
                            case 'e': cout << "executive"  << endl; break;
                            case 'r': cout << "researcher" << endl; break;
                        }
Но Ваше сообщение надоумило меня на вот такое изменение: cin >> (char&)worker1.pro;

Теперь все работает! Большое спасибо Вам!

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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
// Test_Project.cpp: определяет точку входа для консольного приложения.
//
 
#include "stdafx.h"
#include <iostream>
using namespace std;
 
///////////////////////////////////////////////////////////////////////
struct employee
{
    int number;
    float money;
 
    int d;
    int m;
    int y;
 
    enum etupe { laborer, secretary, manager, accountant, executive, researcher };
    etupe pro;
};
///////////////////////////////////////////////////////////////////////
 
int main ()
{
    system("chcp 1251 >nul");
 
    char ch='/', ch1='/';
    int ch2, ch3=0, ch4=0, ch5=0;
 
    employee worker1, worker2, worker3;
 
    do
    {
        cout << "Выберите сотрудника(1, 2, 3)\nЛибо введите \"4\" для вывода данных: ";
        cin >> ch2;
 
        switch(ch2)
        {
            case 1:
                {
                    cout << "\nПервый сотрудник.\n";
                    cout << "Введите номер и величину зарплаты: ";
                    cin >> worker1.number >> worker1.money;
                    cout << "Введите первую букву должности\n(laborer, secretary, manager, accountant, executive, researcher): ";
                    cin >> (char&)worker1.pro;
                    cout << "Введите дату поступления на работу формата(день/месяц/год): ";
                    cin >> worker1.d >> ch1 >> worker1.m >> ch1 >> worker1.y; ch3++; cout << endl; continue;
                }
            case 2:
                {
                    cout << "\nВторой сотрудник.\n";
                    cout << "Введите номер и величину зарплаты: ";
                    cin >> worker2.number >> worker2.money;
                    cout << "Введите первую букву должности\n(laborer, secretary, manager, accountant, executive, researcher): ";
                    cin >> (char&)worker2.pro;
                    cout << "Введите дату поступления на работу формата(день/месяц/год): ";
                    cin >> worker2.d >> ch1 >> worker2.m >> ch1 >> worker2.y; ch4++; cout << endl; continue;
                }
            case 3:
                {
                    cout << "\nТретий сотрудник.\n";
                    cout << "Введите номер и величину зарплаты: ";
                    cin >> worker3.number >> worker3.money;
                    cout << "Введите первую букву должности\n(laborer, secretary, manager, accountant, executive, researcher): ";
                    cin >> (char&)worker3.pro;
                    cout << "Введите дату поступления на работу формата(день/месяц/год): ";
                    cin >> worker3.d >> ch1 >> worker3.m >> ch1 >> worker3.y; ch5++; cout << endl; continue;
                }
            case 4: 
                {
                    if(ch3>0 && ch4>0 && ch5>0)
                    {
                        cout << endl << "\nПервый сотрудник под номером " << worker1.number << " Зарплата: " << worker1.money << "\nДолжность: ";
                        switch((char&)worker3.pro)
                        {
                            case 'l': cout << "laborer"    << endl; break;
                            case 's': cout << "secretary"  << endl; break;
                            case 'm': cout << "manager"    << endl; break;
                            case 'a': cout << "accountant" << endl; break;
                            case 'e': cout << "executive"  << endl; break;
                            case 'r': cout << "researcher" << endl; break;
                        }
                        cout << "Дата устройства: " << worker1.d << ch1 << worker1.m << ch1 << worker1.y << endl;
 
                        cout << endl << "Второй сотрудник под номером " << worker2.number << " Зарплата: " << worker2.money << "\nДолжность: ";
                        switch((char&)worker2.pro)
                        {
                            case 'l': cout << "laborer"    << endl; break;
                            case 's': cout << "secretary"  << endl; break;
                            case 'm': cout << "manager"    << endl; break;
                            case 'a': cout << "accountant" << endl; break;
                            case 'e': cout << "executive"  << endl; break;
                            case 'r': cout << "researcher" << endl; break;
                        }
                        cout << "Дата устройства: " << worker2.d << ch1 << worker2.m << ch1 << worker2.y << endl;
 
                        cout << endl << "Третий сотрудник под номером " << worker3.number << " Зарплата: " << worker3.money << "\nДолжность: ";
                        switch((char&)worker3.pro)
                        {
                            case 'l': cout << "laborer"    << endl; break;
                            case 's': cout << "secretary"  << endl; break;
                            case 'm': cout << "manager"    << endl; break;
                            case 'a': cout << "accountant" << endl; break;
                            case 'e': cout << "executive"  << endl; break;
                            case 'r': cout << "researcher" << endl; break;
                        }
                        cout << "Дата устройства: " << worker3.d << ch1 << worker3.m << ch1 << worker3.y << endl; break;
                    }
                    else
                    {
                        cout << "Вы ввели не все данные!"; break;
                    }
                }
            default: cout << "Вы ввели неверное значение!"; break;
        }
        cout << "\n\nПродолжить?(y/n): ";
        cin>> ch; cout << endl;
    }
    while(ch !='n');
 
 return 0;
}
FliXis
31 / 31 / 2
Регистрация: 17.09.2012
Сообщений: 155
03.10.2012, 22:52  [ТС]     Как правильно впихнуть и использовать перечисления в структуре? #7
Дошел до функций и ради эксперимента решил попробовать немного переделать эту прогу.
Хотел заменить блоки с строки 42 по 47, с 52 по 57, с 62 по 67 - функция void diss (employee);
и блоки с строчки 74 по 82, с 86 по 94, с 98 по 106 - функция void disp (employee);
p.s. указанные строчки верны для старого листинга который чуть выше того, что внизу.

сперва делал функцию void disp (employee); Все отлично скомпилилось. Как только добавил функцию void disp (employee); начал жаловаться на неинициализированность переменных worler1, worker2, worker3 в стрчоках 44, 50, 56.

Возникает вопрос: Вся проблема в этом? -

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
struct employee
{
    int number;
    float money;
 
    int d;
    int m;
    int y;
 
    enum etupe { laborer, secretary, manager, accountant, executive, researcher };
    etupe pro;
};
///////////////////////////////////////////////////////////////////////
void diss (employee);
void disp (employee);
Нельзя принимать значения одной структуры двум разным функциям с фактически одними и теми же переменными этой структуры?

Весь код:

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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
// Test_Project.cpp: определяет точку входа для консольного приложения.
//
 
#include "stdafx.h"
#include <iostream>
using namespace std;
 
///////////////////////////////////////////////////////////////////////
struct employee
{
    int number;
    float money;
 
    int d;
    int m;
    int y;
 
    enum etupe { laborer, secretary, manager, accountant, executive, researcher };
    etupe pro;
};
///////////////////////////////////////////////////////////////////////
void diss (employee);
void disp (employee);
 
int main ()
{
    system("chcp 1251 >nul");
 
    char ch='/';
    int ch2, ch3=0, ch4=0, ch5=0;
 
    employee worker1, worker2, worker3;
 
    do
    {
        cout << "Выберите сотрудника(1, 2, 3)\nЛибо введите \"4\" для вывода данных: ";
        cin >> ch2;
 
        switch(ch2)
        {
            case 1:
                {
                    cout << "\nПервый сотрудник.\n";
                    diss(worker1);
                    ch3++; continue;
                }
            case 2:
                {
                    cout << "\nВторой сотрудник.\n";
                    diss(worker2);
                    ch4++; continue;
                }
            case 3:
                {
                    cout << "\nТретий сотрудник.\n";
                    diss(worker3);
                    ch5++; continue;
                }
            case 4: 
                {
                    if(ch3>0 && ch4>0 && ch5>0)
                    {
                        cout << endl << "\nПервый сотрудник под номером " << worker1.number << " Зарплата: " << worker1.money << "\nДолжность: ";
                        disp(worker1);
 
                        cout << endl << "Второй сотрудник под номером " << worker2.number << " Зарплата: " << worker2.money << "\nДолжность: ";
                        disp(worker2);
 
                        cout << endl << "Третий сотрудник под номером " << worker3.number << " Зарплата: " << worker3.money << "\nДолжность: ";
                        disp(worker3); break;
                    }
                    else
                    {
                        cout << "Вы ввели не все данные!"; break;
                    }
                }
            default: cout << "Вы ввели неверное значение!"; break;
        }
        cout << "\n\nПродолжить?(y/n): ";
        cin>> ch; cout << endl;
    }
    while(ch !='n');
 
 return 0;
}
///////////////////////////////////////////////////////////////////////
void diss(employee ddd)
{
    char ch1='/';
    cout << "Введите номер и величину зарплаты: ";
    cin >> ddd.number >> ddd.money;
    cout << "Введите первую букву должности\n(laborer, secretary, manager, accountant, executive, researcher): ";
    cin >> (char&)ddd.pro;
    cout << "Введите дату поступления на работу формата(день/месяц/год): ";
    cin >> ddd.d >> ch1 >> ddd.m >> ch1 >> ddd.y; cout << endl;
}
///////////////////////////////////////////////////////////////////////
void disp(employee dd)
{
switch((char&)dd.pro)
    {
        case 'l': cout << "laborer"    << endl; break;
        case 's': cout << "secretary"  << endl; break;
        case 'm': cout << "manager"    << endl; break;
        case 'a': cout << "accountant" << endl; break;
        case 'e': cout << "executive"  << endl; break;
        case 'r': cout << "researcher" << endl; break;
    }
cout << "Дата устройства: " << dd.d << "/" << dd.m << "/" << dd.y << endl;
}
///////////////////////////////////////////////////////////////////////
igorrr37
 Аватар для igorrr37
1593 / 1221 / 118
Регистрация: 21.12.2010
Сообщений: 1,868
Записей в блоге: 7
03.10.2012, 23:35     Как правильно впихнуть и использовать перечисления в структуре? #8
для инициализации объект надо передавать в ф-цию по ссылке
void diss (employee&);
FliXis
31 / 31 / 2
Регистрация: 17.09.2012
Сообщений: 155
03.10.2012, 23:50  [ТС]     Как правильно впихнуть и использовать перечисления в структуре? #9
Цитата Сообщение от igorrr37 Посмотреть сообщение
для инициализации объект надо передавать в ф-цию по ссылке
void diss (employee&);
Теперь все работает! Благодарю Вас! Только не совсем врубился почему именно. Можно у Вас спросить, почему для void disp (employee); & - не требовалось, а для void diss (employee&); это так было необходимо?

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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
// Test_Project.cpp: определяет точку входа для консольного приложения.
//
 
#include "stdafx.h"
#include <iostream>
using namespace std;
 
///////////////////////////////////////////////////////////////////////
struct employee
{
    int number;
    float money;
 
    int d;
    int m;
    int y;
 
    enum etupe { laborer, secretary, manager, accountant, executive, researcher };
    etupe pro;
};
///////////////////////////////////////////////////////////////////////
void diss (employee&);
void disp (employee);
 
int main ()
{
    system("chcp 1251 >nul");
 
    char ch='/';
    int ch2, ch3=0, ch4=0, ch5=0;
 
    employee worker1, worker2, worker3;
 
    do
    {
        cout << "Выберите сотрудника(1, 2, 3)\nЛибо введите \"4\" для вывода данных: ";
        cin >> ch2;
 
        switch(ch2)
        {
            case 1:
                {
                    cout << "\nПервый сотрудник.\n";
                    diss(worker1);
                    ch3++; continue;
                }
            case 2:
                {
                    cout << "\nВторой сотрудник.\n";
                    diss(worker2);
                    ch4++; continue;
                }
            case 3:
                {
                    cout << "\nТретий сотрудник.\n";
                    diss(worker3);
                    ch5++; continue;
                }
            case 4: 
                {
                    if(ch3>0 && ch4>0 && ch5>0)
                    {
                        cout << endl << "\nПервый сотрудник под номером " << worker1.number << " Зарплата: " << worker1.money << "\nДолжность: ";
                        disp(worker1);
 
                        cout << endl << "Второй сотрудник под номером " << worker2.number << " Зарплата: " << worker2.money << "\nДолжность: ";
                        disp(worker2);
 
                        cout << endl << "Третий сотрудник под номером " << worker3.number << " Зарплата: " << worker3.money << "\nДолжность: ";
                        disp(worker3); break;
                    }
                    else
                    {
                        cout << "Вы ввели не все данные!"; break;
                    }
                }
            default: cout << "Вы ввели неверное значение!"; break;
        }
        cout << "\n\nПродолжить?(y/n): ";
        cin>> ch; cout << endl;
    }
    while(ch !='n');
    system ("pause");
 
 return 0;
}
///////////////////////////////////////////////////////////////////////
void diss(employee& ddd)
{
    char ch1='/';
    cout << "Введите номер и величину зарплаты: ";
    cin >> ddd.number >> ddd.money;
    cout << "Введите первую букву должности\n(laborer, secretary, manager, accountant, executive, researcher): ";
    cin >> (char&)ddd.pro;
    cout << "Введите дату поступления на работу формата(день/месяц/год): ";
    cin >> ddd.d >> ch1 >> ddd.m >> ch1 >> ddd.y; cout << endl;
}
///////////////////////////////////////////////////////////////////////
void disp(employee dd)
{
switch((char&)dd.pro)
    {
        case 'l': cout << "laborer"    << endl; break;
        case 's': cout << "secretary"  << endl; break;
        case 'm': cout << "manager"    << endl; break;
        case 'a': cout << "accountant" << endl; break;
        case 'e': cout << "executive"  << endl; break;
        case 'r': cout << "researcher" << endl; break;
    }
cout << "Дата устройства: " << dd.d << "/" << dd.m << "/" << dd.y << endl;
}
///////////////////////////////////////////////////////////////////////
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.10.2012, 00:12     Как правильно впихнуть и использовать перечисления в структуре?
Еще ссылки по теме:

C++ как правильно использовать map в c++
C++ Как правильно использовать классы? Как вывести значение класса на экран?
Как правильно использовать cin.get? C++

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

Или воспользуйтесь поиском по форуму:
igorrr37
 Аватар для igorrr37
1593 / 1221 / 118
Регистрация: 21.12.2010
Сообщений: 1,868
Записей в блоге: 7
04.10.2012, 00:12     Как правильно впихнуть и использовать перечисления в структуре? #10
при передаче по ссылке в ф-цию попадает сам объект, при передаче по значению - его копия. В ф-цию disp лучше тоже по ссылке передавать чтобы не тратить ресурсы на создание копии.
Yandex
Объявления
04.10.2012, 00:12     Как правильно впихнуть и использовать перечисления в структуре?
Ответ Создать тему
Опции темы

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