Консультация № 159929
08.02.2009, 14:13
0.00 руб.
0 6 1
Здравствуйте, уважаемые экспреты! Помогите пожалуйста не знающему... задача состоит в:
Разработать класс обработки комплексных чисел. Класс должен включать всю комплексную арифметику: умножение, деление, сложение, вычитание, возведение в степень, вычисление корня, а также выделение модуля и аргумента комплексного числа.

Приложение:
Class MyComplex
{
public:
double real;
double imaq;
public:
MyComplex (double r = 0, double i = 0) : real(r), imaq(i) {};
//конструктор, инициализирует действительную и мнимую часть нулями по умолчанию
MyComplex & operator += (const MyComplex & c1);
MyComplex & operator -= (const MyComplex & c1);
MyComplex & operator *= (const MyComplex & c1); //перегруженные операторы
MyComplex & operator /= (const MyComplex & c1); // необходимые в программе
MyComplex & operator = (const MyComplex & c1);
MyComplex & operator = (double r) { real = r; return (*this); }
MyComplex & operator () (double val) {
val = real;
};
Это всего лишь малая часть того, что должно быть.... что дальше.... не знаю.... Помогите пожалуйста :)

Обсуждение

Неизвестный
08.02.2009, 16:30
общий
09.02.2009, 22:37
это ответ
Здравствуйте, Романова Галина!
Вообще то, в заголовочном файле 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
Неизвестный
10.02.2009, 21:57
общий
Спасибо огромное, ребята!!!Но почему-то у меня оно компилируется с большим количеством ошибок :(( Я конечно не уверена, но предполагаю, что всё дело в моём Си... попробую ещё найти и установить Visual studio 2005. Ну а вообще я не волшебник и только учусь... и надеюсь во всем этом разобраться :))) Учитывая то, что на земле ещё есть хорошие люди Вобщем ОГРОМНЕЙШЕЕ Вам спасибо :))
Неизвестный
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.bloodshed.net/dev/devcpp.html
Но Visual Studio это лучшее(imho).
Неизвестный
10.02.2009, 22:21
общий
Ну на самом деле у меня стоит Visual C++ 6.0, но я уже нашла статью о тех ошибках.. оказывается это компилятор вылетает, а ошибка такова:
fatal error C1001: INTERNAL COMPILER ERROR , если закомментировать ту строчку в которой эта ошибка, то после неё ещё очень много ошибок выдаёт.... одним словом виноват компилятор :))
Вобщем спасибо за советобязательно скачаю новую версию :)
Неизвестный
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. Да и изучать то, что уже морально устарело смысла нет.
Неизвестный
10.02.2009, 22:46
общий
Ну если честно я вам на слово поверила, что программа без ошибок... потому что видно, что граммотно написано и комментарии везде есть, что редко встречаетсяА я считаю, что программный код написанный красиво и с комментариями, это залог успешного проекта :))) Вобщем Вы просто молодец :)) Большое спасибо :)))
P.S.: Новая версия уже качается :))
Форма ответа