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

Свойства отношений - C++

Восстановить пароль Регистрация
 
BIZMONT
0 / 0 / 0
Регистрация: 31.01.2013
Сообщений: 12
21.03.2013, 21:37     Свойства отношений #1
Задали написать программу, которая проверяет свойство отношения: антисимметрия. Проблема в том, что я не могу понять алгоритм самой программы. Помогите пожалуйста написать программу или хотя бы объясните что за чем делать. Заранее спасибо.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
22.03.2013, 12:22     Свойства отношений #2
Из википедии:
В дополнение к обычным операциям симметрии (вращение, отражение, инверсия, трансляция и их комбинации) добавляются операции антисимметрии - вращение с изменением цвета (антиповорот), отражение с изменением цвета (антиотражение), инверсия с изменением цвета (антиинверсия), трансляция с изменением цвета (антитрансляция) и так далее.
BIZMONT
0 / 0 / 0
Регистрация: 31.01.2013
Сообщений: 12
22.03.2013, 15:58  [ТС]     Свойства отношений #3
Извините, забыл написать что это задача относится к дискретной математике.
palva
 Аватар для palva
2373 / 1595 / 190
Регистрация: 08.06.2007
Сообщений: 6,364
Записей в блоге: 4
22.03.2013, 16:21     Свойства отношений #4
Делаем по определению. Отношение на множестве A это подмножество декартового квадрата множества A. Если множество имеет n элементов, то декартов квадрат может быть представлен матрицей n x n, а чтобы задать отношение нужно в этой матрице выделить некоторые элементы, которые принадлежат отношению. Например элементы, принадлежащие отношению, будут true, остальные false. Отсюда алгоритм проверки антисимметрии может быть таким:
C++
1
2
3
4
5
6
bool a[n][n];
bool s=false;
for(i=0; i<n-1; i++)
for(j=i+1; j<n; j++)
s ||= a[i][j] && a[j][i];
if(!s) cout << "antisymmetric";
Код не проверял.
BIZMONT
0 / 0 / 0
Регистрация: 31.01.2013
Сообщений: 12
22.03.2013, 16:51  [ТС]     Свойства отношений #5
Добавлено через 2 минуты
Цитата Сообщение от palva Посмотреть сообщение
C++
1
s ||= a[i][j] && a[j][i];
Здесь точно должно быть "||"?
И еще вопрос: если мне нужно исследовать отношения множеств на каком нибуть конкретном примере, который задаю я сам, сложно ли это реализировать? Если нет, то каким способом? Обьясните пожалуйста.
palva
 Аватар для palva
2373 / 1595 / 190
Регистрация: 08.06.2007
Сообщений: 6,364
Записей в блоге: 4
22.03.2013, 17:01     Свойства отношений #6
А как же иначе? Конкретный пример вы заносите в матрицу a, а потом запускаете цикл проверки. Я же написал
Цитата Сообщение от palva Посмотреть сообщение
Например элементы, принадлежащие отношению, будут true, остальные false
Что же касается || то, думаю, правильно, но вполне мог и ошибиться. Если у вас есть сомнения, то изложите их подробнее.

Добавлено через 5 минут
Ну то есть сначала вы заносите во все элементы матрицы false, а потом заносите отношение по алгоритму: если http://www.cyberforum.ru/cgi-bin/latex.cgi?x_i\circ y_j, то делаете a[i][j]=true; Это для отношения обозначенного через http://www.cyberforum.ru/cgi-bin/latex.cgi?\circ
BIZMONT
0 / 0 / 0
Регистрация: 31.01.2013
Сообщений: 12
22.03.2013, 17:20  [ТС]     Свойства отношений #7
Цитата Сообщение от palva Посмотреть сообщение
Что же касается || то, думаю, правильно, но вполне мог и ошибиться. Если у вас есть сомнения, то изложите их подробнее.
Проблема в том что компилятор ругается на знак равенства после ||. Я не совсем понял эту строчку поэтому не могу исправить.
Цитата Сообщение от palva Посмотреть сообщение
Ну то есть сначала вы заносите во все элементы матрицы false, а потом заносите отношение по алгоритму: если http://www.cyberforum.ru/cgi-bin/latex.cgi?x_i\circ y_j, то делаете a[i][j]=true; Это для отношения обозначенного через http://www.cyberforum.ru/cgi-bin/latex.cgi?\circ
Я не совсем это понимаю. Вот для примера есть у меня отношение R={(x, х')| x,х' Є Z, |x-х'|<24}. Так решить могу. Но я совсем не знаю как реализировать это програмно. Или я лезу совсем не туда?
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
22.03.2013, 17:23     Свойства отношений #8
Цитата Сообщение от BIZMONT Посмотреть сообщение
Проблема в том что компилятор ругается на знак равенства после ||. Я не совсем понял эту строчку поэтому не могу исправить.
Видимо будет так:
C++
1
 s = s || (a[i][j] && a[j][i]);
palva
 Аватар для palva
2373 / 1595 / 190
Регистрация: 08.06.2007
Сообщений: 6,364
Записей в блоге: 4
22.03.2013, 17:30     Свойства отношений #9
Цитата Сообщение от BIZMONT Посмотреть сообщение
компилятор ругается
В самом деле. Тогда напишите так:
C++
1
s = s || a[i][j] && a[j][i];
Цитата Сообщение от BIZMONT Посмотреть сообщение
Но я совсем не знаю как реализировать это програмно
Это реализовать невозможно. Множество или хотя бы отношение должно быть конечно.
BIZMONT
0 / 0 / 0
Регистрация: 31.01.2013
Сообщений: 12
22.03.2013, 18:40  [ТС]     Свойства отношений #10
Цитата Сообщение от palva Посмотреть сообщение
Это реализовать невозможно. Множество или хотя бы отношение должно быть конечно.
Кажеться я понял принцип. Изложу свои мысли.
1) Сначала я задаю отношение (Например x<=y)
2) Я ввожу некоторое множество чисел.
3) Потом с помощью вашего алгоритма создаётся матрица в которой один столбец и одна строка соответствует одному элементу множества. И если у нас получится, что на диагонали все елементы true то это отношение есть симетричным, ну и если на диагонали есть хотя бы одно false то получится антисимметрия.

Я правильно всё понял? Если где то ошибся исправте меня пожалуйста.
palva
 Аватар для palva
2373 / 1595 / 190
Регистрация: 08.06.2007
Сообщений: 6,364
Записей в блоге: 4
22.03.2013, 18:44     Свойства отношений #11
Диагональ не имеет значения. Главное чтобы никакая пара элементов, симметричная относительно диагонали, не была одновременно true.
BIZMONT
0 / 0 / 0
Регистрация: 31.01.2013
Сообщений: 12
22.03.2013, 18:54  [ТС]     Свойства отношений #12
Цитата Сообщение от palva Посмотреть сообщение
Диагональ не имеет значения. Главное чтобы никакая пара элементов, симметричная относительно диагонали, не была одновременно true.
Понял. Ну а так всё правильно, да?
И ещё небольшой вопрос: Можно ли сделать так что бы это отношение вводилось пользователем из клавиатуры и компилятор видел это как уравнение ну или неравенство?
palva
 Аватар для palva
2373 / 1595 / 190
Регистрация: 08.06.2007
Сообщений: 6,364
Записей в блоге: 4
22.03.2013, 18:59     Свойства отношений #13
Компилятор не будет видеть то, что вводит пользователь. Это будет видеть ваша программа.
Пользователь введет два целых числа через пробел i и j, а ваша программа должна сделать a[i][j]=true; Это я уже повторяюсь. Можете придумать другой формат ввода. Или, если у вас оконная программа, то вы вводите числа в контролы ввода.
BIZMONT
0 / 0 / 0
Регистрация: 31.01.2013
Сообщений: 12
22.03.2013, 19:04  [ТС]     Свойства отношений #14
Цитата Сообщение от palva Посмотреть сообщение
Компилятор не будет видеть то, что вводит пользователь. Это будет видеть ваша программа.
Пользователь введет два целых числа через пробел i и j, а ваша программа должна сделать a[i][j]=true; Это я уже повторяюсь. Можете придумать другой формат ввода. Или, если у вас оконная программа, то вы вводите числа в контролы ввода.
Ладно, буду что то придумывать. Спасибо вам большое за помощь.
Mr.X
Эксперт С++
 Аватар для Mr.X
2802 / 1578 / 247
Регистрация: 03.05.2010
Сообщений: 3,666
22.03.2013, 19:59     Свойства отношений #15
Если пользоваться этим определением, то вот так правильно:
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
/////////////////////////////////////////////////////////////////////////////////////////
#include <iostream>
/////////////////////////////////////////////////////////////////////////////////////////
int main()
{
    std::locale::global(std::locale(""));
    const int   n   =   3;
    bool a[n][n]    =   {
                            {0, 1, 0},
                            {0, 1, 1},
                            {0, 1, 1}
                        };
 
    for(int i = 0; i < n - 1; ++i)
    {
        for(int j = i + 1; j < n; ++j)
        {
            bool    is_not_asymmetric   =       a[i][j]
                                            &&  a[j][i]
                                            &&  i   !=  j;
 
            if( is_not_asymmetric )
            {
                std::cout   <<  "Элемент a["
                            <<  i
                            <<  "]["
                            <<  j
                            <<  "] не антисимметричен."
                            <<  std::endl;
 
                break;
            }//if
        }//for
    }//for
}
palva
 Аватар для palva
2373 / 1595 / 190
Регистрация: 08.06.2007
Сообщений: 6,364
Записей в блоге: 4
22.03.2013, 20:02     Свойства отношений #16
Цитата Сообщение от Mr.X Посмотреть сообщение
&& i != j
Это выполняется всегда. Посмотрите как у меня меняются индексы. Они никогда не равны друг другу.
Mr.X
Эксперт С++
 Аватар для Mr.X
2802 / 1578 / 247
Регистрация: 03.05.2010
Сообщений: 3,666
22.03.2013, 20:10     Свойства отношений #17
Да, пардон, вот так правильнее:
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
/////////////////////////////////////////////////////////////////////////////////////////
#include <iostream>
/////////////////////////////////////////////////////////////////////////////////////////
int main()
{
    std::locale::global(std::locale(""));
    const int   n   =   3;
    bool a[n][n]    =   {
                            {0, 1, 0},
                            {0, 1, 1},
                            {0, 1, 1}
                        };
 
    for(int i = 0; i < n - 1; ++i)
    {
        for(int j = i + 1; j < n; ++j)
        {
            bool    is_not_asymmetric   =       a[i][j]
                                            &&  a[j][i];
 
            if( is_not_asymmetric )
            {
                std::cout   <<  "Элемент a["
                            <<  i
                            <<  "]["
                            <<  j
                            <<  "] не антисимметричен."
                            <<  std::endl;
 
                break;
            }//if
        }//for
    }//for
}
BIZMONT
0 / 0 / 0
Регистрация: 31.01.2013
Сообщений: 12
22.03.2013, 20:56  [ТС]     Свойства отношений #18
Цитата Сообщение от Mr.X Посмотреть сообщение
bool a[n][n] = { {0, 1, 0}, {0, 1, 1}, {0, 1, 1} };
А это обязательно, что бы масив а был логического типа?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.03.2013, 22:03     Свойства отношений
Еще ссылки по теме:

C++ Реализация метода отношений случайных нормальных величин
C++ Директивы и их свойства
Реализация отношений между объектами C++

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

Или воспользуйтесь поиском по форуму:
palva
 Аватар для palva
2373 / 1595 / 190
Регистрация: 08.06.2007
Сообщений: 6,364
Записей в блоге: 4
22.03.2013, 22:03     Свойства отношений #19
Цитата Сообщение от BIZMONT Посмотреть сообщение
А это обязательно, что бы масив а был логического типа?
Конечно нет. Вы же сами пишете программу, делайте как вам удобнее и привычнее. Можно целые, можно char, можно придумать какой-нибудь класс, который хранит информацию в битовых полях...
Yandex
Объявления
22.03.2013, 22:03     Свойства отношений
Ответ Создать тему
Опции темы

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