Форум программистов, компьютерный форум 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,340
24.02.2013, 17:58     Нюанс в работе с классом #21
Цитата Сообщение от Vlad_ Посмотреть сообщение
а если использовать вектор как это упростит задачу?
Не придется реализовывать свой класс динамического массива для хранения элементов множества, не придется реализовывать методы для добавления/удаления/объединения/поиска элементов.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ITcrusader
Эксперт C++
 Аватар для ITcrusader
176 / 162 / 8
Регистрация: 12.02.2013
Сообщений: 410
24.02.2013, 19:22     Нюанс в работе с классом #22
Цитата Сообщение от Vlad_ Посмотреть сообщение
а если использовать вектор как это упростит задачу?
Ну, скажем так, даже не вектор лучше, а список, думаю. Просто он абсолютно подходит для решения задачи, реализует, как написал уже nonedark2008, все операции. Остается просто воспользоваться его реализацией, добавив лишь контроль над уникальностью в нем элементов. Т.е. создать тот же list, но без дубликатов.
Vlad_
7 / 7 / 0
Регистрация: 07.09.2012
Сообщений: 174
26.02.2013, 00:52  [ТС]     Нюанс в работе с классом #23
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
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
typedef __int16 int16_t;
typedef unsigned __int16 uint16_t;
 
#include <iostream>
#include <string>
 
using namespace std;
 
class Set {
public:
    typedef int16_t ValueType;
    typedef uint16_t UnsignedValueType;
    typedef unsigned int StorageType;
    Set()
        : data_size_((1 << (sizeof(ValueType) * 8)) / (sizeof(StorageType) * 8)),
        data_(new StorageType[data_size_]) {
            for (int i = 0; i < data_size_; ++i)
                data_[i] = 0;
    }
    Set(const Set &other)
        : data_size_(other.data_size_),
        data_(new StorageType[data_size_]) {
            for (size_t i = 0; i < data_size_; ++i)
                data_[i] = other.data_[i];
    }
    ~Set() {
        //cout<<"Деструктор\n";
        delete [] data_;
    }
    int Has(ValueType value) const {
        UnsignedValueType uvalue = static_cast<UnsignedValueType>(value);
        return data_[uvalue / (sizeof(StorageType) * 8)] &
            (1 << (uvalue % (sizeof(StorageType) *8 )));
    }
    void Add(ValueType value) const {
        UnsignedValueType uvalue = static_cast<UnsignedValueType>(value);
        data_[uvalue / (sizeof(StorageType) * 8)] |=(1 << (uvalue % (sizeof(StorageType) * 8)));
    }
    void Remove(ValueType value) const {
        UnsignedValueType uvalue = static_cast<UnsignedValueType>(value);
        data_[uvalue / (sizeof(StorageType) * 8)] &=
            ~(1 << (uvalue % (sizeof(StorageType) * 8)));
    }
    bool IsEmpty() const {
        for (size_t i = 0; i < data_size_; ++i)
            if (data_[i] != 0)
                return false;
        return true;
    }
    size_t DataSize() const {
        return data_size_;
    }
    Set Intersection(const Set &other) {
        Set result;
        for (int i = 0; i < data_size_; ++i)
            result.data_[i] = data_[i] & other.data_[i];
        return result;
    }
    Set Union(const Set &other) {
        Set result;
        for (int i = 0; i < data_size_; ++i)
            result.data_[i] = data_[i] | other.data_[i];
        return result;
    }
    Set Complement(const Set &other) {
        Set result;
        for (int i = 0; i < data_size_; ++i)
            result.data_[i] = data_[i] & ~other.data_[i];
        return result;
    }
 
    void check() {
        int prov;
        cout<<"Введите число для проверки\n";
        cin>>prov;
        for (UnsignedValueType i = 0; i <= (1 << (sizeof(ValueType) * 8) - 1); ++i){
            
            if (ValueType(i)=prov){
                cout<<"Пренадлежит\n";
                break;
            }
            else cout<<"Не пренадлежит\n";
            break;
        }
    }
 
    Set &operator=(const Set &other) {
        if (&other != this) {
            data_size_ = other.data_size_;
            delete [] data_;
            data_ = new StorageType[data_size_];
            for (size_t i = 0; i < data_size_; ++i)
                data_[i] = other.data_[i];
        }
        return *this;
    }
    void PrintAllNumbers() {
        for (UnsignedValueType i = 0; i <= (1 << (sizeof(ValueType) * 8) - 1); ++i)
            if (Has(i))
                cout<<" "<<ValueType(i);
        cout<<endl;
    }
private:
    size_t data_size_;
    StorageType *data_;
};
 
int main() {
    setlocale(0,"");
    do{
        system("CLS");
    Set a, b, c;
    int n;
    cout<<"Введите рамерность множеств\n";
    cin>>n;
    for (int i = 0; i < n; ++i) a.Add(rand() % 10);
    for (int i = 0; i < n; ++i) b.Add(rand() % 10);
 
    cout<<"Сгенерированное множество a: ";
    a.PrintAllNumbers();
    cout<<"Сгенерированное множество b: ";
    b.PrintAllNumbers();
 
    cout<<("Объединение : ");
    a.Union(b).PrintAllNumbers();
 
    cout<<"Пересечиние: ";
    a.Intersection(b).PrintAllNumbers();
 
    cout<<"Разность: ";
    a.Complement(b).Union(b.Complement(a)).PrintAllNumbers();
 
    cout<<"Проверка на пренадлежность \n";
    cout<<"Для множества a \n";
    a.check();
    cout<<"Для множества b \n";
    b.check();
    
    system("pause");
    }while(true);
    return  0;
}
можете помочь отладить функциюю check потому что он единственная которая не работает,точнее она работает но не корректно ,почему то всё ей подходит
nonedark2008
624 / 502 / 92
Регистрация: 28.07.2012
Сообщений: 1,340
26.02.2013, 01:22     Нюанс в работе с классом #24
Цитата Сообщение от Vlad_ Посмотреть сообщение
можете помочь отладить
Я пока не понимаю даже задумки... Что за ValueType? StorageType? Что это за махинации с размерами типов? Зачем это все? Я пока не вижу в этом смысла >_>
Vlad_
7 / 7 / 0
Регистрация: 07.09.2012
Сообщений: 174
26.02.2013, 01:38  [ТС]     Нюанс в работе с классом #25
nonedark2008, это пример с форума в котором как вы и говорили динам класс использовался,я нашел по вашей рекомендации правда я и сам не совсем врубаюсь в смысл)
C++
1
2
3
private:
    size_t data_size_;
    StorageType *data_;
а принцип что мы храним тип,размерность,значения,с ними проводим операции а память выделяем с запасом,что бы на верняка хватило.
nonedark2008
624 / 502 / 92
Регистрация: 28.07.2012
Сообщений: 1,340
26.02.2013, 02:06     Нюанс в работе с классом #26
Vlad_, если честно то что вы привели - нечто не то... Простой динамический класс содержит: указатель на массив, максимальный размер массива, кол-во элементов в массиве, и кол-во на которое увеличивается массив, если мы его до конца заполним. Вам нужно что-то такое...
Vlad_
7 / 7 / 0
Регистрация: 07.09.2012
Сообщений: 174
26.02.2013, 02:13  [ТС]     Нюанс в работе с классом #27
nonedark2008, ну даже дело не в этом,он ведь работает как поправить функцию check для меня главнее,я уже вожусь с этой задачей 2 неделю.
nonedark2008
624 / 502 / 92
Регистрация: 28.07.2012
Сообщений: 1,340
26.02.2013, 02:24     Нюанс в работе с классом #28
Vlad_, хоть оно и работает, но проблема в том, что оно работает хрен знает как... И реализация отличается от общепринятой. Вот тебя спросят, что это за параша с типами, почему класс сдеалн не через шаблоны и т.п.? сможешь ли ответить? Если ты узнаешь как хранятся элементы множества в массиве, тогда уж и сможешь написать функцию check.
Vlad_
7 / 7 / 0
Регистрация: 07.09.2012
Сообщений: 174
26.02.2013, 02:35  [ТС]     Нюанс в работе с классом #29
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
#include <iostream>
#include <algorithm>
#include <vector>
 
using namespace std;
 
template <class InputIterator1, class InputIterator2, class OutputIterator>
OutputIterator set_union (InputIterator1 first1, InputIterator1 last1,
    InputIterator2 first2, InputIterator2 last2,
    OutputIterator result)
{
    while (true)
    {
        if (first1==last1) return copy(first2,last2,result);
        if (first2==last2) return copy(first1,last1,result);
 
        if (*first1<*first2) { *result = *first1; ++first1; }
        else if (*first2<*first1) { *result = *first2; ++first2; }
        else { *result = *first1; ++first1; ++first2; }
        ++result;
    }
}
 
 
template <class InputIterator1, class InputIterator2, class OutputIterator>
OutputIterator set_intersection (InputIterator1 first1, InputIterator1 last1,
    InputIterator2 first2, InputIterator2 last2,
    OutputIterator result)
{
    while (first1!=last1 && first2!=last2)
    {
        if (*first1<*first2) ++first1;
        else if (*first2<*first1) ++first2;
        else {
            *result = *first1; first2;
            ++result; ++first1; ++first2;
        }
    }
    return result;
}
 
template <class InputIterator1, class InputIterator2, class OutputIterator>
OutputIterator set_difference (InputIterator1 first1, InputIterator1 last1,
    InputIterator2 first2, InputIterator2 last2,
    OutputIterator result)
{
    while (first1!=last1 && first2!=last2)
    {
        if (*first1<*first2) { *result = *first1; ++result; ++first1; }
        else if (*first2<*first1) ++first2;
        else { ++first1; ++first2; }
    }
    return copy(first1,last1,result);
}
 
 
 
 
int main(){
    setlocale(0,"");
    int first[] = {5,10,15,20,25};
    int second[] = {50,40,30,20,10};
    vector<int> v(10);                      
    vector<int>::iterator it;
 
    sort (first,first+5);     
    sort (second,second+5); 
 
    it=set_difference (first, first+5, second, second+5, v.begin());
    
    v.resize(it-v.begin());                      
 
    cout << "The difference has " << (v.size()) << " elements:\n";
    for (it=v.begin(); it!=v.end(); ++it)
        cout << ' ' << *it;
    cout << '\n';
 
    system("pause");
    return 0;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.02.2013, 03:22     Нюанс в работе с классом
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
nonedark2008
624 / 502 / 92
Регистрация: 28.07.2012
Сообщений: 1,340
26.02.2013, 03:22     Нюанс в работе с классом #30
Цитата Сообщение от Vlad_ Посмотреть сообщение
я как бы пытался сделать через шаблоны,но запутался
Ужас ^_^
Блин, конечно у меня есть реализованный в давности динамический массив, но он тебе не подойдет. Там слишком много всего >_> Мои переопределения типов, мои исключения, комментарии на англ... Я вообще считаю, что первым делом нужен динамический массив: либо делать самому, либо воспользоваться std::vector - нужно у препода уточнить. А используя это - реализовывать класс множества. Я не знаю, что требует преподаватель, но считаю, что нужно делать именно так(Уточни если можешь).
Т.е. нужно иметь хранилище для множества, а далее имея это хранилище - реализовывать множество.
У хранилища должны быть обычные операции: добавление элемента, удаление элемента, получение элемента по номеру. Класс множества должен содержать в себе хранилище, метод для добавления элемента в множество с проверкой на наличие такого же элемента в этом множестве, удаление элемента из множества, поиск элемента в множестве ну и еще что-то. Далее буду функция объединения двух множеств: какой-нить union, который объединяет два множества. Т.е. просто вызывается для первого множества функция добавления для каждого элемента второго. Пересечение - пробегаем по каждому элементу первого и ищем его во втором, если найден - оставляем, не найден - удаляем. Ну и т.д.

Добавлено через 2 минуты
Вообще динамический массив - не обязателен в таком виде, как я упоминал. Будет достаточно любого хранилища с таким функционалом. Например, список. Может сделаешь через него? По идее через список будет легче...

Добавлено через 9 минут
Короче, советую сначало сделать через std::vector. Сделать так, чтобы работало. Сохранить, а реализовать свою замену для std::vector(например список).
Yandex
Объявления
26.02.2013, 03:22     Нюанс в работе с классом
Ответ Создать тему
Опции темы

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