Читайте также:
|
|
Лабораторная работа № 11. Структура-пара с конструкторами и перегрузкой операций
Методические указания
Выполнить задания Лабораторной работы 1, закрыв поля. Реализовать для каждой структуры вместо метода Init конструкторы без аргументов и инициализации. Вместо реализации функции Read перегрузить операцию ввода, вместо реализации функции Display перегрузить операцию вывода. Операции ввода/вывода оформить как дружественные.
Для демонстрации работы с объектами нового типа во всех заданиях требуется написать главную функцию. В программе обязательно должны быть продемонстрированы различные способы создания объектов и массивов объектов. Программа должна демонстрировать использование всех функций и методов.
Показать пример реализации
Пример проверки-тестирования – обязательно!
Вариант 0: пример программы.
0. Поле first – вещественное число, модуль комплексного числа; поле second – вещественное число, аргумент комплексного числа. Реализовать метод im()– вычисление мнимой части комплексного числа. Метод должен правильно работать при любых допустимых значениях first и second.
Программа.
Подключаемые библиотеки, описание структуры и функций
#include <iostream>
#include <cmath>
using namespace std;
class Complex
{ float first; // модуль комплексного числа = радиус-вектор
float second; // аргумент комплексного числа = угол
// -- закрытая функция проверки аргументов
bool init(float f, float s)
{ if (
(f < 0) ||
((f == 0)&&(s!= 0))
)
return false; // неправильные аргументы - не инициализировать поля
else // аргументы правильные - инициализировать поля
{ first = f;
second = s;
return true;
}
}
public:
// -- конструктор инициализации и конструктор по умолчанию
Complex(float f = 0, float s = 0)
{ if (!init(f,s))
throw "Конструктору не понравились ваши данные!";
}
friend istream& operator>>(istream &t, Complex &r);
friend ostream& operator<<(ostream &t, const Complex &r);
float im(){ return first * sin(second); }
};
ostream& operator<<(ostream &t, const Complex &r)
{ t << r.first << " * exp(" << r.second << " * i);";
return t;
}
istream& operator>>(istream &t, Complex &r)
{ float f=0,s=0;
do
{ cout << "Задавать только корректные данные!" << endl;
cout << "Задайте модуль:_ "; cin >> f;
cout << "Задайте аргумент:_ "; cin >> s;
}while(!r.init(f,s));
r.first = f; r.second = s;
return t;
}
Complex make_Complex(float f, float s)
{ Complex A(f,s);
return A;
}
/* Тестовые данные для проверки:
-- неправильные --
-1.0, 1.0
0.0, 1.0
0.0, -1.0
-- правильные -- результат im
0.0, 0.0 0.0
1.0, 0.0 0.0
1.0, 1.0 0.8414709848078965066525023216303
1.0, -1.0 -0.8414709848078965066525023216303
1.0, 1.57079632679 ПИ пополам 1.0
1.0, -1.57079632679 -ПИ пополам -1.0
2.0, 1.57079632679 ПИ пополам 2.0
1.0, 0.52359877560 одна шестая ПИ 0.5
1.0, -0.52359877560 -одна шестая ПИ -0.5
2.0, 0.52359877560 одна шестая ПИ 1.0
2.0, 2.61799387800 пять шестых ПИ 1.0
1.0, 3.14159265358 ПИ 0.0
*/
int main()
{ setlocale(LC_ALL, "Russian");
try { // -- ловля исключения обязательна!
Complex A; // создание одного объекта с полями по умолчанию
cout << A << "; "; cout << "Мнимая часть:_" << A.im() << endl;
//Complex B(-1,1); -- исключение возникает!
// И так все неправильные варианты тестов
// -----------------------------------
Complex D(1,1);
cout << D << "; "; cout << "Мнимая часть:_" << D.im() << endl;
// И так все правильные варианты тестов
// Все правильные варианты тестов - для вызова метода read
// -------------------------------------------------------------------
Complex *p = new Complex(1, 3.14159265358f);
cout << *p << "; "; cout << "Мнимая часть:_" << p->im() << endl;
// -------------------------------------------------------------------
// -- вызов make -- ловля исключения --
Complex F = make_Complex(-1,1); // -- исключение --
Complex M[5];
// корректная инициализация элемента массива
M[0] = make_Complex(1,0);
cout << M[0] << "; ";
cout << " Мнимая часть:_" << M[0].im() << endl;
// и так - все правильные варианты тестов
// -----------------------------------
Complex *m = new Complex[2];
// корректная инициализация элемента массива
m[0] = make_Complex(1,-0.52359877560f);
cout << m[0] << "; ";
cout << " Мнимая часть:_" << m[0].im() << endl;
// -----------------------------------
m[1] = make_Complex(-1,0); // -- исключение возникает!
} catch(char *s) { cout << s << endl; }
system("pause");
return 0;
}
Вариант 0: пример тестовых данных.
/* Тестовые данные для проверки:
-- неправильные --
-1.0, 1.0
0.0, 1.
0.0, -1.0
-- правильные -- результат im
0.0, 0.0 0.0
1.0, 0.0 0.0
1.0, 1.0 0.8414709848078965
1.0, -1.0 -0.8414709848078965
1.0, 1.57079632679 ПИ пополам 1.0
1.0, -1.57079632679 -ПИ пополам -1.0
2.0, 1.57079632679 ПИ пополам 2.0
1.0, 0.52359877560 одна шестая ПИ 0.5
1.0, -0.52359877560 -одна шестая ПИ -0.5
2.0, 0.52359877560 одна шестая ПИ 1.0
2.0, 2.61799387800 пять шестых ПИ 1.0
1.0, 3.14159265358 ПИ 0.0
*/
Варианты заданий: из Лабораторной работы №9
Дата добавления: 2015-11-26; просмотров: 92 | Нарушение авторских прав