Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
23 / 23 / 11
Регистрация: 15.04.2012
Сообщений: 183
1

Ошбика в алгоритме нахождения разности множеств

04.10.2012, 15:30. Показов 1541. Ответов 5
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
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
Set& Set::operator-(const Set &set)
{
    Set *raznost = new Set;
    if (this->size != 0 && set.size != 0)
    {
        for (int i = 0; i < this->size; i++)
        {
            for (int j = 0; j < set.size; j++)
            {
                if (this->data[i] == set.data[j])
                {
                    break;
                }
            }
            raznost->data[raznost->size] = this->data[i];
            ++(raznost->size);
        }
    }
    else {
        raznost->size = 0;
        return *raznost;
    }
    return *raznost;
}
В общем в чём проблема:
в два множества(это объекты) введены элементы:
sets[2].add('k'); sets[3].add('x');
sets[2].add('y'); sets[3].add('z');
sets[2].add('h'); sets[3].add('h');
На выходе должен быть результат разности sets[2] - sets[3] равен {k,y}
А получаю {k,y,h}.
Оператор - для объектов перегружен.
В принципе я знаю ошибку, если всё на бумаге или в уме раскидать, то результат правильный выдан, то есть ошибка семантическая.
Но как её решить, не могу я понять
Кучу вариантов перепробовал,везде всё возвращается к этому же результату.

Добавлено через 3 минуты
Так же я менял местами код делая вот так:
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
Set& Set::operator-(const Set &set)
{
    Set *raznost = new Set;
    if (this->size != 0 && set.size != 0)
    {
        for (int i = 0; i < this->size; i++)
        {
            for (int j = 0; j < set.size; j++)
            {
                if (this->data[i] == set.data[j])
                {
                    break;
                }
                else
                {
                    raznost->data[raznost->size] = this->data[i];
                    ++(raznost->size);
                }
            }
        }
    }
    else {
        raznost->size = 0;
        return *raznost;
    }
    return *raznost;
}
Но это тожже не верно, потому что каждый элемент из первого множества сравниваеться с каждым из второго множества, и в итоге получаем {k,k,k,y,y,y,h,h}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.10.2012, 15:30
Ответы с готовыми решениями:

Доказать, что симметрическая разность множеств равна симметрической разности дополнений этих множеств
Ребят, помогите доказать, что симметрическая разность множеств равна симметрической разности...

Количество элементов в разности множеств
Всем привет. Знаю, что тема довольно заезженная. Пролистал похожие на форуме, но решил все-таки...

Доказать свойства разности множеств
Доказать следующие свойства разности множеств: (А\В)\С = (А\С)\В; ( А υ В )\С =( А \ С)...

Написать функцию разности множеств
Привет всем! Задача: По началу было понятно, что при вызове функции (f '(1 2 1 2 1 3) '(5 3...

5
576 / 559 / 47
Регистрация: 16.12.2011
Сообщений: 1,389
04.10.2012, 15:31 2
C++
1
2
3
4
5
6
7
8
9
for (int j = 0; j < set.size; j++)//этот цикл у вас вообще бесполезен
            {
                if (this->data[i] == set.data[j])
                {
                    break;
                }
            }
            raznost->data[raznost->size] = this->data[i];//так как это выполнится в любом случае. не зависимо от того, что произойдет в цикле
            ++(raznost->size);
Добавьте булевый флаг перед циклом.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
bool should_add = true;
for (int j = 0; j < set.size; j++)
            {
                if (this->data[i] == set.data[j])
                {
                    should_add = false;
                    break;
                }
            }
            if(should_add)
            {            
                 raznost->data[raznost->size] = this->data[i];
                 ++(raznost->size);
            }

Не по теме:

эх, форматирование все съехало...

1
23 / 23 / 11
Регистрация: 15.04.2012
Сообщений: 183
04.10.2012, 15:46  [ТС] 3
Цитата Сообщение от I.M. Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
for (int j = 0; j < set.size; j++)//этот цикл у вас вообще бесполезен
            {
                if (this->data[i] == set.data[j])
                {
                    break;
                }
            }
            raznost->data[raznost->size] = this->data[i];//так как это выполнится в любом случае. не зависимо от того, что произойдет в цикле
            ++(raznost->size);
Добавьте булевый флаг перед циклом.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
bool should_add = true;
for (int j = 0; j < set.size; j++)
            {
                if (this->data[i] == set.data[j])
                {
                    should_add = false;
                    break;
                }
            }
            if(should_add)
            {            
                 raznost->data[raznost->size] = this->data[i];
                 ++(raznost->size);
            }

Не по теме:

эх, форматирование все съехало...

Я уже добавлял булевый флаг, разници нету...выводит тоже самое {k,k,k,y,y,y,h,h}.Тут идёт сравнение каждого элемента с каждым элементом другого множества, получаеться каждый элемент сравниваеться трижды в данном случае, и трижды он не равен, поэтому трижды он записывается, и так до конца, а вот последний элемент, видно что не 3 раза вывелся а только 2, потому что наконец-то встретил равного себе. С этим и борюсь вот, но пока я проигрываю в борьбе\
0
576 / 559 / 47
Регистрация: 16.12.2011
Сообщений: 1,389
04.10.2012, 16:19 4
Цитата Сообщение от Elfenlide Посмотреть сообщение
Я уже добавлял булевый флаг
Наверняка вы его добавляли во вложенный цикл. Т.е. не туда.
Булевый флаг должен инициализироваться до цикла по j и проверяться один раз после цикла по j. Т.е. для каждого i будет одна проверка

Можете глянуть тут
http://www.cplusplus.com/refer... ifference/
0
Заблокирован
04.10.2012, 16:41 5
Цитата Сообщение от Elfenlide Посмотреть сообщение
Я уже добавлял булевый флаг, разници нету...выводит тоже самое
все правильно вам говорят.
Bash
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
~/samples$ cat sample.c 
#include <stdio.h>
 
int main() {
 
    int a1[] = {1, 2, 3, 4, 5};
    int a2[] = {3, 4, 5, 6, 7};
    int flag, i = 0, j;
 
    for (; i < 5; ++i) {
        flag = 1;
 
        for (j = 0; j < 5; ++j)
            if (a1[ i ] == a2[ j ]) {
                flag = 0;
                break;
            }
        if (flag)
            fprintf(stdout, "%2i", a1[ i ]);
    }
    putchar('\n');
 
    return 0;
}
~/samples$ gcc sample.c -o sample
~/samples$ ./sample 
 1 2
~/samples$
1
23 / 23 / 11
Регистрация: 15.04.2012
Сообщений: 183
04.10.2012, 21:41  [ТС] 6
Цитата Сообщение от I.M. Посмотреть сообщение
Наверняка вы его добавляли во вложенный цикл. Т.е. не туда.
Булевый флаг должен инициализироваться до цикла по j и проверяться один раз после цикла по j. Т.е. для каждого i будет одна проверка
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
Set& Set::operator-(const Set &set)
{
    Set *raznost = new Set;
    bool flag;
 
    if (this->size != 0 && set.size != 0)
    {
        for (int i = 0; i < this->size; ++i)
        {
            flag = true;
 
            for (int j = 0; j < set.size; ++j)
            {
                if (this->data[i] == set.data[j])
                {
                    flag = false;
                    break;
                }
                if (flag)
                {
                    raznost->data[raznost->size] = this->data[i];
                    ++(raznost->size);
                }               
            }
        }
    }
    else {
        raznost->size = 0;
        return *raznost;
    }
    return *raznost;
}
вот я так делал, и ничего...Даже если так прикинуть то выходит что:
Флаг устанавливается в "1", и становиться 0 только если значение х == у, а так как не равно, то и значение останется "1" у булевой переменной. В итоге сработает if(flag)

Добавлено через 4 минуты
Цитата Сообщение от Elfenlide Посмотреть сообщение
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
Set& Set::operator-(const Set &set)
{
    Set *raznost = new Set;
    bool flag;
 
    if (this->size != 0 && set.size != 0)
    {
        for (int i = 0; i < this->size; ++i)
        {
            flag = true;
 
            for (int j = 0; j < set.size; ++j)
            {
                if (this->data[i] == set.data[j])
                {
                    flag = false;
                    break;
                }
                if (flag)
                {
                    raznost->data[raznost->size] = this->data[i];
                    ++(raznost->size);
                }               
            }
        }
    }
    else {
        raznost->size = 0;
        return *raznost;
    }
    return *raznost;
}
вот я так делал, и ничего...Даже если так прикинуть то выходит что:
Флаг устанавливается в "1", и становиться 0 только если значение х == у, а так как не равно, то и значение останется "1" у булевой переменной. В итоге сработает if(flag)
Я понял свою ошибку)\\\Спасибо вам большое всем!)
0
04.10.2012, 21:41
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.10.2012, 21:41
Помогаю со студенческими работами здесь

Операции объединения, пересечения и разности множеств
Здравствуйте,помогите записать этот код в Delphi и скиньте архивом эту программу,пожалуйста. Вот...

Реализовать функцию вычисления симметричной разности множеств
Помогите пожалуйста, не знаю как симметрическую разность сделать. Должно вывести 0 1 7 8 9 15 40...

Найти мощность разности An множества и объединения n-1 других множеств
Добрый день! Я пишу программу на C#, по ходу использую Wolfram Mathematica. Недавно столкнулся с...

Логическая ошибка в алгоритме нахождения точек циссоиды
Здравствуйте, товарищи. Нужно построить график циссоиды. Здесь я получаю точки циссоиды, но что-то...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru