Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лабораторная по МП 5,6,7.docx
Скачиваний:
8
Добавлен:
04.11.2018
Размер:
69.5 Кб
Скачать

Примеры выполнения

Пример 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

  1. -45

A+B=

-19 53

20 -13

A-B=

21 -33

20 77

A*B=

-20 -407

-400 -580

Норма матрицы B = 65.375839