Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 8, средняя оценка - 4.75
Vlad_
7 / 7 / 0
Регистрация: 07.09.2012
Сообщений: 174
11.02.2013, 00:56     Нюанс в работе с классом #1
задача такая создать класс для работы с множествами
и реализовать в нём функции для объединения разности множеств и т.д
если я запонляю поля класса так как в коде
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 по форумам ответа не нашел,подобной темы тоже,в справочная литература которую обычно использую не дала ответа на этот вопрос)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.02.2013, 00:56     Нюанс в работе с классом
Посмотрите здесь:

C++ борлэнд с++ один нюанс
C++ Ошибка в работе с классом "очередь"
C++ программа с классом
работа с классом C++
C++ работа с классом
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
nonedark2008
624 / 502 / 92
Регистрация: 28.07.2012
Сообщений: 1,343
11.02.2013, 01:04     Нюанс в работе с классом #2
Хмм. Делаешь класс для работы с множеством. Кстати, в качестве хранилища выгоднее использовать std:vector.
А далее создаешь функции типа Aggregate AggrCross(Aggregate A, Aggregate B) - для пересечения. А в классе множества сделать метод для проверки наличия элемента в данном множестве. Кстати, можно еще просто перегрузить некоторые операторы, например + для объединения / - для разности и т.д.
Vlad_
7 / 7 / 0
Регистрация: 07.09.2012
Сообщений: 174
11.02.2013, 01:14  [ТС]     Нюанс в работе с классом #3
nonedark2008, спасибо за совет,я и не знал про то что функция обьедениня реализована в vector(просто ещё не изучал)завтра по практикую,результат если что не получится напишу
lemegeton
 Аватар для lemegeton
2910 / 1339 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
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.
В том случае, если хранить дерево в виде двоичной кучи.
nonedark2008
624 / 502 / 92
Регистрация: 28.07.2012
Сообщений: 1,343
11.02.2013, 02:48     Нюанс в работе с классом #5
lemegeton, конечно в виде дерева хранить выгоднее с точки зрения производительности. Но я сомневаюсь, что сдесь именно этот случай... А так, можно было бы устроить красно-черное дерево для хранения множества...
Vlad_
7 / 7 / 0
Регистрация: 07.09.2012
Сообщений: 174
11.02.2013, 21:17  [ТС]     Нюанс в работе с классом #6
lemegeton,
nonedark2008,
однозначно вектор, дерево,хеш таблицы мы не проходили,и это есть в темах, но на будущие,это работа с классами и с указателями внутри класса,динамическое выделение памяти,под массивы.По этому нужно использовать что есть.
NeonLost
Пес войны
 Аватар для NeonLost
74 / 85 / 3
Регистрация: 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;
в методе класса вообще моветон
Vlad_
7 / 7 / 0
Регистрация: 07.09.2012
Сообщений: 174
11.02.2013, 21:43  [ТС]     Нюанс в работе с классом #8
NeonLost, константу обьявлять как хочу могу,какая разница то?
а delete нет потому что кода нету,сначала нужно код накатать а потом уже в конце штрихи,ну это я за себя
nonedark2008
624 / 502 / 92
Регистрация: 28.07.2012
Сообщений: 1,343
11.02.2013, 21:54     Нюанс в работе с классом #9
Vlad_, const - имя определенное в стандарте языка. Имхо, когда кто-то будет читать ваш код и увидит ЭТО, то не поймет. Что вам мешает сейчас написать #define main 2 а потом удивляться, почему ничего не компилируется?
Цитата Сообщение от Vlad_ Посмотреть сообщение
сначала нужно код накатать а потом уже в конце штрихи
Если таким способом строить программу, то в конце будет огромная куча ошибок, из тех "штрихов", которые вы не доделали, забыли сделать, или посчитали не нужными. И говорю сразу, потом их очень сложно выискивать.
Vlad_
7 / 7 / 0
Регистрация: 07.09.2012
Сообщений: 174
11.02.2013, 22:51  [ТС]     Нюанс в работе с классом #10
nonedark2008, аа вы за это,я как то и не обратил внимание,поправил,

Добавлено через 39 минут
а что будет результатом конструктора копирования,ведь просто объединить не то,ещё нужно отловить повторения + желательно сортировку сделать
nonedark2008
624 / 502 / 92
Регистрация: 28.07.2012
Сообщений: 1,343
12.02.2013, 08:08     Нюанс в работе с классом #11
Vlad_, можно реализовать функцию проверки, ноходится ли данный элемент в множестве или нет. Например, пересечение: у нас есть два множества и множество, в которое записывается результат. Пробегаем по всем элементам первого, если такой элемент есть во втором, то добавляем его. Т.е. нужно реализовать функцию добавления элемента в множество, можно добавлять элемент так, чтобы множество было отсортировано.
Vlad_
7 / 7 / 0
Регистрация: 07.09.2012
Сообщений: 174
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;
}
nonedark2008
624 / 502 / 92
Регистрация: 28.07.2012
Сообщений: 1,343
17.02.2013, 17:13     Нюанс в работе с классом #13
Vlad_, разность и объединение написаны не верно. Разность - вообще неверно. Объединение - нужно удалять повторяющиеся элементы. Сделай возможность добавлять элементы в множество, иначе не сможешь проверить. Поиск - просто пробегаешь по массиву и сравниваешь с тем что ищешь.
Vlad_
7 / 7 / 0
Регистрация: 07.09.2012
Сообщений: 174
17.02.2013, 18:38  [ТС]     Нюанс в работе с классом #14
nonedark2008, а можно как-то поконкретней,пример кода, потому что мне вообще не ясно "добавлять элементы в множество"
в какое множество?
поиск я пробовал сделать тоже не вышло выдавало типо связанное что элемент(который задавался для поиска) не относится к const DynArray
nonedark2008
624 / 502 / 92
Регистрация: 28.07.2012
Сообщений: 1,343
17.02.2013, 19:28     Нюанс в работе с классом #15
Код у меня нет времени писать, тем более я не дома. У тебя есть класс DynArray, в котором должно хранится множество. Как хранится множество? В массиве, где каждый элемент - элемент множества. Как инициализировать множество? В конструкторе передаешь кол-во элементов, и например массив с этими элементами, а затем копируешь их в созданный внутри класса массив. Как объединять? Тут проблема, можно было бы просто создать множество, в которое запихать элементы из двух других, но тогда попадут и повторяющиеся, что не нужно. Если есть множества с мощностью N1 и N2, то мощность их объединения <= N1 + N2. Т.е. если для их объединения выделить N1+N2 элемента, то этого будет достаточно. Но тогда нужна будет еще одна переменная, чтобы хранить сколько всего элементов в множестве. Как отсеивать повторяющиеся, мы просто добавляем каждый элемент из первых двух, но перед этим кадый раз проверяем - не добавляли ли мы такой элемент ранее. DynArray - из названия следует, что это класс для динамического массива. Т.е. он должен быть динамическим, чего нет. Что нужно? В начале ты указываешь размер массива n, но в последствии, если ты захочешь добавить n+1 элемент, то массив должен увеличиться, чтобы он туда влез.
Т.е. фактически, у тебя должен быть класс, в котором есть массив, кол-во элементов в массиве и текущее кол-во хранимых элементов в массиве. Короче, прежде чем тебе реализовывать работу с множествами - тебе нужно сделать нормальную реализацию динамического массива, с динамическим расширением массива, добавлением элементов, поиском, удалением элементов.
Vlad_
7 / 7 / 0
Регистрация: 07.09.2012
Сообщений: 174
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" не определяет этот оператор или преобразование к типу приемлемо к встроенному оператору
nonedark2008
624 / 502 / 92
Регистрация: 28.07.2012
Сообщений: 1,343
23.02.2013, 18:19     Нюанс в работе с классом #17
Посомтри типы элементов, где происходит присваивание - явное несоответствие.
Еще раз повторюсь, забей пока на множества. Тебе нужно сделать класс динамического массива - по нему примеров должно быть достаточно. А уже на основе него нужно делать класс множества.
NeonLost
Пес войны
 Аватар для NeonLost
74 / 85 / 3
Регистрация: 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];
ITcrusader
Эксперт C++
 Аватар для ITcrusader
176 / 162 / 8
Регистрация: 12.02.2013
Сообщений: 410
23.02.2013, 21:46     Нюанс в работе с классом #19
Цитата Сообщение от nonedark2008 Посмотреть сообщение
Еще раз повторюсь, забей пока на множества. Тебе нужно сделать класс динамического массива - по нему примеров должно быть достаточно. А уже на основе него нужно делать класс множества.
А нельзя пользоваться vector в качестве динамического массива и с его помощью реализовать класс множество, который просто следит за уникальностью в нем элементов?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.02.2013, 17:55     Нюанс в работе с классом
Еще ссылки по теме:

Swith - нюанс C++
Не вызывается деструктор при работе с классом C++

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

Или воспользуйтесь поиском по форуму:
Vlad_
7 / 7 / 0
Регистрация: 07.09.2012
Сообщений: 174
24.02.2013, 17:55  [ТС]     Нюанс в работе с классом #20
ITcrusader, использовать и можно только вот в рамки не входит,нужно ограничится только,классами ну и шаблонами классов максимум.

Добавлено через 3 часа 3 минуты
а если использовать вектор как это упростит задачу?
Yandex
Объявления
24.02.2013, 17:55     Нюанс в работе с классом
Ответ Создать тему
Опции темы

Текущее время: 18:55. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru