Отчеты по лабам / ООП Лаб 5 Зарецкий Вариант 9
.docx
ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ "САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ ТЕЛЕКОММУНИКАЦИЙ ИМ. ПРОФ. М. А. БОНЧ-БРУЕВИЧА"
Факультет инфокоммуникационных сетей и систем
Кафедра программной инженерии и вычислительной техники
ЛАБОРАТОРНАЯ РАБОТА №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. Обработка исключительных ситуаций: переполнение типа.