С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.52/63: Рейтинг темы: голосов - 63, средняя оценка - 4.52
30 / 24 / 6
Регистрация: 24.11.2020
Сообщений: 214
1

Построить иерархию классов, используя абстрактный класс

31.03.2021, 15:13. Показов 12074. Ответов 59

Author24 — интернет-сервис помощи студентам
Здравствуйте! Помогите разобраться с заданием, честно говоря, я вообще не понимаю, что и как делать...
Задание такое:
Постройте иерархию классов, используя абстрактный класс в
соответствии с вариантом задания. (Рабочий, кадры, инженер, администрация).
Должны быть заданы названия базовых и производных классов. Необходимо
разработать поля и методы, наследуемые из базового класса, и собственные
компоненты производных классов. При выполнении работы следует разработать
возможность выбирать соответствующий класс, просматривать его содержимое,
заносить, изменять и удалять данные этого класса.

Нашла вот такой код, пыталась хоть как-то вникнуть в тему классов... Пробовала сделать меню, для выбора хотя бы, но не знаю, как реализовать этот самый вывод:
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
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
#include <iostream>
#include <conio.h>
#include <string>
#include <Windows.h>
 
using namespace std;
 
class Publication {
protected:
    string name;
 
public:
    static Publication* begin;
    Publication* next;
 
    static void add(Publication* cur) {
        cur->next = begin;
        begin = cur;
    }
 
    Publication() {
        add(this);
    }
 
    virtual void show() {
        cout << "Name: " << name << endl;
        cout << "----------------------------" << endl;
    }
 
    virtual void set_parameters() {
        string s;
 
        cout << "Name: ";
        cin >> s;
 
        name = s;
    }
 
    virtual void print() {
        Publication* l = begin;
 
        while (l) {
            l->show();
            l = l->next;
        }
    }
};
 
Publication* Publication::begin;
 
class Book : public Publication {
protected:
    int pages;
    string author;
 
public:
    Book() :Publication() {}
 
    void show() {
        cout << "Name: " << name << endl;
        cout << "Pages: " << pages << endl;
        cout << "Author: " << author << endl;
        cout << "----------------------------" << endl;
    }
 
    void set_parameters() {
        int k;
        string s, a;
 
        cout << "Name: ";
        cin >> s;
 
        cout << "Author: ";
        cin >> a;
 
        cout << "Pages: ";
        cin >> k;
 
        name = s;
        author = s;
        pages = k;
    }
 
};
 
class Magazine : public Publication {
protected:
    int pages;
    int mon;
    int year;
 
public:
    Magazine() :Publication() {}
 
    void show() {
        cout << "Name: " << name << endl;
        cout << "Pages: " << pages << endl;
        cout << "Data: " << mon << "." << year << endl;
        cout << "----------------------------" << endl;
    }
 
    void set_parameters() {
        int n, m, y;
        string s;
 
        cout << "Name: ";
        cin >> s;
 
        cout << "Pages: ";
        cin >> n;
 
        cout << "Month: ";
        cin >> m;
 
        cout << "Year: ";
        cin >> y;
 
        name = s;
        pages = n;
        year = y;
        mon = m;
    }
};
 
class Textbook : public Publication {
public:
    Textbook() :Publication() {}
};
 
int main() 
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
 
    Publication::begin = 0;
    Publication publication;
    Book book;
    Magazine magazine;
    Textbook textbook;
 
    cout << "Publication" << endl;
    publication.set_parameters();
 
    cout << "Book" << endl;
    book.set_parameters();
 
    cout << "Magazine" << endl;
    magazine.set_parameters();
 
    cout << "Textbook" << endl;
    textbook.set_parameters();
 
    cout << "============================" << endl;
    cout << "All PUBLICATION" << endl;
    cout << "============================" << endl;
 
    publication.print();
 
    _getch();
    return 0;
}
Добавлено через 16 минут
Немного отредактировала, чтобы было удобнее
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
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
#include <iostream>
#include <conio.h>
#include <string>
#include <Windows.h>
 
using namespace std;
 
class Kadry {
protected:
    string name;
 
public:
    static Kadry* begin;
    Kadry* next;
 
    static void add(Kadry* cur) {
        cur->next = begin;
        begin = cur;
    }
 
    Kadry() {
        add(this);
    }
 
    virtual void show() {
        cout << "Имя: " << name << endl;
        cout << "----------------------------" << endl;
    }
 
    virtual void set_parameters() {
        string s;
 
        cout << "Имя: ";
        cin >> s;
 
        name = s;
    }
 
    virtual void print() {
        Kadry* l = begin;
 
        while (l) {
            l->show();
            l = l->next;
        }
    }
};
 
Kadry* Kadry::begin;
 
class Admin : public Kadry {
protected:
    int age;
    string familiya;
 
public:
    Admin() :Kadry() {}
 
    void show() {
        cout << "Имя: " << name << endl;
        cout << "Возраст: " << age << endl;
        cout << "Фамилия: " << familiya << endl;
        cout << "----------------------------" << endl;
    }
 
    void set_parameters() {
        int k;
        string s, a;
 
        cout << "Имя: ";
        cin >> s;
 
        cout << "Фамилия: ";
        cin >> a;
 
        cout << "Возраст: ";
        cin >> k;
 
        name = s;
        familiya = a;
        age = k;
    }
 
};
 
class Rabochii : public Kadry {
protected:
    int age;
    int mon;
    int year;
 
public:
    Rabochii() :Kadry() {}
 
    void show() {
        cout << "Имя: " << name << endl;
        cout << "Возраст: " << age << endl;
        cout << "Месяц и год рождения: " << mon << "." << year << endl;
        cout << "----------------------------" << endl;
    }
 
    void set_parameters() {
        int n, m, y;
        string s;
 
        cout << "Имя: ";
        cin >> s;
 
        cout << "Возраст: ";
        cin >> n;
 
        cout << "Месяц: ";
        cin >> m;
 
        cout << "Год: ";
        cin >> y;
 
        name = s;
        age = n;
        year = y;
        mon = m;
    }
};
 
class Injener : public Kadry {
public:
    Injener() :Kadry() {}
};
 
int main() 
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
 
    Kadry::begin = 0;
    Kadry Kadry;
    Admin Admin;
    Rabochii Rabochii;
    Injener Injener;
 
    cout << "Кадры: " << endl;
    Kadry.set_parameters();
 
    cout << "Администрация: " << endl;
    Admin.set_parameters();
 
    cout << "Рабочие: " << endl;
    Rabochii.set_parameters();
 
    cout << "Инженеры: " << endl;
    Injener.set_parameters();
 
    cout << "============================" << endl;
    cout << "Вывод Информации!" << endl;
    cout << "============================" << endl;
 
    Kadry.print();
 
    _getch();
    return 0;
}
Добавлено через 6 минут
Например, чтобы реализовать меню, я могу так сделать?
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
int menu();
 
while (1)
    {
        switch (menu())
        {
        case 1:
//////
            break;
        case 2:
//////
            break;
        case 3:
////////
            break;
        case 4:
      /////////
            break;
        case 5:
            exit(0);
            break;
        case 6:
            system("cls");
            break;
        default:
            cout << "Неверный выбор!\n";
        }
    }
 
int menu()
{
    int vvod;
    cout << "1 - ///;\n";
    cout << "2 - ///;\n";
    cout << "3 - ///;\n";
    cout << "4 - ///;\n";
    cout << "5 - выход;\n";
    cout << "6 - очистить экран;\n\n";
    cout << "Выберите действие: "; cin >> vvod;
    cout << "\n";
    return vvod;
}
Если да, то как?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
31.03.2021, 15:13
Ответы с готовыми решениями:

Создать иерархию классов: абстрактный базовый класс Array и производные классы AndArray и OnArray
Помогите написать программу, спасибо!!! Создать абстрактный базовый класс Array с виртуальными...

Создать абстрактный базовый класс объектов на декартовой плоскости CShape и разработать иерархию классов конкретных фигур
Создать абстрактный базовый класс объектов на декартовой плоскости CShape (фигура). ...

Создать иерархию классов Шахматная фигура – абстрактный класс, содержащий поле – цвет. Создать производные классы
Создать иерархию классов Шахматная фигура – абстрактный класс, содержащий поле – цвет. Создать...

Построить иерархию классов
Построить иерархию классов. Корень иерархии - абстрактный класс с указанными в условии задачи...

59
6770 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
02.04.2021, 20:33 41
Author24 — интернет-сервис помощи студентам
Цитата Сообщение от ANGELin04ka Посмотреть сообщение
oleg-m1973, Ну, со структурами было чуть понятнее, что через точку мы обращались, а как тут программа будет определять, к какому классу относится введённая информация?
Виртуальный метод
1
373 / 316 / 65
Регистрация: 14.10.2014
Сообщений: 1,341
02.04.2021, 20:34 42
Цитата Сообщение от ANGELin04ka Посмотреть сообщение
к какому классу относится введённая информация
ооОО - это есть магия полиморфизма
1
6770 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
02.04.2021, 20:38 43
Цитата Сообщение от ANGELin04ka Посмотреть сообщение
осталось добавить изменение и удаление записей введённых
C++
1
2
3
4
5
6
7
8
case 5: //Изменить информацию о существующем сотруднике
    {
        size_t i;
        std::cin >> i;
        if (i < n)
            employees[i]->SetParam();
    }
    break;
1
30 / 24 / 6
Регистрация: 24.11.2020
Сообщений: 214
02.04.2021, 20:44  [ТС] 44
oleg-m1973, А для удаления можно так сделать?
C++
1
2
3
4
5
6
7
8
9
10
            size_t d;
            cin >> d;
            if (d < n)
            {
                for (int i = (d - 1); i < n; i++)
                {
                    employees[i] = employees[i + 1];
                    n = n - 1;
                }
            }
0
6770 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
02.04.2021, 20:48 45
Лучший ответ Сообщение было отмечено ANGELin04ka как решение

Решение

Цитата Сообщение от ANGELin04ka Посмотреть сообщение
oleg-m1973, А для удаления можно так сделать?
C++
1
2
3
4
5
6
7
8
9
size_t d;
cin >> d;
if (d < n)
{
    delete employees[d];
    for (size_t i = d + 1; i < n; i++)
        employees[i - 1] = employees[i];
    --n;
}
1
373 / 316 / 65
Регистрация: 14.10.2014
Сообщений: 1,341
02.04.2021, 20:52 46
ух, что-то у меня к вечеру мозги уже совсем плохо соображают - но ничего, собрал волю в кулак, напряг извилины (те, которые ещё не совсем надорвались и могут ещё соображать ), обмозговал и в общем:

ANGELin04ka, обрати внимание на пост №20 и пост №32

в двадцатом посте oleg-m1973, показал тебе что должно быть в функции main. Если конкретно - то там создаются указатели на объекты Employee . Ты же ещё создаёшь другие объекты
C++
1
2
3
    Admin admin;        //
    Worker worker;      //Создаём
    Engineer engineer;  //
А в данном месте этого делать не надо. Их нужно создавать из указателей Employee в зависимости от контекста, кто нужен в данный момент.

Ну а в 32 посте упоминание о том, что динамическую память нужно возвращать системе.
1
30 / 24 / 6
Регистрация: 24.11.2020
Сообщений: 214
02.04.2021, 20:55  [ТС] 47
Спасибо всем вам за помощь, без вас бы не справилась, как же тяжело даётся программирование, а как классы пошли, вообще тьма какая-то, извините, что так вам всем надоела
0
373 / 316 / 65
Регистрация: 14.10.2014
Сообщений: 1,341
02.04.2021, 21:03 48
Цитата Сообщение от ANGELin04ka Посмотреть сообщение
вообще тьма какая-то
советую книгу скачать, например эту: Стенли Б. Липпман, Жози Лажойе, Барбара Э. Му - Язык программирования C++. Базовый курс - 2014 (может уже более поздние выпуски есть). Сам я её не читал, потому как читал Лафоре, но творение Липмана лучше - даже сейчас думаю её просмотреть, потому как узнаю новые вещи, которые до этого не знал.

Цитата Сообщение от ANGELin04ka Посмотреть сообщение
так вам всем надоела
Ну не знаю - для меня лично это очередная тренировка мозгов и способ не забыть имеющиеся знания, а то когда изо дня в день делаешь одно и тоже - про остальное забываешь.
0
30 / 24 / 6
Регистрация: 24.11.2020
Сообщений: 214
02.04.2021, 21:07  [ТС] 49
Recrut_rf, Да, я начала её читать, но я только дошла до указателей, констант и псевдонимов типа
0
373 / 316 / 65
Регистрация: 14.10.2014
Сообщений: 1,341
02.04.2021, 21:17 50
ANGELin04ka, молодец . Прочитай главы 7 и 15 - тебе более менее станет понятно, что от тебя требуется в задании (остальные пока пропусти)
1
30 / 24 / 6
Регистрация: 24.11.2020
Сообщений: 214
03.04.2021, 11:47  [ТС] 51
oleg-m1973, Сейчас заметила странную особенность, что, если, допустим, мы ввели 2 админа, рабочего и инженера (4 элемента, неважно каких), то при удалении, например, 0 элемента, должен удалиться только первый администратор, а удаляется ещё и последний введённый, т.е. 3 элемент, а если удалить 1 или 2, то ошибка вылазит и какую-то запись просто дублирует
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
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
#include <iostream>
#include <conio.h>
#include <string>
#include <vector>
#include <Windows.h>
 
using namespace std;
 
class Employee { //Абстрактный базовый класс кадры
protected:
    string firstname; //Поле, в котором будет храниться имя
    string secondname;//Поле, в котором будет храниться фамилия
    string sex;//Поле, в котором будет храниться пол
    int age;//Поле, в котором будет храниться возраст
public:
    virtual ~Employee() = default;
    virtual void SetParam() = 0;
    virtual void Show() = 0;
};
 
class Admin : public Employee {//Класс Администрация
protected:
    string otdel;//Поле, задающее, какой отдел
    string street;//Поле, задающее улицу
    string town;//Поле, задающее город
public:
 
    void SetParam()//Метод, в котором мы заполняем поля
    {
        string otd, ylica, gorod;
        string imya, familiya, pol;
        int vozrast;
 
        cout << "Введите имя: ";
        cin >> imya;
        firstname = imya;
 
        cout << "Введите фамилию: ";
        cin >> familiya;
        secondname = familiya;
 
        cout << "Введите пол: ";
        cin >> pol;
        sex = pol;
 
        cout << "Введите возраст: ";
        cin >> vozrast;
        age = vozrast;
 
        cout << "Введите отдел администрации: ";
        cin >> otd;
        otdel = otd;
 
        cout << "Введите улицу администрации: ";
        cin >> ylica;
        street = ylica;
 
        cout << "Введите город администрации: ";
        cin >> gorod;
        town = gorod;
    }
    void Show()//Метод вывода информации на экран
    {
        cout << "Администрация: " << endl << endl;
        cout << "Имя администратора: " << firstname << endl;
        cout << "Фамилия администратора: " << secondname << endl;
        cout << "Пол администратора: " << sex << endl;
        cout << "Возраст администратора: " << age << endl;
        cout << "Отдел администрации: " << otdel << endl;
        cout << "Улица администрации: " << street << endl;
        cout << "Город администрации: " << town << endl;
    }
 
    virtual ~Admin() {}//Виртуальный деструктор
};
 
class Worker : public Employee {//Класс рабочий наследник класса кадры
protected:
    string specialnost;
public:
 
    void SetParam()
    {
        string spec;
        string imya, familiya, pol;
        int vozrast;
 
        cout << "Введите имя: ";
        cin >> imya;
        firstname = imya;
 
        cout << "Введите фамилию: ";
        cin >> familiya;
        secondname = familiya;
 
        cout << "Введите пол: ";
        cin >> pol;
        sex = pol;
 
        cout << "Введите возраст: ";
        cin >> vozrast;
        age = vozrast;
 
        cout << "Введите специальность рабочего: ";
        cin >> spec;
        specialnost = spec;
    }
    void Show()
    {
        cout << "Рабочие: " << endl << endl;
        cout << "Имя рабочего: " << firstname << endl;
        cout << "Фамилия рабочего: " << secondname << endl;
        cout << "Пол рабочего: " << sex << endl;
        cout << "Возраст рабочего: " << age << endl;
        cout << "Специальность рабочего: " << specialnost << endl;
    }
 
    virtual ~Worker() {}
};
 
class Engineer : public Employee {//Класс Инженер наследник класса кадры
protected:
    int rank;
    string oblast;//Поля, задающие разряд инженера и область его работы
public:
 
    void SetParam()
    {
        int razryad;
        string obl;
        string imya, familiya, pol;
        int vozrast;
 
        cout << "Введите имя: ";
        cin >> imya;
        firstname = imya;
 
        cout << "Введите фамилию: ";
        cin >> familiya;
        secondname = familiya;
 
        cout << "Введите пол: ";
        cin >> pol;
        sex = pol;
 
        cout << "Введите возраст: ";
        cin >> vozrast;
        age = vozrast;
 
        cout << "Введите разряд иженера(1-5): ";
        cin >> razryad;
        rank = razryad;
 
        cout << "Введите область работы иженера: ";
        cin >> obl;
        oblast = obl;
    }
    void Show()
    {
        cout << "Инженеры: " << endl << endl;
        cout << "Имя инженера: " << firstname << endl;
        cout << "Фамилия инженера: " << secondname << endl;
        cout << "Пол инженера: " << sex << endl;
        cout << "Возраст инженера: " << age << endl;
        cout << "Разряд инженера: " << rank << endl;
        cout << "Область работы иженера: " << oblast << endl;
    }
 
    virtual ~Engineer() {}
};
 
int main()
{
    SetConsoleCP(1251);         //Кодировка
    SetConsoleOutputCP(1251);   //Консоли
 
    const size_t N = 100;
    Employee* employees[N];
    size_t n = 0;
 
    size_t n2 = 0;
 
    for (;;)//Бесконечный цикл для меню
    {
        system("cls");
        cout << "1: Приступить к новому вводу!" << endl;
        cout << "2: Добавить нового администратора" << endl;
        cout << "3: Добавить нового рабочего" << endl;
        cout << "4: Добавить нового инженера" << endl;
        cout << "5: Изменить информацию о существующем сотруднике" << endl;
        cout << "6: Удалить информацию о существующем сотруднике" << endl;
        cout << "7: Вывести всю информацию на экран" << endl;
        cout << "0: Выход" << endl << endl;
 
        int choise;
 
        cout << "Выберите действие: ";
        cin >> choise;//Переменная для выбора пункта меню
        if (choise == 0)
            break;
 
        switch (choise)//Выборы меню
        {
        case 1://Дефолтный новый ввод
            cout << "Введите число администраторов: "; cin >> n2;
 
            for (size_t i = 0; i < n2 && n < N; i++)
            {
                cout << "Ввод параметров " << i + 1 << " администратора: " << endl << endl;
                auto* p = new Admin();
                p->SetParam();
                employees[n++] = p;
                cout << endl;
            }
 
            cout << "Введите число рабочих: "; cin >> n2;
 
            for (size_t i = 0; i < n2 && n < N; i++)
            {
                cout << "Ввод параметров  " << i + 1 << " рабочего: " << endl;
                auto* p = new Worker();
                p->SetParam();
                employees[n++] = p;
                cout << endl;
            }
 
            cout << "Введите число инженеров: "; cin >> n2;
 
            for (size_t i = 0; i < n2 && n < N; i++)
            {
                cout << "Ввод параметров " << i + 1 << " инженера: " << endl;
                auto* p = new Engineer();
                p->SetParam();
                employees[n++] = p;
                cout << endl;
            }
            break;
        case 2://Добавление нового администратора
            if (n < N)
            {
                cout << "Введите параметры нового администратора: " << endl << endl;
                auto* p = new Admin();
                p->SetParam();
                employees[n++] = p;
                cout << endl;
            }
            break;
        case 3://Добавление нового рабочего
            if (n < N)
            {
                cout << "Введите параметры нового рабочего: " << endl << endl;
                auto* p = new Worker();
                p->SetParam();
                employees[n++] = p;
                cout << endl;
            }
            break;
        case 4://Добавление нового инженера
            if (n < N)
            {
                cout << "Введите параметры нового инженера: " << endl << endl;
                auto* p = new Engineer();
                p->SetParam();
                employees[n++] = p;
                cout << endl;
            }
            break;
        case 5://Изменение информации о существующем сотруднике
        {
            size_t i;
            cout << "Введите номер записи, которую нужно изменить (нумерация записей начинается с 0): ";
            cin >> i;
            if (i < n)
            {
                employees[i]->SetParam();
            }
        }
        break;
        case 6://Удаление информации о существующем сотруднике
            size_t d;
            cout << "Введите номер записи, которую нужно удалить (нумерация записей начинается с 0): ";
            cin >> d;
            if (d < n)
            {
                delete employees[d];
 
                for (size_t i = d + 1; i < n; i++)
                {
                    employees[i - 1] = employees[i];
                    --n;
                }
            }
            break;
        case 7://Вывод всей введённой информации на экран
            cout << "Информация о кадрах: " << endl << endl;
            for (size_t i = 0; i < n; i++)
            {
                employees[i]->Show();
                cout << endl;
            }
            break;
        }
 
        cout << "Выберите действие: " << endl;
        _getch();
    }
 
    system("pause");
    return 0;
}
0
6770 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
03.04.2021, 11:50 52
Цитата Сообщение от ANGELin04ka Посмотреть сообщение
то при удалении, например, 0 элемента, должен удалиться только первый администратор, а удаляется ещё и последний введённый, т.е. 3 элемент, а если удалить 1 или 2, то ошибка вылазит и какую-то запись просто дублирует
Я ошибся
C++
1
2
3
4
5
6
7
8
delete employees[d];
 for (size_t i = d + 1; i < n; i++)
                {
                    employees[i - 1] = employees[i];
                    //--n;
                }
 
--n;
1
30 / 24 / 6
Регистрация: 24.11.2020
Сообщений: 214
03.04.2021, 11:52  [ТС] 53
oleg-m1973, Я тоже нашла, поменяла, сейчас всё работает, спасибо, а можно сделать так, чтобы при изменении какой-либо записи, мне не нужно было писать новую запись на место старой, а, допустим, только изменить поле с именем или фамилией?
0
6770 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
03.04.2021, 11:55 54
Цитата Сообщение от ANGELin04ka Посмотреть сообщение
oleg-m1973, Я тоже нашла, поменяла, сейчас всё работает, спасибо, а можно сделать так, чтобы при изменении какой-либо записи, мне не нужно было писать новую запись на место старой, а, допустим, только изменить поле с именем или фамилией?
Добавь в класс Employee ещё один виртуальный метод (например ChangeParam), реализуй его в наследниках, и вызывай при изменении вместо SetParam
1
30 / 24 / 6
Регистрация: 24.11.2020
Сообщений: 214
03.04.2021, 11:56  [ТС] 55
oleg-m1973, А добавить тоже чисты виртуальный?
C++
1
virtual void ChangeParam() = 0
0
6770 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
03.04.2021, 11:59 56
Цитата Сообщение от ANGELin04ka Посмотреть сообщение
oleg-m1973, А добавить тоже чисты виртуальный?
Да, можно так

Добавлено через 2 минуты
Цитата Сообщение от ANGELin04ka Посмотреть сообщение
oleg-m1973, Я тоже нашла, поменяла, сейчас всё работает, спасибо,
Кстати, это не я ошибся. Это ты зачем-то добавила фигурные скобки, да ещё неправильно
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
if (d < n)
{
    delete employees[d];
    for (size_t i = d + 1; i < n; i++)
        employees[i - 1] = employees[i];
    --n;
}
1
30 / 24 / 6
Регистрация: 24.11.2020
Сообщений: 214
03.04.2021, 12:24  [ТС] 57
oleg-m1973, Да, я поняла свой косяк, заметила уже после того, как к вам обратилась. У меня получилось сделать изменение каждого поля, спасибо за наводку, всё отлично работает

Добавлено через 1 минуту
oleg-m1973, А ничего, что в кейсе 6 при удалении подчёркивает смещение элементов и пишет, что переполнение буфера? Предупреждение
0
30 / 24 / 6
Регистрация: 24.11.2020
Сообщений: 214
23.04.2021, 20:47  [ТС] 58
oleg-m1973, В общем-то, я сделала, но неправильно, поля, которые в наследниках выводятся нормально, а поля, которые в абстрактном классе выводятся мусором, где косяк не могу понять
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
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
#include <iostream>
#include <Windows.h>
#include <string>
#include <conio.h>
 
