русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Определение программного класса комплексных чисел


Дата добавления: 2015-01-16; просмотров: 609; Нарушение авторских прав


Класс комплексных чисел с операциями над ними определен в среде разработки Borland C++ в файле complex.h. Мы воспользуемся этим файлом с упрощениями, не искажающими смысла, и снабдим необходимыми, на наш взгляд, комментариями – это хороший образец для последующего самостоятельного определения класса векторов, являющегося по существу обобщением класса комплексных чисел на многомерное пространство.

Итак, файл complex.h –включаемый библиотечный файл определения комплексных чисел. Для экономии места мы опускаем директивы препроцессора условной компиляции и другие несущественные детали.

 

class complex

{

/*Нам понадобятся рабочие переменные для хранения Re и Im*/

double re, im;

/*А дальше определим общедоступные функции-члены класса и начнем с конструкторов*/

public:

/*конструктор с инициализацией вещественной и мнимой частей при объявлении комплексного числа в прикладной программе*/

complex(double __re_val, double __im_val=0)

{ re=__re_val; im=__im_val;}

//конструктор по умолчанию

complex() {re=im=0;}

/*текущие значения вещественной и мнимой частей возвратят функции*/

double real(){ return re;}

double imag(){ return im;}

 

//сопряженное данному комплексное число

complex conj(){ return complex(re,-im);}

 

//Модуль и аргумент комплексного числа

double norm () { return(re*re+im*im) ;}

double arg(){return (!re&&!im)?0:atan2(im,re);}

 

/*Операции над комплексными объектами.

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



*/

 

/*Операции проверки равенства и неравенства комплексных чисел*/

friend int operator==(complex _FAR &, complex _FAR &);

friend int operator!=(complex _FAR &, complex _FAR &);

/*Бинарные алгебраические операции над парами комплексных чисел, комплексным и вещественным, вещественным и комплексным */

friend complex operator+(complex _FAR&, complex _FAR &);

friend complex operator+(double, complex _FAR &);

friend complex operator+(complex _FAR&, double);

friend complex operator-(complex _FAR &, complex _FAR &);

friend complex operator-(double, complex _FAR &);

friend complex operator-(complex _FAR &, double);

friend complex operator*(complex _FAR &, complex _FAR &);

friend complex operator*(complex _FAR &, double);

friend complex operator*(double, complex _FAR &);

friend complex operator/(complex _FAR &, complex _FAR &);

friend complex operator/(complex _FAR &, double);

friend complex operator/(double, complex _FAR &);

 

/*

Унарные +, - и * комбинированные с присвоением арифметические операции сделаем функциями-членами, изменяющими текущее значение комплексного объекта. Мы объединим их объявления с определениями. */

complex operator+(){ return *this;}

complex operator-(){ return complex(-re,-im);}

complex _FAR & operator+=(complex _FAR &)

{

re+=__z2.re;

im+=__z2.im;

return *this;

}

complex _FAR & operator+=(double __re_val2)

{

re+=__re_val2;

return *this;

}

complex _FAR & operator-=(complex _FAR & __z2)

{

re-=__z2.re;

im-=__z2.im;

return *this;

}

complex _FAR & operator-=(double __re_val2)

{

re-=__re_val2;

return *this;

}

complex _FAR & operator*=(complex _FAR & __z2)

{

re=re*z2.real()-im*z2.imag();

im=re*z2.imag()+z2.real()*im;

return *this;

}

complex _FAR & operator*=(double __re_val2)

{

re*=__re_val2;

im*=__re_val2;

return *this;

}

complex _FAR & operator/=(complex _FAR & __z2)

{

re=(re*z2.real()+im*z2.image())/

(z2.real()*z2.real()+z2.imag()*z2.imag());

im=(z2.real()*im-re*z2.imag())/

(z2.real()*z2.real()+z2.imag()*z2.imag());

return *this;

}

complex _FAR & operator/=(double __re_val2)

{

re/=__re_val2;

im/=__re_val2;

return *this;

}

 

/*В заключение определим и функцию потокового вывода комплексного объекта*/

ostream _FAR& operator<<(ostream _FAR &, complex _FAR &)

{return os<<"("<<x.real()<<","<<x.imag()<<")";};

 

/* Теперь приведем реализацию дружественных операторных функций, не являющихся членами класса и реализующих бинарные операции над комплексными объектами. */

 

inline complex operator+(complex _FAR & __z1, complex _FAR & __z2)

{return complex(__z1.re+__z2.re, __z1.im+__z2.im);}

inline complex operator+(double __re_val1, complex _FAR & __z2)

{return complex(__re_val1+__z2.re, __z2.im);}

inline complex operator+(complex _FAR & __z1, double __re_val2)

{return complex(__z1.re+__re_val2, __z1.im);}

inline complex operator-(complex _FAR & __z1, complex _FAR & __z2)

{return complex(__z1.re-__z2.re, __z1.im-__z2.im);}

inline complex operator-(double __re_val1, complex _FAR & __z2)

{return complex(__re_val1-__z2.re,-__z2.im);}

inline complex operator-(complex _FAR & __z1, double __re_val2)

{return complex(__z1.re-__re_val2, __z1.im);}

inline complex operator*(complex _FAR & __z1, complex _FAR & __z2)

{

double r=z1.real()*z2.real()-z1.imag()*z2.imag();

double i=z1.real()*z2.imag()+z2.real()*z1.imag()};

return complex(r,i);

}

inline complex operator*(complex _FAR & __z1, double __re_val2)

{

return complex(__z1.re*__re_val2,

__z1.im*__re_val2);

}

inline complex operator*(double __re_val1, complex _FAR & __z2)

{

return complex(__z2.re*__re_val1,

__z2.im*__re_val1);

}

inline complex operator/(complex _FAR & __z1, complex _FAR & __z2)

{

double r=(z1.real()*z2.real()+z1.imag()*z2.image())/

(z2.real()*z2.real()+z2.imag()*z2.imag());

double i=(z2.real()*z1.imag()-z1.real()*z2.imag())/

(z2.real()*z2.real()+z2.imag()*z2.imag());

return complex(r,i);

}



<== предыдущая лекция | следующая лекция ==>
Основные понятия | Основные понятия


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 0.026 сек.