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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 8, средняя оценка - 4.75
Vlad_
7 / 7 / 0
Регистрация: 07.09.2012
Сообщений: 178
#1

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

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

задача такая создать класс для работы с множествами
и реализовать в нём функции для объединения разности множеств и т.д
если я запонляю поля класса так как в коде
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++
Здравствуйте! Не подскажете почему при работе с классом Деструктор не вызывается???? Вот код: #define _CRTDBG_MAP_ALLOC ...

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

Ошибка в работе с классом "очередь" - C++
Скажите пожалуйста, почему указатель на хвост очереди после инициализации всегда направлен в NULL, а на голову в адрес 158? (через...

Swith - нюанс - C++
Такой вот вопрос: как сделать так, что бы при неправильном вводе пользователя какой-либо строки, вопрос о повторении ввода не выбивался...

Нюанс с dynamic_cast: может ли указанное приведение типов быть корректным? - C++
Может ли такое приведение типов (второй dynamic_cast) быть корректным?:class A {public: virtual ~A() {}}; class B : private virtual A...

программа с классом - C++
Помогите пожалуйста с программой, в которой класс sphere представляет шары. Конструктор с параметрами позволяет задать номер, цвет и радиус...

Ошибка с классом. - C++
Здравствуйте. Возникла проблема с классом. http://codepad.org/XpTrKcAC В чем может быть проблема?

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

Добавлено через 39 минут
а что будет результатом конструктора копирования,ведь просто объединить не то,ещё нужно отловить повторения + желательно сортировку сделать
nonedark2008
886 / 625 / 126
Регистрация: 28.07.2012
Сообщений: 1,683
12.02.2013, 08:08     Нюанс в работе с классом #11
Vlad_, можно реализовать функцию проверки, ноходится ли данный элемент в множестве или нет. Например, пересечение: у нас есть два множества и множество, в которое записывается результат. Пробегаем по всем элементам первого, если такой элемент есть во втором, то добавляем его. Т.е. нужно реализовать функцию добавления элемента в множество, можно добавлять элемент так, чтобы множество было отсортировано.
Vlad_
7 / 7 / 0
Регистрация: 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;
}
nonedark2008
886 / 625 / 126
Регистрация: 28.07.2012
Сообщений: 1,683
17.02.2013, 17:13     Нюанс в работе с классом #13
Vlad_, разность и объединение написаны не верно. Разность - вообще неверно. Объединение - нужно удалять повторяющиеся элементы. Сделай возможность добавлять элементы в множество, иначе не сможешь проверить. Поиск - просто пробегаешь по массиву и сравниваешь с тем что ищешь.
Vlad_
7 / 7 / 0
Регистрация: 07.09.2012
Сообщений: 178
17.02.2013, 18:38  [ТС]     Нюанс в работе с классом #14
nonedark2008, а можно как-то поконкретней,пример кода, потому что мне вообще не ясно "добавлять элементы в множество"
в какое множество?
поиск я пробовал сделать тоже не вышло выдавало типо связанное что элемент(который задавался для поиска) не относится к const DynArray
nonedark2008
886 / 625 / 126
Регистрация: 28.07.2012
Сообщений: 1,683
17.02.2013, 19:28     Нюанс в работе с классом #15
Код у меня нет времени писать, тем более я не дома. У тебя есть класс DynArray, в котором должно хранится множество. Как хранится множество? В массиве, где каждый элемент - элемент множества. Как инициализировать множество? В конструкторе передаешь кол-во элементов, и например массив с этими элементами, а затем копируешь их в созданный внутри класса массив. Как объединять? Тут проблема, можно было бы просто создать множество, в которое запихать элементы из двух других, но тогда попадут и повторяющиеся, что не нужно. Если есть множества с мощностью N1 и N2, то мощность их объединения <= N1 + N2. Т.е. если для их объединения выделить N1+N2 элемента, то этого будет достаточно. Но тогда нужна будет еще одна переменная, чтобы хранить сколько всего элементов в множестве. Как отсеивать повторяющиеся, мы просто добавляем каждый элемент из первых двух, но перед этим кадый раз проверяем - не добавляли ли мы такой элемент ранее. DynArray - из названия следует, что это класс для динамического массива. Т.е. он должен быть динамическим, чего нет. Что нужно? В начале ты указываешь размер массива n, но в последствии, если ты захочешь добавить n+1 элемент, то массив должен увеличиться, чтобы он туда влез.
Т.е. фактически, у тебя должен быть класс, в котором есть массив, кол-во элементов в массиве и текущее кол-во хранимых элементов в массиве. Короче, прежде чем тебе реализовывать работу с множествами - тебе нужно сделать нормальную реализацию динамического массива, с динамическим расширением массива, добавлением элементов, поиском, удалением элементов.
Vlad_
7 / 7 / 0
Регистрация: 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" не определяет этот оператор или преобразование к типу приемлемо к встроенному оператору
nonedark2008
886 / 625 / 126
Регистрация: 28.07.2012
Сообщений: 1,683
23.02.2013, 18:19     Нюанс в работе с классом #17
Посомтри типы элементов, где происходит присваивание - явное несоответствие.
Еще раз повторюсь, забей пока на множества. Тебе нужно сделать класс динамического массива - по нему примеров должно быть достаточно. А уже на основе него нужно делать класс множества.
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++
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     Нюанс в работе с классом
Еще ссылки по теме:

Работа с классом - C++
Необходимо написать класс который будет переводить из 16-ой системы счисления числа в 10-ю систему счисления, классы только неделю назад...

Работа с классом - C++
Приветствую.Начал изучать с++ , возникла вот такая программка : в классе целых чисел между соседними отрицательными вставить нолик ) Буду...

работа с классом - C++
Напсал код: #include &lt;IOSTREAM&gt; #include &lt;fstream&gt; #include &quot;rus.h&quot; #include &quot;work.h&quot; using namespace std; class Temperatura ...

Работа с классом - C++
Работа с классом, карточку отдела кадров(обеспечить вывод на экран в удобном виде, печать сообщения при достижении пенсионного возраста)....

работа с классом - C++
пишу класс быстрой математики (знаю что многие делали в инете дофига всего, но всё же) сделал таблицу корней в общем то всё работает...


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

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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru