Помощь в написании студенческих работ
Антистрессовый сервис

Тип данных complex стандартной библиотеки языка C++

КурсоваяПомощь в написанииУзнать стоимостьмоей работы

Операции сравнения Из всех операций сравнения для комплексных чисел определены только проверки на равенство и на неравенство. Операторы == и ≠ определены как глобальные функции, поэтому один из операндов может быть скалярной величиной. В этом случае операнд интерпретируется как вещественная часть, а мнимой части комплексного числа присваивается значение по умолчанию для данного типа (обычно 0… Читать ещё >

Тип данных complex стандартной библиотеки языка C++ (реферат, курсовая, диплом, контрольная)

Южно-Сахалинский институт экономики, права и информатики Кафедра «Компьютерные технологии и системы»

ПОЯСНИТЕЛЬНАЯ ЗАПИСКА

к курсовой работе

по дисциплине «Программирование на языке высокого уровня»

на тему: Тип данных complex стандартной библиотеки языка C++

Руководитель работы

ст. преподаватель кафедры КТиC

Соболев П.Ю.

«____"__________________2009 г.

Исполнитель

студент группы ВТ-21

Мустафин А.С.

«____"__________________2009 г.

Южно-Сахалинск

Южно-Сахалинский институт экономики, права и информатики

Кафедра Компьютерные технологии и системы

УТВЕРЖДЕНО

Зав. кафедрой

________________ Мазур И.К.

З, А Д, А Н И Е

на выполнение курсовой работы студенту Мустафину Александру Сергеевичу

1. Тема работы: Тип данных complex стандартной библиотеки языка C++

2. Срок сдачи студентом законченного проекта 22 декабря 2009

4. Содержание пояснительной записки (перечень подлежащих к разработке вопросов):

1. Постановка и анализ задачи, изучение теоретических вопросов темы

2. Разработка алгоритмов и типов данных

3. Разработка программного обеспечения

Заключение

Задание принял к исполнению 1 октября 2009 года

(дата, подпись)

Руководитель ____________________________

(подпись)

ПРИМЕЧАНИЕ: Студент предупрежден о том, что при несвоевременном представлении работы руководителю студент считается не выполнившим график учебного процесса и не допускается к защите курсовой работы.

1 Постановка задачи Задачей курсовой работы является реализация программы для работы с комплексными числами. Для реализации программы требуется использовать интегрированную среду разработки Borland C++ Builder 6.0, а также стандартные типы данных библиотеки VCL.

Цель работы — изучить типы данных complex и продемонстрировать операции над данным типом для указанной операционной системы. В проекте предполагается реализовать программу-калькулятор для комплексных чисел.

Разрабатываемая программа выполняет математические и тригонометрические функции для данного типа.

Для разработки приложения используются следующие программные инструменты:

1. среда разработки Borland C++ Builder,

2. библиотека классов VCL (Visual Component Library),

3. функции интерфейса прикладного программирования операционной системы Windows (Win32 API).

2 Теоретическая часть В стандартную библиотеку С++ входит шаблонный класс complex<>, предназначенный для работы с комплексными числами. На всякий случай стоит напомнить, что комплексные числа состоят из двух частей: вещественной и мнимой. Особое свойство мнимой части заключается в том, что ее квадрат является отрицательным числом. Иначе говоря, мнимая часть представляет собой произведение числа и квадратного корня из -1, обозначаемого символом i.

2.1 Строение класса complex

Здесь приведены подробные описания всех операций класса complex<>. Обозначение Т задает параметр шаблона класса complex<>, то есть тип вещественной и мнимой частей значения complex.

Определения типов

complex:value_type

Тип вещественной и мнимой частей.

Операции создания, копирования и присваивания

complex:complex ()

? Конструктор по умолчанию.

? Создает комплексное значение, в котором вещественная и мнимая части инициализируются вызовом конструкторов по умолчанию (0 для базовых типов данных). Это означает, что для базовых типов данных исходные значения вещественной и мнимой частей равны 0

сотрlex:complex (const Т& re)

? Создает комплексное значение, в котором вещественная часть равна re, а мнимая часть инициализируется вызовом конструктора по умолчанию (0 для базовых типов данных).

? Конструктор также определяет автоматическое преобразование типа Т в complex

complex:complex (const Т& re. const Т& im)

complex программа число комплексный Создает комплексное значение, в котором вещественная и мнимая части равны соответственно re и im

complex polar (const Т& rho)

complex polar (const T& rho. const T& theta)

? Обе формы создают и возвращают комплексное число, инициализированное в полярных координатах.

? Параметр rho определяет амплитуду.

? Параметр theta определяет фазовый угол в радианах (по умолчанию 0).

complex conj (const complex& cmplx)

Создает и возвращает комплексное число, инициализируемое сопряжением другого комплексного числа (то есть числом с противоположным знаком мнимой части).

complex:complex (const complex& cmplx)

? Копирующий конструктор.

? Создает новое комплексное число как копию cmplx.

? Копирует вещественную и мнимую части.

? Функция определяется в обеих формах: шаблонной и обычной. Таким образом, конструктор обеспечивает автоматическое преобразование к типу элементов.

? В специализированных версиях для типов float, double и long double копирующие конструкторы ограничиваются так, чтобы небезопасные преобразования (double и long double в float, long double в double) выполнялись явно, а другие преобразования к типу элементов были запрещены:

Листинг1-преобразования

namespace std { template<> class complex

{

public;

explicit complex (const complex&);

explicit complex (const complex)&);

// Другие версии копирующих конструкторов отсутствуют

};

template<> class complex { public;

complex (const complex&);

explicit complex (const complex)&);

// Другие версии копирующих конструкторов отсутствуют

);

template<> class complex { public;

complex (const complex&);

complex (const complex)&);

// Другие версии копирующих конструкторов отсутствуют

};

}

complex& complex: :operator= (const complex& cmplx)

? Присваивает значение комплексного числа cmplx.

? Возвращает *this.

? Функция определяется в обеих формах: шаблонной и обычной. Тем самым обеспечивается автоматическое преобразование к типу элементов (это относится и к специализированным версиям из стандартной библиотеки С++).

complex& complex: :operator+= (const complex& cmplx)

complex& complex: operator— (const complex& cmplx)

complex& complex: operator*= (const complex& cmplx)

complex& complex: :operator/= (const complex& cmplx)

? Сложение, вычитание, умножение и деление cmplx и *this с сохранением результата в *this.

? Операторы возвращают *this.

? Операции определяются в обеих формах: как шаблонные и обычные функции. Тем самым обеспечивается автоматическое преобразование к типу элементов (это относится и к специализированным версиям из стандартной библиотеки С++). Обратите внимание: операторы присваивания — единственные функции, позволяющие изменить значение существующего объекта complex.

Обращение к данным Т complex:.real () const

Т real (const complex& cmplx)

T complex: imag () const

T imag (const complex& cmplx)

?Функции возвращают значение вещественной или мнимой части соответственно.

? Возвращаемое значение не является ссылкой. Это означает, что функции real () и imag () не могут использоваться для изменения вещественной или мнимой части числа. Чтобы изменить только вещественную или мнимую часть, необходимо присвоить объекту complex новое комплексное число.

Т abs (const complex& cmplx)

? Возвращает модуль (абсолютное значение) комплексного числа cmplx.

? По формуле вычисляется модуль комплексного числа. Т norm (const complex& cmplx)

? Возвращает квадрат модуля комплексного числа cmplx.

? Квадрат модуля комплексного числа вычисляется по формуле стрlx. real ()2 + + cmplx. imag ()2.

Т arg (const complex& cmplx)

? Возвращает фазовый угол представления cmplx в полярных координатах (ц).

? Эквивалент:

atan2(cmplx.imag () .cmplx.real ()).

Операции ввода-вывода

ostream& operator" (ostream& strm, const complex& cmplx)

? Выводит значение cmplx в ноток данных strm в формате:

(вещественная_часть, мнимая_часть)

? Возвращает strm.

istream& operator" (istream& strm. complex& cmplx)

? Читает новое значение из потока данных strm в переменную cmplx.

? Допустимые форматы входных данных:

(вещественная_частъ, мнимая_часть)

(вещественная_часть)

вещественная __часть

? Возвращает strm.

Операторы

complex operator (const complex& cmplx)

Возвращает cmplx. complex operator (const complex& cmplx)

? Унарное изменение знака.

? Возвращает cmplx с обратными знаками вещественной и мнимой частей.

complex бинарна я_операция (const complex& cmplx1. const complex& cmplx2)

complex бинарная_операция (const complex& cmplx1. const T& value)

complex бинарная_операция (const T& value, const complex& cmplx2)

? Все формы возвращают комплексный результат выполнения заданной бинарной операции.

? Параметр бинарная_операция — один из следующих операторов:

operator-operator* operator/

? Если при вызове оператора передается скалярное значение типа элемента, оно интерпретируется как вещественная часть, а мнимая часть инициализируется значением по умолчанию для своего типа (0 для базовых типов данных).

bool сравнение (const complex& cmplx1, const complex& cmplx2)

bool сравнение (const complex& cmplx1. const T& value)

bool сравнение (const T& value, const complex& cmplx1)

? Возвращает результат сравнения двух комплексных чисел или комплексного числа со скалярным значением.

? Параметр сравнение — один из следующих операторов:

operator == operator ≠

? Если при вызове оператора передается скалярное значение типа элемента, оно интерпретируется как вещественная часть, а мнимая часть инициализируется значением по умолчанию для своего типа (0 для базовых типов данных).

? Обратите внимание: операторы <, <=, > и >= не поддерживаются.

Трансцендентные функции

complex pow (const complex& base, int exp)

complex pow (const complex& base, const T& exp)

complex pow (const complex& base, const complex& exp)

complex pow (const T& base, const complex& exp)

? Все формы возвращают результат комплексного возведения base в степень ехр, вычисляемый по формуле:

exp (exp*log (base))

? Разрывы направлены вдоль отрицательной вещественной полуоси.

? Значение, возвращаемое для pow (0,0), определяется реализацией.

complex exp (const complex& cmplx)

Возвращает результат комплексного возведения числа е в степень cmplx.

complex sqrt (const complex& cmplx)

? Возвращает комплексный квадратный корень из cmplx, находящийся в правой полуплоскости.

? Если аргумент является отрицательным вещественным числом, то возвращаемое значение находится на положительной мнимой полуоси.

? Разрывы направлены вдоль отрицательной вещественной полуоси. complex log (const complex& cmplx)

? Возвращает комплексный натуральный логарифм cmplx.

? Если cmplx является отрицательным вещественным числом, то imag (log (cmplx))=PI.

? Разрывы направлены вдоль отрицательной вещественной полуоси, complex log10 (const complex& cmplx)

? Возвращает комплексный десятичный логарифм cmplx.

? Эквивалент:

log (cmplx)/log (10)

? Разрывы направлены вдоль отрицательной вещественной полуоси.

complex sin (const complex& cmplx)

complex cos (const complex& cmplx)

complex tan (const complex& cmplx)

complex sinh (const complex& cmplx)

complex cosh (const complex& cmplx)

complex tanh (const complex& cmplx)

? Функции возвращают результаты соответствующих комплексных тригонометрических операций с cmplx.

Класс complex объявляется в заголовочном файле :

#include

Определение класса complex в файле выглядит так:

Листинг 2-Определение класса complex

Namespace std

{

template

class complex;

}

Параметр шаблона T задает скалярный тип как вещественной, так и мнимой части комплексного числа.

В стандартную библиотеку С++ включены также три специализированные версии класса complex для типов float, double и long double:

Листинг 2-специализированные классы

namespace std {

template<> class complex;

template<> class complex;

template<> class complex;

}

Определения этих типов позволяют выполнять некоторые виды оптимизации и безопасное преобразование от одного комплексного типа к другому.

2.2 Примеры использования класса complex

Следующая программа демонстрирует возможности класса complex по созданию комплексных чисел, их выводу в разных представлениях и выполнению некоторых типовых операций с комплексными числами.

Листинг 3-Типовые операции класса complex

// num/complex1.cpp

#include

#include

using namespace std;

int main ()

{

/* Комплексное число с вещественной и мнимой частями

* - Вещественная часть: 4.0

* - Мнимая часть: 3.0

complex c1(4.0.3.0);

/* Создание комплексного числа в системе полярных координат

* - Амплитуда: 5.0

* - Фазовый угол: 0.75

*/

complex c2(polar (5.0.0.75));

// Вывод комплексного числа с вещественной и мнимой частями

cout ««c1: «» c1 «endl:

cout ««c2: «» c2 «endl;

// Вывод комплексного числа в полярных координатах

cout ««c1: magnitude: «» abs (cl)

" «(squared magnitude: «» norm (c1) ««) «

" «phase angle: «» arg (c1) «endl; cout ««c2: magnitude: «» abs (c2)

" «(squared magnitude: «» norm (c2) ««) «» «phase angle: «» arg (c2) «endl;

// Вывод сопряжений комплексных чисел

cout ««c1 conjugated: «» conj (c1) «endl;

cout ««c2 conjugated: «» conj (c2) «endl;

// Вывод результата вычисления

cout ««4.4 + c1 * 1.8: «» 4.4 + c1 * 1.8 «endl:

/* Вывод суммы c1 и с2: * - внимание: разные типы!

cout ««c1 + с2:

" c1+ complex (c2.real (), c2. imag ()) «endl;

// Прибавление к c1 квадратного корня из c1 и вывод результата

cout ««c1 += sqrt (c1): ' «(c1 += sqrt (c1)) «endl;

}

Примерный результат выполнения программы выглядит так (точный результат зависит от реализации некоторых свойств типа double):

c1: (4.3)

C2: (3.65 844.3.40 819)

c1: magnitude: 5 (squared magnitude: 25) phase angle: 0.643 501

c2: magnitude: 5 (squared magnitude: 25) phase angle: 0.75

c1: conjugated: (4.-3)

c2: conjugated: (3.65 844.-3.40 819)

4.4 + c1 * 1.8: (11.6.5.4)

c1 + c2: (7.65 844.6.40 819)

c1 += sqrt (c1): (6.12 132.3.70 711)

Вторая программа в цикле читает два комплексных числа и вычисляет результат возведения первого числа в степень второго:

Листинг 4-цикл возведения первого числа во второе

// num/complex2.cpp

include

#include

#include

#include

using namespace std;

int main ()

{

complex c1. c2;

while (cin.peek () ≠ EOF)

{

// Ввод первого комплексного числа

cout ««complex number c1: «;

cin «c1;

if (!cin)

{

cout ««input error» «endl;

return EXIT_FAILURE;

// Ввод второго комплексного числа cout ««complex number c2: «;

cin «с2; if (!cin)

{

сout ««input error» «endl;

return EXIT_FAILURE:

)

if (c1 == c2)

{

cout ««c1 and c2 are equal !» «endl;

}

cout ««c1 raised to the c2: «» pow (c1.c2) «endl «endl;

// Пропуск оставшейся части строки

cin.ignore (numeric_limits:max ().'n');

}

}

В таблице 1 приведены примеры входных данных и полученных результатов.

Таблица 1- Примеры входных данных.

c1

C2

Результат

c1 raised to c2: (4,0)

(16)

0.5

c1 raised to C2: (4,0)

(8,0)

0.333 333 333

c1 raised to c2: (2,0)

0.99

(5)

c1 raised to C2: (0.95 099,0)

(0,2)

c1 raised to c2: (-4,4.8984e-16)

(1.7,0.3)

c1 raised to c2: (1,0)

(3,4)

(-4,3)

c1 raised to c2: (4.32424e-05,8.91396e-05)

(1.7,0.3)

(4.3,2.8)

c1 raised to c2: (-4.17 622,4.86 871)

Обратите внимание: при вводе комплексного числа указывается либо только вещественная часть в виде отдельного значения (в круглых скобках или без), либо вещественная и мнимая части в круглых скобках, разделенные запятыми.

2.3 Операции с комплексными числами Далее описаны операции с комплексными числами, поддерживаемые классом complex.

В таблице 2 перечислены конструкторы и операции присваивания для типа complex. Конструкторам могут передаваться исходные значения вещественной и мнимой частей. Если значения не заданы, они инициализируются конструктором по умолчанию для соответствующего типа.

Таблица 2 — Конструкторы и операции присваивания для типа complex.

Выражение

Эффект

complex с

Создает комплексное число с нулевой вещественной и мнимой частями (0+0i)

complex с (1.3)

Создает комплексное число с вещественной частью 1.3 и нулевой мнимой частью (1.3+0i)

complex с (1.3, 2.4)

Создает комплексное число с вещественной частью 1.3 и мнимой частью 4.2 (1.3+4.2i)

complex c1(c2)

Создает комплексное число c1 как копию с2

polar (4.2)

Создает временное комплексное число по полярным координатам

(амплитуда р = 4.2, фазовый угол ц = 0)

polar (4.2, 0.75)

Создает временное комплексное число по полярным координатам

(амплитуда р = 4.2, фазовый угол ц = 0.75)

conj (c)

Создает временное комплексное число, сопряженное с числом с

(то есть комплексное число с противоположным знаком мнимой части)

c1 = с2

Присваивает c1 вещественную и мнимую части с2

c1 += с2

Прибавляет с2 к c1

c1 -= с2

Вычитает с2 из c1

c1*=c2

Умножает с1 на с2

с1/=с2

Делит с1 на с2

Значение существующего комплексного числа может быть изменено только при помощи операторов присваивания. Комбинированные операторы присваивания +=, -=, *= и /= осуществляют суммирование, вычитание, умножение и деление значений двух комплексных операндов.

Вспомогательная функция polar () позволяет создать комплексное число, инициализируемое в полярных координатах (через амплитуду и фазовый угол, указанный в радианах):

// Создание комплексного числа с инициализацией в полярных координатах std: complex

c2(std:polar (4.2.0.75));

Если в создании комплексного числа задействовано неявное преобразование типа, возникает проблема. Например, следующее решение работает нормально: std: complex

c2(std:polar (4.2,0.75)); // OK

Однако похожая запись со знаком равенства ошибочна:

std:complex

с2 = std: polar (4.2.0.75); // ОШИБКА Эта проблема рассматривается далее.

Вспомогательная функция conj () позволяет создать комплексное число, инициализированное значением, сопряженным с другим комплексным числом (то есть комплексным числом с противоположным знаком мнимой части):

std: :complex с1(1.1.5.5);

std:complex c2(conj (c1));

// c2 инициализируется как

// complex (1.1.-5.5)

2.4 Неявные преобразования типов Конструкторы специализированных версий для типов float double и long double спроектированы так, чтобы безопасные преобразования типов (например, complex в complex) могли выполняться неявно, а потенциально рискованные преобразования (например, complex в complex) были:

std:complex cf;

std:complex cd;

std:complex cld;

std:complex cd1 =cf: // OK: безопасное преобразование

std:complex cd2 = сld: // ОШИБКА: нет неявного преобразования

std:complex cd3(cld); // OK: явное преобразование

He существует конструкторов, создающих комплексное число по другим комплексным типам. В частности, нельзя преобразовать complex с целым типом в complex с типом float, double или long double. Впрочем, преобразования можно выполнять при передаче вещественной и мнимой частей в отдельных аргументах:

std:complex cd;

std:complex ci;

std:complex cd4 = ci; // ОШИБКА: небезопасное преобразование std: complex cd5(ci); // ОШИБКА: нет явного преобразования

std: :complex cd6(ci.real () .ci .imag ()); // OK

К сожалению, операторы присваивания позволяют выполнять небезопасные преобразования. Они определены в виде шаблонов для всех типов, поэтому присваивание допустимо для любых комплексных типов (при возможности пре-образования типа значения):

std: :complex cd;

std: :complex cld;

std:complex ci;

Эта проблема также относится к функциям polar () и conj (). Например, следующая запись работает нормально:

std:complex c2(std:polar (4.2.0.75)); // OK

С другой стороны, запись со знаком = не работает:

std:complex с2 = std: polar (4.2.0.75); // ОШИБКА Дело в том, что выражение std: polar (4.2,0.75) создает временный объект complex, а неявное преобразование из complex в complex не определено.

2.5 Доступ к данным В таблице 3 перечислены функции получения атрибутов комплексных чисел.

Таблица 3- Функции получения атрибутов.

Выражение

Описание

c.real ()

Возвращает значение вещественной части (функция класса)

real (c)

Возвращает значение вещественной части (глобальная функция)

c.lmag ()

Возвращает значение мнимой части (функция класса)

imag (c)

Возвращает значение мнимой части (глобальная функция)

abs (c)

Возвращает модуль с ()

norm (c)

Возвращает квадрат модуля с (c.real ()2+c.imag ()2)

arg (c)

Возвращает фазовый угол в полярном представлении c (ц); эквивалент atan2(c.imag (), c. real ())

Функции real () и imag () позволяют только прочитать значения вещественной и мнимой частей. Чтобы изменить любую из частей комплексного числа, необходимо присвоить ему новое значение. Например, следующая команда присваивает мнимой части с значение 3.7: std: complex с;

… с = std: complex (c.real ().3.7);

2.6 Операции сравнения Из всех операций сравнения для комплексных чисел определены только проверки на равенство и на неравенство. Операторы == и ≠ определены как глобальные функции, поэтому один из операндов может быть скалярной величиной. В этом случае операнд интерпретируется как вещественная часть, а мнимой части комплексного числа присваивается значение по умолчанию для данного типа (обычно 0).

Другие операции сравнения (например, с оператором < и т. д.) для класса complex не определены. Хотя в принципе для комплексных чисел можно определить порядок сортировки, результат получается недостаточно интуитивным и не приносит особой практической пользы. Например, сравнивать комплексные числа на основании модулей бессмысленно, поскольку два разных комплексных числа (например, 1 и -1) могут иметь одинаковые модули. Конечно, можно изобрести специальный критерий сортировки, например, для двух комплексных чисел c1 и с2 считать, что c1<|c2|, а в случае совпадения модулей — при выполнении условия arg (c1)

Таблица 4- Операции сравнения для класса complex<>.

Выражение

Описание

c1 == c2

Проверка на равенство c1 и с2 (c1.real ()==c2.real () && c1. imag ()==c2.imag ())

с== 1.7

Проверка на равенство c1 и 1.7 (c1.real ()==1.7 &&c1.imag ()==0.0)

1.7 == с

Проверка на равенство 1.7 и с (c1.real0==1.7 && c1. imag ()==0.0)

с1 ≠ с2

Проверка на неравенство c1 и с2 (c1.real ()≠c2.real () || c1. imag ()≠c2.imag ())

с ≠ 1.7

Проверка на неравенство c1 и 1.7 (c1.real ()≠1.7 || c1. imag ()≠0.0)

1.7 ≠ с

Проверка на неравенство 1.7 и с (c1.real ()≠1.7 || c1. imag ()≠0.0)

Из этого следует, что тип complex не может быть типом элементов ассоциативных контейнеров (без определения пользовательского критерия сортировки). Дело в том, что для сортировки элементов по умолчанию ассоциативные контейнеры используют объект функции less<>, который вызывает оператор <

Определение пользовательского оператора < позволяет сортировать комплексные числа и использовать их в ассоциативных контейнерах. Нельзя нарушать стандартное пространство имен. Пример:

Листинг 5-правильное пространство имен

template

bool operator< (const std: complex& c1.

const std: complex& c2)

return std: abs (cl)

2.7 Арифметические операции Для комплексных чисел определены четыре базовые арифметические операции, а также операции изменения знака.

Таблица 5- Арифметические операции класса complex<>.

Выражение

Описание

с1+с2

Возвращает сумму с1 и с2

с1+1.7

Возвращает сумму с1 и 1.7

1.7 + с

Возвращает сумму 1.7 и с

c1 — с2

Возвращает разность c1 и с2

с — 1.7

Возвращает разность с и 1.7

1.7 — с

Возвращает разность 1.7 и с

c1 * с2

Возвращает произведение c1 и с2

с* 1.7

Возвращает произведение с и 1.7

1.7* с

Возвращает произведение 1.7 и с

c1 / с2

Возвращает частное от деления c1 на с2

с / 1.7

Возвращает частное от деления с на 1.7

1.7 / с

Возвращает частное от деления 1.7 на с

— с

Возвращает значение с с обратным знаком

+ с

Возвращает с

c1 += с2

Эквивалент c1 = c1 + с2

c1 -= с2

Эквивалент c1 = c1 — с2

c1 *= с2

Эквивалент c1 = c1 * с2

c1 /= с2

Эквивалент c1 = c1 / с2

2.8 Операции ввода-вывода В классе complex определены стандартные операторы ввода-вывода << и >> .

Таблица 6- операции ввода-вывода класса complex<>

Выражение

Описание

strm << с

Записывает комплексное число с в выходной поток данных strm

strm >> с

Читает комплексное число с из входного потока данных strm

Оператор «>>» выводит комплексное число в поток данных в следующем формате:

(вещественная_часть, мнимая_часть) Эквивалентная реализация оператора вывода выглядит так:

Листинг 6-эквивалентная реализация.

template

std:basic_ostream&

operator" (std: :basic_ostream& strm. const std: :complex c)

{

// Временная строка для выполнения вывода с одним аргументом

std: :basic_ostringstream s:

s.flags (strm.flags ()); // Копирование флагов потока

s.imbue (strm.getloc ()); // Копирование локального контеста потока

s.precision (strm.precision ()); // Копирование точности потока

// Подготовка итоговой строки

s «'(' «с. real () «'.' «c.imag () «')';

// Вывод итоговой строки strm «s.str ();

return strm;

}

Оператор ввода читает комплексные числа в одном из представленных ниже

(вещественная_часть, мнимая_часть)

(вещественная_часть)

вещественная_часть Если очередные символы во входном потоке данных не соответствуют ни одному из перечисленных форматов, устанавливается флаг ios: failbit, что может привести к соответствующему исключению.

К сожалению, вы не можете задать собственный разделитель для вещественной запятой в качестве «десятичной точки» (как, например, в Германии или России) вводимые/выводимые данные выглядят довольно странно. Например, комплексное число с вещественной частью 4.6 и мнимой частью 2.7 записывается в виде: (4.6.2.7).

2.9 Трансцендентные функции В таблице 7 перечислены трансцендентные функции (тригонометрия, возведение в степень и т. д.) класса complex.

Таблица 7- Трансцендентные функции.

Выражение

Описание

pow (c, 3)

Комплексное возведение в степень: с3

pow (c, 1.7)

Комплексное возведение в степень: с1,7

pow (с1,c2)

Комплексное возведение в степень: с1c2

pow (1.7,c)

Комплексное возведение в степень: 1.7

exp (c)

Возведение в степень по основанию е: ес

sqrt (c)

Квадратный корень из с ()

log (c)

Комплексный натуральный логарифм с (In с)

log 10(c)

Комплексный десятичный логарифм с (lg с)

sln (c)

Синус с (sin с)

cos (c)

Косинус с (cos с)

tan (c)

Тангенс с (tan с)

sinh (c)

Гиперболический синус с (sinh с)

cosh (с)

Гиперболический косинус с (cosh с)

tanh (c)

Гиперболический тангенс с (tanh с)

3 Анализ данных Для реализации поставленной задачи автором была проведена работа по анализу входных/выходных данных, используемых в проекте. Общие сведения о переменных и константах сведены в таблицу. Приводимые в таблицах переменные представлены в программном коде приложения и сопровождаются комментариями.

Таблица 8 — Входные данные программы.

Переменная

Тип

Назначение

c1

complex

Принимает значение первого комплексного числа.

c2

complex

Принимает значение второго комплексного числа.

Таблица 9 — Выходные данные программы.

Переменная

Тип

Назначение

с

AnsiString

Формат действительной части с1, с2.

d

AnsiString

Формат мнимой части с1, с2.

Таблица 10 — Промежуточные данные программы.

Переменная

Тип

Назначение

p

complex

Полученает значения при выполнении операций над числами с1 и с2

4 Разработка программного обеспечения Разработка программного обеспечения велась на языке высокого уровня C++, при использовании перечисленных далее инструментов.

В качестве основного инструмента для разработки программного комплекса на языке C++ была использована интегрированная среда разработки Borland C++ Builder 6.0. Также при разработке использовались компоненты библиотеки VCL, и функции, описанные в стандартных заголовочных файлах C++ Builder.

1. Назначение программного обеспечения:

Разработанное программное обеспечение является калькулятором для комплексных чисел, в обязательные функции которого входит:

1. вычисление арифметических функций,

2. вычисление трансцедентных функций,

3. операция сравнения.

2. Описание реализации функций программы.

2.1 Вычисление всех заданных функций и вывод результата.

Для вычисления использовались стандартные функции библиотеки С++ Builder 6.0. Пример реализации операций описаны ниже:

Листинг 7 — Выполнение вычислений и вывод результата.

{

p=c1+c2; //Сложение чисел

c=FormatFloat («0.00», p. real ());

d=FormatFloat («0.00», p. imag ()); //Округление результата до сотых

Label7->Caption="(«+c+» ." +d+")"; //Вывод результата сложения

}

.. .. .. .. .. .. .. .. .. .

{

p=c1-c2; //Разность чисел

c=FormatFloat («0.00», p. real ());

d=FormatFloat («0.00», p. imag ());

Label7->Caption="(«+c+» ." +d+")" ;

}

.. .. .. .. .. .. .. .. ... .

{

p=c1*c2; //Произведение чисел

c=FormatFloat («0.00», p. real ());

d=FormatFloat («0.00», p. imag ());

Label7->Caption="(«+c+» ." +d+")" ;

}

.. .. .. .. .. .. .. .. ... .

{

if (c2.real ()≠0.0 || c2. imag ()≠0.0) //Если с2 не равно нулю то

{ //выполнить деление

p=c1/c2;

c=FormatFloat («0.00», p. real ());

d=FormatFloat («0.00», p. imag ());

Label7->Caption="(«+c+» ." +d+")" ;

}

else //иначе вывести ошибку

{ ShowMessage («Нельзя делить на ноль»);

};

}

4.1 Вывод подсказки использования данной программы Листинг 8 -Вывод окна помощи.

{

//Вывод сообщение с подсказкой

ShowMessage («Наберите два комплексных числа в данных полях (действительные и мнимые части каждого числа) и нажмите кнопку 'Ввести', изначально значения чисел заданы как нулевые. Далее выберите нужную операцию.»);

}

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

Установка программы: специальной установки программа не требует. Для использования программы необходимо скопировать исполняемый файл в любое место жёсткого диска. Для работы программы установка дополнительных программных модулей и библиотек не требуется.

Внешний вид главного окна программы показан на рисунке 1.

Рисунок 1 — главное окно программы

В случае неверно введенных данных будут показаны предупреждения, пример показан на рисунке 2.

Рисунок 2 — Вывод предупреждения

Заключение

Результатом решения поставленной задачи является программакалькулятор, предназначенная для совершений математических операций над комплексными числами, работающая под управлением операционной системы Windows. Автором изучены средства работы с комплексным типом данных, предоставленным средой разработки C++Builder (из библиотеки VCL и интерфейса прикладного программирования Win32 API).

Стоит отметить тот факт, что в процессе тестирования не выявлены ошибки времени исполнения, программа полностью реализует заявленные функции и в целом работает устойчиво.

Так как задачей данной работы являлась демонстрация работы с комплексным типом стандартной библиотеки C++ Builder 6.0, то на основании выше изложенного можно утверждать, что тема раскрыта полностью.

Список использованных источников

1. Архангельский, А. Я. Программирование в С++ Builder 6. [текст] / А. Я. АрхангельскийМ.: Бином, 2002. — 1152 с.

2. Дейтел, Х. М. Как программировать на С++. [текст] / Х.М. ДейтелМ.: Бином, 2001. — 1152 с.

3. Страуструп, Бьерн Язык программирования С++. [текст] / Бьерн СтрауструпСПб.: Бином, 1999. — 990 с.: ил.

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

Файл (каталог)

Назначение

Curse.exe

Файл приложения

Проект

Папка с исходным проектом в формате С++ Builder 6

записка.doc

файл пояснительной записки

Показать весь текст
Заполнить форму текущей работой