Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
 Аватар для Fixer_84
1505 / 969 / 812
Регистрация: 30.04.2016
Сообщений: 3,337

Работа с абстрактным классом, считывание данных

21.03.2019, 12:05. Показов 2638. Ответов 41
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, уважаемые форумчане! Пишу программу по следующему заданию:

Создать класс Изготовитель cо следующими полями:
- торговая марка;
- страна происхождения.
Создать базовый класс Часы (модель, изготовитель) и дочерние классы:
- механические часы (продолжительность работы, гарантийный срок);
- электронные часы (тип батареи, тип экрана);
- использовать класс Изготовитель как поле класса Часы.
Функции:
- cчитать из текстового файла данные о разных часах;
- используя механизм виртуальных функций, в новый файл записать информацию о часах, отсортированных по названию марки;
- подсчитать количество часов указанного изготовителя с заданным типом батареи;
- вывести информацию о механических часах с самым большим гарантийным сроком.

Поля для Механические часы: string string string int int
Поля для Электронные часы: string string string string string

Важно, что поля для 4 и 5 записи различаются.

Так как у меня не очень большой опыт работы с классами, у меня возникли следующие вопросы:

1. Как для данной задачи считывать данные? Нужен ли дополнительный класс для считывания? Если нет, то как различать данные по последним 4 и 5 полям (они различаются). В какой объект считывать данные?

2. Что имеется ввиду под фразой используя механизм виртуальных функций, в новый файл записать информацию о часах, отсортированных по названию. Это просто виртуальные методы для сортировки и записи в файл?

3. Фраза "подсчитать количество часов указанного изготовителя с заданным типом батареи" подразумевает, что будет использоваться объект типа "Электронные часы", в то время как фраза "вывести информацию о механических часах с самым большим гарантийным сроком" подразумевает, что будет использоваться объект типа "Механические часы". Как объяснить программе какие данные из общего списка считывать для одного подкласса, а какие для другого? Нужно ли вводить некоторую функцию, которая будет различать данные для каждого подкласса?

Очень прошу помочь. Пока вот все, что удалось сделать:

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
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <fstream>
 
    using namespace std;
       
class Producer { //Класс Изготовитель (этот класс используется внутри другого класса Часы (композиция объектов))
 
    public:
 
        string t_mark; //Торговая марка
        string c_origin; //Страна происхождения
};
 
class Clock { //Базовый, абстрактный класс Часы
 
    protected:
 
        string model; //Модель
        Producer prod; //Изготовитель
    
    public:
        
    //virtual void sortClockByTradeMark() = 0; //Виртуальная функция сортировки информации о часах по названию марки (pure virtual function)
    //virtual void writeSortedDataIntoFile() = 0; //Виртуальная функция записи отсортированной информации в файл (pure virtual function)
};
 
class Mechanical: public Clock { //Класс-наследник (механические часы)
 
    private:
    
        int lifetime; //Продолжительность работы
        int w_period; //Гарантийный срок
    
    public:
 
        string getMechanicalClockModel() const; //Геттер (модель)
        Producer getMechanicalClockProducer(string, string) const; //Геттер (изготовитель)
        int getMechanicalClockLifeTime() const; //Геттер (продолжительность работы)
        int getMechanicalClockWarrantyPeriod() const; //Геттер (гарантийный срок)
        
        friend ifstream& operator>>(ifstream &in, Mechanical &obj) { 
        in >> obj.model
           >> obj.prod.t_mark
           >> obj.prod.c_origin
           >> obj.lifetime
           >> obj.w_period;
        return in;
    }
};
 
class Electronic: public Clock { //Класс-наследник (электронные часы)
 
    private:
    
        string battery_t; //Тип батареи
        string display_t; //Тип дисплея
    
    public:
        
        string getElectronicClockModel() const; //Геттер (модель)
        Producer getElectronicClockProducer(string, string) const; //Геттер (изготовитель)
        string getElectronicClockBatteryType() const; //Геттер (тип батареи)
        string getElectronicClockDisplayType() const; //Геттер (тип экрана)
        
        friend ifstream& operator>>(ifstream &in, Electronic &obj) { 
        in >> obj.model
           >> obj.prod.t_mark
           >> obj.prod.c_origin
           >> obj.battery_t
           >> obj.display_t;
        return in;
    }
};
   
int main() { 
    ifstream in("clock.txt");
    in.close();
    system("pause");
    return 0;
}
 
//Геттеры (механические часы):
 
string Mechanical::getMechanicalClockModel() const { //Модель (механические часы) 
    return model;
}
 
Producer Mechanical::getMechanicalClockProducer(string trademark, string country) const { //Изготовитель (механические часы) 
    Producer p;
    p.t_mark = trademark;
    p.c_origin = country;
    return p;
}
 
int Mechanical::getMechanicalClockLifeTime() const { //Продолжительность работы (механические часы) 
    return lifetime;
}
 
int Mechanical::getMechanicalClockWarrantyPeriod() const { //Гарантийный срок (механические часы)
    return w_period;
}
 
//Геттеры (электронные часы):
 
string Electronic::getElectronicClockModel() const { //Модель (электронные часы) 
    return model;
}
 
Producer Electronic::getElectronicClockProducer(string trademark, string country) const { //Изготовитель (электронные часы) 
    Producer p;
    p.t_mark = trademark;
    p.c_origin = country;
    return p;
}
 
string Electronic::getElectronicClockBatteryType() const { //Тип батареи (электронные часы) 
    return battery_t;
}
 
string Electronic::getElectronicClockDisplayType() const { //Тип экрана (электронные часы)
    return display_t;
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
21.03.2019, 12:05
Ответы с готовыми решениями:

Работа с абстрактным классом
Доброго времени суток! Имеется небольшой класс: #include &lt;irrlicht.h&gt; class EngineInit { public: IrrlichtDevice* device...

Непонятки с абстрактным классом
У нуба возник вопрос :) Вот объявляю я абстрактный Inline класс. Ну под инлайн я имею ввиду, что он без cpp, реализация в H. #pragma...

Полиморфизм с абстрактным классом
Добрий день, нуждаюсь в помощи. У меня есть абстрактный класс IStudent_Manip и производный класс Student_Manipulator. Хочу сделать...

41
 Аватар для zayats80888
6354 / 3525 / 1428
Регистрация: 07.02.2019
Сообщений: 9,008
21.03.2019, 21:30
Студворк — интернет-сервис помощи студентам
Fixer_84, попробуйте заменить функцию проверки на эту
C++
1
2
3
4
5
6
7
8
9
10
11
12
int check_type(ifstream& is) {
    string str;
    int val;
    streampos pos = is.tellg();
    if (is.peek() == '\n') is.get();
    getline(is, str);
    is.seekg(pos);
    stringstream ss(str);
    
    if (ss >> str >> str >> str >> val >> val) return 1;
    return 0;
}
Добавлено через 8 минут
Цитата Сообщение от Fixer_84 Посмотреть сообщение
просто весь смысл виртуального метода в том, что он сам понимает для какого класса и когда себя вызывать
так вы в своем коде не используете вызов виртуального метода через базовый класс, вы его напрямую вызываете
0
 Аватар для zayats80888
6354 / 3525 / 1428
Регистрация: 07.02.2019
Сообщений: 9,008
22.03.2019, 00:48
Fixer_84, делать было нечего, доработал ваш код.

Код:
Кликните здесь для просмотра всего текста
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
/*
Создать класс Изготовитель cо следующими полями:
    - торговая марка;
    - страна происхождения.
Создать базовый класс Часы (модель, изготовитель) и дочерние классы:
    - механические часы (продолжительность работы, гарантийный срок);
    - электронные часы (тип батареи, тип экрана);
    - использовать класс Изготовитель как поле класса Часы.
Функции:
    - cчитать из текстового файла данные о разных часах;
    - используя механизм виртуальных функций, в новый файл записать информацию о часах, отсортированных по названию марки;
    - подсчитать количество часов указанного изготовителя с заданным типом батареи;
    - вывести информацию о механических часах с самым большим гарантийным сроком.
 
Пример входных данных:
 
    C4698/4 Candino Switzerland 35 2
    KP-1434M-E Kappa Italy 15 1
    ES-8091-01 Earnshaw England 10 2
    SYG194B Superdry England 20 1
    W0991G7 Guess USA 5 2
    JZ1065-05E Citizen Japan 15 3
    SKW2726 Skagen Denmark 10 5
    P.2.1.5 Putnik Russia 15 1
 
    A-163WA-1 Casio Japan Alkaline FRP
    A-168WEC-3E Casio Japan Lithium Plastic
    T5K335 Timex USA Alkaline Mineral
    SN05 SmartWatch China Lithium Plastic
    SS022663000 Suunto Finland Alkaline Plastic
    47326 StormDigitron England Lithium Mineral
*/
 
#include <iostream>
#include <string>
#include <algorithm>
#include <numeric>
#include <fstream>
#include <sstream>
#include <vector>
 
using namespace std;
 
int check_type(ifstream&);
 
class Producer { //Класс Изготовитель (этот класс используется внутри другого класса Часы (композиция объектов))
 
public:
 
    string t_mark; //Торговая марка
    string c_origin; //Страна происхождения
};
 
class Clock { //Базовый, абстрактный класс Часы
 
protected:
 
    int _clock_type;
    string model; //Модель
    Producer prod; //Изготовитель
 
public:
 
    virtual ~Clock() {}
 
    int clock_type() const { return _clock_type; }//функция для сортировки по типу часов
    virtual string Data_to_string() const = 0; //Виртуальная функция для вывода данных
    virtual string Data_to_sort() const = 0;//Виртуальная функция возвращающая данные для сортировки
    const string& getClockModel() const { return model; } //Геттер (модель)
    const Producer& getProducer() const { return prod; } //Геттер (изготовитель)
};
 
class Mechanical : public Clock { //Класс-наследник (механические часы)
 
private:
 
    int lifetime; //Продолжительность работы
    int w_period; //Гарантийный срок
 
public:
    explicit Mechanical() { _clock_type = 0; }
 
    int getMechanicalClockLifeTime() const; //Геттер (продолжительность работы)
    int getMechanicalClockWarrantyPeriod() const; //Геттер (гарантийный срок)
 
    string Data_to_string() const;
    string Data_to_sort() const;
 
    friend ifstream& operator>>(ifstream &in, Mechanical &obj) {
        if (check_type(in) == 1) {
            in.setstate(ios_base::failbit);
            return in;
        }
 
        in >> obj.model
            >> obj.prod.t_mark
            >> obj.prod.c_origin
            >> obj.lifetime
            >> obj.w_period;
        return in;
    }
};
 
 
class Electronic : public Clock { //Класс-наследник (электронные часы)
 
private:
 
    string battery_t; //Тип батареи
    string display_t; //Тип дисплея
 
public:
    explicit Electronic() { _clock_type = 1; }
 
    string getElectronicClockBatteryType() const; //Геттер (тип батареи)
    string getElectronicClockDisplayType() const; //Геттер (тип экрана)
 
    string Data_to_string() const;
    string Data_to_sort() const;
 
    friend ifstream& operator>>(ifstream &in, Electronic &obj) {
        if (check_type(in) == 0) {
            in.setstate(ios_base::failbit);
            return in;
        }
 
        in >> obj.model
            >> obj.prod.t_mark
            >> obj.prod.c_origin
            >> obj.battery_t
            >> obj.display_t;
        return in;
    }
};
 
ostream& operator<<(ostream &out, const Clock &obj) {//функция вывода в поток
    return out << obj.Data_to_string() << endl;
}
 
class clock_vector {//контейнер для указателей на объекты базового класса
    vector<Clock*> cv;
public:
    void push_back(Clock* c) { cv.push_back(c); }
 
    ~clock_vector() { for (auto i : cv) delete i; }
 
    typedef vector<Clock*>::iterator iterator;
 
    iterator begin() { return cv.begin(); }
    iterator end() { return cv.end(); }
};
 
bool by_trade_mark(const Clock* a, const Clock* b) {//предикат сортировки по торговой марке
    return (a->getProducer()).t_mark < (b->getProducer()).t_mark;
}
 
class by_producer_n_battary_type {//предикат для  подсчета по изготовителю и типу батареи
    Producer prod;
    string b_type;
public:
    by_producer_n_battary_type(const Producer& p, const string& b) : prod(p), b_type(b) {}
    int operator()(int acc, const Clock* clock) const {
        if ((clock->getProducer()).t_mark == prod.t_mark &&
            clock->Data_to_sort() == b_type)
            ++acc;
        return acc;
    }
};
 
struct by_clock_type {//предикат поиска по типу часов
    int c_type;
    bool operator()(const Clock* clock) {
        return clock->clock_type() == c_type;
    }
};
 
Clock* max_w_period(clock_vector& cv) {//поиск механических часов с самым большим гарантийным сроком.
    typedef clock_vector::iterator iterator;
 
    iterator current = cv.begin();
    Clock* result = 0;
    while (true) {
        current = find_if(current, cv.end(), by_clock_type({ 0 }));
        if (current == cv.end()) break;
        if (!result) result = *current;
        else if (result->Data_to_sort() < (*current)->Data_to_sort()) result = *current;
        ++current;
    }
    return result;
}
 
bool read_from_file(const string& fname, clock_vector& cv) {//чтение из файла в контейнер
    ifstream in(fname.c_str());
    if (!in) return 0;
    
    while (in.peek() != EOF) {
        Electronic e;
        Mechanical m;
        in >> e;
        if (in.fail()) {
            in.clear();
            if (!(in >> m)) break;
            cv.push_back(new Mechanical(m));
        }
        else cv.push_back(new Electronic(e));
    }
    in.close();
    return 1;
}
 
void print_vector(clock_vector& cv, ostream& os) {
    for (auto i : cv) os << i->Data_to_string() << endl;
}
 
int main() {
    clock_vector cv;
    if (!read_from_file("clock.txt", cv)) cerr << "file_not_found" << endl;
    else {
        print_vector(cv, cout);
        cout << endl;
 
        sort(cv.begin(), cv.end(), by_trade_mark);
        cout << "Sorted by TM:" << endl;
        print_vector(cv, cout);
        cout << endl;
 
        cout << "Count of Casio Alkaline: "
            << accumulate(cv.begin(), cv.end(), 0, by_producer_n_battary_type({ "Casio","" }, "Alkaline"))
            << endl << endl;
 
        Clock* max = max_w_period(cv);
        if (max) cout << "Max warranty period: " << max->Data_to_string() << endl;
 
    }
    system("pause");
    return 0;
}
 
int check_type(ifstream& is) {
    string str;
    int val;
 
    streampos pos = is.tellg();
    if (is.peek() == '\n') is.get();
    getline(is, str);
    is.seekg(pos);
 
    stringstream ss(str);
    if (ss >> str >> str >> str >> val >> val) return 0;
    return 1;
}
 
//Геттеры (механические часы):
 
int Mechanical::getMechanicalClockLifeTime() const { //Продолжительность работы (механические часы) 
    return lifetime;
}
 
int Mechanical::getMechanicalClockWarrantyPeriod() const { //Гарантийный срок (механические часы)
    return w_period;
}
 
string Mechanical::Data_to_string() const
{
    stringstream ss;
    ss << model << ' '
        << prod.t_mark << ' '
        << prod.c_origin << ' '
        << lifetime << ' '
        << w_period;
    return ss.str();
}
 
string Mechanical::Data_to_sort() const
{
    return to_string(w_period);
}
 
//Геттеры (электронные часы):
 
string Electronic::getElectronicClockBatteryType() const { //Тип батареи (электронные часы) 
    return battery_t;
}
 
string Electronic::getElectronicClockDisplayType() const { //Тип экрана (электронные часы)
    return display_t;
}
 
string Electronic::Data_to_string() const
{
    stringstream ss;
    ss << model << ' '
        << prod.t_mark << ' '
        << prod.c_origin << ' '
        << battery_t << ' '
        << display_t;
    return ss.str();
}
 
string Electronic::Data_to_sort() const
{
    return battery_t;
}


Исходный файл:
Кликните здесь для просмотра всего текста


Результат работы:
Кликните здесь для просмотра всего текста
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
22.03.2019, 00:48

Создать иерархию наследования с абстрактным базовым классом
Доброго времени суток! Помогите, пожалуйста, сделать: 2) Создать абстрактный базовый класс с виртуальной функцией &quot;Площадь&quot;....

Ошибка при работе с абстрактным классом pair
Всем доброго времени суток, стоит задача создать абстрактный класс pair и создать от него производный класс complex, определив при этом...

Теория по абстрактным типам данных
В общем нужно сделать лабораторную работу по абстрактным типам данных на Си. Не могу найти подходящую теорию, подкиньте пожалуйста где есть...

Задача с абстрактным типом данных
Даны сведения о 14 кубиках: длина ребра в сантиметрах, его цвет и материал (деревянный, металлический, пластмассовый). Найти количество...

работа с классом
пишу класс быстрой математики (знаю что многие делали в инете дофига всего, но всё же) сделал таблицу корней в общем то всё работает...


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

Или воспользуйтесь поиском по форуму:
42
Ответ Создать тему
Новые блоги и статьи
Транслитерация текста с кириллицы на латиницу (вариант №3)
Maks 15.11.2026
Обновленная версия предыдущей обработки. Изменения коснулись букв: Ъ, Ы, Ь, Э, отображения которых зависят от положения реквизита "Транслитерация имён". Изменено отображение буквы Й. Добавлена. . .
Транслитерация текста с кириллицы на латиницу (вариант №2)
Maks 13.11.2026
Обновленная версия ранее созданной обработки. Добавлено: - Проверка исходного текста на кириллицу, через обращение к стандартной функции "ТолькоКириллицаВСтроке" из общего модуля. . .
Часы с термометром и праздничным календарем
yariko 12.11.2026
Сегодня мы рассмотрим как можно сделать отличные многофункциональные часы. Итак, поставим конкретную задачу: разработать часы с календарем, двумя термодатчиками, выводом поздравительных сообщений. . .
Транслитерация текста с кириллицы на латиницу (вариант №1)
Maks 11.11.2026
Решил облегчить жизнь себе и коллегам админам при создании электронных почтовых ящиков для пользователей, в результате написал обработку "Транслитерация текста" с кириллицы на латиницу, а в ней. . .
Книги по геймдизайну, левел-дизайну, игровым механикам и проектированию игрового опыта
8Observer8 08.11.2026
Содержание блога | English Version 1. 2003 - 06 - Designing Virtual Worlds (1st Edition) Автор: Richard A. Bartle | Объем: 768 стр. Ссылки: Amazon . . .
Как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Ответ от Джемени ИИ.
zorxor 08.11.2026
Джемени, как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Многие люди, возвращаясь домой, сразу переодеваются в максимально свободную одежду или вовсе предпочитают. . .
Паттерн очереди действий/команд (Action / Command Queue). Система очереди действий и кат-сцен с SDL3 Callbacks, cglm и OpenGL
8Observer8 07.11.2026
Содержание блога | English Version Руководство для начинающих по реализации паттерна очереди действий/ команд (Action / Command Queue) на C++ (C++20) с использованием официального SDL3 Callbacks. . .
Проверка полного ФИО в типовом справочнике
Maks 07.11.2026
Решение реализовано в конфигурации КА2, на примере справочника "КонтактныеЛицаПартнеров". Задача: Запрет инициалов. Не допускаеть использование сокращений вида "И. И. ", "И. И. ", "И И" и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru