Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 19, средняя оценка - 4.74
vlad_light
4 / 4 / 1
Регистрация: 24.09.2012
Сообщений: 178
#1

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

14.10.2012, 17:08. Просмотров 2916. Ответов 25
Метки нет (Все метки)

Сейчас начал изучение классов. Придумал себе задачку: написать класс комплексных чисел. Пока планирую так:
PRIVATE:
- переменные:
double Real, Imaginary, Radius, Argument;
http://www.cyberforum.ru/cpp-beginners/thread1109208.html
- функции:
тригонометрия, возведение в степень и т.п.

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

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

Класс Комплексных Чисел
Здравствуйте, попробовал тут написать класс комплексных чисел, но пишет ошибку...

Класс комплексных чисел
Помогите пожалуйста реализовать (без использования <complex>) класс комплексных...

Класс комплексных чисел
Ребят, помогите пожалуйста написать класс комплексных чисел... Я плохо...

Класс комплексных чисел
Нужно создать программу (два класса) Класс комплексных чисел Базовый класс...

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

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

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

Арифметику как операторы внутри класса. Возведение в степень, тригонометрия, модуль, логарифмы и вся другая лабуда, что есть в стандартной математической библиотеке — точно так же, как и в библиотеке: вынесены в глобальные функции. Перегрузка, все дела.
1
vlad_light
4 / 4 / 1
Регистрация: 24.09.2012
Сообщений: 178
14.10.2012, 17:30  [ТС] #3
но что так, что иначе — всё равно будут потери точности.
Для меня важно научиться с классами работать, а точность абсолютно никакой роли не играет, поскольку на практике я эту программу применять не буду.
Конструкторы копирования
такое я пока не учил, можете рассказать на пальцах в 2-ух словах?
создание комплексного по одному/паре действительных
это как? У меня функция void input () будет работать с действительными числами и "копировать" их в комплексные.
И константу i
а зачем она?
И операторы присваивания всего, что можете выдумать.
Так, по-моему, классы и так можно между собой присваивать. Подскажите, какие ещё придумать?
Арифметику как операторы внутри класса. Возведение в степень, тригонометрия, модуль, логарифмы и вся другая лабуда, что есть в стандартной математической библиотеке — точно так же, как и в библиотеке: вынесены в глобальные функции. Перегрузка, все дела.
Можно на простом языке? Я ещё достаточно мало знаю в программировании...
0
Nixy
ComfyMobile
400 / 281 / 34
Регистрация: 24.07.2012
Сообщений: 916
14.10.2012, 17:34 #4
может лучше взять задачку попроше, для изучения классов, чем комплексные числа?
0
vlad_light
4 / 4 / 1
Регистрация: 24.09.2012
Сообщений: 178
14.10.2012, 17:37  [ТС] #5
Я не против Это просто первое, что пришло в голову. Подскажите другую задачу, пожалуйста. Спасибо!
0
OhMyGodSoLong
~ Эврика! ~
1245 / 994 / 74
Регистрация: 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() — вне класса как глобальные функции. Не методы.
1
Nixy
ComfyMobile
400 / 281 / 34
Регистрация: 24.07.2012
Сообщений: 916
14.10.2012, 17:41 #7
ну чтобы , полностью насладится всей прелестью ООП, как стандарт , задачка на реализацию классов Геом Фигур, начиная с абстрактной точки заканчивая , сферой , тут можно и перегрузку функций подсчета площадей и объема посмотреть, полиморфизм в явном виде, а комплексные числа лучше делать когда их применяешь , и то лучше стандартных библиотек врятил сделаешь )
если ваша среда разработки поддерживает GUI , то можно попробовать реализовать интегратор какой нибудь мат модели, тогоже маятника, и запилить через GUI анимацию движения
0
vlad_light
4 / 4 / 1
Регистрация: 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.
Сейчас займусь написанием кода, спасибо!
а комплексные числа лучше делать когда их применяешь
так будем применять) Например, потом посчитаем комплексную экспоненту через ряд
0
Nixy
ComfyMobile
400 / 281 / 34
Регистрация: 24.07.2012
Сообщений: 916
14.10.2012, 18:02 #9
Цитата Сообщение от vlad_light Посмотреть сообщение
Т.е. сделать неявное преобразование из действительного в комплексное (поскольку, на действительное число можно только умножать, прибавлять, например, действительное и комплексное нельзя).
думаю , ~OhMyGodSoLong~, имел ввиду перегрузку оператора '=' ,и насчет суммы действительного и комплексного, число 8 = 8+0i , и число 4i , результат суммы, очевидно, 8+4i
0
OhMyGodSoLong
~ Эврика! ~
1245 / 994 / 74
Регистрация: 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
0
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 эквивалентна просто числу.

0
OhMyGodSoLong
14.10.2012, 18:23
  #12

Не по теме:

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

Не по теме:

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

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

Не по теме:

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

0
OhMyGodSoLong
14.10.2012, 19:08
  #14

Не по теме:

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

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

1
vlad_light
4 / 4 / 1
Регистрация: 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;
    }
};
0
Nixy
ComfyMobile
400 / 281 / 34
Регистрация: 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()
0
vlad_light
4 / 4 / 1
Регистрация: 24.09.2012
Сообщений: 178
14.10.2012, 19:48  [ТС] #17
output() у меня просто выводит число на экран. А остальные я сделаю так: ф-ция принимает аргумент, делает над ним операции, а результат записывает в исходную переменную. Так, по-моему, памяти меньше расходуется.
0
OhMyGodSoLong
~ Эврика! ~
1245 / 994 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
14.10.2012, 20:17 #18
Насчёт памяти не волнуйтесь. Это последнее, о чём стоит волноваться, если программа вообще работает.
0
Nixy
ComfyMobile
400 / 281 / 34
Регистрация: 24.07.2012
Сообщений: 916
14.10.2012, 20:20 #19
тем более на современных комп-ах, если в задаче будет критична память, то тогда надо будет придумывать алгоритмы оптимизации, а так это учебная прога, вы ее не больше раза запустите)
0
vlad_light
4 / 4 / 1
Регистрация: 24.09.2012
Сообщений: 178
14.10.2012, 20:32  [ТС] #20
тут дело немного в другом: мне сказали, что нужно возвращать тип complex, а не void, а я объяснил, почему именно я использовал такой подход. Т.е. мне важна не сама память, а аргументы в пользу complex, вместо void.
И по поводу кода: перепешите, пожалуйста, чтоб он выглядел так, как пишут программисты (с правильными отступами, последовательностью объявлений, типами аргументов и т.п.). Ну и ошибки обязательно подправьте. Понимаю, что это мелочи, но хочу уже сейчас начинать привыкать к хорошему оформлению, принятому среди программистов. Спасибо!
0
14.10.2012, 20:32
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.10.2012, 20:32
Привет! Вот еще темы с решениями:

Написать класс комплексных чисел
Недавно начал изучать C++ по самоучителю, пишу на Dev-C++ 4.9. Не могу...

Класс комплексных чисел(подправить)
Помогите дописать в оераторе &quot;умножение&quot; умножение вещественного числа на...

Создать класс комплексных чисел
Создать класс,объекты которого моделируют комплексные числа с перегрузкой...

Класс для обработки комплексных чисел
Дана задача написать класс для обработки комплексных чисел(вывод на экран,...


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

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

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