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

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

Войти
Регистрация
Восстановить пароль
 
 
BIZMONT
0 / 0 / 0
Регистрация: 31.01.2013
Сообщений: 12
#1

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

21.03.2013, 21:37. Просмотров 979. Ответов 18
Метки нет (Все метки)

Задали написать программу, которая проверяет свойство отношения: антисимметрия. Проблема в том, что я не могу понять алгоритм самой программы. Помогите пожалуйста написать программу или хотя бы объясните что за чем делать. Заранее спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.03.2013, 21:37
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Свойства отношений (C++):

Найти композицию отношений - C++
Найти композицию отношений a*b-нечётное и a+b=10, программно реализовать на С++. Я даже не знаю, как это можно на С++ написать. Если вы...

Реализация отношений между классами is-a, has-a, uses-a в С++ - C++
Где можно найти информацию по отношениям между объектами классов is-a, has-a, uses-a и и их реализация средствами С++. В инете очень мало...

Наследование дружественных отношений: возможно ли? - C++
Есть 2 класса - A и B. У класса A есть наследники - C,D,E. Так же класс B дружественнен по от к A, то есть класс A имеет доступ ко всем...

Реализация отношений между объектами - C++
Здравствуйте. Есть задумка организовать класс или что-то в этом роде между объектами в программе, который бы отражал их взаимные...

Построение сильноветвящегося дерева на основе таблицы отношений - C++
Мое задание состоит в том, чтоби построить дерево, имея таблицу отношений родителя к потомку. Эта таблица находиться в базе данных, а...

Циклы и выражения отношений (Прата 5 глава 3 зад) - C++
Помогите с задачей: Дафна инвестировала $100 под простых 10%. То естьб каждый год инвестиция должна приносить 10% инвестированной...

18
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
22.03.2013, 12:22 #2
Из википедии:
В дополнение к обычным операциям симметрии (вращение, отражение, инверсия, трансляция и их комбинации) добавляются операции антисимметрии - вращение с изменением цвета (антиповорот), отражение с изменением цвета (антиотражение), инверсия с изменением цвета (антиинверсия), трансляция с изменением цвета (антитрансляция) и так далее.
0
BIZMONT
0 / 0 / 0
Регистрация: 31.01.2013
Сообщений: 12
22.03.2013, 15:58  [ТС] #3
Извините, забыл написать что это задача относится к дискретной математике.
0
palva
2628 / 1855 / 268
Регистрация: 08.06.2007
Сообщений: 7,091
Записей в блоге: 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";
Код не проверял.
1
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];
Здесь точно должно быть "||"?
И еще вопрос: если мне нужно исследовать отношения множеств на каком нибуть конкретном примере, который задаю я сам, сложно ли это реализировать? Если нет, то каким способом? Обьясните пожалуйста.
0
palva
2628 / 1855 / 268
Регистрация: 08.06.2007
Сообщений: 7,091
Записей в блоге: 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
1
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}. Так решить могу. Но я совсем не знаю как реализировать это програмно. Или я лезу совсем не туда?
0
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
22.03.2013, 17:23 #8
Цитата Сообщение от BIZMONT Посмотреть сообщение
Проблема в том что компилятор ругается на знак равенства после ||. Я не совсем понял эту строчку поэтому не могу исправить.
Видимо будет так:
C++
1
 s = s || (a[i][j] && a[j][i]);
1
palva
2628 / 1855 / 268
Регистрация: 08.06.2007
Сообщений: 7,091
Записей в блоге: 4
22.03.2013, 17:30 #9
Цитата Сообщение от BIZMONT Посмотреть сообщение
компилятор ругается
В самом деле. Тогда напишите так:
C++
1
s = s || a[i][j] && a[j][i];
Цитата Сообщение от BIZMONT Посмотреть сообщение
Но я совсем не знаю как реализировать это програмно
Это реализовать невозможно. Множество или хотя бы отношение должно быть конечно.
0
BIZMONT
0 / 0 / 0
Регистрация: 31.01.2013
Сообщений: 12
22.03.2013, 18:40  [ТС] #10
Цитата Сообщение от palva Посмотреть сообщение
Это реализовать невозможно. Множество или хотя бы отношение должно быть конечно.
Кажеться я понял принцип. Изложу свои мысли.
1) Сначала я задаю отношение (Например x<=y)
2) Я ввожу некоторое множество чисел.
3) Потом с помощью вашего алгоритма создаётся матрица в которой один столбец и одна строка соответствует одному элементу множества. И если у нас получится, что на диагонали все елементы true то это отношение есть симетричным, ну и если на диагонали есть хотя бы одно false то получится антисимметрия.

Я правильно всё понял? Если где то ошибся исправте меня пожалуйста.
0
palva
2628 / 1855 / 268
Регистрация: 08.06.2007
Сообщений: 7,091
Записей в блоге: 4
22.03.2013, 18:44 #11
Диагональ не имеет значения. Главное чтобы никакая пара элементов, симметричная относительно диагонали, не была одновременно true.
0
BIZMONT
0 / 0 / 0
Регистрация: 31.01.2013
Сообщений: 12
22.03.2013, 18:54  [ТС] #12
Цитата Сообщение от palva Посмотреть сообщение
Диагональ не имеет значения. Главное чтобы никакая пара элементов, симметричная относительно диагонали, не была одновременно true.
Понял. Ну а так всё правильно, да?
И ещё небольшой вопрос: Можно ли сделать так что бы это отношение вводилось пользователем из клавиатуры и компилятор видел это как уравнение ну или неравенство?
0
palva
2628 / 1855 / 268
Регистрация: 08.06.2007
Сообщений: 7,091
Записей в блоге: 4
22.03.2013, 18:59 #13
Компилятор не будет видеть то, что вводит пользователь. Это будет видеть ваша программа.
Пользователь введет два целых числа через пробел i и j, а ваша программа должна сделать a[i][j]=true; Это я уже повторяюсь. Можете придумать другой формат ввода. Или, если у вас оконная программа, то вы вводите числа в контролы ввода.
0
BIZMONT
0 / 0 / 0
Регистрация: 31.01.2013
Сообщений: 12
22.03.2013, 19:04  [ТС] #14
Цитата Сообщение от palva Посмотреть сообщение
Компилятор не будет видеть то, что вводит пользователь. Это будет видеть ваша программа.
Пользователь введет два целых числа через пробел i и j, а ваша программа должна сделать a[i][j]=true; Это я уже повторяюсь. Можете придумать другой формат ввода. Или, если у вас оконная программа, то вы вводите числа в контролы ввода.
Ладно, буду что то придумывать. Спасибо вам большое за помощь.
0
Mr.X
Эксперт С++
3050 / 1695 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
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
}
0
22.03.2013, 19:59
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.03.2013, 19:59
Привет! Вот еще темы с ответами:

Реализовать добавление переопределения операций или отношений - C++
Прошу помочь реализовать в этом коде добавление переопределения операций или отношений. Работа операций должна отображаться на мониторе. ...

Реализация метода отношений случайных нормальных величин - C++
Доброго времени суток, подскажите пожалуйста что значит &quot;метод отношений случайных нормальных величин&quot;, что это собой подрозумевает, дали...

Операторы отношений и логические операторы - C++
изучаю C++ по Шилдту, и частенько встречаются не рабочии коды и приходится доделывать под себя, но в этот раз я не пойму почему у него в...

Операторы отношений и логические операторы - C++
Всем добрый день. Очередной день изучения Г.Шилда С++ базовый курс, дошел до Операторов отношений, все понял, но не компилируется данный...


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

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

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