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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 8, средняя оценка - 5.00
D-Vampire
3 / 3 / 0
Регистрация: 16.05.2012
Сообщений: 36
#1

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

23.08.2012, 01:20. Просмотров 1038. Ответов 9
Метки нет (Все метки)

Сейчас делаю реализацию класса. Что-то мне подсказывает, что есть ошибки. Тут больше вопрос по математике, в коей я практически ничего не понимаю. Кто в теме, просмотрите перегрузку арифметических действий, все ли там верно?
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     Комплексные числа. Символическая форма записи
Посмотрите здесь:

Классы, комплексные числа, возможность записи comp(3+2.2i) - C++
Доброго времени суток! Для разминки мозгов решил написать класс больших комплексных чисел(мол число интерпретировать как строку, дабы...

Обратная форма записи 16ричного числа - C++
Здравствуйте, при записи массива в файл с помощью функции fwrite возникли следующие сложности: числа записываются в 16ричной формате в...

Комплексные числа - C++
Здравствуйте. Изучаю сейчас C++ по Дейтелам, там попалось задание - создать класс комплексное число с функциями: сложение, вычитание,...

Комплексные числа - C++
Как вы думаете. Допустим, у нас есть i. То самое, что значит -1. Можно ли как-то реализовать, например, с помощью #define i таким образом,...

Комплексные числа - C++
2. Даны два комплексных числа в алгебраической форме. Найти их произведение. Пример //Лаб.раб.№ 1. Линейная программа. ...

Комплексные числа в с++ - C++
Здравствуйте. Нужна ваша помощь. Задание такое: Написать программу решения квадратного уравнения. Корни могут быть...

Комплексные числа - C++
Доброе время суток! Я новичок в Си++ а задали задание сделать: Заранее спасибо!

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
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
Модератор
22515 / 10920 / 1774
Регистрация: 12.02.2012
Сообщений: 18,067
23.08.2012, 14:37     Комплексные числа. Символическая форма записи #4
С математикой проблемы явные... Если (x,y) и (z,w) - два комплексных числа, то произведение - это вот такая пара: (x*z-y*w, x*w+y*z). А у тебя в коде ЧТО запрограммировано?
edward_jonson
158 / 158 / 25
Регистрация: 23.02.2011
Сообщений: 392
23.08.2012, 15:23     Комплексные числа. Символическая форма записи #5
Catstail, Если я правильно понял, то операторы реализованы для показательной формы.
Catstail
Модератор
22515 / 10920 / 1774
Регистрация: 12.02.2012
Сообщений: 18,067
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.
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++
Здравствуйте! у меня большая проблема... я плохо понимаю с++ и с трудом делаю лабы в универе. вот одна из них. Задание:Написать класс,...

комплексные числа - C++
дан список, элементы которого являются комплексными числами. Найти сумму элементов списка

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

Комплексные числа - C++
Здравствуйте! Как мне в С написать вычисление следующего значения R(коэффициент прохождения): l=exp(i*ky1*(-d)); j=i*ky1*(1-d); ...

Комплексные числа - C++
Не могу решить эту задачу!Напишите Алгоритм пожалуйста,вот условие: 1)Вводятся два комплексных числа в алгебраической форме. Написать...


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

Или воспользуйтесь поиском по форуму:
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     Комплексные числа. Символическая форма записи
Ответ Создать тему
Опции темы

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