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

Комплексные числа. Символическая форма записи - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 8, средняя оценка - 5.00
D-Vampire
3 / 3 / 0
Регистрация: 16.05.2012
Сообщений: 36
23.08.2012, 01:20     Комплексные числа. Символическая форма записи #1
Сейчас делаю реализацию класса. Что-то мне подсказывает, что есть ошибки. Тут больше вопрос по математике, в коей я практически ничего не понимаю. Кто в теме, просмотрите перегрузку арифметических действий, все ли там верно?
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
        class Ccomplex
        {
            private:
                float x;
                float y;
            public:
                // Элементарное приравнивание и возврат значений
                void SetX(float value)
                {
                    x = value;
                }
                void SetY(float value)
                {
                    y = value;
                }
                float GetX()
                {
                    return x;
                }
                float GetY()
                {
                    return y;
                }
                // Конструкторы
                // По умолчанию
                Ccomplex()
                {
                    x = 0.0;
                    y = 0.0;
                }
                // Конструктор копирования
                Ccomplex(Ccomplex& tmp)
                {
                    this->x = tmp.GetX();
                    this->y = tmp.GetY();
                }
                // Арифметические действия над комплексным числом (+-/*=)
                Ccomplex operator*(const Ccomplex& second)
                {
                    Ccomplex result;
                    result.x = abs(this->x) * abs(second.x);
                    result.y = this->y + second.y;
                    //this->x = abs(this->x) * abs(second.x);
                    //this->y = this->y + second.y;
                    //result.x = x*second.x;
                    return result;
                }
                Ccomplex operator/(Ccomplex const &second)//const
                {
                    Ccomplex result;// (A / second.A, F / second.F);
                    result.x = abs(this->x) / abs(second.x);
                    result.y = this->y - second.y;
 
                    //this->x = abs(this->x) / abs(second.x);
                    //this->y = this->y - second.y;
                    
                    //result.x = x/second.x;
                    return result;
                }
                // Деление комлексного числа на целое
                Ccomplex operator/(int X)
                {
                    Ccomplex result;
                    result.x = X;
                    result.y = 0;
 
                    return this->operator/(result);
                }
                Ccomplex operator+(Ccomplex const &second)//const
                {
                    Ccomplex result;
                    result.x = sqrt( abs(x*x) + abs(second.x*second.x) + 2*abs(this->x*second.x) * cos( (this->y-second.y)*M_PI/180) );
 
                    float xx = abs(this->x) * sin(this->y*M_PI/180) + abs(second.x) * sin(second.y*M_PI/180);
                    float yy = abs(this->x) * cos(this->y*M_PI/180) + abs(second.x) * cos(second.y*M_PI/180);
 
                    result.y = atan2(xx,yy) * 180.0/M_PI;
                    
                    //result.x = this->x + second.x;
                    //result.y = 0; 
                    return result;
                }               
                Ccomplex operator-(Ccomplex const &second)const
                {
                    Ccomplex result;//(A + second.A, F + second.F);
                    result.x = sqrt( abs(x*x) + abs(second.x*second.x) - 2*abs(x*second.x) * cos( (y-second.y)*M_PI/180) );
                    
                    float xx = abs(x) * sin(y*M_PI/180) - abs(second.y) * sin(second.y*M_PI/180);
                    float yy = abs(x) * cos(y*M_PI/180) - abs(second.x) * cos(second.y*M_PI/180);                   
 
                    result.y = atan2(xx,yy) * 180.0/M_PI;
                    
                    //result.x = this->x - second.x;
                    //result.y = 0; 
                    return result;
                }
 
        };
З.Ы. Прошу обратить внимание, именно символическая форма записи. Также, если вы знаете где почитать про это чудо, скидывайте пожалуйста ссылки.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.08.2012, 01:20     Комплексные числа. Символическая форма записи
Посмотрите здесь:

C++ Комплексные числа
комплексные числа C++
C++ Комплексные числа..
C++ Комплексные числа
C++ Комплексные числа
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
I.M.
 Аватар для I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
23.08.2012, 04:41     Комплексные числа. Символическая форма записи #2
Зачем в некоторых местах закомментировали const? И зачем обращаетесь к переменным через this-> ? С делением на целое перемудрили - сделали метод дольше и сложней. И в делении забываете проверять на 0.
Для других действий тоже неплохо бы сделать поддержку обычных чисел. И лучше это делать с помощью шаблонов, а не писать по 4 функции для каждого типа.
Для самопроверки математики можете сравнивать результаты вычислений своего класса с аналогичными результатами у std::complex

А почему выбрали именно показательную форму записи?
D-Vampire
3 / 3 / 0
Регистрация: 16.05.2012
Сообщений: 36
23.08.2012, 08:29  [ТС]     Комплексные числа. Символическая форма записи #3
Цитата Сообщение от I.M. Посмотреть сообщение
Зачем в некоторых местах закомментировали const? И зачем обращаетесь к переменным через this-> ? С делением на целое перемудрили - сделали метод дольше и сложней. И в делении забываете проверять на 0.
Для других действий тоже неплохо бы сделать поддержку обычных чисел. И лучше это делать с помощью шаблонов, а не писать по 4 функции для каждого типа.
Для самопроверки математики можете сравнивать результаты вычислений своего класса с аналогичными результатами у std::complex

А почему выбрали именно показательную форму записи?
Выбирать не приходилось - это часть курсовой. По той же причине не использовались шаблоны и перегрузка операторов для целых чисел. За std::complex отдельное спасибо.
Catstail
Модератор
 Аватар для Catstail
21487 / 10240 / 1668
Регистрация: 12.02.2012
Сообщений: 17,120
23.08.2012, 14:37     Комплексные числа. Символическая форма записи #4
С математикой проблемы явные... Если (x,y) и (z,w) - два комплексных числа, то произведение - это вот такая пара: (x*z-y*w, x*w+y*z). А у тебя в коде ЧТО запрограммировано?
edward_jonson
 Аватар для edward_jonson
157 / 157 / 25
Регистрация: 23.02.2011
Сообщений: 388
23.08.2012, 15:23     Комплексные числа. Символическая форма записи #5
Catstail, Если я правильно понял, то операторы реализованы для показательной формы.
Catstail
Модератор
 Аватар для Catstail
21487 / 10240 / 1668
Регистрация: 12.02.2012
Сообщений: 17,120
23.08.2012, 15:41     Комплексные числа. Символическая форма записи #6
Для экспоненциальной формы умножение тоже небезгрешно... abs - лишняя, т.к. модуль комплексного числа есть число неотрицательное.

Вообще же алгебраическая форма легче реализуется. Ведь в эксп. форме сложение/вычитание будут трудные. Но - дело хозяйское.
D-Vampire
3 / 3 / 0
Регистрация: 16.05.2012
Сообщений: 36
23.09.2012, 00:15  [ТС]     Комплексные числа. Символическая форма записи #7
Поднимаю тему, поспрашивал у однокурсников, почитал сообщения. Проблема все равно не ясна, но исходя из рекомендаций поправил код. Посмотрите, так ли это должно выглядеть? Особенное внимание прошу уделить методу CheckQuarter, т.к. этот момент мне наиболее неясен.
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
110
class Ccomplex
        {
            private:
                double x;
                double y;
                
                void CheckQuarter(double xx, double yy, double &resArc)
                {
                    resArc = atan(xx/yy); //[-pi/2,+pi/2] radians.
                    
                    //if (xx > 0 && yy > 0)                             // I
                    // nothing
                    
                    if ( (xx < 0 && yy > 0) || (xx < 0 && yy < 0))      // II or III
                        resArc += M_PI/2;
                    else if (xx > 0 && y < 0)                           // IV
                        resArc -= M_PI/2;
                        
                }
                
            public:
                // Элементарное приравнивание и возврат значений
                void SetX(double value)
                {
                    x = value;
                }
                void SetY(double value)
                {
                    y = value;
                }
                double GetX()
                {
                    return x;
                }
                double GetY()
                {
                    return y;
                }
                // Конструкторы
                // По умолчанию
                Ccomplex()
                {
                    x = 0.0;
                    y = 0.0;
                }
                // Конструктор копирования
                Ccomplex(const Ccomplex& tmp)
                {
                    x = tmp.x;
                    y = tmp.y;
                }
                
                // Арифметические действия над комплексным числом (+-/*=)
                Ccomplex operator*(const Ccomplex& second)
                {
                    Ccomplex result;
                    result.x = abs(x) * abs(second.x);
                    result.y = y + second.y;
 
                    return result;
                }
                Ccomplex operator/(Ccomplex const &second)
                {
                    Ccomplex result;// (A / second.A, F / second.F);
                    result.x = abs(x) / abs(second.x);
                    result.y = y - second.y;
 
                    return result;
                }
                
                // Деление комлексного числа на целое
                Ccomplex operator/(const int &X)const
                {
                    Ccomplex result;
                    result.x = abs(x) / abs(X);
                    result.y = y;
 
                    return result;
                }
                Ccomplex operator+(Ccomplex const &second)
                {
                    Ccomplex result;
                    result.x = sqrt( x*x + second.x*second.x + 2*x*second.x * cos(y-second.y) );
 
                    double xx = x * sin(y) + second.x * sin(second.y);
                    double yy = x * cos(y) + second.x * cos(second.y);
 
                    CheckQuarter(xx, yy, result.y);
                    
                    return result;
                }               
                Ccomplex operator-(Ccomplex const &second)
                {
                    Ccomplex result;
                    result.x = sqrt( x*x + second.x*second.x - 2*x*second.x * cos(y-second.y) );
 
                    double xx = x * sin(y) - second.x * sin(second.y);
                    double yy = x * cos(y) - second.x * cos(second.y);                  
                    
                    CheckQuarter(xx, yy, result.y);
                    
                    return result;
                }
                Ccomplex& operator=(Ccomplex const &orig)
                {
                    x = orig.x;
                    y = orig.y;
                    return *this;
                }
        };
З.Ы. Из градусов в радианы уже перевел на этапе чтения. Тоесть внутри класса радианы
I.M.
 Аватар для I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
23.09.2012, 00:41     Комплексные числа. Символическая форма записи #8
Вы хотите замечаний по коду или математике?
По коду могу накидать. матиматику надо вспоминать)
стандартные типы данных обычно передают напрямую, без всяких ссылок
функция проверки четверти будет выглядеть логичнее, если будет возвращать значение четверти ретурном
возможно деление на 0
оператор вычитания можно переписать через оператор сложения

при умножении и делении точно нужны модули? я сам уже не помню(
D-Vampire
3 / 3 / 0
Регистрация: 16.05.2012
Сообщений: 36
23.09.2012, 18:17  [ТС]     Комплексные числа. Символическая форма записи #9
Насчет деления на 0 спасибо, действительно этого не учел.
Что касается проверки четверти, если делать return, то можно было возвращать именно то, что нужно прибавить/отнять. но для меня на данный момент так код выглядит проще (тем более что его никто сопровождать не будет).
оператор вычитания можно переписать через оператор сложения
Условный флаг сделать, чтобы к примеру -1 подставить в операторы? Тоже заметил и поправил. Спасибо.

Но вообще больше замечаний нужно именно по математике, т.к. именно она и создает для меня чтолько проблем.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.09.2012, 19:23     Комплексные числа. Символическая форма записи
Еще ссылки по теме:

Комплексные числа в с++ C++
Классы, комплексные числа, возможность записи comp(3+2.2i) C++
Обратная форма записи 16ричного числа C++

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

Или воспользуйтесь поиском по форуму:
D-Vampire
3 / 3 / 0
Регистрация: 16.05.2012
Сообщений: 36
25.09.2012, 19:23  [ТС]     Комплексные числа. Символическая форма записи #10
Проблему решил, были еще ошибки в методе проверки четверти, исправил:
C++
1
2
3
4
5
6
7
8
9
                void CheckQuarter(double xx, double yy, double &resArc)
                {
                    resArc = atan(xx/yy); //[-pi/2,+pi/2] radians.
                    
                    if ( (xx < 0 && yy > 0) || (xx < 0 && yy < 0))     
                        resArc += M_PI/2;
 
                        
                }
Спасибо всем, кто ответил
Yandex
Объявления
25.09.2012, 19:23     Комплексные числа. Символическая форма записи
Ответ Создать тему
Опции темы

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