Министерство науки и высшего образования Российской Федерации
Федеральное государственное бюджетное образовательное учреждение высшего профессионального образования
ТОМСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ СИСТЕМ УПРАВЛЕНИЯ И РАДИОЭЛЕКТРОНИКИ (ТУСУР)
Кафедра промышленной электроники (ПрЭ)
ОТЧЁТ
по результатам лабораторной работы №12
по дисциплине «Информатика»
Наследование
Выполнил
Студент гр. 362-1
________ Цвинтарный И.В.
«___» __________20___г.
Проверил
Преподаватель
_____________ Савин Д.А.
«___»__________20___г.
Томск 2023
Оглавление
Введение 3
1. Ход работы 4
2. Индивидуальное задание 5
3. Программный код – текст программы 5
4. Результаты работы программы 13
Заключение 14
Введение
В двенадцатой лабораторной работе нам необходимо научиться создавать классы-потомки на основе базовых классов и описывать их свойства и методы. Научиться применять конструкторы базового класса в соответствующих конструкторах наследуемых классов. Освоить умение работать с абстрактными классами, дружественными и виртуальными функциями и научиться перегружать операторы. Закрепить навыки конструирования классов, выделения памяти под динамические объекты класса, освобождения памяти, обращения к их свойствам и методам.
1. Ход работы
1. Задать базовый класс и классы-потомки на его основе, реализующие операции с данными, в соответствии с индивидуальным заданием
2. В базовом классе обязательно создать конструктор_по_умолчанию, и конструктор_с_параметрами, а также деструктор класса. Продемонстрировать применение в конструкторах классов-потомков соответствующих конструкторов базового класса
3. Сделать базовый класс абстрактным. Продемонстрировать вызов методов абстрактного класса через объекты класса-потомка
4. Продемонстрировать использование дружественной функции или класса
5. Продемонстрировать реализацию виртуальной функции в базовом классе и в классах-потомках
6. В отчете привести листинг программы, скриншоты тестирования программы, рисунок структуры класса. Листинг программы без комментариев не принимается
2. Индивидуальное задание
Вариант индивидуального задания – 1.
Рисунок 2.1 – Формулировка задания
3. Программный код – текст программы
Основная программа:
#include <iostream>
#include "Matrix.h"
#include "Determinant.h"
using namespace std;
int main()
{
setlocale(LC_ALL, "RUS");
srand(time(nullptr));
MatrixDet matrixDet;
matrixDet.fillMatrix();
matrixDet.print();
matrixDet.calculateDet();
}
CRect.h:
#define _CRT_SECURE_NO_WARNINGS
#pragma once
class Complexchisl
{
private:
int real1;
int imig1;
public:
Complexchisl();
Complexchisl(int real1, int imig1);
~Complexchisl();
void print();
int getX1();
void setX1(int real);
int getY1();
void setY1(int imig);
Complexchisl& operator += (int d);
Complexchisl& operator -= (int d);
Complexchisl& Sum(Complexchisl& odt);
int getModul();
Complexchisl& operator * (Complexchisl& odt);
Complexchisl& operator = (int d);
Complexchisl operator*(const Complexchisl& odt);
Complexchisl& operator + (Complexchisl& odt);
Complexchisl& operator - (Complexchisl& odt);
friend void print_complexchisl(Complexchisl& odt);
};
CRect.cpp:
#define _CRT_SECURE_NO_WARNINGS
#include "CRect.h"
#include <iostream>
#include "math.h"
using namespace std;
Complexchisl::Complexchisl()
{
real1 = 0;
imig1 = 0;
}
Complexchisl::Complexchisl(int real1, int imig1)
{
this->real1 = real1;
Complexchisl::imig1 = imig1;
}
Complexchisl::~Complexchisl()
{}
void Complexchisl::print()
{}
int Complexchisl::getX1()
{
return real1;
}
void Complexchisl::setX1(int real)
{
if (real < 0)
{
real1 = 2;
cout << "Превышено минимальное значение действительной части real1!" << endl;
}
else if (real > 100)
{
real1 = 100;
cout << "Превышено максимальное значение действительной части real1!" << endl;
}
else
real1 = real;
}
int Complexchisl::getY1()
{
return imig1;
}
void Complexchisl::setY1(int imig)
{
if (imig < 0)
{
imig1 = 2;
cout << "Превышено минимальное значение мнимой части imig1!" << endl;
}
else if (imig > 100)
{
imig1 = 100;
cout << "Превышено максимальное значение мнимой части imig1!" << endl;
}
else
imig1 = imig;
}
Complexchisl& Complexchisl::operator += (int d)
{
real1 += d;
imig1 += d;
if (real1 > 100)
real1 = 100;
if (imig1 > 100)
imig1 = 100;
return *this;
}
Complexchisl& Complexchisl::operator -= (int d)
{
real1 -= d;
imig1 -= d;
if (real1 < 0)
real1 = 2;
if (imig1 < 0)
imig1 = 3;
return *this;
}
Complexchisl& Complexchisl::operator + (Complexchisl& odt)
{
Complexchisl prog;
prog.real1 = real1 + odt.real1;
return prog;
}
Complexchisl& Complexchisl::operator - (Complexchisl& odt)
{
Complexchisl prog;
prog.real1 = real1 + odt.real1;
return prog;
}
Complexchisl& Complexchisl::operator * (Complexchisl& odt)
{
Complexchisl prog;
prog.real1 = real1 + odt.real1;
return prog;
}
Complexchisl& Complexchisl::operator = (int d)
{
if (real1 < 0)
real1 = 2;
if (imig1 < 0)
imig1 = 3;
return *this;
}
int Complexchisl::getModul()
{
return (sqrt(pow(real1, 2) + pow(imig1, 2)));
}
Complexchisl& Complexchisl::Sum(Complexchisl& odt)
{
real1 += odt.real1;
imig1 += odt.imig1;
cout << "ComplexSum = " << real1 << " + " << imig1 << "i" << endl;
return *this;
}
Matrix.h:
#pragma once
#include "CRect.h"
#define N 3
#define M 3
class Matrix
{
private:
Complexchisl matrix[N][M];
public:
friend class MatrixDet;
Matrix();
Matrix(Complexchisl matrix);
~Matrix();
void setMatrix(Complexchisl value);
Complexchisl getMatrix();
void fillMatrix();
virtual void print() = 0;
};
Matrix.cpp:
#include "Matrix.h"
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#define rnd1(a, b) (rand()%((b) - (a) + 1) + (a))
using namespace std;
Matrix::Matrix()
{}
Matrix::Matrix(Complexchisl matrix)
{}
Matrix::~Matrix()
{}
void Matrix::fillMatrix()
{
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 3; j++)
{
int real1 = rnd1(0, 20);
int imig1 = rnd1(0, 20);
Complexchisl odt(real1, imig1);
matrix[i][j] = odt;
}
}
}
void Matrix::print()
{
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 3; j++)
{
cout << matrix[i][j].getX1() << " + " << matrix[i][j].getY1() << "i\t";
}
cout << endl;
}
}
Determinant.h:
#pragma once
#include "Matrix.h"
class MatrixDet : public Matrix
{
private:
int RealDet;
int ImigDet;
public:
MatrixDet();
MatrixDet(Complexchisl matrix, int RealDet, int ImigDet);
~MatrixDet();
void setRealDet(int value);
void print();
int getRealDet();
void calculateDet();
void setImigDet(int value);
int getImigDet();
};
Determinant.cpp:
#include "Determinant.h"
#include <iostream>
using namespace std;
MatrixDet::MatrixDet()
: Matrix()
{
cout << "Конструктор по-умолчанию:" << this << endl;
RealDet = 0;
ImigDet = 0;
}
MatrixDet::MatrixDet(Complexchisl matrix, int RealDet, int ImigDet)
{
cout << "Конструктор с параметрами: " << this << endl;
}
MatrixDet::~MatrixDet()
{
cout << "Деструктор: " << this << endl;
}
void MatrixDet::setRealDet(int value)
{
RealDet = value;
}
int MatrixDet::getRealDet()
{
return RealDet;
}
void MatrixDet::setImigDet(int value)
{
ImigDet = value;
}
int MatrixDet::getImigDet()
{
return ImigDet;
}
void MatrixDet::print()
{
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 3; j++)
{
cout << "Matrix[" << i << "]" << "[" << j << "] = " << matrix[i][j].getX1() << " + " << matrix[i][j].getY1() << "i\t";
}
cout << endl;
}
}
void MatrixDet::calculateDet()
{
RealDet = matrix[0][0].getX1() * matrix[1][1].getX1() * matrix[2][2].getX1()
- matrix[2][2].getX1() * matrix[0][0].getY1() * matrix[1][1].getY1()
- matrix[1][1].getX1() * matrix[0][0].getY1() * matrix[2][2].getY1()
- matrix[0][0].getX1() * matrix[1][1].getY1() * matrix[2][2].getY1()
+ matrix[1][2].getX1() * matrix[0][1].getX1() * matrix[2][0].getX1()
- matrix[2][0].getX1() * matrix[0][1].getY1() * matrix[1][2].getY1()
- matrix[1][2].getX1() * matrix[0][1].getY1() * matrix[2][0].getY1()
- matrix[0][1].getX1() * matrix[2][0].getY1() * matrix[1][2].getY1()
+ (matrix[1][0].getX1() * matrix[2][1].getX1() * matrix[0][2].getX1()
- matrix[0][2].getX1() * matrix[1][0].getY1() * matrix[2][1].getY1()
- matrix[2][1].getX1() * matrix[1][0].getY1() * matrix[0][2].getY1()
- matrix[1][0].getX1() * matrix[2][1].getY1() * matrix[0][2].getY1())
- (matrix[2][0].getX1() * matrix[1][1].getX1() * matrix[0][2].getX1()
- matrix[0][2].getX1() * matrix[2][0].getY1() * matrix[1][1].getY1()
- matrix[1][1].getX1() * matrix[0][2].getY1() * matrix[2][0].getY1()
- matrix[2][0].getX1() * matrix[1][1].getY1() * matrix[0][2].getY1())
- (matrix[1][0].getX1() * matrix[0][1].getX1() * matrix[2][2].getX1()
- matrix[2][2].getX1() * matrix[1][0].getY1() * matrix[0][1].getY1()
- matrix[0][1].getX1() * matrix[1][0].getY1() * matrix[2][2].getY1()
- matrix[1][0].getX1() * matrix[0][1].getY1() * matrix[2][2].getY1())
- (matrix[2][1].getX1() * matrix[1][2].getX1() * matrix[0][0].getX1()
- matrix[0][0].getX1() * matrix[2][1].getY1() * matrix[1][2].getY1()
- matrix[1][2].getX1() * matrix[2][1].getY1() * matrix[0][0].getY1()
- matrix[2][1].getX1() * matrix[1][2].getY1() * matrix[0][0].getY1());
ImigDet = matrix[2][2].getX1() * matrix[1][1].getX1() * matrix[0][0].getY1()
+ matrix[0][0].getX1() * matrix[2][2].getX1() * matrix[1][1].getY1()
+ matrix[1][1].getX1() * matrix[0][0].getX1() * matrix[2][2].getY1()
- matrix[0][0].getY1() * matrix[1][1].getY1() * matrix[2][2].getY1()
+ (matrix[1][2].getX1() * matrix[2][0].getX1() * matrix[0][1].getY1()
+ matrix[2][0].getX1() * matrix[0][1].getX1() * matrix[1][2].getY1()
+ matrix[1][2].getX1() * matrix[0][1].getX1() * matrix[2][0].getY1()
- matrix[0][1].getY1() * matrix[1][2].getY1() * matrix[2][0].getY1())
+ (matrix[2][1].getX1() * matrix[0][2].getX1() * matrix[1][0].getY1()
+ matrix[1][0].getX1() * matrix[0][2].getX1() * matrix[2][1].getY1()
+ matrix[1][0].getX1() * matrix[2][1].getX1() * matrix[0][2].getY1()
- matrix[1][0].getY1() * matrix[2][1].getY1() * matrix[0][2].getY1())
- (matrix[0][2].getX1() * matrix[1][1].getX1() * matrix[2][0].getY1()
+ matrix[0][2].getX1() * matrix[2][0].getX1() * matrix[1][1].getY1()
+ matrix[2][0].getX1() * matrix[1][1].getX1() * matrix[0][2].getY1()
- matrix[2][0].getY1() * matrix[1][1].getY1() * matrix[0][2].getY1())
- (matrix[2][2].getX1() * matrix[0][1].getX1() * matrix[1][0].getY1()
+ matrix[2][2].getX1() * matrix[1][0].getX1() * matrix[0][1].getY1()
+ matrix[1][0].getX1() * matrix[0][1].getX1() * matrix[2][2].getY1()
- matrix[1][0].getY1() * matrix[0][1].getY1() * matrix[2][2].getY1())
- (matrix[1][2].getX1() * matrix[0][0].getX1() * matrix[2][1].getY1()
+ matrix[0][0].getX1() * matrix[2][1].getX1() * matrix[1][2].getY1()
+ matrix[2][1].getX1() * matrix[1][2].getX1() * matrix[0][0].getY1()
- matrix[2][1].getY1() * matrix[1][2].getY1() * matrix[0][0].getY1());
setlocale(LC_ALL, "RUS");
if (ImigDet < 0)
cout << "Определитель = " << RealDet << " - " << abs(ImigDet) << "i" << endl;
else
cout << "Определитель = " << RealDet << " + " << ImigDet << "i" << endl;
}