Скачиваний:
42
Добавлен:
28.03.2021
Размер:
127.91 Кб
Скачать

Министерство образования Республики Беларусь

Министерство образования Республики Беларусь

БЕЛОРУССКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ

ИНФОРМАТИКИ И РАДИОЭЛЕКТРОНИКИ

Кафедра эконмической информатики

Объектно-ориентированное программирование

Лабораторная работа №7

“РЕАЛИЗАЦИЯ ШАБЛОНОВ КЛАССОВ И ФУНКЦИЙ”

Вариант 8

Выполнила: Студент группы

972303

Рушева Маргарита

Владиславовна

Проверила: Григорьева Юлия

Юрьевна

Минск, 2020

1 ЦЕЛЬ ЛАБОРАТОРНОЙ РАБОТЫ

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

2 ТЕОРИЯ ПО ЛАБОРАТОРНОЙ РАБОТЕ

В С++ используется ключевое слово template для обеспечения параметрического полиморфизма. Шаблоны определения класса и шаблоны определения функции позволяют многократно использовать код, корректно по отношению к различным типам. Шаблоны в С++ являются средствами метапрограммирования и реализуют полиморфизм времени компиляции. Когда мы пишем код с полиморфным поведением, но само поведение определяется на этапе компиляции — т.е., в противовес полиморфизму виртуальных функций, полученный бинарный код уже будет иметь постоянное поведение. Шаблон — это одно из самых сложных и мощных средств в языке C++. Он не вошел в исходную спецификацию C++, и лишь относительно недавно стал неотъемлемой частью программирования на C++. Шаблоны позволяют достичь одну из самых трудных целей в программировании – создать многократно используемый код. Используя шаблоны, можно создавать обобщенные функции и классы.

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

ФУНКЦИЯ С ДВУМЯ ОБОБЩЕННЫМИ ТИПАМИ

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

ОБОБЩЕННЫЕ КЛАССЫ

Шаблоны классов – обобщенное описание пользовательского типа, в котором могут быть параметризованы атрибуты и методы типа. Представляют собой конструкции, по которым могут быть сгенерированы действительные классы путём подстановки вместо параметров конкретных аргументов. Для создания обобщенного класса необходимо создать класс, в котором определяются все используемые им алгоритмы; при этом реальный тип обрабатываемых в нем данных будет задан как параметр при создании объектов этого класса.

3 ИНДИВИДУАЛЬНОЕ ЗАДАНИЕ

Разработать шаблонный класс «Квадратное уравнение», где имеется следующие поля: коэффициенты, дискриминант, корни. Предусмотреть наличие в классе методов вывода на экран уравнения, нахождения максимума и среднего значения элементов. Перегрузить операторы бинарный минус, *= (каждый коэффициент умножить на число).

4 КОД РЕШЕНИЯ ИНДИВИДУАЛЬНОГО ЗАДАНИЯ

#include <iostream>

#include <cmath>

#include <Windows.h>

using namespace std;

template <typename T> class Equation;

template <typename T = int>

class Equation

{

private:

//коэффициенты

T a, b, c;

public:

//конструктор

Equation()

{

}

//деструктор

~Equation()

{

}

//добавляем значения коэффициентам

void Add()

{

cout << "Введите коэффициент а:\n ";

cin >>a;

if (a > 100 || a < -100)

{

cout << "Диапазон вводимых значений [-100;100]";

exit(1);

}

cout << "Введите коэффициент b:\n ";

cin >> b;

if (b > 100 || b < -100)

{

cout << "Диапазон вводимых значений [-100;100]";

exit(1);

}

cout << "Введите коэффициент c:\n ";

cin >> c;

if (c > 100 || c < -100)

{

cout << "Диапазон вводимых значений [-100;100]";

exit(1);

}

cout << endl;

}

//считаем дискриминант

double Discriminant()

{

return b * b - 4 * a * c;

}

//находим корни уравнения

void Roots()

{

cout << "Дискриминант: " << Discriminant() << endl;

double discriminant = Discriminant();

if (discriminant > 0)

{

double root1 = (-b + sqrt(discriminant)) / (2 * a);

double root2 = (-b - sqrt(discriminant)) / (2 * a);

cout << "1 корень уравнения: " << root1 << endl;

cout << "2 корень уравнения: " << root2 << endl;

}

else if (discriminant == 0)

{

if (a != 0) cout << "Оба корня уравнения равны: " << ((-b) / (2 * a)) << endl;

else cout << "Нет корней, так как коэффициент а = 0. " << endl;

}

else

{

cout << "У уравнения нет действительных корней." << endl;

}

}

T GetA() { return a; }

T GetB() { return b; }

T GetC() { return c; }

void setA(T a) { this->a = a; }

void setB(T b) { this->b = b; }

void setC(T c) { this->c = c; }

//находим максимум и минимум во всех случаях

void GetMaxMin()

{

if (a > 0)

{

cout << "Парабола направлена вверх. Находим её минимум:" << endl;

double min = (-b / (2 * a));

double func = a * min * min + b * min + c;

cout << "Минимум =: " << func << endl;

}

else if (a == 0)

{

cout << "У уравнения нет максимума или минимума, так как коэффициент а = 0.";

}

else

{

cout << "Парабола направлена вниз. Находим её максимум:" << endl;

double max = (-b / (2 * a));

double func = a * max * max + b * max + c;

cout << "Максимум =: " << func << endl;

}

}

//среднее значение элементов

void GetMean()

{

double mean = (a + b + c) / 3;

cout << "Среднее значение элементов: " << mean << endl;

}

//функция вывода уравнения в консоль

void ShowEquation()

{

cout << "Ваше уравнение: " << endl;

cout << "(" << a << ")x^2 + (" << b << ")x + (" << c << ") = 0" << endl;

}

void operator- (Equation<T> other)

{

a = a - other.a;

b = b - other.b;

c = c - other.c;

};

void operator*= (int choice)

{

a *= choice;

b *= choice;

c *= choice;

}

};

//Главная функция

int main(void)

{

int choice;

//консоль

SetConsoleCP(1251);

SetConsoleOutputCP(1251);

Equation<int> quadr1, quadr2;

//добавляем значения коэф

quadr1.Add();

//вывод получившегося уравнения

quadr1.ShowEquation();

//находим корни

quadr1.Roots();

//находим максимум и минимум уравнения

quadr1.GetMaxMin();

//среднее значение трех элементов

quadr1.GetMean();

system("pause");

system("cls");

//перегрузка

cout << "Перегрузить бинарный минус *= :\n " << endl;

cout << "Введите коэффициенты ещё одного уравнения:\n ";

// те же действия

quadr2.Add();

quadr1 - quadr2;

quadr1.ShowEquation();

quadr1.Roots();

quadr1.GetMaxMin();

quadr1.GetMean();

//консоль

system("pause");

system("cls");

cout << "Перегрузка *=:" << endl;

cout << "Rаждый коэффициент умножить на число: ";

cin >> choice;

quadr1 *= choice;

//подсчет и вывод значений

quadr1.ShowEquation();

quadr1.Roots();

quadr1.GetMaxMin();

quadr1.GetMean();

}

5 СКРИНШОТЫ ВЫПОЛНЕНИЯ ИНДИВИДУАЛЬНОГО ЗАДАНИЯ

ВЫВОДЫ

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

Соседние файлы в папке лабы салапура