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

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

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

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

01.08.2012, 13:30. Просмотров 5010. Ответов 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 шт.); ...

36
OhMyGodSoLong
~ Эврика! ~
1244 / 993 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
01.08.2012, 14:00 #16
А чтоб совсем всё зашибись было: ещё перегрузку арифметики для обычных чисел.
0
John Prick
801 / 734 / 145
Регистрация: 27.07.2012
Сообщений: 2,107
Завершенные тесты: 3
01.08.2012, 14:06 #17
Цитата Сообщение от Leomana Посмотреть сообщение
Статические методы предназначены для статических полей
так в моём коде нестатические поля и не менялись в статической функции
0
grizlik78
Эксперт С++
1956 / 1449 / 115
Регистрация: 29.05.2011
Сообщений: 3,008
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);
}
Да, я сохранил передачу по значению, хотя лучше (быстрее) передавать с помощью ссылки на константу. Первая функция тоже может возвращать ссылку на константу (но не вторая).
Конструктор копирования здесь не обязателен.
0
John Prick
801 / 734 / 145
Регистрация: 27.07.2012
Сообщений: 2,107
Завершенные тесты: 3
01.08.2012, 14:12 #19
grizlik78, конструктор копирования в любом случае необходим.
0
Leomana
58 / 58 / 5
Регистрация: 29.06.2012
Сообщений: 188
01.08.2012, 14:12 #20
и пришел он ... grizlik78 ... и всё сделал как надо
0
grizlik78
Эксперт С++
1956 / 1449 / 115
Регистрация: 29.05.2011
Сообщений: 3,008
01.08.2012, 14:13 #21
Цитата Сообщение от John Prick Посмотреть сообщение
grizlik78, конструктор копирования в любом случае необходим.
Здесь компилятор его самостоятельно сделает вполне подходящим. Но можно и самому написать. Если написать правильно, то хуже не станет
0
Leomana
58 / 58 / 5
Регистрация: 29.06.2012
Сообщений: 188
01.08.2012, 14:16 #22
Цитата Сообщение от John Prick Посмотреть сообщение
grizlik78, конструктор копирования в любом случае необходим.
имеет смысл делать конструктор копирования, если есть указатели или ссылки..
0
John Prick
801 / 734 / 145
Регистрация: 27.07.2012
Сообщений: 2,107
Завершенные тесты: 3
01.08.2012, 14:19 #23
Цитата Сообщение от grizlik78 Посмотреть сообщение
Здесь компилятор его самостоятельно сделает вполне подходящим.
Вот они издержки моего MSVS6.0. у меня он самостоятельно ничего за меня делать не будет.
0
grizlik78
Эксперт С++
1956 / 1449 / 115
Регистрация: 29.05.2011
Сообщений: 3,008
01.08.2012, 14:22 #24
John Prick, я с этим чудом техники давно уже не сталкивался, но думаю ты ошибаешься. Умолчательные конструкторы (в том числе и копирования) появились в языке задолго до первого стандарта и VC6.
0
John Prick
801 / 734 / 145
Регистрация: 27.07.2012
Сообщений: 2,107
Завершенные тесты: 3
01.08.2012, 14:35 #25
grizlik78, умолчательный конструктор копирования там будет, но надеяться, что он правильно скопирует внутренние поля нельзя, только если класс совсем уж простой. Впрочем, это уже оффтоп.
0
grizlik78
01.08.2012, 14:36
  #26

Не по теме:

Ну, класс и есть простой, побитового копирования вполне хватает. Ладно, не будем развивать тему

0
-=ЮрА=-
Заблокирован
Автор FAQ
01.08.2012, 15:02 #27
kozlik_kozlik, если комплексы по простому, то посмотри сюда
http://www.cyberforum.ru/faq/thread4...ml#post2432704
Здесь крайне простая реализация решение квадратного уравнения с D < 0
http://www.cyberforum.ru/faq/thread4...ml#post2435222
Здесь таблица значений функции с комплексным значением
http://www.cyberforum.ru/faq/thread4...ml#post2439450
Ну и далее по нарастающей вплоть до класса CComplex

Добавлено через 1 минуту

Не по теме:

PS:

Цитата Сообщение от kozlik_kozlik Посмотреть сообщение
using std::cin;
using std::cout;
using std::endl;
- это всё спокойно можно заменить 1 строкой using namespace std хуже код от этого не станет...

0
Avazart
Эксперт С++
7213 / 5385 / 286
Регистрация: 10.12.2010
Сообщений: 23,796
Записей в блоге: 17
01.08.2012, 15:32 #28
Цитата Сообщение от -=ЮрА=-
- это всё спокойно можно заменить 1 строкой using namespace std хуже код от этого не станет...
Вообще-то будет, т.е. и с уже using плохо ...

Важно в основном не то что использовать using или using namespace, а то где это делать...
Не хорошо это делать в глобальном пространстве.

Если что то используется в классе
C++
1
2
3
4
void Complex::print_number() //вывод числа
{
    cout << "( " << re << ", " << im << " )" << endl;
}
лучше указывать явно std::
C++
1
2
3
4
void Complex::print_number() //вывод числа
{
    std::cout << "( " << re << ", " << im << " )" << std::endl;
}
Либо помещать using во внутрь метода.Это улучшит читаемость и обезопасит от конфликта имен

Добавлено через 10 минут
Если расматривать это метод, то наверное лучше его немного обобщить
C++
1
2
3
4
void Complex::print_number(std::istream &stream) //вывод числа
{
    stream << "( " << re << ", " << im << " )" << std::endl;
}
Так как в будующем может понадобится выводить в данные в другие потоки ( например в файл).
Но думаю лучшим вариантом было бы перегрузить оператор << относительно класса.
0
-=ЮрА=-
Заблокирован
Автор FAQ
01.08.2012, 15:45 #29

Не по теме:

Avazart, я не хочу спорить тут всё рассказал http://www.cyberforum.ru/blogs/34326/blog275.html
От того что тыкаем везде space:: умными дядями вы не станете, а в моих глазах это вообще глупость. Есть желание поспорить что либо заходи в блог, я покажу и тебе что ничего такого в этом нет, даже выгоды имеются от экономии и понятности кода



Добавлено через 1 минуту

Не по теме:

Цитата Сообщение от Avazart Посмотреть сообщение
Либо помещать using во внутрь метода.
- это вообще бред!
Цитата Сообщение от Avazart Посмотреть сообщение
лучше указывать явно std::
- почему лучше?Потому что все бездумно так пишут?

0
Avazart
Эксперт С++
7213 / 5385 / 286
Регистрация: 10.12.2010
Сообщений: 23,796
Записей в блоге: 17
01.08.2012, 16:06 #30
У меня нет и капли сомнения в том что я говорю (и в том что говорят умные дяди пишущие книжки) поэтому и желания спорить нет.

Столько страниц в блоге и вас еще не переубедили в очевидном...
Что на водит на мысль вы наверное не умеете просто призновать свою не правоту.


Класс лучше оформлять в отдельном файле ( и желательно в оформленом в отдельном пространстве ).
А значит ваши юзинги перекочуют и в хедер что в дальнейшем может повлеч конфликт имен при подключении ваших исходников кем-то другим в другую программу в другой среде где свои имена ( а может и вами лично по тому как груду кода в памяти не удержишь)

Более того если кода много "глобальные" юзинги плохо читаются. Их тяжелее найти в большом файле нежели в конкретной области видимости.

Цитата Сообщение от -=ЮрА=-
- это вообще бред!
Ну а локализовывать переменные тоже бред ?

Цитата Сообщение от -=ЮрА=-
- почему лучше? Потому что все бездумно так пишут?
Хотя бы из расчета того что ваш код может расширятся и может использоваться другими программистами (которые повидимому не особо горят желанием разбираться что у вас там и как...)

Читаем допустим такой код
C++
1
regex re("*.txt");
Что тут имелось ввиду boost::regex или std::regex (из нового стандарта) или my::regex или regex из IDE или чужего исходника?
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.08.2012, 16:06
Привет! Вот еще темы с ответами:

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

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

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

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


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

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

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