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

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

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

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

11.02.2013, 00:56. Просмотров 1056. Ответов 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++):

Не вызывается деструктор при работе с классом - 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++
Доброе времени суток...у меня проблема в создании класса - динамического массива! проблема в изминении определённого элемента и вывода на...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
nonedark2008
904 / 643 / 131
Регистрация: 28.07.2012
Сообщений: 1,737
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
2923 / 1352 / 135
Регистрация: 29.11.2010
Сообщений: 2,725
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
904 / 643 / 131
Регистрация: 28.07.2012
Сообщений: 1,737
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
904 / 643 / 131
Регистрация: 28.07.2012
Сообщений: 1,737
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
904 / 643 / 131
Регистрация: 28.07.2012
Сообщений: 1,737
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
904 / 643 / 131
Регистрация: 28.07.2012
Сообщений: 1,737
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
904 / 643 / 131
Регистрация: 28.07.2012
Сообщений: 1,737
17.02.2013, 19:28 #15
Код у меня нет времени писать, тем более я не дома. У тебя есть класс DynArray, в котором должно хранится множество. Как хранится множество? В массиве, где каждый элемент - элемент множества. Как инициализировать множество? В конструкторе передаешь кол-во элементов, и например массив с этими элементами, а затем копируешь их в созданный внутри класса массив. Как объединять? Тут проблема, можно было бы просто создать множество, в которое запихать элементы из двух других, но тогда попадут и повторяющиеся, что не нужно. Если есть множества с мощностью N1 и N2, то мощность их объединения <= N1 + N2. Т.е. если для их объединения выделить N1+N2 элемента, то этого будет достаточно. Но тогда нужна будет еще одна переменная, чтобы хранить сколько всего элементов в множестве. Как отсеивать повторяющиеся, мы просто добавляем каждый элемент из первых двух, но перед этим кадый раз проверяем - не добавляли ли мы такой элемент ранее. DynArray - из названия следует, что это класс для динамического массива. Т.е. он должен быть динамическим, чего нет. Что нужно? В начале ты указываешь размер массива n, но в последствии, если ты захочешь добавить n+1 элемент, то массив должен увеличиться, чтобы он туда влез.
Т.е. фактически, у тебя должен быть класс, в котором есть массив, кол-во элементов в массиве и текущее кол-во хранимых элементов в массиве. Короче, прежде чем тебе реализовывать работу с множествами - тебе нужно сделать нормальную реализацию динамического массива, с динамическим расширением массива, добавлением элементов, поиском, удалением элементов.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.02.2013, 19:28
Привет! Вот еще темы с ответами:

работа с классом - C++
Разработайте класс, моделирующий рациональные числа как несократимые дроби, включающий числитель Num и знаменатель Den. Предусмотрите...

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

Задача с классом - C++
Здравствуйте. Имеется следующий класс. class CClass { private: int *arr; const int size;

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


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
17.02.2013, 19:28
Ответ Создать тему
Опции темы

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