New Complex (1), Complex , Complex (1,2)

Темы

· классы и объекты,

· Inline методы,

· конструкторы по умолчанию и инициализации,

· математическая библиотека cmath.

Задания

Если по расписанию еще не было лекции 2, то начните с ее беглого просмотра (15-20 мин) до слайда 16.

1. Запустить VisualStudio и создать консольный проект “classes”. Попросить каталог под решение.

a. Добавить в stdafx . h ввод-вывод.

b. Используя мастер добавления классов создать класс Complex.

c. На имени проекта в контекстном меню “Добавить” ->“Класс” и выбрать“ C ++ Класс”.

d. Определить имя класса Complex и завершить создание.

e. Изучить, что сделал мастер.

i. Добавлены 2 файла Complex . cpp и Complex . h. Они и образуют модуль класса Complex.

ii. В заголовочном файле определение класса, в cpp- реализация (конструктора и деструктора);

iii. Обратите внимание как конструктор и деструктор реализованы в cpp. используется контекст класса Complex :: Complex () и Complex ::~ Complex ()

iv. Это необходимо. Иначе компилятор не поймет, что функции относятся к классу, а не определены “сами по себе”.

 

Часто разработчики вообще не пользуются мастером создания классов, а добавляют необходимые файлы и определения “вручную”.

 

2. Разработать “полезный” класс комплексных чисел.

3. Вспомните, что значит “inline” и как определяются inline-члены класса. В нашем классе все методы будут короткими и для эффективности имеет смысл сделать их именно inline.

4. Поэтому файл Complex . cppнам не понадобится.

a. Правой кнопкой мыши на имени файла(Complex . cppв Обозреватель решения) и “Удалить”.

i. В Complex . h удалить деструктор. Для данного класса он не нужен (почему?).

ii. Прототип конструктора заменить его реализацией, просто убрав ‘;’ и добавив {}

 

b. Добавить мнимую и действительную часть в наш класс. В Complex . h

c. - перед конструктором добавить 2 публичных поля:double Re , Im ;

d. - в конструкторе задать начальные значения полей Re и Im равными 0;

e. Проверить, что проект собирается, если надо устранить ошибки.

f. В основной модуль (с main) добавить #include “complex . h” и создать объект типа

Complex c; в main.

g. Проверить, что проект собирается, если надо устранить ошибки.

 

Пока класс почти бесполезен. Может только хранить действительную и мнимую части.

 

5. Научить Complex выводить объекты в поток вывода. Для этого:

a. Добавить в заголовочный файл Complex . h ниже объявления класса переопределение операции << для потока вывода и комплексного числа

b. inline ostream & operator<< ( ostream & o , const Complex & c )

{ return o << '(' << c .Re << ", " << c .Im << ')' ; }

c.

Теперь для комплексных чисел можно cout << c, т.к. cout является производным от ostream.

d. Разберитесь с переопределением оператора.

e. Обратите внимание на то, что вне класса, чтобы объявить inline-функцию перед ней обязательно указать inline!

 

F. Зачем возвращается ссылка на поток?

g. Почему параметр ‘ c ’ передается как константная ссылка?

 

В основном модуле проверить в main, что вывод работает.

 

С нашим классом работать пока не удобно. Нужно объявить (создать) объект, присвоить значения его полям.

 

6. Доработать конструктор так, чтобы он мог создавать объекты сразу с нужными значениями (конструктор инициализации).

a. В определении конструктора добавить 2 параметра double re = 0 и double im = 0, со значениями по умолчанию.

b. В теле конструктора использовать их как начальные значения (вместо 0).

c. Значения по умолчанию позволят нам вызвать конструктор и без параметров, и с одним параметром.

Проверьте, что в main теперь можно создавать объекты с нужными начальными значениями.

Complex a(1,2), b = 3;

cout<<a<<", "<<b<<endl;

 

7. Определить основные операции для Complex.

a. Добавить операцию +.

b. В определении класса ниже конструктора пишем:

Complex operator + ( const Complex & c ) const

{ return Complex (Re + c .Re, Im + c .Im); }

 

Что означают квалификаторы const в определении операции?

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

 

c. Самостоятельно добавьте операции -, *, /.

Для умножения (x1+i*y1)*(x2+i*y2) = (x1*x2 – y1*y2, i*(x1*y2+x2*y1))

Для деления ( x 1+ i * y 1)/( x 2+ i * y 2) =

((x1*x2 + y1*y2)/ (x2*x2 + y2*y2), i*(-x1*y2+x2*y1)/ (x2*x2 + y2*y2)).

 

d.

Проверьте, что операции +- и */ взаимно обратны!

(если число вычесть из самого себя, то получится 0, если разделить на само себя, то получится 1)

 

e. Самостоятельно реализуйте метод сопряжения комплексного числа

f. Complex Conjugate () – возвращает сопряженное число.( a + i * b ) => ( a - i * b )

 

8. Математические функции собраны в библиотеке cmath.

a. Включить в stdafx модуль математических функций <cmath>.Лучше это делать сразу после # include < iostream >, т.е. перед using namespace std ; Это сделает текст более наглядным.

b. Реализовать самостоятельно метод double Mod (), который возвращает модуль комплексного числа, sqrt ( Re 2 + Im 2 ).

 

c. Самостоятельно реализовать метод Arg (), который возвращает аргумент комплексного числа в экспоненциальном представлении. a + i * b = m * exp ( i * arg ). Можно восстанавливать аргумент, например, так:

 если модуль равен 0, то возвращаем 0;

- если Re >0, то atan ( Im / Re );

- если Im >= 0, то acos ( Re / Mod ())

- иначе - -acos(Re / Mod())

 

Получили довольно неплохой класс для работы с комплексными числами. Практически, ничем не отличается от встроенных int , double и пр.!

 

9. Объявить массив комплексных чисел. Здесь нам и понадобится конструктор по умолчанию, который можно вызывать без параметров.

a. Вывести массив в одну строку на консоль.

b. Добавить инициализатор массива и повторить вывод.

c. Complex v[4]{ 1,2,3 };

Все как со встроенными типами!

 

10. Работа с динамическими блоками памяти.

a. Объявить указатель на Complex * pc.

b. Создать объект Complex оператором new. Поиграть с параметрами.

new Complex (1), Complex , Complex (1,2)

c. Вывести число на консоль.

d. Вывести отдельно мнимую и действительную часть, используя оператор ->

e. Не забывайте delete после использования;

f. Создать массив комплексных чисел ( new Complex [3]);

g. Разобраться, что означает pc [1]. Re.

h. Не забывайте delete после использования;

 

Завершайте работу, удалите ненужные файлы, архивируйте решение и сохраняйте на сетевом диске или на флешке.

 

ТЕПЕРЬ МЫ УМЕЕМ:

· Добавлять и использовать классы;

· Делать их методы inline или обычными;

· Переопределять операции;

· Использовать cmath .


Дата добавления: 2020-01-07; просмотров: 356; Мы поможем в написании вашей работы!

Поделиться с друзьями:




Мы поможем в написании ваших работ!