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

Комплексные числа - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 37, средняя оценка - 4.70
kozlik_kozlik
7 / 11 / 0
Регистрация: 01.08.2012
Сообщений: 99
01.08.2012, 13:30     Комплексные числа #1
Здравствуйте.
Изучаю сейчас C++ по Дейтелам, там попалось задание - создать класс комплексное число с функциями: сложение, вычитание, вывод числа в виде (re, im). Была проблема с первыми двумя функциями. Пошёл шарить по форумам - нашёл только варианты с перегрузкой операторов, а такого в книжке нет до этого задания, то есть надо типа обойтись без перегрузки. Я взял написал по-тупому, пока только сложение (смысл делать остальное, когда оно должно быть построено по тому же принципу, а я может в чём ошибаюсь). Посмотрите пжлст мою программу и скажите насколько я идиот прокомментриуйте функцию add, сложения то бишь: так вообще можно делать? Не вызовет ли это каких-либо проблем? Программа работает и выдаёт вполне себе человеческий результат, но мало ли где могут быть подводные грабли.
И да, если мой вариант всё-таки правильный, почему ВЕЗДЕ, где ни поищу, попадаются варианты с перегрузкой? Они чем-то лучше?
Буду очень благодарен за ответ идиот ли я и почему, учиться мне особо не у кого, а надо.

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
#include <iostream>
#include <cmath>
 
using std::cin;
using std::cout;
using std::endl;
 
class Complex
{
public:
    Complex(double = 0.0, double = 0.0);
    void print_number();
    Complex add(Complex, Complex);
 
private:
    double re, im;
 
};
 
Complex::Complex(double r, double i) //конструктор со значениями по умолчанию
{
    re=r; im=i;
}
void Complex::print_number() //вывод числа
{
    cout << "( " << re << ", " << im << " )" << endl;
}
Complex Complex::add(Complex a, Complex b) //сложение
{
    Complex x;
 
    x.re=a.re+b.re;
    x.im=a.im+b.im;
 
    return x;
}
int main()
{
    Complex complex1(3.0, 5.5), complex2(2.0, -1.0), complex_sum;
    //создаём объекты, задаём значения
 
    complex1.print_number();//вывести первое число
    complex2.print_number();//вывести второе число
    complex_sum=complex_sum.add(complex1, complex2);//сложить их
    complex_sum.print_number();//вывести результат
 
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.08.2012, 13:30     Комплексные числа
Посмотрите здесь:

C++ Комплексные числа
Комплексные числа C++
комплексные числа C++
C++ Комплексные числа..
C++ Комплексные числа
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
John Prick
754 / 687 / 123
Регистрация: 27.07.2012
Сообщений: 1,974
Завершенные тесты: 3
01.08.2012, 13:37     Комплексные числа #2
Наверное, не совсем так. Есть комплексное число, к нему можно прибавить другое комплексное число. выглядеть это будет так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Complex
{
public:
    Complex(double = 0.0, double = 0.0);
    void print_number();
    void add(Complex &);
    double re, im;
};
 
void Complex::add(Complex & X)
{
    re += X.re;
    im += X.im;
}
Только, если по-хорошему, надо прятать re и im в секцию private и делать функции доступа к этим полям.
Leomana
58 / 58 / 5
Регистрация: 29.06.2012
Сообщений: 188
01.08.2012, 13:37     Комплексные числа #3
перегрузка операций выглядит (согласитесь) красивее и понятней.. одно дело вы пишите с = add(a,b) .. а другое дело вы просто пишите с = а+b ...
kozlik_kozlik
7 / 11 / 0
Регистрация: 01.08.2012
Сообщений: 99
01.08.2012, 13:39  [ТС]     Комплексные числа #4
Спасибо, товарищи!

Цитата Сообщение от John Prick Посмотреть сообщение
Наверное, не совсем так.
А вы не могли бы пояснить, почему не совсем так? Почему бы и не сделать сложение по моему варианту? Чем именно он плох? Я не задираюсь, а разобраться хочу, потому что сУрпризов потом не хочется.

И почему у вас X передаётся по ссылке? Вроде можно обойтись без & и всё будет хорошо?
Leomana
58 / 58 / 5
Регистрация: 29.06.2012
Сообщений: 188
01.08.2012, 13:41     Комплексные числа #5
Цитата Сообщение от John Prick Посмотреть сообщение
Наверное, не совсем так. Есть комплексное число, к нему можно прибавить другое комплексное число. выглядеть это будет так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Complex
{
public:
    Complex(double = 0.0, double = 0.0);
    void print_number();
    void add(Complex &);
    double re, im;
};
 
void Complex::add(Complex & X)
{
    re += X.re;
    im += X.im;
}
Только, если по-хорошему, надо прятать re и im в секцию private и делать функции доступа к этим полям.
если делать так то получается мы не можем сложить два числа не изменив одно из них...
kozlik_kozlik
7 / 11 / 0
Регистрация: 01.08.2012
Сообщений: 99
01.08.2012, 13:44  [ТС]     Комплексные числа #6
Цитата Сообщение от Leomana Посмотреть сообщение
если делать так то получается мы не можем сложить два числа не изменив одно из них...
Вово, всё-таки бяка получается, и весьма неприятная.
Leomana
58 / 58 / 5
Регистрация: 29.06.2012
Сообщений: 188
01.08.2012, 13:44     Комплексные числа #7
kozlik_kozlik , то есть всё таки, если Вам надо взять два комплексных числа, сложить и занести результат в другую переменную (объект).. то Ваш код вполне уместен
John Prick
754 / 687 / 123
Регистрация: 27.07.2012
Сообщений: 1,974
Завершенные тесты: 3
01.08.2012, 13:49     Комплексные числа #8
Цитата Сообщение от kozlik_kozlik Посмотреть сообщение
А вы не могли бы пояснить, почему не совсем так? Почему бы и не сделать сложение по моему варианту? Чем именно он плох
Попробуйте написать небольшой код, который будет использовать Вашу функцию. Она у вас не будет работать без объекта, т.е. не получится написать:
C++
1
2
Complex a,b,c;
c = add(a ,b);
В вашем случае её нужно сделать статической и обращаться к ней через ::
C++
1
2
3
4
5
6
7
8
Class Complex
{
// ...
    static Complex add(Comlex, Complex);
};
// где-то в коде
Complex a,b,c;
c = Complex::add(a,b);
Не очень удобно, на мой взгляд.
И, кстати, всё равно работать не будет, потому что из функции возвращается объект. В фрагменте кода выше в переменной с всё равно будут начальные значения чисел. Чтобы они были теми, которые вы ожидаете, необходим конструктор копирования в классе Complex:
C++
1
2
3
4
5
class Complex
{
public:
   Complex(Complex & C) { im = C.im; re = C.re; }
};
Как-то так, если ничего не забыл
Leomana
58 / 58 / 5
Регистрация: 29.06.2012
Сообщений: 188
01.08.2012, 13:49     Комплексные числа #9
для полной радости можно еще написать так
C++
1
Complex Complex::add(const Complex a, const Complex b)
kozlik_kozlik
7 / 11 / 0
Регистрация: 01.08.2012
Сообщений: 99
01.08.2012, 13:49  [ТС]     Комплексные числа #10
Leomana, а почему в другом коде X передаётся по ссылке? Это имеет какое-то сакральное значение? Или так тупо быстрее?
John Prick
754 / 687 / 123
Регистрация: 27.07.2012
Сообщений: 1,974
Завершенные тесты: 3
01.08.2012, 13:52     Комплексные числа #11
Цитата Сообщение от Leomana Посмотреть сообщение
если делать так то получается мы не можем сложить два числа не изменив одно из них...
Выше объяснил, что не так в первоначальном варианте.
Но в принципе он нормален, только учесть замечания. Так можно поступать.

Добавлено через 1 минуту
Цитата Сообщение от kozlik_kozlik Посмотреть сообщение
а почему в другом коде X передаётся по ссылке? Это имеет какое-то сакральное значение? Или так тупо быстрее?
а) быстрее
б) в вашем первоначальном варианте будет работать не так, как вы ожидаете, так как у вас не написан конструктор копирования
kozlik_kozlik
7 / 11 / 0
Регистрация: 01.08.2012
Сообщений: 99
01.08.2012, 13:54  [ТС]     Комплексные числа #12
Цитата Сообщение от John Prick Посмотреть сообщение
И, кстати, всё равно работать не будет, потому что из функции возвращается объект.
Так ведь работает, что самое смешное! Почему бы функции не возвращать объект?

Так можно поступать.
А, ну это главное. Совершенствоваться ещё буду потом, щас не до жиру, быть бы живу.

Спасибо всем!
John Prick
754 / 687 / 123
Регистрация: 27.07.2012
Сообщений: 1,974
Завершенные тесты: 3
01.08.2012, 13:55     Комплексные числа #13
Цитата Сообщение от kozlik_kozlik Посмотреть сообщение
Так ведь работает, что самое смешное!
Спорим, что не работает ну то есть, работает, но не так. Задайте начальные значения ненулевые и посмотрите результат.

UPD. А пардон, будет работать невнимательно посмотрел код main
kozlik_kozlik
7 / 11 / 0
Регистрация: 01.08.2012
Сообщений: 99
01.08.2012, 13:57  [ТС]     Комплексные числа #14
Цитата Сообщение от John Prick Посмотреть сообщение
Задайте начальные значения ненулевые и посмотрите результат.
Я в смысле - первоначальный вариант работает, без предложенных исправлений.

Ну да, ненулевые, вон они в main задаются и результат правильный. Либо я дурак, либо жопа пишется через ё
Leomana
58 / 58 / 5
Регистрация: 29.06.2012
Сообщений: 188
01.08.2012, 13:59     Комплексные числа #15
Цитата Сообщение от John Prick Посмотреть сообщение
В вашем случае её нужно сделать статической и обращаться к ней через ::
Статические методы предназначены для статических полей.. так что если уж менять на красоту, то используя дружественную функцию ..
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
01.08.2012, 14:00     Комплексные числа #16
А чтоб совсем всё зашибись было: ещё перегрузку арифметики для обычных чисел.
John Prick
754 / 687 / 123
Регистрация: 27.07.2012
Сообщений: 1,974
Завершенные тесты: 3
01.08.2012, 14:06     Комплексные числа #17
Цитата Сообщение от Leomana Посмотреть сообщение
Статические методы предназначены для статических полей
так в моём коде нестатические поля и не менялись в статической функции
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
01.08.2012, 14:06     Комплексные числа #18
Удобнее сделать 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
class Complex
{
public:
    Complex(double = 0.0, double = 0.0);
    void print_number();
    Complex add(Complex);
 
private:
    double re, im;
 
};
 
Complex Complex::add(Complex a) //сложение (член класса)
{
    re += a.re;
    im += a.im;
 
    return *this;
}
 
Complex add(Complex a, Complex b) //сложение (внешняя функция)
{
    Complex x = a; // это на случай, если a передавать по ссылке
                   // поскольку сейчас в a копия, то можно не копировать
 
    return x.add(b);
}
Да, я сохранил передачу по значению, хотя лучше (быстрее) передавать с помощью ссылки на константу. Первая функция тоже может возвращать ссылку на константу (но не вторая).
Конструктор копирования здесь не обязателен.
John Prick
754 / 687 / 123
Регистрация: 27.07.2012
Сообщений: 1,974
Завершенные тесты: 3
01.08.2012, 14:12     Комплексные числа #19
grizlik78, конструктор копирования в любом случае необходим.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.08.2012, 14:12     Комплексные числа
Еще ссылки по теме:

C++ Комплексные числа
Комплексные числа C++
Комплексные числа в с++ C++

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

Или воспользуйтесь поиском по форуму:
Leomana
58 / 58 / 5
Регистрация: 29.06.2012
Сообщений: 188
01.08.2012, 14:12     Комплексные числа #20
и пришел он ... grizlik78 ... и всё сделал как надо
Yandex
Объявления
01.08.2012, 14:12     Комплексные числа
Ответ Создать тему
Опции темы

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