using namespace std;
 
class Vehicle
{
protected:
    double avgspeed;
    string model;
    int countpassanger;
public:
    Vehicle(string& v_model, double& v_avgspeed, int& v_countpassanger) : model(v_model), avgspeed(v_avgspeed), countpassanger(v_countpassanger) {}
 
    virtual void PotreblenieToplivaandTime() = 0;
    virtual void Show() = 0;
    virtual ~Vehicle() {};
};
 
class Bycicle : public Vehicle
{
protected:
    string colorsits;
    int razmercepi;
    string velotype;
public:
    Bycicle(string& v_model, double& v_avgspeed, int& v_countpassanger, string &v_colorsits, int &v_razmercepi, string &v_velotype) : Vehicle(model, avgspeed, countpassanger), colorsits(v_colorsits), razmercepi(v_razmercepi), velotype(v_velotype) {}
    void PotreblenieToplivaandTime()
    {
        double potreb; unsigned int rasst, skorost; double preobrrasst, time;
        cout << "Vvedite potreblenie topliva na 100km: ";
        cin >> potreb;
        potreb = potreb / 100;
        cout << endl;
 
        cout << "Vvedite vashu skorost: ";
        cin >> skorost;
        cout << endl;
 
        cout << "Vvedite neobhodimoe rasstoyanie: ";
        cin >> rasst;
        cout << endl;
 
        preobrrasst = potreb * rasst;
        cout << "Potreblenie na rasstoyanie " << rasst << ": " << preobrrasst << endl;
 
        time = skorost / rasst;
        cout << "Vremya na zadannoe rasstoyanie: " << time << " ч" << endl;
    }
    void Show()
    {
        cout << "Велосипеды: " << endl;
        cout << "Модель: " << model << endl;
        cout << "Средняя скорость: " << avgspeed << endl;
        cout << "Число пассажиров: " << countpassanger << endl;
        cout << "Размер цепи: " << razmercepi << endl;
        cout << "Цвет сидения: " << colorsits << endl;
        cout << "Тип велосипеда: " << velotype << endl;
    }
    virtual ~Bycicle() {};
};
 
class Car : public Vehicle
{
protected:
    double VEngine;
    int losil;
public:
    Car(string& v_model, double& v_avgspeed, int& v_countpassanger, double &v_VEngine, int &v_losil) : Vehicle(model, avgspeed, countpassanger), VEngine(v_VEngine), losil(v_losil) {}
    void PotreblenieToplivaandTime()
    {
        double potreb; unsigned int rasst, skorost; double preobrrasst, time;
        cout << "Vvedite potreblenie topliva na 100km: ";
        cin >> potreb;
        potreb = potreb / 100;
        cout << endl;
 
        cout << "Vvedite vashu skorost: ";
        cin >> skorost;
        cout << endl;
 
        cout << "Vvedite neobhodimoe rasstoyanie: ";
        cin >> rasst;
        cout << endl;
 
        preobrrasst = potreb * rasst;
        cout << "Potreblenie na rasstoyanie " << rasst << ": " << preobrrasst << endl;
 
        time = skorost / rasst;
        cout << "Vremya na zadannoe rasstoyanie: " << time << " ч" << endl;
    }
    void Show()
    {
        cout << "Автомобили: " << endl;
        cout << "Модель: " << model << endl;
        cout << "Средняя скорость: " << avgspeed << endl;
        cout << "Число пассажиров: " << countpassanger << endl;
        cout << "Объём двигателя: " << VEngine << endl;
        cout << "Лошадиных сил: " << losil << endl;
    }
    virtual ~Car() {}
};
 
class Truck : public Vehicle
{
protected:
    double MaxWeight;
    string kuzow;
    string naznachenie;
public:
 
    Truck(const string& v_model, double& v_avgspeed, int& v_countpassanger, double& v_MaxWeight, string& v_kuzow, string &v_naznachenie) : Vehicle(model, avgspeed, countpassanger), MaxWeight(v_MaxWeight), kuzow(v_kuzow), naznachenie(v_naznachenie) {}
    void PotreblenieToplivaandTime()
    {
        double potreb; unsigned int rasst, skorost; double preobrrasst, time;
        cout << "Vvedite potreblenie topliva na 100km: ";
        cin >> potreb;
        potreb = potreb / 100;
        cout << endl;
 
        cout << "Vvedite vashu skorost: ";
        cin >> skorost;
        cout << endl;
 
        cout << "Vvedite neobhodimoe rasstoyanie: ";
        cin >> rasst;
        cout << endl;
 
        preobrrasst = potreb * rasst;
        cout << "Potreblenie na rasstoyanie " << rasst << ": " << preobrrasst << endl;
 
        time = skorost / rasst;
        cout << "Vremya na zadannoe rasstoyanie: " << time << " ч" << endl;
    }
    void Show()
    {
        cout << "Грузовики: " << endl;
        cout << "Модель: " << model << endl;
        cout << "Средняя скорость: " << avgspeed << endl;
        cout << "Число пассажиров: " << countpassanger << endl;
        cout << "Максимальный подъёмный вес: " << MaxWeight << endl;
        cout << "Тип кузова: " << kuzow << endl;
        cout << "Назначение: " << naznachenie << endl;
    }
    virtual ~Truck() {}
};
 
int main()
{
    SetConsoleCP(1251);         //Кодировка
    SetConsoleOutputCP(1251);   //Консоли
 
    string model, colorsits, velotype, kuzow, naznachenie;
    double avgspeed, VEngine, MaxWeight;
    int countpassanger, razmercepi, losil;
 
    const size_t N = 100;
    Vehicle* machine[N];
    size_t n = 0;
 
    size_t n2 = 0;
 
    for (;;)//Бесконечный цикл для меню
    {
        system("cls");
        cout << "1: Приступить к новому вводу!" << endl;
        cout << "2: Добавить новый велосипед" << endl;
        cout << "3: Добавить новый автомобиль" << endl;
        cout << "4: Добавить новый грузовик" << endl;
        cout << "5: Изменить информацию о существующем транспорте" << endl;
        cout << "6: Удалить информацию о существующем транспорте" << endl;
        cout << "7: Вывести всю информацию на экран" << endl;
        cout << "0: Выход" << endl << endl;
 
        int choise;
 
        cout << "Выберите действие: ";
        cin >> choise;//Переменная для выбора пункта меню
        if (choise == 0)
            break;
 
        switch (choise)//Выборы меню
        {
        case 1://Дефолтный новый ввод
 
            cout << "Введите число велосипедов: "; cin >> n2;
 
            for (size_t i = 0; i < n2 && n < N; i++)
            {
                cout << "Ввод параметров  " << i + 1 << " велосипеда: " << endl;
 
                cout << "model: ";
                cin >> model;
                cout << endl;
 
                cout << "sr skorost: ";
                cin >> avgspeed;
                cout << endl;
 
                cout << "passanger: ";
                cin >> countpassanger;
                cout << endl;
 
                cout << "colorsits: ";
                cin >> colorsits;
                cout << endl;
 
                cout << "razmer cepi: ";
                cin >> razmercepi;
                cout << endl;
 
                cout << "tip velika: ";
                cin >> velotype;
                cout << endl;
                auto* p = new Bycicle(model, avgspeed, countpassanger, colorsits, razmercepi, velotype);
                machine[n++] = p;
                cout << endl;
            }
 
            cout << "Введите число автомобилей: "; cin >> n2;
 
            for (size_t i = 0; i < n2 && n < N; i++)
            {
                cout << "Ввод параметров  " << i + 1 << " автомобиля: " << endl;
 
                cout << "model: ";
                cin >> model;
                cout << endl;
 
                cout << "sr skorost: ";
                cin >> avgspeed;
                cout << endl;
 
                cout << "passanger: ";
                cin >> countpassanger;
                cout << endl;
 
                cout << "ob dvig: ";
                cin >> VEngine;
                cout << endl;
 
                cout << "loshad sil: ";
                cin >> losil;
                cout << endl;
                auto* p = new Car(model, avgspeed, countpassanger, VEngine, losil);
                machine[n++] = p;
                cout << endl;
            }
 
            cout << "Введите число грузовиков: "; cin >> n2;
 
            for (size_t i = 0; i < n2 && n < N; i++)
            {
                cout << "Ввод параметров " << i + 1 << " грузовика: " << endl;
 
                cout << "model: ";
                cin >> model;
                cout << endl;
 
                cout << "sr skorost: ";
                cin >> avgspeed;
                cout << endl;
 
                cout << "passanger: ";
                cin >> countpassanger;
                cout << endl;
 
                cout << "max ves: ";
                cin >> MaxWeight;
                cout << endl;
 
                cout << "vid kuzova: ";
                cin >> kuzow;
                cout << endl;
 
                cout << "naznachenie: ";
                cin >> naznachenie;
                cout << endl;
                auto* p = new Truck(model, avgspeed, countpassanger, MaxWeight, kuzow, naznachenie);
                machine[n++] = p;
                cout << endl;
            }
            break;
        case 2://Добавление нового велосипеда
            if (n < N)
            {
                cout << "Введите параметры нового автомобиля: " << endl << endl;
                cout << "model: ";
                cin >> model;
                cout << endl;
 
                cout << "sr skorost: ";
                cin >> avgspeed;
                cout << endl;
 
                cout << "passanger: ";
                cin >> countpassanger;
                cout << endl;
 
                cout << "colorsits: ";
                cin >> colorsits;
                cout << endl;
 
                cout << "razmer cepi: ";
                cin >> razmercepi;
                cout << endl;
 
                cout << "tip velika: ";
                cin >> velotype;
                cout << endl;
                auto* p = new Bycicle(model, avgspeed, countpassanger, colorsits, razmercepi, velotype);
                machine[n++] = p;
                cout << endl;
            }
            break;
        case 3://Добавление нового авто
            if (n < N)
            {
                cout << "Введите параметры нового автомобиля: " << endl << endl;
 
                cout << "model: ";
                cin >> model;
                cout << endl;
 
                cout << "sr skorost: ";
                cin >> avgspeed;
                cout << endl;
 
                cout << "passanger: ";
                cin >> countpassanger;
                cout << endl;
 
                cout << "ob dvig: ";
                cin >> VEngine;
                cout << endl;
 
                cout << "loshad sil: ";
                cin >> losil;
                cout << endl;
                auto* p = new Car(model, avgspeed, countpassanger, VEngine, losil);
                machine[n++] = p;
                cout << endl;
            }
            break;
        case 4://Добавление нового грузовика
            if (n < N)
            {
                cout << "Введите параметры нового грузовика: " << endl << endl;
                
                cout << "model: ";
                cin >> model;
                cout << endl;
 
                cout << "sr skorost: ";
                cin >> avgspeed;
                cout << endl;
 
                cout << "passanger: ";
                cin >> countpassanger;
                cout << endl;
 
                cout << "max ves: ";
                cin >> MaxWeight;
                cout << endl;
 
                cout << "vid kuzova: ";
                cin >> kuzow;
                cout << endl;
 
                cout << "naznachenie: ";
                cin >> naznachenie;
                cout << endl;
                auto* p = new Truck(model, avgspeed, countpassanger, MaxWeight, kuzow, naznachenie);
                machine[n++] = p;
                cout << endl;
            }
            break;
        /*case 5://Изменение информации о существующем транспорте
        {
            size_t i;
            cout << "Введите номер записи, которую нужно изменить (нумерация записей начинается с 0): ";
            cin >> i;
            if (i < n)
            {
                machine[i]->ChangeParam();
            }
        }
        break; */
        case 6://Удаление информации о существующем транспорте
            size_t d;
            cout << "Введите номер записи, которую нужно удалить (нумерация записей начинается с 0): ";
            cin >> d;
            if (d < n)
            {
                delete machine[d];
 
                for (size_t i = d + 1; i < n; i++)
                {
                    machine[i - 1] = machine[i];
                }
                --n;
            }
            break;
        case 7://Вывод всей введённой информации на экран
            cout << "Информация о средствах передвижения: " << endl << endl;
            for (size_t i = 0; i < n; i++)
            {
                machine[i]->Show();
                cout << endl;
            }
            break;
        }
 
        cout << "Выберите действие: " << endl;
        _getch();
    }
 
    system("pause");
    return 0;
}
0
6770 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
23.04.2021, 21:22 59
Цитата Сообщение от ANGELin04ka Посмотреть сообщение
oleg-m1973, В общем-то, я сделала, но неправильно, поля, которые в наследниках выводятся нормально, а поля, которые в абстрактном классе выводятся мусором, где косяк не могу понять
Цитата Сообщение от ANGELin04ka Посмотреть сообщение
Bycicle(string& v_model, double& v_avgspeed, int& v_countpassanger, string &v_colorsits, int &v_razmercepi, string &v_velotype) : Vehicle(model, avgspeed, countpassanger),
Vehicle(v_model, v_avgspeed, v_countpassanger)
Здесь и везде

Добавлено через 1 минуту
И ссылки убери, везде, во всех классах
C++
1
Bycicle(const string& v_model, double v_avgspeed, int v_countpassanger, const string &v_colorsits, int v_razmercepi, const string &v_velotype)
1
30 / 24 / 6
Регистрация: 24.11.2020
Сообщений: 214
23.04.2021, 23:41  [ТС] 60
oleg-m1973, Поняла, спасибо
0
23.04.2021, 23:41
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.04.2021, 23:41
Помогаю со студенческими работами здесь

Реализовать иерархию классов, используя виртуальные функции
Здравствуйте! Хочется убедиться, что я правильно поняла задание. Буду благодарна за...

Построить иерархию классов: Аптека, Магазин, Гастроном
:hysteric:Практическое задание &quot;Наследование&quot; Построить иерархию классов: Аптека, Магазин,...

Построить иерархию классов точка, отрезок, треугольник
Добрый день, пожалуйста, помогите. Нужно Построить иерархию классов: точка, отрезок, треугольник с...

Абстрактный класс,массив классов,наследование
Доброго времени суток,нужна помощь в решении вот такой задачки: 1)Создать абстрактный класс...

Построить иерархию классов: студент, преподаватель, персона, заведующий кафедрой
Помогите построить иерархию классов: студент, преподаватель,персона, заведующий кафедрой,...

Используя механизм шаблонного наследования создайте иерархию классов(тьма ошибок)
/* Задание 2. Используя механизм шаблонного наследования создайте иерархию классов. Базовый...


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

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru