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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 19, средняя оценка - 4.74
vlad_light
4 / 4 / 0
Регистрация: 24.09.2012
Сообщений: 178
14.10.2012, 17:08     Класс комплексных чисел #1
Сейчас начал изучение классов. Придумал себе задачку: написать класс комплексных чисел. Пока планирую так:
PRIVATE:
- переменные:
double Real, Imaginary, Radius, Argument;
- функции:
тригонометрия, возведение в степень и т.п.

PUBLIC:
- функции:
ввод, вывод;
сумма, разность, умножение;
возведение в степень;

(пока, думаю, достаточно)
Помогите, пожалуйста, с написанием прототипа класса и дайте советов по улучшению? Спасибо!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.10.2012, 17:08     Класс комплексных чисел
Посмотрите здесь:

C++ класс для обработки комплексных чисел
C++ Класс комплексных чисел
Класс комплексных чисел C++
Класс комплексных чисел C++
C++ Класс комплексных чисел(подправить)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
14.10.2012, 17:17     Класс комплексных чисел #2
Лучше храните внутри числа в каком-то одном формате. Или как действительную и мнимую части, или в экспоненциальной форме (радиус-угол). Можно извращаться с автоматическим переводом туда-сюда, но что так, что иначе — всё равно будут потери точности.

Конструкторы копирования, создание комплексного по одному/паре действительных и т. п. тоже не забудьте. И константу i. И операторы присваивания всего, что можете выдумать.

Арифметику как операторы внутри класса. Возведение в степень, тригонометрия, модуль, логарифмы и вся другая лабуда, что есть в стандартной математической библиотеке — точно так же, как и в библиотеке: вынесены в глобальные функции. Перегрузка, все дела.
vlad_light
4 / 4 / 0
Регистрация: 24.09.2012
Сообщений: 178
14.10.2012, 17:30  [ТС]     Класс комплексных чисел #3
но что так, что иначе — всё равно будут потери точности.
Для меня важно научиться с классами работать, а точность абсолютно никакой роли не играет, поскольку на практике я эту программу применять не буду.
Конструкторы копирования
такое я пока не учил, можете рассказать на пальцах в 2-ух словах?
создание комплексного по одному/паре действительных
это как? У меня функция void input () будет работать с действительными числами и "копировать" их в комплексные.
И константу i
а зачем она?
И операторы присваивания всего, что можете выдумать.
Так, по-моему, классы и так можно между собой присваивать. Подскажите, какие ещё придумать?
Арифметику как операторы внутри класса. Возведение в степень, тригонометрия, модуль, логарифмы и вся другая лабуда, что есть в стандартной математической библиотеке — точно так же, как и в библиотеке: вынесены в глобальные функции. Перегрузка, все дела.
Можно на простом языке? Я ещё достаточно мало знаю в программировании...
Nixy
ComfyMobile
 Аватар для Nixy
399 / 280 / 8
Регистрация: 24.07.2012
Сообщений: 916
14.10.2012, 17:34     Класс комплексных чисел #4
может лучше взять задачку попроше, для изучения классов, чем комплексные числа?
vlad_light
4 / 4 / 0
Регистрация: 24.09.2012
Сообщений: 178
14.10.2012, 17:37  [ТС]     Класс комплексных чисел #5
Я не против Это просто первое, что пришло в голову. Подскажите другую задачу, пожалуйста. Спасибо!
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
14.10.2012, 17:40     Класс комплексных чисел #6
Цитата Сообщение от vlad_light Посмотреть сообщение
Для меня важно научиться с классами работать, а точность абсолютно никакой роли не играет, поскольку на практике я эту программу применять не буду.
Ну вот и будете учиться работать с классами. А не наступать на грабли "ой я сделал вычисления в одном формате, но забыл перевести результат в другой и запомнить".

Цитата Сообщение от vlad_light Посмотреть сообщение
такое я пока не учил, можете рассказать на пальцах в 2-ух словах?
Для такого представления чисел, как у вас, его не надо делать руками, но он есть. Это конструктор, который (сюрприз!) делает копию объекта. Например, когда делается
C++
1
2
Complex x(10, 20);
Complex y = x; // отрабатывает конструктор копирования
Цитата Сообщение от vlad_light Посмотреть сообщение
это как? У меня функция void input () будет работать с действительными числами и "копировать" их в комплексные.
Это
C++
1
Complex x(10, 20); // 10 + 20i
Цитата Сообщение от vlad_light Посмотреть сообщение
а зачем она?
Ну это больше для прикола. Чтоб можно было писать
C++
1
Complex x = 10 + 20*i;
Цитата Сообщение от vlad_light Посмотреть сообщение
Так, по-моему, классы и так можно между собой присваивать. Подскажите, какие ещё придумать?
Одного типа да, можно. А присвоить double комплексному числу так, чтобы действительная часть комплексного числа стала равна тому double, а мнимая обнулилась? (Ну, хотя, там могут отработать неявные приведения типов и всё будет окей.)

Цитата Сообщение от vlad_light Посмотреть сообщение
Можно на простом языке? Я ещё достаточно мало знаю в программировании...
Ну вот все эти + и * будут внутри класса как перегруженные операторы: operator+, operator* и т. п. А всякие pow(), exp(), log() — вне класса как глобальные функции. Не методы.
Nixy
ComfyMobile
 Аватар для Nixy
399 / 280 / 8
Регистрация: 24.07.2012
Сообщений: 916
14.10.2012, 17:41     Класс комплексных чисел #7
ну чтобы , полностью насладится всей прелестью ООП, как стандарт , задачка на реализацию классов Геом Фигур, начиная с абстрактной точки заканчивая , сферой , тут можно и перегрузку функций подсчета площадей и объема посмотреть, полиморфизм в явном виде, а комплексные числа лучше делать когда их применяешь , и то лучше стандартных библиотек врятил сделаешь )
если ваша среда разработки поддерживает GUI , то можно попробовать реализовать интегратор какой нибудь мат модели, тогоже маятника, и запилить через GUI анимацию движения
vlad_light
4 / 4 / 0
Регистрация: 24.09.2012
Сообщений: 178
14.10.2012, 17:57  [ТС]     Класс комплексных чисел #8
C++
1
2
Complex x(10, 20);
Complex y = x; // отрабатывает конструктор копирования
Ну, такое у меня вроди как и само по себе будет работать: Complex x(10, 20) -- это иницилизация (а разве там не фигурные скобки надо?), а Complex y = x -- это присваивание классов между собой, что тоже допускается.
Одного типа да, можно. А присвоить double комплексному числу так, чтобы действительная часть комплексного числа стала равна тому double, а мнимая обнулилась?
Т.е. сделать неявное преобразование из действительного в комплексное (поскольку, на действительное число можно только умножать, прибавлять, например, действительное и комплексное нельзя).
как перегруженные операторы: operator+, operator*
до операторов я пока не дошёл, поэтому сделаю что-то типа add(x,y), вместо x+y.
Сейчас займусь написанием кода, спасибо!
а комплексные числа лучше делать когда их применяешь
так будем применять) Например, потом посчитаем комплексную экспоненту через ряд
Nixy
ComfyMobile
 Аватар для Nixy
399 / 280 / 8
Регистрация: 24.07.2012
Сообщений: 916
14.10.2012, 18:02     Класс комплексных чисел #9
Цитата Сообщение от vlad_light Посмотреть сообщение
Т.е. сделать неявное преобразование из действительного в комплексное (поскольку, на действительное число можно только умножать, прибавлять, например, действительное и комплексное нельзя).
думаю , ~OhMyGodSoLong~, имел ввиду перегрузку оператора '=' ,и насчет суммы действительного и комплексного, число 8 = 8+0i , и число 4i , результат суммы, очевидно, 8+4i
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
14.10.2012, 18:07     Класс комплексных чисел #10
Да нет, можно и через неявные преобразования (раз они уж есть в Си++). Но для того, чтобы эти преобразования работали, надо сделать специальные конструкторы.

Цитата Сообщение от vlad_light Посмотреть сообщение
Ну, такое у меня вроди как и само по себе будет работать: Complex x(10, 20) -- это иницилизация (а разве там не фигурные скобки надо?)
Вот именно, чтобы было не через фигурные. Да и через фигурные вы не сможете — поля ведь private. И чтобы можно было делать
C++
1
2
double y = 10;
Complex x = y; // x == 10 + 0i
vlad_light
14.10.2012, 18:17  [ТС]
  #11

Не по теме:

насчет суммы действительного и комплексного, число 8 = 8+0i , и число 4i , результат суммы, очевидно, 8+4i
Я имел ввиду, что [math]$+:\mathbb C\times\mathbb C\to\mathbb C$[\math], т.е. определён только для комплексных чисел. А то, что 8=8+0i -- это чисто совпадение, такое же, скажем, как и матрица 1 на 1 эквивалентна просто числу.

OhMyGodSoLong
14.10.2012, 18:23
  #12

Не по теме:

Я вас удивлю, но ℝ ⊂ ℂ.

Не по теме:

Куда можно нажаловаться на уё*****сть местного рендерера ТеХа?

vlad_light
14.10.2012, 19:01  [ТС]
  #13

Не по теме:

Пусть будет так А как сюда ТеХ вставить?

OhMyGodSoLong
14.10.2012, 19:08
  #14

Не по теме:

[latex]ТеХ-код[/latex]

Только лучше сразу сядьте и возьмите бумажный пакетик в руки.

vlad_light
4 / 4 / 0
Регистрация: 24.09.2012
Сообщений: 178
14.10.2012, 19:35  [ТС]     Класс комплексных чисел #15
Гляньте, пожалуйста. Пока правильно?
class
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
//my_complex.h
#include <iostream>
 
double pow (const double& x, const int& a);
double sin (const double& x);
double cos (const double& x);
double atan (const double& x);
 
 
class complex
{
private:
    double Re, Im;
 
public:
    void input ();
    void output();
    void sum (const complex& z);
    void sub (const complex& z);
    void mul (const complex& z);
    void pow (const double& a);
 
    complex ()
    {
        Re = Im = 0;
    }
    complex (double x)
    {
        Re = x;
        Im = 0;
    }
    complex (double x, double y)
    {
        Re = x;
        Im = y;
    }
};
Nixy
ComfyMobile
 Аватар для Nixy
399 / 280 / 8
Регистрация: 24.07.2012
Сообщений: 916
14.10.2012, 19:38     Класс комплексных чисел #16
вот если интересно мое мнение , то я бы не делал
C++
1
2
3
4
5
void output();
    void sum (const complex& z);
    void sub (const complex& z);
    void mul (const complex& z);
    void pow (const double& a)
типа void возвращал бы complex, особенно в output()
vlad_light
4 / 4 / 0
Регистрация: 24.09.2012
Сообщений: 178
14.10.2012, 19:48  [ТС]     Класс комплексных чисел #17
output() у меня просто выводит число на экран. А остальные я сделаю так: ф-ция принимает аргумент, делает над ним операции, а результат записывает в исходную переменную. Так, по-моему, памяти меньше расходуется.
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
14.10.2012, 20:17     Класс комплексных чисел #18
Насчёт памяти не волнуйтесь. Это последнее, о чём стоит волноваться, если программа вообще работает.
Nixy
ComfyMobile
 Аватар для Nixy
399 / 280 / 8
Регистрация: 24.07.2012
Сообщений: 916
14.10.2012, 20:20     Класс комплексных чисел #19
тем более на современных комп-ах, если в задаче будет критична память, то тогда надо будет придумывать алгоритмы оптимизации, а так это учебная прога, вы ее не больше раза запустите)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.10.2012, 20:32     Класс комплексных чисел
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
vlad_light
4 / 4 / 0
Регистрация: 24.09.2012
Сообщений: 178
14.10.2012, 20:32  [ТС]     Класс комплексных чисел #20
тут дело немного в другом: мне сказали, что нужно возвращать тип complex, а не void, а я объяснил, почему именно я использовал такой подход. Т.е. мне важна не сама память, а аргументы в пользу complex, вместо void.
И по поводу кода: перепешите, пожалуйста, чтоб он выглядел так, как пишут программисты (с правильными отступами, последовательностью объявлений, типами аргументов и т.п.). Ну и ошибки обязательно подправьте. Понимаю, что это мелочи, но хочу уже сейчас начинать привыкать к хорошему оформлению, принятому среди программистов. Спасибо!
Yandex
Объявления
14.10.2012, 20:32     Класс комплексных чисел
Ответ Создать тему
Опции темы

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