Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Отчеты по лабам / ООП Лаб 5 Зарецкий Вариант 9

.docx
Скачиваний:
8
Добавлен:
05.11.2021
Размер:
45.83 Кб
Скачать

ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ "САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ ТЕЛЕКОММУНИКАЦИЙ ИМ. ПРОФ. М. А. БОНЧ-БРУЕВИЧА"

Факультет инфокоммуникационных сетей и систем

Кафедра программной инженерии и вычислительной техники

ЛАБОРАТОРНАЯ РАБОТА №5

«ШАБЛОНЫ КЛАССОВ»

по дисциплине «Объектно-ориентированное программирование»

Выполнил:

студент 2 курса

дневного отделения

группы ИКПИ-06

Зарецкий Д.Е.

Санкт-Петербург

2021

А. Постановка задачи

В настоящей лабораторной работе необходимо решить две задачи, связанные с организацией шаблонов классов. Первая из задач состоит в преобразовании в шаблон класс того числового класса, который был разработан студентом в первой лабораторной работе по ООП (в 9-ом варианте задание с комплексными числами). Вторая задача состоит в разработке шаблона контейнера. При решении второй задачи следует предусмотреть обработку исключительных ситуаций (файл main.cpp). В данном варианте - разработать шаблон класса для динамического одномерного массива.

Б. Таблицы атрибутов классов

Таблица атрибутов класса комплексных чисел

N

Назначение

Идентификатор

Секция

1

Действительная часть

a (T)

private

2

Мнимая часть

b (T)

private

Таблица атрибутов класса динамического одномерного массива

N

Назначение

Идентификатор

Секция

1

Число элементов

arrayElementsAmount

private

2

Указатель на массив типа T

T* arr;

private

В. Коды программ

Файл main.cpp

#include <iostream>

#include <iomanip>

#include <cmath>

#include "ComplexNumber.h"

#include "arrays.h"

using namespace std;

void TestComplexNumber();

void TestArrays();

int main() {

cout << "[---] Lab5. Task: template class \"Complex Number\", variant 9 [---]" << endl << endl;

TestComplexNumber();

cout << endl;

cout << "[---] Lab5. Task: template class \"Arrays\", variant 9 [---]" << endl << endl;

TestArrays();

cout << "[---] End [---]" << endl;

return 0;

}

void TestComplexNumber() {

ComplexNumber<int> cn1(3, 4);

ComplexNumber<double> cn2(8.5, 6.1);

PrintCN(cn1, 1);

PrintCN(cn2, 2);

ComplexNumber<int> cn3 = cn1 + ComplexNumber<int>(3, 4);

PrintCN(cn3, 3);

std::cout << std::endl;

}

void TestArrays() {

while (1) {

int n, elem;

cout << "Array 1 [INT]: " << endl;

cout << "Enter amount of elements: ";

cin >> n;

//Проверка массива на положительность

if (n < 0) {

cout << "Array size can't be negative. Try again" << endl;

break;

}

Array<int> arr1(n);

arr1.arrayInput();

cout << "Enter an element you want to paste" << endl;

cin >> elem;

//Проверка - имеет ли элемент значение больше чем может вместить тип

if (elem > 21474836) {

cout << "The element can't be greater than INT type. Try again" << endl;

break;

}

arr1.elementInput(elem);

arr1.findMaxArrayEl(arr1);

cout << endl;

cout << "Array 2 [FLOAT]: " << endl;

cout << "Enter amount of elements: ";

cin >> n;

//Проверка массива на положительность

if (n < 0) {

cout << "Array size can't be negative. Try again" << endl;

break;

}

Array<float> arr2(n);

arr2.arrayInput();

float elemf;

cout << "Enter an element you want to paste" << endl;

cin >> elemf;

//Проверка - имеет ли элемент значение больше чем может вместить тип

if (elemf > 205891132094649.0) {

cout << "The element can't be greater than FLOAT type. Try again" << endl;

break;

}

arr2.elementInput(elemf);

arr2.findMaxArrayEl(arr2);

break;

}

}

Файл ComplexNumber.h

#pragma once

#include <iostream>

template <typename T>

class ComplexNumber {

private:

T a; // Реальная часть КЧ

T b; // Мнимая часть КЧ

public:

ComplexNumber() : a(T()), b(T()) {};

ComplexNumber(T a, T b) : a(a), b(b) {};

using CN = ComplexNumber;

const CN operator+(const CN& cn) const { return ComplexNumber(a + cn.a, b + cn.b); };

const CN operator-(const CN& cn) const { return ComplexNumber(a - cn.a, b - cn.b); };

const CN operator*(const CN& cn) const {

T* new_a = a * cn.a - b * cn.b;

T* new_b = a * cn.b + b * cn.a;

return ComplexNumber(new_a, new_b);

}

const CN operator/(const CN& cn) const {

// Предполагается, что значения a и b у числа ненулевые

double z = cn.a * cn.a + cn.b * cn.b;

double new_a = (a * cn.a + b * cn.b) / z;

double new_b = (b * cn.a - a * cn.b) / z;

return ComplexNumber(new_a, new_b);

}

CN& operator=(const CN& rhs) {

if (this == &rhs)

return *this;

a = rhs.a;

b = rhs.b;

return *this;

}

void Print() const {

std::cout << std::setprecision(3) << a << ' '

<< (b > 0 ? '+' : '-') << ' '

<< std::setprecision(3) << std::abs(b)

<< 'i';

// std::cout << std::endl;

}

};

template<typename T>

void PrintCN(const ComplexNumber<T>& cn, int number) {

std::cout << "cn" << number << " = ";

cn.Print();

std::cout << std::endl;

}

Файл arrays.h

#pragma once

#include<iostream>

#include <cmath>

#include <stdexcept>

using namespace std;

template <typename T>

class Array

{

public:

Array(int n) : arrayElementsAmount(n), arr(new T[n]) {};

void arrayInput() {

cout << "Enter array's elements: " << endl;

for (int i = 0; i < arrayElementsAmount; i++) cin >> arr[i];

}

void arrayOutput() {

for (int i = 0; i < arrayElementsAmount; i++) cout << arr[i] << " ";

}

void elementInput(T inputElement) {

T* newArr = new T[arrayElementsAmount + 1];

for (int i = 0; i < arrayElementsAmount; i++)

newArr[i] = arr[i];

newArr[arrayElementsAmount++] = inputElement;

delete[] arr;

arr = newArr;

cout << "Input an element\"" << inputElement << "\": " << endl;

arrayOutput();

cout << endl;

}

void findMaxArrayEl(const Array& array1) {

T max = arr[0];

for (int i = 0; i < arrayElementsAmount; i++)

if (arr[i] > max) max = arr[i];

cout << "Max element is: " << max << endl;

}

private:

int arrayElementsAmount;

T* arr;

};

Вывод программы:

Рисунок 1. Шаблон комплексных чисел.

Рисунок 2. Шаблон динамического одномерного массива.

Рисунок 3. Обработка исключительных ситуаций: попытка ввести отрицательное кол-во элементов массива.

Рисунок 4. Обработка исключительных ситуаций: переполнение типа.