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

Нужна помощь по Дискретке. Класс-группа: множество + бинарная операция - C++

Восстановить пароль Регистрация
 
DWand
 Аватар для DWand
13 / 13 / 1
Регистрация: 23.04.2011
Сообщений: 99
27.09.2011, 16:40     Нужна помощь по Дискретке. Класс-группа: множество + бинарная операция #1
Здравствуйте.
В этом году в академии начали преподавать дискретную математику. Что-то не очень легко в начале это все дается. Помогите, пожалуйста, ступить на верный путь для решения задачи и разобраться в задании. С программированием обычно особых проблем не было, но тут зашел в ступор вообще.

Есть вот такое задание:
Создать класс группу, которая содержит определенное множество, на котором введено бинарную алгебраическую операцию (определены в задании 3 контрольной работы 1), и имеет конструктор, деструктор, функции доступа, метод-операцию на элементами множества, единичный (нейтральный) элемент, обратный элемент для каждого элемента множества. Реализовать операцию над элементами и вывести результаты выполнения операции на экран.
Замечание. Если множество с операцией не является группой, добавить в множество элементы, для которых нарушается какое -то свойство, чтобы она стала группой.

Не по теме:

Я не претендую на звание лучшего в мире переводчика, поэтому вот оригинал текста:
Створити клас група, що містить певну множину, на якій введено бінарну алгебраїчну операцію (визначені в завданні 3 контрольної роботи 1), і має конструктор, деструктор, функції доступу, метод-операцію над елементами множини, одиничний (нейтральний) елемент, зворотній елемент для кожного елемента множини. Реалізувати операцію над елементами і вивести результати виконання операції на екран.
Зауваження. Якщо множина з операцією не є групою, додати в множину елементи, для яких порушується якась властивість, щоб вона стала групою.



И вот задание из контрольной:
Определите, создает ли группу множество поворотов правильного шестиугольника в его плоскости, которые переводят вершины в вершины, относительно операции композиции поворотов?

Не по теме:

Аналогично, вот оригинал текста:
Визначте, чи утворює групу множина поворотів правильного шестикутника в його площині, що переводять вершини у вершини, відносно операції композиції поворотів?



Однозначно понятно, что должен быть класс, в нем должны быть конструктор(ы), деструктор, множество какое-то, функции доступа и метод-операция (как я понял это поворот углов шестиугольника), единичный элемент и обратный элемент.
Но вот как это все между собой связать не могу никак понять. И дополнительно запутывает замечание к заданию - получается, что нужно еще элементы и/или множество как-то проверять и куда-то что-то записывать. Плюс это все усугубляется тем, что раньше похожего не делали.
Если кто понял что тут нужно сделать или уже встречался с таким, помогите, пожалуйста, чем можете начинающему. Приветствуется абсолютно все на данную тему: размышления, алгоритмы, исходники, указания, разъяснения. А то ни в какую не идет вообще =((

Заранее спасибо.

Не по теме:

P.S.: Если у вас где-то под рукой совершенно случайно завалялась хорошая книжечка по дискретке ли ссылочка, можете дать, пожалуйста?



Добавлено через 23 часа 42 минуты
Неужели нет никаких мыслей по этой теме?
Если на втором курсе такие задания даются, то даже боюсь себе представить, что будет на пятом...
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.09.2011, 16:40     Нужна помощь по Дискретке. Класс-группа: множество + бинарная операция
Посмотрите здесь:

C++ Класс множество
C++ НУЖНА ПОМОЩЬ В С++
C++ Нужна помощь
C++ Класс Множество
Класс CPoint и ей производные, нужна помощь C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Nameless One
Эксперт С++
 Аватар для Nameless One
5755 / 3404 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
27.09.2011, 18:48     Нужна помощь по Дискретке. Класс-группа: множество + бинарная операция #2
Ну тут на самом деле не все так сложно. Назовем наше множество поворотов http://www.cyberforum.ru/cgi-bin/latex.cgi?\mathbb{G}, а бинарную операцию (композицию поворотов) http://www.cyberforum.ru/cgi-bin/latex.cgi?*. Так как каждый поворот должен отобразить вершину в вершину, то очевидно, что каждый поворот будет происходить на угол http://www.cyberforum.ru/cgi-bin/latex.cgi?\frac{\pi n}{3}, \, n \in \mathbb{Z}. Назовем число http://www.cyberforum.ru/cgi-bin/latex.cgi?n множителем (factor).
Доказательства того, что операция http://www.cyberforum.ru/cgi-bin/latex.cgi?* замкнута на множестве http://www.cyberforum.ru/cgi-bin/latex.cgi?\mathbb{G} и доказательсвто аксиом группы, я думаю, очевидны. Нейтральный элемент группы - это поворот на угол 0, обратный элемент - поворот на угол противоположного знака.
Очевидно, что группа http://www.cyberforum.ru/cgi-bin/latex.cgi?(\mathbb{G}, *) будет изоморфна группе http://www.cyberforum.ru/cgi-bin/latex.cgi?(\mathbb{Z}, +), т.е. операция композиции поворотов на углы http://www.cyberforum.ru/cgi-bin/latex.cgi?\frac{\pi n_1}{3} и http://www.cyberforum.ru/cgi-bin/latex.cgi?\frac{\pi n_2}{3}, \, n_1, n_2 \in \mathbb{Z} будет соответствовать сумме их множителей http://www.cyberforum.ru/cgi-bin/latex.cgi?n_1, n_2 в группе целых чисел с операцией сложения, с нейтральным элементом группы, равной нулю, и обратному элементу - множителю с противоположным знаком. Из этого следует, что в нашем представлении поворота можно хранить не угол (вещественное число, которое невозможно представить без погрешностей), а множитель этого угла (целое, точно число).
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
#include <iostream>
 
class rotation
{
public:
    rotation(int f = 0);    // конструктор
    ~rotation();        // деструктор
 
    // аксессоры
    void set_factor(int);
    int get_factor() const;
 
    // бинарная групповая операция (композиция поворотов)
    rotation operator * (const rotation&) const;
 
    static rotation identity(); // единица
    rotation inverse() const;         // обратный элемент
 
    bool operator == (const rotation&) const;
    bool operator != (const rotation&) const;
    
    // вывод на экран угла поворота
    friend std::ostream& operator << (std::ostream&,
                      const rotation&);
        
private:
    int factor;         // множитель угла поворота
};
 
#define PRINT(EXPR) \
    std::cout << #EXPR ": " << std::boolalpha << (EXPR) << std::endl
 
int main()
{
    rotation id = rotation::identity(); // Поворот на 0 градусов
    rotation half = rotation(3); // Поворот на 180 градусов (против часовой стрелки)
    rotation half_rev = half.inverse(); // Поворот на 180 градусов (по часовой стрелке)
    
    PRINT(id);
    PRINT(half);
    PRINT(half_rev);
    
    PRINT(id * half);
    PRINT(id * half == half);
    PRINT(half * id);
    PRINT(half * id == half);
 
    PRINT(half * half_rev);
    PRINT(half * half_rev == id);
    
    return 0;
}
 
rotation::rotation(int f)
    : factor(f)         // инициализация множителя
{
}
 
rotation::~rotation()
{               // деструктор пустой, выполнять нечего :(
}
 
void rotation::set_factor(int new_factor)
{
    factor = new_factor;
}
 
int rotation::get_factor() const
{
    return factor;
}
 
rotation rotation::operator * (const rotation& rhs) const
{
    return rotation(factor + rhs.factor);
}
 
rotation rotation::identity()
{
    return rotation();
}
 
rotation rotation::inverse() const
{
    return rotation(-factor);
}
 
bool rotation::operator == (const rotation& rhs) const
{
    return factor == rhs.factor;
}
 
bool rotation::operator != (const rotation& rhs) const
{
    return factor != rhs.factor;
}
 
std::ostream& operator << (std::ostream& os,
               const rotation& rhs)
{
    if(rhs.factor == 0)
    os << "0";
    else if(rhs.factor % 3 == 0)
    os << rhs.factor / 3 << " pi";
    else
    os << rhs.factor << " pi";
    
    return os;
}
В примере показаны некоторые аксиомы группы:
Код
[nameless@desktop cpp]$ ./sample 
id: 0
half: 1 pi
half_rev: -1 pi
id * half: 1 pi
id * half == half: true
half * id: 1 pi
half * id == half: true
half * half_rev: 0
half * half_rev == id: true
DWand
 Аватар для DWand
13 / 13 / 1
Регистрация: 23.04.2011
Сообщений: 99
27.09.2011, 19:55  [ТС]     Нужна помощь по Дискретке. Класс-группа: множество + бинарная операция #3
Спасибо огромное, Nameless One! Вроде начинает потихонечку проясняться вопрос.
Пожалуй, еще некоторые моменты нужно уточнить с преподавателем для полной ясности. В частности на счет замечания к заданию. Радует, что не так все сложно, как показалось =)))

Ну, а пока вопрос открытый, по прежнему приветствуются все мысли по поводу этого задания.
А в конце, если все пройдет удачно (на что я надеюсь) выложу сюда, что получится в результате.
DWand
 Аватар для DWand
13 / 13 / 1
Регистрация: 23.04.2011
Сообщений: 99
19.10.2011, 03:12  [ТС]     Нужна помощь по Дискретке. Класс-группа: множество + бинарная операция #4
Вот что получилось в конце. Таки правда - все оказалось не так сложно, как показалось в начале.
:dance3:
Вложения
Тип файла: zip Lab2_A1_Group.zip (3.5 Кб, 7 просмотров)
Yandex
Объявления
19.10.2011, 03:12     Нужна помощь по Дискретке. Класс-группа: множество + бинарная операция
Ответ Создать тему
Опции темы

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