17 / 17 / 6
Регистрация: 10.12.2013
Сообщений: 740
1

Нужно описать класс «множество»

15.05.2015, 10:49. Показов 3879. Ответов 10
Метки нет (Все метки)

Привет всем. Недавно начал изучать классы и решаю одну задачу. Нужно описать класс «множество», позволяющий выполнять основные операции — добавление и удаление элемента, пересечение, объединение и разность множеств.
Ну я в классе создал все методы, но пока написал только первые 2 функции и решил проверить.
Вот код:

Множества.h
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
#ifndef MNOZHESTVO_H
#define MNOZHESTVO_H
 
#include <vector>
using namespace std;
 
class Mnozhestvo{
public:
    Mnozhestvo();
    void add(int, int, vector<int>, vector<int>);
    void del(int, int, vector<int>, vector<int>);
    void crossing(int, int, vector<int>, vector<int>);
    void combination(int, int, vector<int>, vector<int>);
    void raznost(int, int, vector<int>, vector<int>);
private:
    vector<int> a;
    vector<int> b;
    int n;
    int m;
};
 
#include "Множества.cpp"
 
#endif
Множества.cpp
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
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <vector>
#include <iterator>
#include "Множества.h"
using namespace std;
 
void Mnozhestvo::add(int n, int m, vector<int> a, vector<int> b){
    char k;
    int z;
 
    z = 1 + rand() % 50;
 
    cout << "Введите ""a"", чтоб добавить элемент в множество A, или ""b"", чтоб добавить элемент в множество B:" << endl;
    cin >> k;
 
    if(k == 'a'){
        a.push_back(z);
        copy(a.begin(), a.end(), ostream_iterator<int>(cout, " "));
        cout << endl;
    }
 
    if(k == 'b'){
        b.push_back(z);
        copy(b.begin(), b.end(), ostream_iterator<int>(cout, " "));
        cout << endl;
    }
}
 
void Mnozhestvo::del(int n, int m, vector<int> a, vector<int> b){
    int d;
    char k;
 
    cout << "Введите ""a"", чтоб удалить элемент из множества A, или ""b"", чтоб удалить элемент из множества B:" << endl;
    cin >> k;
 
    if(k == 'a'){
        cout << "Введите номер элемента множества, который хотите удалить:" << endl;
        cin >> d;
 
        if(d == 0){
            a.erase(a.begin());
            cout << "Новый массив:" << endl;
            copy(a.begin(), a.end(), ostream_iterator<int>(cout, " "));
            cout << endl;
        }
        else{
            a.erase(a.begin() + d);
            cout << "Новый массив:" << endl;
            copy(a.begin(), a.end(), ostream_iterator<int>(cout, " "));
            cout << endl;
        }
    }
 
    if(k == 'b'){
        cout << "Введите номер элемента множества, который хотите удалить:" << endl;
        cin >> d;
 
        if(d == 0){
            b.erase(b.begin());
            cout << "Новый массив:" << endl;
            copy(b.begin(), b.end(), ostream_iterator<int>(cout, " "));
            cout << endl;
        }
        else{
            b.erase(b.begin() + d);
            cout << "Новый массив:" << endl;
            copy(b.begin(), b.end(), ostream_iterator<int>(cout, " "));
            cout << endl;
        }
    }
}
 
void Menu(int n, int m, vector<int> a, vector<int> b)
{
    Mnozhestvo mn;
    int key;
 
    cout << "Выберите операцию, которая будет выполняться над множеством(ами): " << endl;
    cout << "1 - добавление элемента" << endl;
    cout << "2 - удаление элемента" << endl;
 
    cin >> key;
 
    switch (key)
    {
    case 1:
        mn.add(n, m, a, b);
    case 2:
        mn.del(n, m, a, b);
    default:
        break;
    }
}
main.cpp
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
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <vector>
#include "Mnozhestvo.h"
using namespace std;
 
int main()
{
    int n, m;
    int i;
 
    cout << "Введите количество элементов в множестве a:" << endl;
    cin >> n;
    cout << "Введите количество элементов в множестве b:" << endl;
    cin >> m;
 
    vector<int> a(n);
    vector<int> b(m);
 
    srand(time(NULL));
 
    for(i = 0;i < n;i++)
        a[i] = 1 + rand() % 50;
 
    for(i = 0;i < m;i++)
        b[i] = 1 + rand() % 50;
 
    Menu(n, m, a, b);
 
    system("pause");
 
    return 0;
}
Проблема вот в чем. Сначала я не разделял программу на файлы и писал одну большую. Тогда мне выдавало только одну ошибку "Неразрешенный внешний символ", как я понял, при создании обьекта класса в функции Menu. И я решил попробовать первый раз разбить программу на файлы.
Теперь мне выдает 5 ошибок

Ошибка 1 error C2084: функция "void Mnozhestvo::add(int,int,std::vector<_Ty>,std::vect or<_Ty>)" уже имеет текст реализации
Ошибка 2 error C2084: функция "void Mnozhestvo::del(int,int,std::vector<_Ty>,std::vect or<_Ty>)" уже имеет текст реализации
Ошибка 3 error C2084: функция "void Menu(int,int,std::vector<_Ty>,std::vector<_Ty>)" уже имеет текст реализации
Ошибка 4 error C2264: Mnozhestvo::add: ошибка в определении или объявлении функции; функция не вызвана
Ошибка 5 error C2264: Mnozhestvo::del: ошибка в определении или объявлении функции; функция не вызвана

Насчет первых трех ошибок я погуглил и вроде понял, что нужно переименовывать как-то функции, но ведь их названия больше нигде не встречаются у меня в программе.

Насчет последних двух ошибок, то они появляются при попытке вызова функций add и del в функции Menu. А из-за чего они появляются, не могу понять.

Скажите, где мои ошибки? Я подозреваю, что я что-то не то сделал с конструктором, так как пока не очень понимаю, как работать с конструкторами и деструкторами. Либо не дописал чего-то, либо переписал
Принимаю любую критику, любые злые и добрые комментарии
Заранее спасибо.
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.05.2015, 10:49
Ответы с готовыми решениями:

Описать класс множество
Описать класс множество с полями элементы множества и количество элементов, позволяющий добавлять и...

Описать класс “множество”
Описать класс “множество”, позволяющий выполнять основные операции — добавление и удаление...

Описать класс «множество», позволяющий добавлять и удалять элементы
Всем доброго времени суток, нужна небольшая помощь, void set(int fir, int sec, int thir,int...

Описать класс множество с полями элементы множества и количество элементов
c ++:описать класс множество с полями элементы множества и количество элементов, позволяющий...

10
55 / 56 / 34
Регистрация: 29.12.2012
Сообщений: 478
15.05.2015, 11:46 2
C++
1
#include "Множества.cpp"
в h файли лишнее отсюда ВСЕ ошибки


А теперь структурные ошибки

Добавлено через 15 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    int n, m;
    int i;
 
    cout << "Введите количество элементов в множестве a:" << endl;
    cin >> n;
    cout << "Введите количество элементов в множестве b:" << endl;
    cin >> m;
 
    vector<int> a(n);
    vector<int> b(m);
 
    srand(time(NULL));
 
    for(i = 0;i < n;i++)
        a[i] = 1 + rand() % 50;
 
    for(i = 0;i < m;i++)
        b[i] = 1 + rand() % 50;
Вотетот контекст должен быть в конструкторе

Добавлено через 1 минуту
void Menu методом класс
0
17 / 17 / 6
Регистрация: 10.12.2013
Сообщений: 740
15.05.2015, 13:38  [ТС] 3
Черный мечник, Блин, запутался. Первое убрал. Ошибки пропали. Функцию Menu сделал методом класса.
Но так и не понял насчет конструктора. Насколько я вас понял...вот код:

Множества.h
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
#ifndef MNOZHESTVO_H
#define MNOZHESTVO_H
 
#include <cstdlib>
#include <ctime>
#include <vector>
using namespace std;
 
class Mnozhestvo{
public:
    Mnozhestvo()
    {
    int n, m;
    int i;
 
    cout << "Введите количество элементов в множестве a:" << endl;
    cin >> n;
    cout << "Введите количество элементов в множестве b:" << endl;
    cin >> m;
 
    vector<int> a(n);
    vector<int> b(m);
 
    srand(time(NULL));
 
    for(i = 0;i < n;i++)
        a[i] = 1 + rand() % 50;
 
    for(i = 0;i < m;i++)
        b[i] = 1 + rand() % 50;
    };
    void add(int, int, vector<int>, vector<int>);
    void del(int, int, vector<int>, vector<int>);
    void crossing(int, int, vector<int>, vector<int>);
    void combination(int, int, vector<int>, vector<int>);
    void raznost(int, int, vector<int>, vector<int>);
    void Menu(int, int, vector<int>, vector<int>);
private:
    vector<int> a;
    vector<int> b;
    int n;
    int m;
};
 
#endif
Множества.cpp
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
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <vector>
#include <iterator>
#include "Множества.h"
using namespace std;
 
void Mnozhestvo::add(int n, int m, vector<int> a, vector<int> b){
    char k;
    int z;
 
    z = 1 + rand() % 50;
 
    cout << "Введите ""a"", чтоб добавить элемент в множество A, или ""b"", чтоб добавить элемент в множество B:" << endl;
    cin >> k;
 
    if(k == 'a'){
        a.push_back(z);
        copy(a.begin(), a.end(), ostream_iterator<int>(cout, " "));
        cout << endl;
    }
 
    if(k == 'b'){
        b.push_back(z);
        copy(b.begin(), b.end(), ostream_iterator<int>(cout, " "));
        cout << endl;
    }
}
 
void Mnozhestvo::del(int n, int m, vector<int> a, vector<int> b){
    int d;
    char k;
 
    cout << "Введите ""a"", чтоб удалить элемент из множества A, или ""b"", чтоб удалить элемент из множества B:" << endl;
    cin >> k;
 
    if(k == 'a'){
        cout << "Введите номер элемента множества, который хотите удалить:" << endl;
        cin >> d;
 
        if(d == 0){
            a.erase(a.begin());
            cout << "Новый массив:" << endl;
            copy(a.begin(), a.end(), ostream_iterator<int>(cout, " "));
            cout << endl;
        }
        else{
            a.erase(a.begin() + d);
            cout << "Новый массив:" << endl;
            copy(a.begin(), a.end(), ostream_iterator<int>(cout, " "));
            cout << endl;
        }
    }
 
    if(k == 'b'){
        cout << "Введите номер элемента множества, который хотите удалить:" << endl;
        cin >> d;
 
        if(d == 0){
            b.erase(b.begin());
            cout << "Новый массив:" << endl;
            copy(b.begin(), b.end(), ostream_iterator<int>(cout, " "));
            cout << endl;
        }
        else{
            b.erase(b.begin() + d);
            cout << "Новый массив:" << endl;
            copy(b.begin(), b.end(), ostream_iterator<int>(cout, " "));
            cout << endl;
        }
    }
}
 
void Mnozhestvo::Menu(int n, int m, vector<int> a, vector<int> b)
{
    int key;
 
    cout << "Выберите операцию, которая будет выполняться над множеством(ами): " << endl;
    cout << "1 - добавление элемента" << endl;
    cout << "2 - удаление элемента" << endl;
 
    cin >> key;
 
    switch (key)
    {
    case 1:
        add(n, m, a, b);
    case 2:
        del(n, m, a, b);
    default:
        break;
    }
}
main.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
#include "Множества.h"
using namespace std;
 
int main()
{
    setlocale(0, "RUS");
 
    Mnozhestvo mn;
 
    mn.Menu(n, m, a, b); //!!!!!
 
    system("pause");
 
    return 0;
}
Аргументы в вызове функции Menu подчеркнуты - идентификаторы не определены. Я так понял, что этот кусок кода
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    int n, m;
    int i;
 
    cout << "Введите количество элементов в множестве a:" << endl;
    cin >> n;
    cout << "Введите количество элементов в множестве b:" << endl;
    cin >> m;
 
    vector<int> a(n);
    vector<int> b(m);
 
    srand(time(NULL));
 
    for(i = 0;i < n;i++)
        a[i] = 1 + rand() % 50;
 
    for(i = 0;i < m;i++)
        b[i] = 1 + rand() % 50;
должен быть и в конструкторе, и в main? Когда я и там, и там этот кусок оставил, программа первый раз запустилась, но в консоли просила ввести кол-во элементов в множестве по 2 раза на каждое
0
55 / 56 / 34
Регистрация: 29.12.2012
Сообщений: 478
15.05.2015, 17:28 4
C++
1
mn.Menu();
Добавлено через 10 минут
Убери параметры у нее везте

Добавлено через 1 минуту
И о чудо

Добавлено через 7 минут
что делает конструкор в моем грубом представлении....у тебя есть в программе:две переменные и грубо два крутых масива...и в конструкторе переменнывм можно присвоить 1 а масивы заполнить 0 и
vector<int> a={0,}
vector<int> b={0,}
int n=1
int m=1
и когда создаете Mnozhestvo mn; у вашей программы есть эти начальные данные...и вы с ними можете работать или изменить с помошью других методов
0
3660 / 2997 / 828
Регистрация: 25.03.2012
Сообщений: 11,045
Записей в блоге: 1
15.05.2015, 17:28 5
Черный мечник, давайте не будем учить новичков бреду! Никакой конструктор не должен заниматься вводом данных!
Sh@dow777, давайте вы тоже для начала не будете бредить и осознаете, что вообще такое классы и зачем они нужны.
Вот это вот
C++
1
2
3
4
5
6
class Mnozhestvo{
//блаблабла
private:
    vector<int> a;
    vector<int> b;
};
вот это вот^ никак не класс "множество". Это какие-то два вектора, непонятно зачем лежащие в описании класса. Сразу риторический вопрос: а когда тебя попросят задать три множества, ты что будешь ещё одно поле "цэ" в класс добавлять?
Что такое класс ты знаешь?
А что такое структура, для начала?
А что такое вообще пользовательские типы данных и как ими пользуются ты слышал?
0
55 / 56 / 34
Регистрация: 29.12.2012
Сообщений: 478
15.05.2015, 17:37 6
Kuzia domovenok
Тема с утра висит, и как в книжке я научился ,такой бред расказываю=))Вы б поживее просвешали нас недалеких=)может я и неписал=)

Добавлено через 1 минуту
Я самоучка и тут просто задачки решаю=)на те которые не обрашают внимание=)
0
17 / 17 / 6
Регистрация: 10.12.2013
Сообщений: 740
15.05.2015, 20:28  [ТС] 7
Kuzia domovenok, Да ладно вам. Вы думаете, что я с бухты-барахты без материала, без минимальных знаний стал бы писать эту программу? Я читал в Дейтеле про классы. До наследования, шаблонов(векторов в Дейтеле не нашел) еще не дошел, но основы классов знаю. Я думаю, что кроме векторов, всю программу я написал верно. Даже подозреваю, что конструктор изначально я тоже написал правильно, просто нужно было функцию Menu сделать методом класса.
А насчет векторов - основы, основные их функции тоже знаю. Вот как в классе их создать правильно, как элементы, не знаю - признаюсь.
Поэтому и написал на форуме. Вы либо покажите на примере, что нужно сделать с векторами в
C++
1
private:
либо скажите, где можно почитать об этом.

Добавлено через 4 минуты
Черный мечник, А насчет
C++
1
mn.Menu()
пробовал. Это не то. Все равно аргументы нужны для вызова.
0
55 / 56 / 34
Регистрация: 29.12.2012
Сообщений: 478
15.05.2015, 20:41 8
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
#include "M.h"
using namespace std;
 
int main()
{
    setlocale(0, "RUS");
 
    Mnozhestvo mn;
 
    mn.Menu(); //!!!!!
 
    system("pause");
 
    return 0;
}
Добавлено через 18 секунд
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
#ifndef MNOZHESTVO_H
#define MNOZHESTVO_H
 
#include <cstdlib>
#include <ctime>
#include <vector>
using namespace std;
 
class Mnozhestvo{
public:
    Mnozhestvo()
    {
    int n, m;
    int i;
 
    cout << "Введите количество элементов в множестве a:" << endl;
    cin >> n;
    cout << "Введите количество элементов в множестве b:" << endl;
    cin >> m;
 
    vector<int> a(n);
    vector<int> b(m);
 
    srand(time(NULL));
 
    for(i = 0;i < n;i++)
        a[i] = 1 + rand() % 50;
 
    for(i = 0;i < m;i++)
        b[i] = 1 + rand() % 50;
    };
    void add(int, int, vector<int>, vector<int>);
    void del(int, int, vector<int>, vector<int>);
    void crossing(int, int, vector<int>, vector<int>);
    void combination(int, int, vector<int>, vector<int>);
    void raznost(int, int, vector<int>, vector<int>);
    void Menu();
private:
    vector<int> a;
    vector<int> b;
    int n;
    int m;
};
 
#endif
Добавлено через 17 секунд
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
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <vector>
#include <iterator>
#include "M.h"
using namespace std;
 
void Mnozhestvo::add(int n, int m, vector<int> a, vector<int> b){
    char k;
    int z;
 
    z = 1 + rand() % 50;
 
    cout << "Введите ""a"", чтоб добавить элемент в множество A, или ""b"", чтоб добавить элемент в множество B:" << endl;
    cin >> k;
 
    if(k == 'a'){
        a.push_back(z);
        copy(a.begin(), a.end(), ostream_iterator<int>(cout, " "));
        cout << endl;
    }
 
    if(k == 'b'){
        b.push_back(z);
        copy(b.begin(), b.end(), ostream_iterator<int>(cout, " "));
        cout << endl;
    }
}
 
void Mnozhestvo::del(int n, int m, vector<int> a, vector<int> b){
    int d;
    char k;
 
    cout << "Введите ""a"", чтоб удалить элемент из множества A, или ""b"", чтоб удалить элемент из множества B:" << endl;
    cin >> k;
 
    if(k == 'a'){
        cout << "Введите номер элемента множества, который хотите удалить:" << endl;
        cin >> d;
 
        if(d == 0){
            a.erase(a.begin());
            cout << "Новый массив:" << endl;
            copy(a.begin(), a.end(), ostream_iterator<int>(cout, " "));
            cout << endl;
        }
        else{
            a.erase(a.begin() + d);
            cout << "Новый массив:" << endl;
            copy(a.begin(), a.end(), ostream_iterator<int>(cout, " "));
            cout << endl;
        }
    }
 
    if(k == 'b'){
        cout << "Введите номер элемента множества, который хотите удалить:" << endl;
        cin >> d;
 
        if(d == 0){
            b.erase(b.begin());
            cout << "Новый массив:" << endl;
            copy(b.begin(), b.end(), ostream_iterator<int>(cout, " "));
            cout << endl;
        }
        else{
            b.erase(b.begin() + d);
            cout << "Новый массив:" << endl;
            copy(b.begin(), b.end(), ostream_iterator<int>(cout, " "));
            cout << endl;
        }
    }
}
 
void Mnozhestvo::Menu()
{
    int key;
 
    cout << "Выберите операцию, которая будет выполняться над множеством(ами): " << endl;
    cout << "1 - добавление элемента" << endl;
    cout << "2 - удаление элемента" << endl;
 
    cin >> key;
 
    switch (key)
    {
    case 1:
        add(n, m, a, b);
    case 2:
        del(n, m, a, b);
    default:
        break;
    }
}
Добавлено через 47 секунд
убрал параметры ,и фвйлы переименовал работает нормально
0
2753 / 1908 / 568
Регистрация: 05.06.2014
Сообщений: 5,559
15.05.2015, 20:47 9
C++
1
void Mnozhestvo::add(int n, int m, vector<int> a, vector<int> b)
Экхм, меня одного настораживает что эта милая функция читает данные в векторы a и b, которые являются локальными переменными и сдохнут сразу по завершении метода?
1
3660 / 2997 / 828
Регистрация: 25.03.2012
Сообщений: 11,045
Записей в блоге: 1
15.05.2015, 20:59 10
Цитата Сообщение от Sh@dow777 Посмотреть сообщение
Kuzia domovenok, Да ладно вам. Вы думаете, что я с бухты-барахты без материала, без минимальных знаний стал бы писать эту программу? Я читал в Дейтеле про классы.
именно так и думаю, судя по тому как ты применяешь понятие класс, ты именно что не знаешь, что это такое.
во-первых, судя по построению класса вида
C++
1
2
3
4
class Mnozhestvo{
    vector<int> a(n);
    vector<int> b(m);
}
судя по такому построению класса, ты не понимаешь, что класс это лишь ТИП ДАННЫХ, а не сами данные. Что это описание, которое, судя по задумке, описывает одно единственное множество. И для создания двух, нескольких... да вообще скольки угодно множеств, нужно создавать уже экземпляры класса - объекты.
Во-вторых, Renji, сказал уже, а я замечу, что судя по
C++
1
void Mnozhestvo::add(int n, int m, vector<int> a, vector<int> b)
ты опять-таки, не понимаешь, как работают методы класса, ты совершенно не осознаёшь, что достаточно
добавить в класс просто метод void Mnozhestvo::add(), т.е. без параметров и он уже получит доступ к полям класса m, n, a, b.
- это основы инкапсуляции. Ты не мог, как утверждаешь, читать про то, что такое классы и инкапсуляция и после этого писать "такое" - это противоречит всякому смыслу!
0
17 / 17 / 6
Регистрация: 10.12.2013
Сообщений: 740
19.05.2015, 21:28  [ТС] 11
Kuzia domovenok, Спасибо за все ваши замечания. У меня только 2 вопроса. Я погуглил, что для множеств лучше использовать set и multiset. Переделал код, дописал все функции. Вот код:

Множества.h
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
#ifndef MNOZHESTVO_H
#define MNOZHESTVO_H
 
#include <cstdlib>
#include <ctime>
#include <set>
#include <iterator>
using namespace std;
 
class Mnozhestvo{
public:
    Mnozhestvo()
    {
    int i, j;
 
    cout << "Введите количество элементов в множестве a:" << endl;
    cin >> n;
    cout << "Введите количество элементов в множестве b:" << endl;
    cin >> m;
 
    srand(time(NULL));
 
    for(i = 0;i < n;i++){
        j = 1 + rand() % 50;
        a.insert(j);
    }
 
    cout << "Множество A:" << endl;
 
    copy(a.begin(), a.end(), ostream_iterator<int>(cout, " "));
    cout << endl;
 
    cout << "Множество B:" << endl;
 
    for(i = 0;i < m;i++){
        j = 1 + rand() % 50;
        b.insert(j);
    }
 
    copy(b.begin(), b.end(), ostream_iterator<int>(cout, " "));
    cout << endl;
};
    void add();
    void del();
    void crossing();
    void combination();
    void raznost();
    int Menu();
private:
    multiset<int> a;
    multiset<int> b;
    int n;
    int m;
};
 
#endif
Множества.cpp
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
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <set>
#include <iterator>
#include <algorithm>
#include "Множества.h"
using namespace std;
 
void Mnozhestvo::add(){
    char k;
    int z;
 
    z = 1 + rand() % 50;
 
    cout << "Введите ""a"", чтоб добавить элемент в множество A, или ""b"", чтоб добавить элемент в множество B:" << endl;
    cin >> k;
 
    if(k == 'a'){
        a.insert(z);
        copy(a.begin(), a.end(), ostream_iterator<int>(cout, " "));
        cout << endl;
    }
 
    if(k == 'b'){
        b.insert(z);
        copy(b.begin(), b.end(), ostream_iterator<int>(cout, " "));
        cout << endl;
    }
}
 
void Mnozhestvo::del(){
    char k;
 
    cout << "Введите ""a"", чтоб удалить элемент из множества A, или ""b"", чтоб удалить элемент из множества B:" << endl;
    cin >> k;
 
    if(k == 'a'){
 
    a.erase(a.end());
 
    cout << "Новое множество:" << endl;
    copy(a.begin(), a.end(), ostream_iterator<int>(cout, " "));
    cout << endl;
}
 
    if(k == 'b'){
 
    b.erase(b.end());
 
    cout << "Новое множество:" << endl;
    copy(b.begin(), b.end(), ostream_iterator<int>(cout, " "));
    cout << endl;
    }
}
 
void Mnozhestvo::crossing()
{
    multiset<int> c;
 
    set_intersection(a.begin(), a.end(), b.begin(), b.end(), inserter(c, c.begin()));
 
    if(c.empty())
        cout << "Множество пустое." << endl;
    else{
    copy(c.begin(), c.end(), ostream_iterator<int>(cout, " "));
    cout << endl;
   }
}
void Mnozhestvo::combination()
{
    multiset<int> c;
 
    set_union(a.begin(), a.end(), b.begin(), b.end(), inserter(c, c.begin()));
 
    copy(c.begin(), c.end(), ostream_iterator<int>(cout, " "));
    cout << endl;
}
 
void Mnozhestvo::raznost()
{
    set<int> c;
    set<int> d;
 
    set_difference(a.begin(), a.end(), b.begin(), b.end(), inserter(c, c.begin()));
    set_difference(b.begin(), b.end(), a.begin(), a.end(), inserter(d, d.begin()));
 
    cout << "Разность A\\B:" << endl;
    copy(c.begin(), c.end(), ostream_iterator<int>(cout, " "));
    cout << endl;
 
    cout << "Разность B\\A:" << endl;
    copy(d.begin(), d.end(), ostream_iterator<int>(cout, " "));
    cout << endl;
}
int Mnozhestvo::Menu()
{
    int key = 0, i;
 
    for(i = 0;i < 1000;i++){
 
    cout << "Выберите номер операции, которая будет выполняться над множеством(ами): " << endl;
    cout << "1 - добавление элемента" << endl;
    cout << "2 - удаление элемента" << endl;
    cout << "3 - пересечение множеств" << endl;
    cout << "4 - объединение множеств" << endl;
    cout << "5 - разность множеств" << endl;
    cout << "-1 - выход из программы" << endl;
 
    cin >> key;
 
    switch (key)
    {
    case 1:
        add();
        break;
    case 2:
        del();
        break;
    case 3:
        crossing();
        break;
    case 4:
        combination();
        break;
    case 5:
        raznost();
        break;
    case -1:
        system("pause");
        return 0;
    default:
        break;
    }
  }
}
main.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
#include "Множества.h"
using namespace std;
 
void main()
{
    setlocale(0, "RUS");
 
    Mnozhestvo mn;
 
    mn.Menu();
}
Вопрос первый - как все таки правильно организовать конструктор? Нужно перенести вот этот кусок кода в main:

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
int n, m;
    int i, j;
 
    multiset<int> a, b;
 
    cout << "Введите количество элементов в множестве a:" << endl;
    cin >> n;
    cout << "Введите количество элементов в множестве b:" << endl;
    cin >> m;
 
    srand(time(NULL));
 
    for(i = 0;i < n;i++){
        j = 1 + rand() % 50;
        a.insert(j);
    }
 
    cout << "Множество A:" << endl;
 
    copy(a.begin(), a.end(), ostream_iterator<int>(cout, " "));
    cout << endl;
 
    cout << "Множество B:" << endl;
 
    for(i = 0;i < m;i++){
        j = 1 + rand() % 50;
        b.insert(j);
    }
 
    copy(b.begin(), b.end(), ostream_iterator<int>(cout, " "));
    cout << endl;
А в конструктор что передать?

И второй вопрос. Все функции работают нормально, кроме удаления. Вроде указал, что нужно удалять последний элемент множества. Но при удалении выводит ошибку Debug Assertion Failed. Я так понял, что типа выходит за границы множества. Что я не так делаю?

Вот отдельно функция удаления:
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
void Mnozhestvo::del(){
    char k;
 
    cout << "Введите ""a"", чтоб удалить элемент из множества A, или ""b"", чтоб удалить элемент из множества B:" << endl;
    cin >> k;
 
    if(k == 'a'){
 
    a.erase(a.end());
 
    cout << "Новое множество:" << endl;
    copy(a.begin(), a.end(), ostream_iterator<int>(cout, " "));
    cout << endl;
}
 
    if(k == 'b'){
 
    b.erase(b.end());
 
    cout << "Новое множество:" << endl;
    copy(b.begin(), b.end(), ostream_iterator<int>(cout, " "));
    cout << endl;
    }
}
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.05.2015, 21:28
Помогаю со студенческими работами здесь

Описать класс "множество", позваляющий выполнять основные операции
Описать класс &quot;множество&quot;, позваляющий выполнять основные операции: добавление и удаление элемента,...

Описать класс «множество» (добавление и удаление элемента, пересечение, объединение и удаление множеств )
Описать класс «множество», позволяющий выполнять основные операции – добавление и удаление...

Описать класс "множество" вещественных чисел, позволяющий выполнять основные операции
# include &lt;iostream&gt; # include &lt;conio.h&gt; # include &lt;string&gt; # include &lt;stdio.h&gt; #include...

Описать класс "множество"
Описать класс «множество», позволяющий выполнять основные операции — добавление и удаление...

Описать класс "множество", позволяющий выполнять основные операции - добавления и удаление элемента, пересечение, множеств, объединение и разность мно
Люди помогите написать программу, очень нужно!!! Буду очень благодарный........ 1. Описать класс...

Создать класс "Множество строк" (нужно чтобы элементы не повторялись)
Подскажите, как создать класс множество строк( нужно чтоб элементы не повторялись) ? Нужно также...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru