С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

11.02.2013, 00:56. Просмотров 1110. Ответов 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 по форумам ответа не нашел,подобной темы тоже,в справочная литература которую обычно использую не дала ответа на этот вопрос)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
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++
Доброе времени суток...у меня проблема в создании класса - динамического массива! проблема в изминении определённого элемента и вывода на...

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

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


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

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