Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
0 / 0 / 0
Регистрация: 09.10.2018
Сообщений: 115
1

Умножение и деление комплексных чисел

05.09.2019, 00:14. Показов 1351. Ответов 15
Метки нет (Все метки)

Неправильно умножаются и делятся комплексные числа
Код:
Main
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
ComplexNumbers A;
    A.ReadComplexNumbers();
    ComplexNumbers B;
    //B.ReadComplexNumbers();
    cout << "Демонстрация операции сложения" << endl;
    ComplexNumbers C;
    C = A + B;
    C.DisplayComplexNumbers(C);
    A.ReadComplexNumbers();
    B.ReadComplexNumbers();
    cout << "Демонстрация операции вычитания" << endl;
    C = A - B;
    C.DisplayComplexNumbers(C);
    A.ReadComplexNumbers();
    B.ReadComplexNumbers();
    cout << "Демонстирация операции умножения" << endl;
    C = A * B;
    C.DisplayComplexNumbers(C);
    A.ReadComplexNumbers();
    B.ReadComplexNumbers();
    cout << "Демонстрация операции деления" << endl;
    C = A / B;
    C.DisplayComplexNumbers(C);
Сама реализация операторов
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
ComplexNumbers& ComplexNumbers::operator * (ComplexNumbers &complexNumbers) 
{
    this->real = real * complexNumbers.real-imgnry*complexNumbers.imgnry;
    this->imgnry = real * complexNumbers.imgnry+imgnry*complexNumbers.real;
    return *this;
}
 
ComplexNumbers& ComplexNumbers::operator / (ComplexNumbers &complexNumbers) 
{
    double d = complexNumbers.real * complexNumbers.real + complexNumbers.imgnry * complexNumbers.imgnry;
    this->real = (real * complexNumbers.real + imgnry * complexNumbers.imgnry) / d;
    this->real = (imgnry * complexNumbers.real - real * complexNumbers.imgnry) / d;
 
    return *this;
}
и еще, как можно сделать, чтобы передаваемые значения постоянно заново не писать, ибо если задать изначально, то после первого сложения экземпляр с именем "A" класса ComplexNumbers меняет свое значение

Добавлено через 43 минуты
Исправил
Теперь осталось: еще, как можно сделать, чтобы передаваемые значения постоянно заново не писать, ибо если задать изначально, то после первого сложения экземпляр с именем "A" класса ComplexNumbers меняет свое значение
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.09.2019, 00:14
Ответы с готовыми решениями:

Деление комплексных чисел
Запуталась с делением комплексных чисел. Помогите пожалуйста. struct complex { double a; ...

Деление комплексных чисел
Вот код #include &lt;iostream&gt; #include &lt;math&gt; using namespace std; typedef struct { float re,...

Дописать деление комплексных чисел
Не знаю как дописать деление комплексных чисел. #include &lt;cstdlib&gt; #include &lt;iostream&gt; #include...

Умножение комплексных чисел
у меня имеется прога, по решению данной задачи, с помощью структуры struct complex { int re;...

15
С чаем беда...
Эксперт CЭксперт С++
9145 / 4664 / 1268
Регистрация: 18.10.2014
Сообщений: 10,517
05.09.2019, 01:07 2
Цитата Сообщение от artur31154 Посмотреть сообщение
и еще, как можно сделать, чтобы передаваемые значения постоянно заново не писать, ибо если задать изначально, то после первого сложения экземпляр с именем "A" класса ComplexNumbers меняет свое значение
Откуда же нам знать, что у вас там понаписано в реализации оператора сложения? Однако по тому, что вы привели, видно, что вместо нормального оператора * вы почему-то реализовали оператор *=. Та же самая ошибка у вас присутствует в реализации / и, скорее всего, в +. Потому значения и меняются. Перестаньте модифицировать первый операнд этих операторов - и он перестанет "менять свое значение".

Также в своих реализациях этих операторов вы "портите" исходные значения и затем используете уже "испорченные" значения там, где требуются исходные значения. Поэтому в результате получается ерунда.

И что это вообще за мешанина: в одном месте real, в другом - this->real? Где логика?
0
0 / 0 / 0
Регистрация: 09.10.2018
Сообщений: 115
05.09.2019, 01:32  [ТС] 3
TheCalligrapher, Можете объяснить в чем разница real от this->real?
Про умножения и деления: я исправил
Код оператора сложения:
C++
1
2
3
4
5
6
ComplexNumbers& ComplexNumbers::operator + (ComplexNumbers &complexNumbers) 
{
    real += complexNumbers.real;
    imgnry += complexNumbers.imgnry;
    return *this;
}
Мне бы хотелось реализовать вот так:
C++
1
ComplexNumbers A(4,5);
и чтобы данные значения в A оставались на протяжении всех тестов и не нужно было бы постоянно перезаписывать, но стоит сделать какую-либо операцию(умножение, деление, разность, сумма) значения сразу меняются.
0
С чаем беда...
Эксперт CЭксперт С++
9145 / 4664 / 1268
Регистрация: 18.10.2014
Сообщений: 10,517
05.09.2019, 01:48 4
Цитата Сообщение от artur31154 Посмотреть сообщение
Можете объяснить в чем разница real от this->real?
Абсолютно ни в чем. Поэтому и возникает вопрос: почему у вас вперемешку используется real и this->real? Чего вы этим пытались добиться?

Цитата Сообщение от artur31154 Посмотреть сообщение
Код оператора сложения:
C++
1
2
3
4
5
6
ComplexNumbers& ComplexNumbers::operator + (ComplexNumbers &complexNumbers) 
{
  real += complexNumbers.real;
  imgnry += complexNumbers.imgnry;
  return *this;
}
Та же самая проблема, о которой я говорил выше. Ваш "оператор сложения" ведет себя как оператор +=. Зачем вы реализовали += вместо +? Реализуйте нормальный +, который не меняет this->real и this->imgnry.
0
9 / 7 / 2
Регистрация: 13.11.2014
Сообщений: 51
05.09.2019, 02:04 5
Цитата Сообщение от artur31154 Посмотреть сообщение
ComplexNumbers& ComplexNumbers::operator + (ComplexNumbers &complexNumbers)
{
* * real += complexNumbers.real;
* * imgnry += complexNumbers.imgnry;
* * return *this;
}
Поддержу коллегу. Вы понимаете, что такое механизм передачи по ссылке и по значению, и понимаете предназначение this?

Вот пример верного описания операции сложения по вашему требованию, чтоб ничего не менялось:

C++
1
2
3
4
5
6
7
ComplexNumbers ComplexNumbers::operator + (ComplexNumbers &complexNumbers) 
{
    ComplexNumbers temp;
* * temp.real += complexNumbers.real;
* * temp.imgnry += complexNumbers.imgnry;
* * return temp;
}
Не понимаете, почему так - спрашивайте!

Цитата Сообщение от artur31154 Посмотреть сообщение
ComplexNumbers A(4,5);
Хотите так - напишите конструктор с двумя аргументами!
0
С чаем беда...
Эксперт CЭксперт С++
9145 / 4664 / 1268
Регистрация: 18.10.2014
Сообщений: 10,517
05.09.2019, 03:10 6
Цитата Сообщение от born4bits Посмотреть сообщение
Вот пример верного описания операции сложения по вашему требованию
Идея правильная, но не работает: реализация содержит баг.
0
0 / 0 / 0
Регистрация: 09.10.2018
Сообщений: 115
05.09.2019, 07:17  [ТС] 7
born4bits, Программа содержит конструктор с двумя параметрами

TheCalligrapher, какой ?
0
С чаем беда...
Эксперт CЭксперт С++
9145 / 4664 / 1268
Регистрация: 18.10.2014
Сообщений: 10,517
05.09.2019, 07:50 8
Цитата Сообщение от artur31154 Посмотреть сообщение
TheCalligrapher, какой ?
Переменную ComplexNumbers temp; нужно сначала инициализировать содержимым *this. А в вашем коде содержимое *this вообще никак нигде не участвует. Ясно, что правильно работать этот никак не может.
0
0 / 0 / 0
Регистрация: 09.10.2018
Сообщений: 115
05.09.2019, 09:36  [ТС] 9
TheCalligrapher, как это сделать ?
0
9 / 7 / 2
Регистрация: 13.11.2014
Сообщений: 51
05.09.2019, 12:13 10
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Идея правильная, но не работает: реализация содержит баг
Поторопился )

C++
1
2
3
4
5
6
7
ComplexNumbers ComplexNumbers::operator + (ComplexNumbers &complexNumbers) 
{
    ComplexNumbers temp;
* * temp.real = this.real + complexNumbers.real;
* * temp.imgnry = this.imgnry+ complexNumbers.imgnry;
* * return temp;
}
Вот так верно
Цитата Сообщение от artur31154 Посмотреть сообщение
Программа содержит конструктор с двумя параметрами
Тогда пишите

C++
1
ComplexNumbers A(4,5);
кто вам мешает?
0
С чаем беда...
Эксперт CЭксперт С++
9145 / 4664 / 1268
Регистрация: 18.10.2014
Сообщений: 10,517
06.09.2019, 00:06 11
Цитата Сообщение от born4bits Посмотреть сообщение
Поторопился )

C++
1
2
3
4
5
6
7
ComplexNumbers ComplexNumbers::operator + (ComplexNumbers &complexNumbers) 
{
    ComplexNumbers temp;
    temp.real = this.real + complexNumbers.real;
    temp.imgnry = this.imgnry+ complexNumbers.imgnry;
    return temp;
}
Вот так верно
Верно ли? Вообще-то this в С++ всегда был указателем.
0
0 / 0 / 0
Регистрация: 09.10.2018
Сообщений: 115
06.09.2019, 02:21  [ТС] 12
TheCalligrapher, Так, как сделать так, чтобы один раз создать экземпляр класса, передав в конструктор два аргумента, чтобы они больше не менялись?

Добавлено через 1 час 24 минуты
Все, сделал
0
3347 / 1925 / 368
Регистрация: 09.09.2017
Сообщений: 7,791
06.09.2019, 10:19 13
Цитата Сообщение от artur31154 Посмотреть сообщение
Все, сделал
А поделиться с окружающими?
0
9 / 7 / 2
Регистрация: 13.11.2014
Сообщений: 51
06.09.2019, 13:17 14
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Верно ли? Вообще-то this в С++ всегда был указателем.
Позор мне.

Цитата Сообщение от artur31154 Посмотреть сообщение
Все, сделал
Так держать )
0
0 / 0 / 0
Регистрация: 09.10.2018
Сообщений: 115
06.09.2019, 16:03  [ТС] 15
COKPOWEHEU,
C++
1
2
3
4
5
6
7
ComplexNumbers ComplexNumbers::operator + (const ComplexNumbers &complexNumbers)
{
    ComplexNumbers CNumbers;
    CNumbers.real = real +complexNumbers.real;
    CNumbers.imgnry = imgnry + complexNumbers.imgnry;
    return CNumbers;
}
0
С чаем беда...
Эксперт CЭксперт С++
9145 / 4664 / 1268
Регистрация: 18.10.2014
Сообщений: 10,517
06.09.2019, 18:13 16
Цитата Сообщение от artur31154 Посмотреть сообщение
COKPOWEHEU,
C++
1
2
3
4
5
6
7
ComplexNumbers ComplexNumbers::operator + (const ComplexNumbers &complexNumbers)
{
    ComplexNumbers CNumbers;
    CNumbers.real = real +complexNumbers.real;
    CNumbers.imgnry = imgnry + complexNumbers.imgnry;
    return CNumbers;
}
Еще лучше

C++
1
2
3
4
5
6
7
ComplexNumbers ComplexNumbers::operator + (const ComplexNumbers &complexNumbers) const
{
    ComplexNumbers CNumbers;
    CNumbers.real = real + complexNumbers.real;
    CNumbers.imgnry = imgnry + complexNumbers.imgnry;
    return CNumbers;
}
Можно также

C++
1
2
3
4
5
6
7
ComplexNumbers ComplexNumbers::operator + (const ComplexNumbers &complexNumbers) const
{
    ComplexNumbers CNumbers(*this);
    CNumbers.real += complexNumbers.real;
    CNumbers.imgnry += complexNumbers.imgnry;
    return CNumbers;
}
Но еще лучше было бы реализовать перегрузку самостоятельной функцией, а не методом класса.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.09.2019, 18:13

Умножение комплексных чисел в алгебраическом ввиде
Умножение комплексных чисел в алгебраическом ввиде Помогите с кодом на с++. Просьба в простом виде...

Умножение комплексных чисел, запись в алгебраическом виде
Господа программисты! Покорнейше прошу помочь мне с написанием данной программы, по скольку сам не...

Умножение/деление длинных целых чисел из строк
у кого есть код 'умножение и деление целых чисел из строк'? заранее спасибо Добавлено через 32...

Сделать сложение, вычитание, умножение и деление длинных чисел
В общем, задача такая, что надо сделать сложение, вычитание, умножение и деление длинных чисел....


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

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

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