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

Пересечение множеств - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.67
Sick2
14 / 14 / 1
Регистрация: 26.11.2010
Сообщений: 235
12.09.2011, 22:54     Пересечение множеств #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
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
#include "stdafx.h"
#include <iostream>
using namespace std;
 
class mnozh
{
    int *m;
    int size;
    int pos;
public:
    mnozh();
    mnozh(int s);
    void add(int e);
    void del(int k);
    void show();
    friend void peresech(const mnozh &,const mnozh &);
};
mnozh::mnozh(int s)
{
    size = s;
    pos = 0;
    m = new int [size];
    for(int i=0;i<size;i++)
    {
        m[i]=0;
    };
};
 
void mnozh::add(int e)
{
    if(pos==size) cout<<"full";
    else { m[pos]=e; pos++;};
};
 
void mnozh::del(int k)
{
    if(size==0){ cout<<"Mnozh. pusto"<<endl;};
    for(int i=k;i<size;i++)
    {
        m[i]=m[i+1];
    };
    size--;
    
};
 
void peresech(const mnozh &o,const mnozh &o1)
{
    int s;
    s=o.size+o1.size;
    mnozh temp(s);
    int kol=0;
    for(int i=0,k=0;i<o.size, k<o1.size;i++,k++)
    {
        if(o.m[i]==o1.m[k]) 
        {
            temp.m[kol]=o.m[i];
            kol++;
        }
    };
    for(int i=0;i<kol;i++)
    {
        cout<<temp.m[i]<<" ";
    };
 
};
void mnozh::show()
{
    for(int i=0;i<size;i++)
    {
        cout<<m[i]<<" ";
    }
};
int _tmain(int argc, _TCHAR* argv[])
{
 
    mnozh a(4),b(4);
    a.add(7);
    a.add(2);
    a.add(1);
    a.add(5);
    
    b.add(7);
    b.add(2);
    b.add(5);
    b.add(2);
    peresech(a,b);
    system("pause");
    return 0;
}
Т.е. я понимаю, почему оно у меня не так работает, но не могу исправить. Мб, кто подскажет?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alkagolik
 Аватар для alkagolik
1510 / 616 / 79
Регистрация: 15.07.2011
Сообщений: 3,552
12.09.2011, 23:06     Пересечение множеств #2
немного неправильно алгоритм конструктора составлен
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
int mnoz1[4] = {1, 2, 3, 4}
int mnoz2[5] = {1, 2, 3, 4, 5}
int *tmp, count = 0;
 
for (int i = 0; i != 4; ++i)
      for(int k = 0; k != 5; ++k)
            if(mnoz1[i] == mnoz2[k]) ++count;
if(!count) std::cout << "пересечение пусто\n";
else{
 
tmp = new tmp[count];
count = 0;
 
for (int i = 0; i != 4; ++i)
      for(int k = 0; k != 5; ++k)
            if(mnoz1[i] == mnoz2[k]) tmp[count++] = mnoz1[i];
.............................
delete []tmp;
}
но тут не учитан случай повтора элемента в множесте... в принципе множество и не подразумевает повторения элементов

подправил немного
Sick2
14 / 14 / 1
Регистрация: 26.11.2010
Сообщений: 235
12.09.2011, 23:17  [ТС]     Пересечение множеств #3
Всё исправил, большое спасибо.
alkagolik
 Аватар для alkagolik
1510 / 616 / 79
Регистрация: 15.07.2011
Сообщений: 3,552
12.09.2011, 23:33     Пересечение множеств #4
вот скомпилировал, отредактировал. там 1 лишний инкремент count++
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
    int mnoz1[4] = {1, 2, 3, 4};
    int mnoz2[5] = {1, 2, 3, 4, 5};
    int *tmp, count = 0;
 
    for (int i = 0; i != 4; ++i)
        for(int k = 0; k != 5; ++k)
            if(mnoz1[i] == mnoz2[k]) ++count;
 
    if(!count) std::cout << "пересечение пусто\n";
    else{
 
        tmp = new int[count];
        count = 0;
 
        for (int i = 0; i != 4; ++i)
            for(int k = 0; k != 5; ++k)
                if(mnoz1[i] == mnoz2[k]) tmp[count++/* вот тут */] = mnoz1[i];
        /* тут восстанавливаем */
        --count;
 
        while(count >= 0)
            std::cout << tmp[count--];
 
        delete []tmp;
    }
как альтернатива без восстановление счетчика
C++
1
2
while(count > 0)
            std::cout << tmp[--count];
Sick2
14 / 14 / 1
Регистрация: 26.11.2010
Сообщений: 235
12.09.2011, 23:56  [ТС]     Пересечение множеств #5
Я думаю, и такой вариант сойдёт :
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
void peresech(const mnozh &o,const mnozh &o1)
{
    int count=0;
    for(int i=0;i<o.size;i++)
        for(int k=0;k<o1.size;k++)
            if(o.m[i]==o1.m[k]) ++count;
    if(!count) {cout<<"Pusto"<<endl;}
    else
    {
    mnozh temp(count);
    int kol=0;
    for(int i=0;i<o.size;i++)
    for(int k=0;k<o1.size;k++)
        if(o.m[i]==o1.m[k]) 
        {
            temp.m[kol]=o.m[i];
            kol++;
        }
    
    for(int i=0;i<kol;i++)
    {
        cout<<temp.m[i]<<" ";
    };
    }
};
Единственное, что я лишнюю переменную создал.
Yandex
Объявления
12.09.2011, 23:56     Пересечение множеств
Ответ Создать тему
Опции темы

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