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

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

Восстановить пароль Регистрация
Другие темы раздела
C++ Builder Работа с картинками в builder http://www.cyberforum.ru/cpp-beginners/thread356598.html
Столкнулся с проблемой осчезновения картинки. Пишу код программы где необходим при правильном вводе данных вывод стрелки в виде изображения, а при вводе не верных данных вывод крустика. Программа работает нормально до повторного ввода. В случае если в первый раз были введены верные данные на картинке со стрелкой Visible становится true и она отображается. Затем при вводе неверных данных...
C++ Удаление элементов массива Задание: Удаление элементов из массива оформить в виде функции. Поиск места удаления элемента или группы элементов в некоторых задачах также оформить в виде функции. Удалить в массиве первую группу из двух подряд идущих нулей. void erase(int *a, int& n, int x){ for (int i = x; i < n ; ++i) swap(a, a); --n; } http://www.cyberforum.ru/cpp-beginners/thread356597.html
C++ Решение интегрального уравнения Вольтерра второго рода.
Есть код программы на C sharp, взятый давно с alglib (сейчас его там нет) : using System; namespace alglib { public class volterra2 { /* This members must be defined by you: static double f(double x)
Нужна консультация по ДМ C++
Все привет. Вообщем задали нам курсовую по Дискр. Мат-ке. Мне досталась тема "Эфективное кодирование. Сжатие текса". Литература есть, почитал (поверхностно) еще приципы работы архиваторов. Используеться метод Шеннона - Фано... Надо будет написать программу с процедурами архивации и разархвации. Но я незнаю на чем написать, мы изучали паскаль и С++. Паскаль мы изучале дольше. Но я незнаю на...
C++ В каждой строке матрицы переставить в обратном порядке элементы http://www.cyberforum.ru/cpp-beginners/thread356558.html
Разработать программу обработки прямоугольной матрицы – двумерного динамического массива. В каждой строке матрицы переставить в обратном порядке элементы, расположенные между последним и максимальным элементами.
C++ Проблема с выводом строки #include<iostream> #include<string> #include<conio.h> #define SIZE 100 using namespace std; class Adress { char fam; char street; подробнее

Показать сообщение отдельно
Nameless One
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
27.09.2011, 18:48     Нужна помощь по Дискретке. Класс-группа: множество + бинарная операция
Ну тут на самом деле не все так сложно. Назовем наше множество поворотов 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
 
Текущее время: 02:30. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru