Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 5.00/15: Рейтинг темы: голосов - 15, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 20.09.2019
Сообщений: 86

Реализация класса со списком объектов множества

11.04.2020, 20:30. Показов 3491. Ответов 41
Метки нет (Все метки)

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

При удалении использовал erase(), думал, что можно просто передать элемент, который мы хотим удалить(перед этим ввести его в main), и удалить его, но нет.

При изменении элемента думал, что можно просто удалить этот элемент и записать новый(не нужно отдельное поле изменять, просто полностью элемент переписать, поэтому так можно), но тоже не работает. Когда реализовал с вектором, то там было проще: были индексы.

Также не представляю как сортировать элементы по любому направлению и полю, если множество априори сортирует по возрастанию.
Весь код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#ifndef SETLIST__H
#define SETLIST_H
 
#include <iostream>
#include <set>
#include "abiturient.h"
 
using namespace std;
 
class AbiturientSet : public  set<Abiturient*>
{
public:
    void add(Abiturient* a);
    void deleteElem(Abiturient* a);
    void changeElem(Abiturient* a);
    bool search(Abiturient& a);
    friend ostream& operator << (ostream& out, const AbiturientSet& set);
    void menu(void);
};
 
#endif
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
#include "setList.h"    
 
void AbiturientSet::add(Abiturient* a)
{
    this->insert(a);
}
 
void AbiturientSet::deleteElem(Abiturient* a)
{
    this->erase(a);
}
 
void AbiturientSet::changeElem(Abiturient* a)
{
    deleteElem(a);
    add(a);
}
 
bool AbiturientSet::search(Abiturient& a)
{
    for (int i = 0; i < this->size(); i++)
    {
        if (a == *(*this)[i])
        {
            return true;
        }
        else
        {
            return false;
        }
    
}
 
ostream& operator << (ostream& out, const AbiturientSet& set)
{
    out << "В множестве присутствуют следующие объекты: " << endl;
    for (auto it = set.begin(); it != set.end(); it++)
    {
        Abiturient* a;
        a = *it;
        out << a << endl;
    }
    return out;
}
 
void AbiturientSet::menu(void)
{
    cout << "================Меню==============" << endl
        << "1. Добавить элемент." << endl
        << "2. Удалить элемент." << endl
        << "3. Поиск." << endl
        << "4. Изменить элемент." << endl
        << "5. Вывести все элементы." << endl
        << "0. Выход." << endl
        << "Введите пункт меню: ";
}
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
#ifndef ABITURIENT_H
#define ABITURIENT_H
 
#include <iostream>
#include <string>
 
using namespace std;
 
class Abiturient
{
private:
    int number;
    string surname;
    string address;
    float average;
    int markMath;
    int markRus;
    int markPhys;
public:
    Abiturient();
    Abiturient(const Abiturient& cop);
    Abiturient(int number, string fio, string adress, float average, int markmath, int markrus, int markphys);
    void setNumber(int abiturientNumber);
    int getNumber();
    void setSurname(string abiturientName);
    string getSurname();
    void setAddress(string abiturientAddress);
    string getAddress();
    void setAverage(float abiturientAverage);
    float getAverage();
    void setMarkMath(int abiturientMarkMath);
    int getMarkMath();
    void setMarkRus(int abiturientMarkRus);
    int getMarkRus();
    void setMarkPhys(int abiturientMarkPhys);
    int getmarkPhys();
    void add(istream& cin);
    bool operator == (Abiturient* eq);
    friend ostream& operator<<(ostream& Cout, Abiturient* abit);
    friend istream& operator>>(istream& cin, Abiturient& abit);
};
#endif
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
#include "abiturient.h"
 
Abiturient::Abiturient()
{
    this->number = 0;
    this->surname = "";
    this->address = "";
    this->average = 0.0;
    this->markMath = 0;
    this->markRus = 0;
    this->markPhys = 0;
}
 
Abiturient::Abiturient(const Abiturient& cop)
{
    this->number = cop.number;
    this->surname = cop.surname;
    this->address = cop.address;
    this->average = cop.average;
    this->markMath = cop.markMath;
    this->markRus = cop.markRus;
    this->markPhys = cop.markPhys;
}
 
Abiturient::Abiturient(int number, string surname, string adress, float average, int markmath, int markrus, int markphys)
{
    this->number = number;
    this->surname = surname;
    this->address = adress;
    this->average = average;
    this->markMath = markmath;
    this->markRus = markrus;
    this->markPhys = markphys;
}
 
void Abiturient::setNumber(int abiturientNumber)
{
    number = abiturientNumber;
}
 
int Abiturient::getNumber()
{
    return number;
}
 
void Abiturient::setSurname(string abiturientName)
{
    surname = abiturientName;
}
 
string Abiturient::getSurname()
{
    return surname;
}
 
void Abiturient::setAddress(string abiturientAddress)
{
    address = abiturientAddress;
}
 
string Abiturient::getAddress()
{
    return address;
}
 
void Abiturient::setAverage(float abiturientAverage)
{
    average = abiturientAverage;
}
 
float Abiturient::getAverage()
{
    return average;
}
 
void Abiturient::setMarkMath(int abiturientMarkMath)
{
    markMath = abiturientMarkMath;
}
 
int Abiturient::getMarkMath()
{
    return markMath;
}
void Abiturient::setMarkRus(int abiturientMarkRus)
{
    markRus = abiturientMarkRus;
}
 
int Abiturient::getMarkRus()
{
    return markRus;
}
 
void Abiturient::setMarkPhys(int abiturientMarkPhys)
{
    markPhys = abiturientMarkPhys;
}
 
int Abiturient::getmarkPhys()
{
    return markPhys;
}
 
bool Abiturient::operator ==(Abiturient* eq)
{
    if (this->number == eq->number && this->surname == eq->surname &&
        this->average == eq->average && this->address == eq->address &&
        this->markMath == eq->markMath && this->markRus == eq->markRus &&
        this->markPhys == eq->markPhys)
    {
        return true;
    }
    else
    {
        return false;
    }
}
 
void Abiturient::add(istream& cin) 
{
    cout << "Номер Фамилия Адрес Средняя оценка Оценка по математика Оценка по русскому Оценка по физике: ";
    cin >> number >> surname >> address >> average >> markMath >> markRus >> markPhys;
}
 
ostream& operator<<(ostream& Cout, Abiturient* abit)
{
    string temp = "Номер: ";
    temp += to_string(abit->getNumber());
    temp += ", ФИО: ";
    temp += abit->getSurname();
    temp += ", Адрес: ";
    temp += abit->getAddress();
    temp += " , Средний балл абитуриента: ";
    temp += to_string(abit->getAverage());
    temp += ", Оценка по математике: ";
    temp += to_string(abit->getMarkMath());
    temp += ", Оценка по русскому: ";
    temp += to_string(abit->getMarkRus());
    temp += ", Оценка по физике: ";
    temp += to_string(abit->getmarkPhys());
    Cout << temp;
    return Cout;
}
 
istream& operator >>(istream& cin, Abiturient& abit) 
{
    abit.add(cin);
    return cin;
}
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
#include <iostream>
#include <Windows.h>
#include "abiturient.h"
#include "setList.h"
 
 
int main(int argc, char* argv[])
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    AbiturientSet l;
    while (true)
    {
        l.menu();
 
        int choise = 0;
        cin >> choise;
        switch (choise)
        {
 
        case 1:
        {
            system("cls");
            Abiturient* elem = new Abiturient();
            cin >> *elem;
            l.add(elem);
            cout << "Элемент успешно добавлен!" << endl;
            system("pause");
            system("cls");
            break;
        }
 
        case 2:
        {
            system("cls");
            cout << "Введите элемент, который хотите удалить: "<<endl;
            Abiturient* elem1 = new Abiturient();
            cin >> *elem1;
            l.deleteElem(elem1);
            system("pause");
            system("cls");
            break;
        }
 
        case 3:
        {
            system("cls");
            cout << "Введите элемент, который хотите найти: " << endl;
            Abiturient* elem2 = new Abiturient();
            cin >> *elem2;
            if (l.search(*elem2))
            {
                cout << elem2 << endl;
            }
            else
            {
                break;
            }
            system("pause");
            system("cls");
            break;
        }
 
        case 4:
        {
            system("cls");
            cout << "Введите элемент, который хотите изменить: " << endl;
            Abiturient* elem2 = new Abiturient();
            cin >> *elem2;
            l.changeElem(elem2);
            system("pause");
            system("cls");
            break;
        }
 
        case 5:
        {
            system("cls");
            cout << l;
            system("pause");
            system("cls");
            break;
        }
 
        case 0:
        {
            return 0;
        }
        break;
        }
    }
}
Возможно, что я не так реализую методы в main. Также в search() выдаёт ошибку в 5-ой строчке, что отсутствует оператор [] соответствующий этим операндам(я так понимаю, потому что его в множестве и нет).
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
bool AbiturientSet::search(Abiturient& a)
{
    for (int i = 0; i < this->size(); i++)
    {
        if (a == *(*this)[i])
        {
            return true;
        }
        else
        {
            return false;
        }
    
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
11.04.2020, 20:30
Ответы с готовыми решениями:

Реализация класса множества
Реализую класс множества. Некорректно работает удаление элемента из множества. Прошу помощи //...

Задать метод события для множества объектов одного класса
Здравствуйте! Вынужден обратиться к опытным людям за советом. Имеется форма, на которой есть 60 label'ов. Необходимо, чтобы при событии...

Объект для работы со списком объектов класса "Автомобиль"
Доброго времени суток! Помогите разобраться с задачей &quot;Объявить объект для работы со списком вышеуказанных объектов .&quot; (объекты...

41
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
14.04.2020, 15:47
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от _Beginner_ Посмотреть сообщение
если getSurname() вызвать, то ошибка тоже, хоть и другая
Добавь к getSurname const
C++
1
string getSurname() const;
В реализации тоже
0
0 / 0 / 0
Регистрация: 20.09.2019
Сообщений: 86
14.04.2020, 17:04  [ТС]
Спасибо, всё работает, ещё раз спасибо за Ваше прекрасное объяснение!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
14.04.2020, 17:04

Создание класса-списка на основе кода со списком без класса
Здравствуйте. Не могли бы вы показать, как оформить этот код в виде класса. Смысл задания: это засунуть в список большое число(здесь я...

LinkedList составленный из объектов класса, как обратиться к полям объектов
Не могу сообразить как обратиться к полям объектов, добавленных в LinkedList. Суть такая: есть класс, имеющий 4 поля (разные типы - String...

Массив объектов базового класса, позволяющий работать с набором объектов — чтение, вывод
Расширить программы с классами. Каждый разработанный класс считать базовым; для каждого такого класса описать производный класс - массив...

Передача объектов дочерних классов через массив объектов родительского класса в функцию
Здравствуйте. Возможно, вопрос больше относится к теории ООП, но все же я не решился задавать его в теме теории ООП, так как он кажется мне...

Задайте списком множества Q^2, Q^3
Дано множество Q={h,квадрат(фигура нарисована)} Задайте списком множества Q^2, Q^3.


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

Или воспользуйтесь поиском по форуму:
42
Ответ Создать тему
Новые блоги и статьи
Книги по геймдизайну, левел-дизайну, игровым механикам и проектированию игрового опыта
8Observer8 08.11.2026
Содержание блога | English Version 1. 2003 - 06 - Designing Virtual Worlds (1st Edition) Автор: Richard A. Bartle | Объем: 768 стр. Ссылки: Amazon . . .
Родители токсичные абьюзеры по отношению к своим детям ругают их оскорбляют не любят
zorxor 08.11.2026
Жить в атмосфере постоянных оскорблений, критики и холодности со стороны родителей — это тяжелое и болезненное испытание, которое оставляет глубокие эмоциональные раны. Токсичное и абьюзивное. . .
Как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Ответ от Джемени ИИ.
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, на примере справочника "КонтактныеЛицаПартнеров". Задача: Запрет инициалов. Не допускаеть использование сокращений вида "И. И. ", "И. И. ", "И И" и. . .
Про "Windows must die!"
kumehtar 04.11.2026
Знаете, чет накатило. . . . Когда-то это было почти боевым кличем: мол, нормальный человек сидит на DOS, OS/ 2 или Linux, а вот это вот - Must Die. А теперь человек произносит «мастдай» с усмешкой - и. . .
Красочные поля с номером страницы svg+background-image
russiannick 04.11.2026
Красочные поля с номером страницы не менее важны чем в эпоху бумажных книг. Посему спешу представить почтеннейшей публике этот важный инструмент который эти поля и формирует. В процессе разработки. . .
Вступаем в новую фазу генерации favicons, векторную.
russiannick 02.11.2026
Теперь нет нужды скрывать что используется простой svg. Исходный код изображения помещаем в поле и жмем кнопку. Исходник преобразуется в вид корректный для помещения в favicon или в url(). Нажатие. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru