Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.92/13: Рейтинг темы: голосов - 13, средняя оценка - 4.92
7 / 7 / 4
Регистрация: 07.09.2012
Сообщений: 178
1

Нюанс в работе с классом

11.02.2013, 00:56. Показов 2345. Ответов 29
Метки нет (Все метки)

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
#include <iostream>
#include <iomanip>
 
#define const 2
 
using namespace std;
 
int i;
 
class Set
{
public:
    void show();
    void unions();
    void razn();
    void intersection();
    void prenadl();
    ~Set();
private:
    int *A;
    int n;
};
 
 
void Set::show()
{
    cout<<"Введите размерность множества \n";
    cin>>n;
    cout <<"Заполните множество \n";
    A=new int[n];
    for (i=0;i<n;i++)
    {
        cin>>*(A+i);    
    }
    cout<<"Вы ввели следующее множество\n";
    for (i=0;i<n;i++)
    {
        cout<<*(A+i)<<" ";      
    }
    cout<<endl;
}
 
 
Set ::~Set(){
    cout<<"Деструктор\n";
}
int main(){
    setlocale(LC_ALL,"");
    cout<<"Введите "<<const<<" множества \n";
    Set *obj;
    obj=new Set[const];
    for (i=0;i<const;i++){
    obj[i].show();
    }
    system("pause");
    return 0;
}
то как потом обратится к записанным полям что объединить элементы А obj[1] с элементами А obj[2]
или нужно заранее создавать два множества(массива)и над ними проводить операции?
ps по форумам ответа не нашел,подобной темы тоже,в справочная литература которую обычно использую не дала ответа на этот вопрос)
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.02.2013, 00:56
Ответы с готовыми решениями:

Ошибка при работе с классом
Если я запускаю программу в 3 файла(main.cpp, auto.h, auto.cpp) выдает ошибку id returned 1 exit...

Access volation при работе с классом
Есть программа которая складывается с нескольких файлов: SDIMAIN.cpp, Marshut.h, Marshut.cpp. В...

Не вызывается деструктор при работе с классом
Здравствуйте! Не подскажете почему при работе с классом Деструктор не вызывается???? Вот код:...

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

29
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
11.02.2013, 01:04 2
Хмм. Делаешь класс для работы с множеством. Кстати, в качестве хранилища выгоднее использовать std:vector.
А далее создаешь функции типа Aggregate AggrCross(Aggregate A, Aggregate B) - для пересечения. А в классе множества сделать метод для проверки наличия элемента в данном множестве. Кстати, можно еще просто перегрузить некоторые операторы, например + для объединения / - для разности и т.д.
1
7 / 7 / 4
Регистрация: 07.09.2012
Сообщений: 178
11.02.2013, 01:14  [ТС] 3
nonedark2008, спасибо за совет,я и не знал про то что функция обьедениня реализована в vector(просто ещё не изучал)завтра по практикую,результат если что не получится напишу
0
4773 / 2582 / 894
Регистрация: 29.11.2010
Сообщений: 5,590
11.02.2013, 01:21 4
Цитата Сообщение от Vlad_ Посмотреть сообщение
задача такая создать класс для работы с множествами
На всякий случай, переспросите преподавателя, чтобы не получить негативную оценку, как именно должна быть реализована структура хранения данных. Чаще всего работа со "множествами" подразумевает создание дерева или хэш-таблицы в качестве хранилища для данных, а не массива.

Цитата Сообщение от Vlad_ Посмотреть сообщение
то как потом обратится к записанным полям что объединить элементы А obj[1] с элементами А obj[2]
Функции-члены классы могут получать доступ к приватным полям объектов того же класса.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
 
class Set {
 public:
  void insert(int value) {
    // добавление значения
  }
  // объединение, в параметре -- с кем объединять
  Set union(const Set &other) {
    // копирование текущего множества в результат
    Set result(*this); //нужен конструктор копии
    // добавление данных из переданного множества
    for (int i = 0; i < other.size; ++i) {
      result.insert(other.data[i]); // доступ к приватным членам другого объекта
    }
    // возвращение результата
    return result;
  }
 private:
  int size;
  int *data;
};
Цитата Сообщение от nonedark2008 Посмотреть сообщение
Кстати, в качестве хранилища выгоднее использовать std:vector.
В том случае, если хранить дерево в виде двоичной кучи.
0
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
11.02.2013, 02:48 5
lemegeton, конечно в виде дерева хранить выгоднее с точки зрения производительности. Но я сомневаюсь, что сдесь именно этот случай... А так, можно было бы устроить красно-черное дерево для хранения множества...
0
7 / 7 / 4
Регистрация: 07.09.2012
Сообщений: 178
11.02.2013, 21:17  [ТС] 6
lemegeton,
nonedark2008,
однозначно вектор, дерево,хеш таблицы мы не проходили,и это есть в темах, но на будущие,это работа с классами и с указателями внутри класса,динамическое выделение памяти,под массивы.По этому нужно использовать что есть.
0
Пес войны
111 / 88 / 22
Регистрация: 23.02.2012
Сообщений: 653
11.02.2013, 21:31 7
кодобред
C++
1
#define const 2
нигде не увидел delete
C++
1
2
A=new int[n];
obj=new Set[const];
ну а
C++
1
cin>>n;
в методе класса вообще моветон
2
7 / 7 / 4
Регистрация: 07.09.2012
Сообщений: 178
11.02.2013, 21:43  [ТС] 8
NeonLost, константу обьявлять как хочу могу,какая разница то?
а delete нет потому что кода нету,сначала нужно код накатать а потом уже в конце штрихи,ну это я за себя
0
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
11.02.2013, 21:54 9
Vlad_, const - имя определенное в стандарте языка. Имхо, когда кто-то будет читать ваш код и увидит ЭТО, то не поймет. Что вам мешает сейчас написать #define main 2 а потом удивляться, почему ничего не компилируется?
Цитата Сообщение от Vlad_ Посмотреть сообщение
сначала нужно код накатать а потом уже в конце штрихи
Если таким способом строить программу, то в конце будет огромная куча ошибок, из тех "штрихов", которые вы не доделали, забыли сделать, или посчитали не нужными. И говорю сразу, потом их очень сложно выискивать.
1
7 / 7 / 4
Регистрация: 07.09.2012
Сообщений: 178
11.02.2013, 22:51  [ТС] 10
nonedark2008, аа вы за это,я как то и не обратил внимание,поправил,

Добавлено через 39 минут
а что будет результатом конструктора копирования,ведь просто объединить не то,ещё нужно отловить повторения + желательно сортировку сделать
0
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
12.02.2013, 08:08 11
Vlad_, можно реализовать функцию проверки, ноходится ли данный элемент в множестве или нет. Например, пересечение: у нас есть два множества и множество, в которое записывается результат. Пробегаем по всем элементам первого, если такой элемент есть во втором, то добавляем его. Т.е. нужно реализовать функцию добавления элемента в множество, можно добавлять элемент так, чтобы множество было отсортировано.
0
7 / 7 / 4
Регистрация: 07.09.2012
Сообщений: 178
17.02.2013, 16:59  [ТС] 12
nonedark2008, а можно как то на моём коде это дописать?
У меня получилось сделать на объединение и разность однако как сделать что бы пересечение и проверку пренадлежности,не знаю.
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
#include <iostream>
 
using namespace std;
 
class DynArray
{
    unsigned int *arr;
    int n;
public:
    DynArray(int count);
    DynArray(const DynArray &obj);
    ~DynArray();
    void show();
    DynArray& append(const DynArray &obj);
    DynArray& razn(const DynArray &obj);
    DynArray& check(const DynArray &obj);
    
};
 
DynArray::DynArray(int count)
{
    n=count;
    arr=new unsigned int[n];
    for(int i=0;i<n;i++)
        cin>>arr[i];
}
 
DynArray::DynArray(const DynArray &obj){
    n=obj.n;
    arr=new unsigned int[n];
    for(int i=0;i<n;i++)
        arr[i]=obj.arr[i];
}
 
DynArray::~DynArray(){
    cout<<"Деструктор\n";
    delete[] arr;
}
 
void DynArray::show(){
    for(int i=0;i<n;i++)
        cout<<arr[i]<<" ";
    cout<<endl;
}
 
DynArray& DynArray::append(const DynArray &obj){
    unsigned int *tmp=new unsigned int[n+obj.n];
    for(int i=0;i<n;i++)
        tmp[i]=arr[i];
    for(int i=0;i<n;i++)
        tmp[n+i]=obj.arr[i];
 
    arr = tmp;
    n +=obj.n;
    return *this;
}
 
DynArray& DynArray::razn(const DynArray &obj){
    unsigned int *tmp=new unsigned int[n+obj.n];
    for(int i=0;i<n;i++)
        tmp[i]=arr[i];
    for(int i=0;i<n;i++)
        tmp[n+i]=obj.arr[i];
 
    arr = tmp;
    n -=obj.n;
    return *this;
}
 
 
 
int main(){
    setlocale(LC_ALL,"");
    int c1,c2;
    cout<<"Введите рамерность\n";
    cin>>c1>>c2;
    DynArray obj1(c1);
    DynArray obj2(c2);
    
    obj1.show();
    obj2.show();
    cout<<"\n+\n";
    obj1.append(obj2);
    obj1.show();
    cout<<"\n-\n";
    obj1.razn(obj2);
    obj1.show();
 
    system("pause");
    return 0;
}
0
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
17.02.2013, 17:13 13
Vlad_, разность и объединение написаны не верно. Разность - вообще неверно. Объединение - нужно удалять повторяющиеся элементы. Сделай возможность добавлять элементы в множество, иначе не сможешь проверить. Поиск - просто пробегаешь по массиву и сравниваешь с тем что ищешь.
0
7 / 7 / 4
Регистрация: 07.09.2012
Сообщений: 178
17.02.2013, 18:38  [ТС] 14
nonedark2008, а можно как-то поконкретней,пример кода, потому что мне вообще не ясно "добавлять элементы в множество"
в какое множество?
поиск я пробовал сделать тоже не вышло выдавало типо связанное что элемент(который задавался для поиска) не относится к const DynArray
0
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
17.02.2013, 19:28 15
Код у меня нет времени писать, тем более я не дома. У тебя есть класс DynArray, в котором должно хранится множество. Как хранится множество? В массиве, где каждый элемент - элемент множества. Как инициализировать множество? В конструкторе передаешь кол-во элементов, и например массив с этими элементами, а затем копируешь их в созданный внутри класса массив. Как объединять? Тут проблема, можно было бы просто создать множество, в которое запихать элементы из двух других, но тогда попадут и повторяющиеся, что не нужно. Если есть множества с мощностью N1 и N2, то мощность их объединения <= N1 + N2. Т.е. если для их объединения выделить N1+N2 элемента, то этого будет достаточно. Но тогда нужна будет еще одна переменная, чтобы хранить сколько всего элементов в множестве. Как отсеивать повторяющиеся, мы просто добавляем каждый элемент из первых двух, но перед этим кадый раз проверяем - не добавляли ли мы такой элемент ранее. DynArray - из названия следует, что это класс для динамического массива. Т.е. он должен быть динамическим, чего нет. Что нужно? В начале ты указываешь размер массива n, но в последствии, если ты захочешь добавить n+1 элемент, то массив должен увеличиться, чтобы он туда влез.
Т.е. фактически, у тебя должен быть класс, в котором есть массив, кол-во элементов в массиве и текущее кол-во хранимых элементов в массиве. Короче, прежде чем тебе реализовывать работу с множествами - тебе нужно сделать нормальную реализацию динамического массива, с динамическим расширением массива, добавлением элементов, поиском, удалением элементов.
0
7 / 7 / 4
Регистрация: 07.09.2012
Сообщений: 178
23.02.2013, 15:56  [ТС] 16
nonedark2008, если делать так как вы говорите то возникает проблемы при передаче объектов,и получается передать либо кол-во объектов либо размерность объекта
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
#include <iostream>
 
using namespace std;
 
class Set
{
    int *arr;
    int razm;
    
public:
    void input();
    void output();
    void sum(int n,const Set &obj);
 
};
 
 
void Set::input(){
    cin>>razm;
    arr=new int[razm];
    for (int i=0;i<razm;i++)
    {
        cin>>arr[i];
    }
}
 
void Set::sum(int n,const Set &obj){
    int *sumarray=new int[razm+razm];
    for (int i=0;i<n;i++)
    {
        sumarray+=obj[i];
    }
    
 
}
 
void Set::output(){
    for (int i=0;i<razm;i++)
    {
        cout<<arr[i];
    }
    cout<<endl;
}
 
int main(){
    setlocale(LC_ALL,"");
    int n;
    cin>>n;
    Set *obj=new Set[n];
    for (int i=0;i<n;i++)
    {
        obj[i].input();
    }
    for (int i=0;i<n;i++)
    {
        obj[i].output();
    }
    system("pause");
    return 0;
}
в строке
C++
1
sumarray+=obj[i];
ошибка
error C2676: бинарный "[": "const Set" не определяет этот оператор или преобразование к типу приемлемо к встроенному оператору
0
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
23.02.2013, 18:19 17
Посомтри типы элементов, где происходит присваивание - явное несоответствие.
Еще раз повторюсь, забей пока на множества. Тебе нужно сделать класс динамического массива - по нему примеров должно быть достаточно. А уже на основе него нужно делать класс множества.
0
Пес войны
111 / 88 / 22
Регистрация: 23.02.2012
Сообщений: 653
23.02.2013, 20:49 18
мне кажется или на этом месте
C++
1
 obj[i].output();
должно быть
C++
1
 obj[i]->output();
Добавлено через 6 минут
и я не догнал...почему ты используешь скобки, если ты их не перегрузил?
C++
1
sumarray+=obj[i];
0
Эксперт С++
177 / 163 / 21
Регистрация: 12.02.2013
Сообщений: 410
23.02.2013, 21:46 19
Цитата Сообщение от nonedark2008 Посмотреть сообщение
Еще раз повторюсь, забей пока на множества. Тебе нужно сделать класс динамического массива - по нему примеров должно быть достаточно. А уже на основе него нужно делать класс множества.
А нельзя пользоваться vector в качестве динамического массива и с его помощью реализовать класс множество, который просто следит за уникальностью в нем элементов?
0
7 / 7 / 4
Регистрация: 07.09.2012
Сообщений: 178
24.02.2013, 17:55  [ТС] 20
ITcrusader, использовать и можно только вот в рамки не входит,нужно ограничится только,классами ну и шаблонами классов максимум.

Добавлено через 3 часа 3 минуты
а если использовать вектор как это упростит задачу?
0
24.02.2013, 17:55
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.02.2013, 17:55
Помогаю со студенческими работами здесь

Краткое руководство по работе с классом TCanvas для начинающих
Вступление Часто на форуме возникают вопросы по поводу рисования той или иной фигуры на канве, а...

Исключение при работе с классом System.Collections.Generic.Dictionary
Делаю программу, которая будет загружать альбомы с музыкой. Возникла проблема со следующей...

Изменить табуляцию при работе с классом XmlDocument перед сохранением файла
Работаю с XML по средствам класса XmlDocument, после того как документ создан, сохраняю его в файл...

"Индекс находится за пределами массива" при работе с классом Task
public void CreateRandomConnects(int ConnectsPerNode) { int Keys = Nodes.Keys.ToArray(); ...


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

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