Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/25: Рейтинг темы: голосов - 25, средняя оценка - 4.80
 Аватар для ka_chu
6 / 6 / 5
Регистрация: 05.05.2015
Сообщений: 27

Реализовать класс абстрактного типа данных "Множество"

28.12.2015, 19:18. Показов 5206. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго вечера!

Требуется помощь с задачей. Никак не могу понять, что не так. Может в указателях дело, не знаю уже...
Необходимо реализовать класс абстрактного типа данных - множество. Перегрузить оператор* задав на нём пересечение множеств, и оператор+ добавление элемента множества. Элементы типа char.
Поля класса:
C++
1
2
3
    int maxsize; //максимальная длина массива
    int cursize; //количество заполненных элементов
    char* data;
Программа уходит в ошибку: std::bad_alloc at memory location.
Проблема скорее всего в реализации пересечения множеств Set& Set::operator*(const Set& ob). После этой операции (A * B) ошибки нет, но когда результат нужно присвоить Set C = A * B возникает исключние.
Привожу только часть кода, чтобы не загромождать, перегрузка *(пересечение) и = (присваивание).

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
Set& Set::operator=(const Set& ob)
{
    if (this == &ob) return *this;
    maxsize = ob.maxsize;
    cursize = ob.cursize;
    delete[] data;
    data = new char[maxsize];
    for (int i = 0; i < cursize; i++){
        data[i] = ob.data[i];
        std::cout << data[i] << std::endl;
    }
    return *this;
}
Set& Set::operator*(const Set& ob)
{
    Set intersection = Set(maxsize);
    int k = 0;
    for (int i = 0; i < cursize; i++){
        for (int j = 0; j < ob.cursize; j++){
            if (data[i] == ob.data[j]){
                intersection.data[i] = data[i];
                k++;
                continue;
                std::cout << i << ' ' << j;
            }
        }
    }
    intersection.cursize = k;
    return intersection;
}

Полный файлов Set.h, Set.cpp, Consoleapp.cpp под катом.
Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#pragma once
class Set
{
public:
    Set(int n);
    Set(const Set& ob);
    ~Set();
 
    void show();
 
    Set& operator = (const Set& ob);
    Set& operator + (const char c);
    Set& operator * (const Set& ob);
 
private:
    int maxsize; //максимальная длина массива
    int cursize; //количество заполненных элементов
    char* data;
};
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
#include "stdafx.h"
#include "Set.h"
#include <iostream>
 
Set::Set(int n)
{
    maxsize = n;
    data = new char[maxsize];
    cursize = 0;
}
Set::Set(const Set& ob)
{
    maxsize = ob.maxsize;
    cursize = ob.cursize;
    data = new char[maxsize];
    for (int i = 0; i < cursize; i++)
        data[i] = ob.data[i];
}
Set::~Set()
{
    delete[] data;
}
Set& Set::operator=(const Set& ob)
{
    if (this == &ob) return *this;
    maxsize = ob.maxsize;
    cursize = ob.cursize;
    delete[] data;
    data = new char[maxsize];
    for (int i = 0; i < cursize; i++){
        data[i] = ob.data[i];
        std::cout << data[i] << std::endl;
    }
    return *this;
}
Set& Set::operator+(const char c)
{
    data[cursize] = c;
    cursize++;
    return *this;
}
Set& Set::operator*(const Set& ob)
{
    Set intersection = Set(maxsize);
    int k = 0;
    for (int i = 0; i < cursize; i++){
        for (int j = 0; j < ob.cursize; j++){
            if (data[i] == ob.data[j]){
                intersection.data[i] = data[i];
                k++;
                continue;
                std::cout << i << ' ' << j;
            }
        }
    }
    intersection.cursize = k;
    return intersection;
}
void Set::show()
{
    for (int i = 0; i < cursize; i++){
        std::cout << data[i] << ' ';
    }
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include "stdafx.h"
#include "Set.h"
#include <iostream>
 
int _tmain(int argc, _TCHAR* argv[])
{
    Set A = Set(10);
    Set B = Set(10);
 
    A = A + 'a' + 'b' + 'c' + 'd';
    B = B + 'e' + 'f' + 'b' + 'a' + 'z' + 'x';
 
    A.show();
    B.show();
    
    Set C = A * B;
 
    C.show();
    
    system("PAUSE");
    return 0;
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
28.12.2015, 19:18
Ответы с готовыми решениями:

Реализовать класс "Динамический массив"
1. Согласно заданию реализовать класс абстрактного типа данных (далее АТД) как динамический массив. Для этого определение класса должно...

Создание абстрактного типа данных
Сейчас читаю книгу Брюса Эккеля - Философия C++. Вот там одно их задиний: &quot;Создайте абстрактный типа данных Video для представления...

Класс- контейнер МНОЖЕСТВО с элементами типа int. Реализовать операции
1. Реализовать класс, перегрузить для него операции, указанные в варианте. 2. Определить исключительные ситуации. 3. Предусмотреть...

2
 Аватар для Геомеханик
838 / 641 / 940
Регистрация: 26.06.2015
Сообщений: 1,409
28.12.2015, 21:23
ka_chu, вот держи добавил изменений немного.
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
#include <iostream>
 
class Set {
private:
    char* data;
    int   maxsize;
    int   cursize;
public:
 
    Set(int n){
        maxsize = n;
        data    = new char[maxsize];
        cursize = 0;
    }
    Set(const Set& ob){
        maxsize = ob.maxsize;
        cursize = ob.cursize;
        data    = new char[maxsize];
        for(int i = 0; i < cursize; i++)
            data[i] = ob.data[i];
    }
    ~Set(){
        delete[] data;
    }
 
public:
 
    //упорядоченная вставка при помощи двоичного поиска
    Set& operator + (const char c){
        if(cursize >= maxsize)
            return *this;
        else if(! cursize || (c > data[cursize - 1])){
            data[cursize++] = c;
            return *this;
        }
 
        int m, f = 0, l = cursize;
        while(f < l){
            m = f + (l - f) / 2;
            if(c == data[m])
                return *this;
            else if(c < data[m])
                l = m;
            else
                f = m + 1;
        }
 
        for(int i = cursize; i > f; --i)
            data[i] = data[i - 1];
 
        data[f] = c;
        ++cursize;
        return *this;
    }
 
    Set operator * (const Set& ob){
        int n = 0, i = 0, j = 0;
        while((i < cursize) && (j < ob.cursize)){
            if(data[i] < ob.data[j])
                ++i;
            else if(ob.data[j] < data[i])
                ++j;
            else {
                ++n;
                ++j;
                ++i;
            }
        }
 
        Set ss(n);
        i = j = 0;
        while((i < cursize) && (j < ob.cursize)){
            if(data[i] < ob.data[j])
                ++i;
            else if(ob.data[j] < data[i])
                ++j;
            else {
                ss = ss + data[i++];
                ++j;
            }
        }
        return ss;
    }
 
    //...
 
    void show(void){
        for(int i = 0; i < cursize; ++i)
            std::cout << data[i] << ' ';
        std::cout << std::endl;
    }
};
 
 
int main(void){
    Set A = Set(10);
    Set B = Set(10);
 
    A = A + 'a' + 'b' + 'x' + 'c' + 'd' + 'w';
    B = B + 'e' + 'f' + 'b' + 'w' + 'a' + 'z' + 'x';
 
    A.show();
    B.show();
 
    Set C = A * B;
    C.show();
    return 0;
}
Пример работы кода
1
 Аватар для ka_chu
6 / 6 / 5
Регистрация: 05.05.2015
Сообщений: 27
29.12.2015, 20:24  [ТС]
Геомеханик, Спасибо большое!!

А не могли бы Вы объяснить, почему необходимо в случае, когда метод возвращает свой экземпляр *this, тип метода должен быть со ссылкой Set&, а когда возвращается другой созданный экземпляр тип метода просто Set.

Свой код я подредактировал в соответствии с этим и всё заработало, только конечно без сортировки как у Вас. Плюс там ещё надо было вместо continue break поставить. Моя невнимательность.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Set Set::operator*(const Set& ob)
{
    Set& intersection = Set(maxsize);
    int k = 0;
    for (int i = 0; i < cursize; i++){
        for (int j = 0; j < ob.cursize; j++){
            if (data[i] == ob.data[j]){
                intersection.data[i] = data[i];
                k++;
                break;
            }
        }
    }
    intersection.cursize = k;
    return intersection;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
29.12.2015, 20:24
Помогаю со студенческими работами здесь

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

Реализовать класс GenericLIFO для произвольного типа данных (стек LIFO)
Реализовать класс GenericLIFO представляющий коллекцию переменного размера для произвольного типа данных(стек LIFO). Реализовать методы ...

Написание абстрактного типа данных (полиморфная коллекция)
Помогите, пожалуйста, с программой. Необходимо написать абстрактный тип данных (полиморфную коллекцию), поэтому использован указатель типа ...

Полиморфизм реализации абстрактного типа данных на основе динамического массива
ТЗ 1. Необходимо реализовать абстрактный тип данных на основе динамического массива. 2. Программа должна быть написана на языке С....

Реализовать класс GenericsFIFO). представляющий коллекцию переменного размера для произвольного типа данных (очередь FIF
Реализовать класс GenericsFIFO). представляющий коллекцию переменного размера для произвольного типа данных (очередь FIFO).). ...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru