
- •Лабораторная 5 Первичные классы и объекты
- •Классы определяются с помощью нижеследующих полей:
- •Варианты заданий
- •Примеры выполнения
- •Пример 2
- •Программа
- •Результаты работы программы
- •Пример 3
- •Программа
- •Результаты работы программы
- •Лабораторная 6 Шаблоны функций и классов
- •Варианты заданий
- •Примеры выполнения ргз 2
- •Результаты работы программы
- •Пример 2
- •Программа
- •Лабораторная 7 Производные классы
- •Примеры выполнения ргз 3
- •Программа
- •Результаты работы программы
Примеры выполнения
Пример 1
Задание. Определить класс заданного типа. Написать определенные как дружественные функции подпрограммы ввода с клавиатуры и вывода на экран данных, определяющих объекты этого класса. Перегрузить указанные операции и функции с помощью составных функций класса:
Матрица n x n |
+, - * float norma() |
сумма и разность произведение матриц норма |
Рассмотрим программу с использованием некоторых рассмотренных классов ввода/вывода в сочетании с собственным классом Matrix, в котором собраны матрица и порядок этой матрицы. Элементы-члены в свою очередь являются закрытыми данными класса.
В этой программе
мы рассмотрим ввод/вывод объектов
собственного класса с использованием
классов istream
и ostream,
функции которых будут определены
дружественными для нашего класса. Это
достигается перегрузкой операторов
функций >> (для объекта cin
класса istream)
и << (для объекта cout
класса ostream),
чтобы они поддерживали работу с нашим
созданным классом. Помимо этого в
программе будут рассмотрены перегрузки
таких операторов, как присваивание (=),
сложение (+), вычитание (-) и умножение
(*). Причем сложение, вычитание и умножение
перегружаются дружественными функциями
для класса Matrix,
а присваивание – функцией-членом нашего
класса Matrix,
т.к. для этой операции компилятор С++
предусматривает скрытую функцию по
умолчанию, если она не определена в
явном виде. Еще в нашем классе рассмотрена
функция-элемент norma(),
которая возвращает норму матрицы типа
float,
т.е. третью норму матрицы: третья норма
матрицы
.
Кроме того, в программе предусмотрены два вида конструкторов: конструктор копирования и, следовательно, конструктор по умолчанию; и соответственно для удаления объекта из памяти без завершения программы предусмотрен деструктор.
Примечание. Для ввода и вывода объектов класса Matrix использованы только объекты классов istream и ostream: cin и cout. Функции printf() и scanf() в программе не используются.
Программа
#include <iostream.h>
#include <conio.h>
#include <math.h>
int y;
// Класс матрица
class Matrix
{
private:
// Собственные элементы:
static int size; // Порядок матрицы
int **matrix; // Матрица
public:
// Общедоступные элементы:
Matrix() {} // Конструктор по умолчанию
Matrix(const Matrix &Object); // Конструктор копирования
~Matrix(); // Деструктор
float norma(); // Норма матрицы
Matrix &operator=(const Matrix &Object); // Перегрузка =
Matrix operator+(Matrix &); // Сложение матриц
Matrix operator-(Matrix &); // Вычитание матриц
Matrix operator*(Matrix &); // Перемножение матриц
// Перегрузка оператора << для вывода матрицы
friend ostream &operator<<(ostream &, Matrix &);
// Перегрузка оператора >> для ввода матрицы
friend istream &operator>>(istream &, Matrix &);
};
// Конструктор копирования
Matrix::Matrix(const Matrix &Object)
{
int i,j;
size = Object.size;
matrix = new int *[size];
for (i = 0; i < size; i++)
matrix[i] = new int [size];
for (i = 0; i < size; i++)
for (j = 0; j < size; j++)
matrix[i][j] = Object.matrix[i][j];
}
// Деструктор
Matrix::~Matrix()
{
for (int i = 0; i < size; i++)
delete matrix[i];
delete matrix;
}
// Норма матрицы
float Matrix::norma()
{
int i,j;
float tmp = 0;
for (i = 0; i < size; i++)
for (j = 0; j < size; j++)
tmp += matrix[i][j] * matrix[i][j];
return sqrt(tmp);
}
// Перегрузка оператора =
Matrix& Matrix::operator=(const Matrix &Object)
{
int i, j;
size = Object.size;
matrix = new int *[size];
for (i = 0; i < size; i++)
matrix[i] = new int [size];
for (i = 0; i < size; i++)
for (j = 0; j < size; j++)
matrix[i][j] = Object.matrix[i][j];
return *this;
}
// Перегрузка оператора +
Matrix Matrix::operator+(Matrix &fp1)
{
int i, j;
if (size == fp1.size)
{
Matrix fp(fp1);
for (i=0;i<fp.size;i++)
for (j=0;j<fp.size;j++)
fp.matrix[i][j]=matrix[i][j]+fp1.matrix[i][j];
return fp;
}
}
// Перегрузка оператора -
Matrix Matrix::operator-(Matrix &fp1)
{
int i, j;
if (size == fp1.size)
{
Matrix fp(fp1);
for (i = 0; i < fp.size; i++)
for (j = 0; j < fp.size; j++)
fp.matrix[i][j] = matrix[i][j] - fp1.matrix[i][j];
return fp;
}
}
// Перегрузка оператора *
Matrix Matrix::operator*(Matrix &fp1)
{
int i, j, k, sum;
if (size == fp1.size)
{
Matrix fp(fp1);
for(i = 0; i < fp.size; i++)
for(j = 0; j < fp.size; j++)
{
sum = 0;
for (k = 0; k < fp.size; k++)
sum += matrix[i][k] * fp1.matrix[k][j];
fp.matrix[i][j]=sum;
}
return fp;
}
}
// Перегрузка оператора >>
istream &operator>>(istream &fi, Matrix &fp)
{
int i, j;
fp.matrix = new int *[fp.size];
for (i = 0; i < fp.size; i++)
fp.matrix[i] = new int [fp.size];
for (i = 0; i < fp.size; i++)
for (j = 0; j < fp.size; j++)
{
gotoxy((j + 1) * 4, y + i + 2);
fi >> fp.matrix[i][j];
}
y += i + 2 /*- 1*/;
return fi;
}
// Перегрузка оператора <<
ostream &operator<<(ostream &fo, Matrix &fp)
{
int i, j;
for (i = 0; i < fp.size; i++)
for (j = 0; j < fp.size; j++)
{
gotoxy((j + 1) * 4, y + i + 2);
fo << fp.matrix[i][j];
}
y += i + 2 /*- 1*/;
return fo;
}
int Matrix::size = 2;
void main()
{
clrscr();
Matrix pr1, pr2;
cout << "Введите матрицу A ->\n ";
cin >> pr1;
cout << "\nВведите матрицу B ->\n ";
cin >> pr2;
cout << "\nA+B="<<(pr1+pr2);
cout << "\n\nA-B="<<(pr1-pr2);
cout << "\n\nA*B="<<(pr1*pr2);
pr1 = pr2;
cout << "\nНорма матрицы B = " << pr1.norma();
getch();
}
Результаты работы программы
Введите матрицу A ->
1 10
20 32
Введите матрицу B ->
-20 43
-
-45
A+B=
-19 53
20 -13
A-B=
21 -33
20 77
A*B=
-20 -407
-400 -580
Норма матрицы B = 65.375839