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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 37, средняя оценка - 4.70
kozlik_kozlik
7 / 11 / 0
Регистрация: 01.08.2012
Сообщений: 99
#1

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

01.08.2012, 13:30. Просмотров 4941. Ответов 36
Метки нет (Все метки)

Здравствуйте.
Изучаю сейчас 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;
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.08.2012, 13:30
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Комплексные числа (C++):

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

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

Комплексные числа - C++
Здравствуйте! у меня большая проблема... я плохо понимаю с++ и с трудом делаю лабы в универе. вот одна из них. Задание:Написать класс,...

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

Комплексные числа - C++
Написать программу производящую арифметические действия над вводимыми с клавиатуры комплексными числами. Те: пользователь вводит одно...

Комплексные числа - C++
Добавлено через 32 секунды Написать тестовую программу, которая: * динамически выделяет массив указателей на базовый класс (4-6 шт.); ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
John Prick
801 / 734 / 145
Регистрация: 27.07.2012
Сообщений: 2,107
Завершенные тесты: 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 и делать функции доступа к этим полям.
0
Leomana
58 / 58 / 5
Регистрация: 29.06.2012
Сообщений: 188
01.08.2012, 13:37 #3
перегрузка операций выглядит (согласитесь) красивее и понятней.. одно дело вы пишите с = add(a,b) .. а другое дело вы просто пишите с = а+b ...
0
kozlik_kozlik
7 / 11 / 0
Регистрация: 01.08.2012
Сообщений: 99
01.08.2012, 13:39  [ТС] #4
Спасибо, товарищи!

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

И почему у вас X передаётся по ссылке? Вроде можно обойтись без & и всё будет хорошо?
0
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 и делать функции доступа к этим полям.
если делать так то получается мы не можем сложить два числа не изменив одно из них...
0
kozlik_kozlik
7 / 11 / 0
Регистрация: 01.08.2012
Сообщений: 99
01.08.2012, 13:44  [ТС] #6
Цитата Сообщение от Leomana Посмотреть сообщение
если делать так то получается мы не можем сложить два числа не изменив одно из них...
Вово, всё-таки бяка получается, и весьма неприятная.
0
Leomana
58 / 58 / 5
Регистрация: 29.06.2012
Сообщений: 188
01.08.2012, 13:44 #7
kozlik_kozlik , то есть всё таки, если Вам надо взять два комплексных числа, сложить и занести результат в другую переменную (объект).. то Ваш код вполне уместен
0
John Prick
801 / 734 / 145
Регистрация: 27.07.2012
Сообщений: 2,107
Завершенные тесты: 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; }
};
Как-то так, если ничего не забыл
0
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)
0
kozlik_kozlik
7 / 11 / 0
Регистрация: 01.08.2012
Сообщений: 99
01.08.2012, 13:49  [ТС] #10
Leomana, а почему в другом коде X передаётся по ссылке? Это имеет какое-то сакральное значение? Или так тупо быстрее?
0
John Prick
801 / 734 / 145
Регистрация: 27.07.2012
Сообщений: 2,107
Завершенные тесты: 3
01.08.2012, 13:52 #11
Цитата Сообщение от Leomana Посмотреть сообщение
если делать так то получается мы не можем сложить два числа не изменив одно из них...
Выше объяснил, что не так в первоначальном варианте.
Но в принципе он нормален, только учесть замечания. Так можно поступать.

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

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

Спасибо всем!
0
John Prick
801 / 734 / 145
Регистрация: 27.07.2012
Сообщений: 2,107
Завершенные тесты: 3
01.08.2012, 13:55 #13
Цитата Сообщение от kozlik_kozlik Посмотреть сообщение
Так ведь работает, что самое смешное!
Спорим, что не работает ну то есть, работает, но не так. Задайте начальные значения ненулевые и посмотрите результат.

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

Ну да, ненулевые, вон они в main задаются и результат правильный. Либо я дурак, либо жопа пишется через ё
0
Leomana
58 / 58 / 5
Регистрация: 29.06.2012
Сообщений: 188
01.08.2012, 13:59 #15
Цитата Сообщение от John Prick Посмотреть сообщение
В вашем случае её нужно сделать статической и обращаться к ней через ::
Статические методы предназначены для статических полей.. так что если уж менять на красоту, то используя дружественную функцию ..
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.08.2012, 13:59
Привет! Вот еще темы с ответами:

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
01.08.2012, 13:59
Ответ Создать тему
Опции темы

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