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; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!