Лидеры рейтинга

ID: 401284

Михаил Александров

Советник

380

Россия, Санкт-Петербург


ID: 259041

Алексеев Владимир Николаевич

Мастер-Эксперт

341

Россия, пос. Теплоозёрск, ЕАО


ID: 401888

puporev

Профессор

216

Россия, Пермский край


ID: 405338

vovaromanov.jr

1-й класс

114


ID: 400669

epimkin

Профессионал

112


ID: 242862

Hunter7007

Мастер-Эксперт

30

Россия, Омск


ID: 137394

Megaloman

Мастер-Эксперт

26

Беларусь, Гомель


8.10.2

13.10.2021

JS: 2.10.2
CSS: 4.6.0
jQuery: 3.6.0
DataForLocalStorage: 2021-10-23 16:46:01-standard


Создание программ на языках C и C++.

Администратор раздела: CradleA (Мастер-Эксперт)

Консультация онлайн # 159929

Раздел: С / С++
Автор вопроса: Романова Галина
Дата: 08.02.2009, 14:13 Консультация закрыта
Поступило ответов: 1

Здравствуйте, уважаемые экспреты! Помогите пожалуйста не знающему... задача состоит в:
Разработать класс обработки комплексных чисел. Класс должен включать всю комплексную арифметику: умножение, деление, сложение, вычитание, возведение в степень, вычисление корня, а также выделение модуля и аргумента комплексного числа.

Приложение:

Ответ # 243172 от Micren
Здравствуйте, Романова Галина!
Вообще то, в заголовочном файле complex(подключается #include <complex>) уже есть шаблон

template<class Type>
class complex

со всеми необходимыми функциями.
Если же Вам нужно, что то свое то вот класс и программа для проверки основных функций:
Код
#include <valarray>
#include <ios>
#include <iostream>

using namespace std;

class complex
{
public:
	// Конструктор
	complex(double re=0, double im=0);
	// Оператор ()
	complex& operator()(double re=0, double im=0);
	complex& operator()(const complex& val);
	// Оператор "равно"
	bool operator==(const complex& val) const;
	// Оператор "не равно"
	bool operator!=(const complex& val) const;
	// Возвращает действительную часть
	double re(void) const;
	static double re(const complex& val);
	// Возвращает мнимую часть
	double im(void) const;
	static double im(const complex& val);
	// Выделение модуля
	double abs(void) const;
	static double abs(const complex& val);
	// Аргумент
	double arg(void) const;
	static double arg(const complex& val);
	// Оператор сложения
	friend complex operator+(const complex& val1,const complex& val2);
	complex& operator+=(const complex& val);
	// Оператор вычитания
	friend complex operator-(const complex& val1,const complex& val2);
	complex& operator-=(const complex& val);
	// Оператор умножения
	friend complex operator*(const complex& val1,const complex& val2);
	complex& operator*=(const complex& val);
	// Опрератор деления
	friend complex operator/(const complex& val1,const complex& val2);
	complex& operator/=(const complex& val);
	// Возведение в степень
	friend complex pow(const complex& val,double deg);
	// Извлечение квадратного корня
	friend complex sqrt(const complex& val);
	// Операторы ввода/вывода
	friend ostream& operator<<(ostream& stream,const complex& val);
	friend istream& operator>>(istream& stream,complex& val);
private:
	double _re;
	double _im;
};

int main()
{
	complex A(10,-5),B(-5,10),C;
	cout<<"A="<<A<<endl;
	cout<<"B="<<B<<endl;
	cout<<"C(A)="<<C(A)<<endl;
	cout<<"(A==C)="<<boolalpha<<(A==C)<<endl;
	cout<<"(A!=C)="<<boolalpha<<(A!=C)<<endl;
	cout<<"C(3,-3)="<<C(3,-3)<<endl;
	cout<<"re(A)="<<A.re()<<endl;
	cout<<"im(A)="<<A.im()<<endl;
	cout<<"(A==B)="<<boolalpha<<(A==B)<<endl;
	cout<<"(A!=B)="<<boolalpha<<(A!=B)<<endl;
	cout<<"A+B="<<A+B<<endl;
	cout<<"10+A="<<10+A<<endl;
	cout<<"A-B="<<A-B<<endl;
	cout<<"10-A="<<10-A<<endl;
	cout<<"A*B="<<A*B<<endl;
	cout<<"10*A="<<10*A<<endl;
	cout<<"A/B="<<A/B<<endl;
	cout<<"10/A="<<10/A<<endl;
	cout<<"abs(A)="<<A.abs()<<endl;
	cout<<"arg(A)="<<A.arg()<<endl;
	cout<<"A^2="<<pow(A,2)<<endl;
	cout<<"C=sqrt(B)="<<(C=sqrt(B))<<endl;
	cout<<"C*C="<<C*C<<endl;
	cout<<"pow(C,2)="<<pow(C,2)<<endl;
	system("PAUSE");
	return 0;
}

// Конструктор
complex::complex(double re, double im)
: _re(re)
, _im(im)
{
}

complex& complex::operator()(double re, double im)
{
	_re=re;
	_im=im;
	return *this;
}
complex& complex::operator ()(const complex& val)
{
	_re=val._re;
	_im=val._im;
	return *this;
}

ostream& operator<<(ostream& stream,const complex& val)
{
	if(val._re||!val._im)stream<<val._re;
	if(val._im)
	{
		ios_base::fmtflags flags=stream.flags();
		if(val._re)stream.setf(ios::showpos);
		stream<<val._im<<'i';
		stream.flags(flags);
	}
	return stream;
};

istream& operator>>(istream& stream,complex& val)
{
	double re,im;
	stream>>re>>im;
	if(stream.good())
	{
		val._re=re;
		val._im=im;
	}
	return stream;
};
inline bool complex::operator==(const complex& val) const
{
	return (_re==val._re)&&(_im==val._im);
}

inline bool complex::operator!=(const complex& val) const
{
	return (_re!=val._re)||(_im!=val._im);
}

// Возвращает действительную часть
inline double complex::re(void) const
{
	return _re;
}
inline double complex::re(const complex& val)
{
	return val._re;
}

// Возвращает мнимую часть
inline double complex::im(void) const
{
	return _im;
}
inline double complex::im(const complex& val)
{
	return val._im;
}

// Оператор сложения
inline complex operator+(const complex& val1,const complex& val2)
{
	return complex(val1._re+val2._re,val1._im+val2._im);
}
inline complex& complex::operator+=(const complex& val)
{
	_re+=val._re;
	_im+=val._im;
	return *this;
}

// Оператор вычитания
inline complex operator-(const complex& val1,const complex& val2)
{
	return complex(val1._re-val2._re,val1._im-val2._im);
}
complex& complex::operator-=(const complex& val)
{
	_re-=val._re;
	_im-=val._im;
	return *this;
}

// Оператор умножения
complex operator*(const complex& val1,const complex& val2)
{
	return complex(val1._re*val2._re-val1._im*val2._im,val1._re*val2._im+val1._im*val2._re);
}
complex& complex::operator*=(const complex& val)
{
	_re=_re*val._re-_im*val._im;
	_im=_re*val._im+_im*val._re;
	return *this;
}

// Опрератор деления
complex operator/(const complex& val1,const complex& val2)
{
	double div=val2._re*val2._re+val2._im*val2._im;
	return complex((val1._re*val2._re+val1._im*val2._im)/div,(val1._im*val2._re-val1._re*val2._im)/div);
}
complex& complex::operator/=(const complex& val)
{
	double div=val._re*val._re+val._im*val._im;
	_re=(_re*val._re+_im*val._im)/div;
	_im=(_im*val._re-_re*val._im)/div;
	return *this;
}

// Выделение модуля
inline double complex::abs(void) const
{
	return std::sqrt(_re*_re+_im*_im);
}
inline double complex::abs(const complex& val)
{
	return std::sqrt(val._re*val._re+val._im*val._im);
}

// Аргумент
inline double complex::arg(void) const
{
	return acos(_re/abs());
}
inline double complex::arg(const complex& val)
{
	return acos(val._re/val.abs());
}

complex pow(const complex& val,double deg)
{
	double r=std::pow(val.abs(),deg),a=val.arg()*deg;
	return complex(r*cos(a),r*sin(a));
}

complex sqrt(const complex& val)
{
	double r=std::sqrt(val.abs()),a=val.arg()/2;
	return complex(r*cos(a),r*sin(a));
}


Пример работы:
Код
A=10-5i
B=-5+10i
C(A)=10-5i
(A==C)=true
(A!=C)=false
C(3,-3)=3-3i
re(A)=10
im(A)=-5
(A==B)=false
(A!=B)=true
A+B=5+5i
10+A=20-5i
A-B=15-15i
10-A=5i
A*B=125i
10*A=100-50i
A/B=-0.8-0.6i
10/A=0.8+0.4i
abs(A)=11.1803
arg(A)=0.463648
A^2=75+100i
C=sqrt(B)=1.75789+2.84432i
C*C=-5+10i
pow(C,2)=-5+10i

Последнее редактирование 09.02.2009, 22:37 [неизвестный]


Micren

Посетитель
08.02.2009, 16:30
Мини-форум консультации # 159929
неизвестный

1

= общий =    10.02.2009, 21:57

Спасибо огромное, ребята!!! smile Но почему-то у меня оно компилируется с большим количеством ошибок :(( Я конечно не уверена, но предполагаю, что всё дело в моём Си... попробую ещё найти и установить Visual studio 2005. Ну а вообще я не волшебник и только учусь... и надеюсь во всем этом разобраться :))) Учитывая то, что на земле ещё есть хорошие люди smile Вобщем ОГРОМНЕЙШЕЕ Вам спасибо :))

Micren

2

= общий =    10.02.2009, 22:07

У Вас наверное Borland C++ 3.1
Это очень древняя система.
Я уже писал кому-то следующее:"Бесплатную версию(и соответственно урезанную) Visual Studio Express можно скачать с http://www.microsoft.com/eXPress/download/
Если же Вы студент, то обратите внимание на http://www.dreamspark.ru/. Здесь Вы можете загрузить профессиональную версию при прохождении соответствующей верификации.
Borland C++ 3.1 это уже атавизм.
"
Данный класс разрабатывался с помощью Microsoft Visual Studio 2008 и вполне работоспособен.
В крайнем случае можете скачать бесплатно Dev-C++ на базе компилятора GCC c http://www.blood.../dev/devcpp.html
Но Visual Studio это лучшее(imho).

неизвестный

3

= общий =    10.02.2009, 22:21

Ну на самом деле у меня стоит Visual C++ 6.0, но я уже нашла статью о тех ошибках.. оказывается это компилятор вылетает, а ошибка такова:
fatal error C1001: INTERNAL COMPILER ERROR , если закомментировать ту строчку в которой эта ошибка, то после неё ещё очень много ошибок выдаёт.... одним словом виноват компилятор :))
Вобщем спасибо за совет smile обязательно скачаю новую версию :)

Micren

4

= общий =    10.02.2009, 22:35

У меня в Visual Studio 2008 компилятор
Microsoft (R) C/C++ Optimizing Compiler Version 15.00.30729.01 for x64
Copyright (C) Microsoft Corporation. All rights reserved.

Вот лог компиляции проекта:

Код
1>------ Rebuild All started: Project: 159929, Configuration: Debug Win32 ------
1>Deleting intermediate and output files for project '159929', configuration 'Debug|Win32'
1>Compiling...
1>159929.cpp
1>Compiling manifest to resources...
1>Microsoft (R) Windows (R) Resource Compiler Version 6.1.6723.1
1>Copyright (C) Microsoft Corporation.  All rights reserved.
1>Linking...
1>LINK : E:\Visual Studio 2008\Projects\RusFAQ\Debug\159929.exe not found or not built by the last incremental link; performing full link
1>Embedding manifest...
1>Microsoft (R) Windows (R) Resource Compiler Version 6.1.6723.1
1>Copyright (C) Microsoft Corporation.  All rights reserved.
1>Build log was saved at "file://e:\Visual Studio 2008\Projects\RusFAQ\159929\Debug\BuildLog.htm"
1>159929 - 0 error(s), 0 warning(s)
========== Rebuild All: 1 succeeded, 0 failed, 0 skipped ==========

0 ошибок,0 предупреждений
Поэтому обязательно скачайте себе что нибудь поновее. Хотя бы тот же Dev-C++. Пробовал на нем ради интереса. Тоже без проблем. Иначе трудно Вам будет на вопросы отвечать. Эксперты уже давным-давно забыли, что такое VC++ 6.0. Да и изучать то, что уже морально устарело смысла нет.

неизвестный

5

= общий =    10.02.2009, 22:46

Ну если честно я вам на слово поверила, что программа без ошибок... потому что видно, что граммотно написано и комментарии везде есть, что редко встречается smile А я считаю, что программный код написанный красиво и с комментариями, это залог успешного проекта :))) Вобщем Вы просто молодец :)) Большое спасибо :)))
P.S.: Новая версия уже качается :))

Возможность оставлять сообщения в мини-форумах консультаций доступна только после входа в систему.
Воспользуйтесь кнопкой входа вверху страницы, если Вы зарегистрированы или пройдите простую процедуру регистрации на Портале.

Лучшие эксперты раздела

Зенченко Константин Николаевич

Старший модератор

Рейтинг: 155

Gluck

9-й класс

Рейтинг: 82

Коцюрбенко Алексей Владимирович

Старший модератор

Рейтинг: 70

CradleA

Мастер-Эксперт

Рейтинг: 2

Лысков Игорь Витальевич

Мастер-Эксперт

Рейтинг: 0

Асмик Гаряка

Советник

Рейтинг: 0