АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

П 2.1 Создание матричной иерархии классов

Читайте также:
  1. HMI/SCADA – создание графического интерфейса в SCADА-системе Trace Mode 6 (часть 1).
  2. II –I в. до н.э. – обострение классовых и социальных противоречий.
  3. III. Создание и обработка комплексного информационного объекта в виде презентации с использованием шаблонов.
  4. MathCad: понятие массива, создание векторов и матриц.
  5. V3: Создание советской политической системы. Конституция РСФСР 1918 г.
  6. А) Теория иерархии потребностей
  7. Агрессивная внешняя политика правящих классов Японии. Японо-китайская война 1894—1895 гг.
  8. Активный запрос на создание таблицы
  9. Ассоциации классов
  10. Бесклассовый общественный строй с единой общенародной собственностью на средства производства, полным социальным равенством всех членов.
  11. Бесклассовый общественный строй с единой общенародной собственностью на средства производства, полным социальным равенством всех членов.
  12. Билет 2. Условия создание привлекательного туристского продукта.

 

Иерархия классов для работы с матрицами представлена на схеме:

• AbstractMatrix

• Vector

• DiagonalMatrix

• ThreeDiagonalMatrix

• EMatrix

• SwapMatrix

• SquareMatrix

• FrobeniusMatrix

• JacobiMatrix

• AugmentMatrix

 

Рис. 1. Объектная классификация абстрактных матриц.

Вершиной матричной иерархии является абстрактный класс «AbstractMatrix». Абстрактные классы предназначены для представления общих понятий, которые предполагается конкретизировать в производных классах. В данном классе описывается общая структура класса без поведения, которая потом будет конкретизирована и дополнена в производных. Класс «AbstractMatrix» воплощает наиболее общие черты разрабатываемого семейства классов.

Потомками абстрактного класса являются классы: «Vector» (Вектор), «SquareMatrix» (Квадратная матрица) и «AugmentMatrix» (Расширенная матрица). Механизм наследования классов позволяет строить иерархии, в которых производные классы получают элементы родительских или базовых классов и могут дополнять их или изменять их свойства.

Класс «Vector» является родителем двух основных классов: «DiagonalMatrix» (Диагональная матрица), «EMatrix» (Единичная матрица).

Класс «DiagonalMatrix» определяет группу диагональных матриц, содержащих ненулевые элементы только на главной диагонали. На основе класса диагональных матриц строится класс «ТhreeDiagonalMatrix» – трехдиагональных матриц, содержащих ненулевые элементы на трех диагоналях: главной, первой сверху и первой снизу.

Класс «EMatrix» содержит методы для работы с единичной матрицей. На основе класса «EMatrix» определяется класс «SwapMatrix» – класс матриц перестановок. Матрица перестановок образуется из единичной матрицы изменением порядка расположения строк. Данный матричный класс соответствует преобразованиям переупорядочения столбцов и строк в основной матрице, которые обычно применяются в методах выбора главного элемента.

Класс «SquareMatrix» предназначен для реализации семейства элементарных квадратных матриц. Потомками этого класса являются – класс «FrobeniusMatrix» (Матрица Фробениуса), класс «JacobiMatrix» (Матрица Якоби), которые необходимы для решения задач на собственные значения.

Класс «AugmentMatrix» представляет собой группу расширенных матриц.

Классы, находящиеся ближе к началу иерархии, объединяют в себе наиболее общие черты для всех нижележащих классов. По мере продвижения вниз по иерархии классы приобретают все больше конкретных черт. Таким образом, организованное множественное наследование позволяет одному классу обладать свойствами двух и более родительских классов [1].


Пример 1. Реализовать следующую иерархию классов на языке программирования С++.

 

• AbstractMatrix

• Vector

• DiagonalMatrix

 

Исходя из того, что класс «AbstractMatrix» является вершиной иерархии, то в данном классе следует описать следующие виртуальные функции: получение значения элемента (getElement), установка значения элемента (setElement), получение количества строк (getRowCount) и получение количества столбцов (getColCount). Виртуальная функция – это функция, объявленная ключевым словом virtual в базовом классе и переопределенная в одном или нескольких производных классах. Виртуальные функции являются особыми функциями. Во время исполнения программы компилятор при вызове объекта производного класса с помощью указателя или ссылки на него определяет, какую функцию вызвать, основываясь на типе объекта. Для разных объектов будут вызываться разные версии одной и той же виртуальной функции [1].

Введем в классе «AbstractMatrix» целочисленное поле size, обозначающее количество строк матрицы. Данная размерность является общей для предложенной иерархии. Получаем реализацию класса «AbstractMatrix».

 

class AbstractMatrix{

protected:

int size; /*Количество строк матрицы*/

public:

/* Получение значения элемента */

virtual double getElement(int i, int j) = 0;

/* Установка значения элемента*/

virtual void setElement(int i, int j, double element)=0;

/* Получение количества столбцов */

virtual int getColCount() = 0;

/* Получение количества строк */

virtual int getRowCount() = 0;

};

Класс «Vector» наследуется от абстрактного класса «AbstractMatrix» и является его потомком. В данном классе переопределяются виртуальные методы абстрактного класса и добавляются свои методы для работы с векторами. Получаем описание класса «Vector».

 

class Vector: public AbstractMatrix{

double *elements; /* Элементы вектора*/

public:

/*Конструкторы*/

/*Конструктор по умолчанию*/

Vector();

/* Конструкторы с параметрами*/

Vector(int size);

Vector(int size, double *elements);

..................

/* Получение значения элемента вектора*/

double getElement(int i);

/* Установка значения элемента вектора*/

void setElement(int i, double element);

/* Получение количества строк */

int getRowCount();

..................

};

 

Класс «DiagonalMatrix» является потомком класса «Vector». В данном классе переопределяются виртуальные методы абстрактного класса и добавляются свои методы для работы с диагональными матрицами. Не стоит забывать, что конструкторы не наследуются, поэтому производный класс должен иметь собственные конструкторы.

Реализация класса «DiagonalMatrix» выглядит следующим образом:

 

class DiagonalMatrix: public Vector{

public:

/* Вектор элементов на диагонали*/

Vector elements;

/*Конструкторы*/

DiagonalMatrix();

DiagonalMatrix(int size);

DiagonalMatrix(int size, double *elements);

..................

/* Получение значения элемента */

double getElement(int i, int j);

/* Установка значения элемента */

void setElement(int i, int j, double element);

/* Получение количества столбцов */

int getColCount();

/* Получение количества строк */

int getRowCount();

..................

};

Пример 2. Реализовать в классе «Vector» конструкторы и следующие методы класса: получение значения элемента (getElement), установка значения элемента (setElement), получение количества строк (getRowCount) и получение количества столбцов (getColCount). Внутри методов-членов класса ссылаться на объект класса с помощью неявно передаваемого указателя this.

Реализация на языке программирования С++ может иметь следующий вид:

 

/*Параметризованные конструкторы*/

Vector:: Vector(int size){

/* Внутри методов-членов класса идентификаторы относятся к тому объекту, для которого функции были вызваны. На этот объект внутри функций-членов класса можно ссылаться с помощью неявно передаваемого указателя this.

*/

this->size = size;

this->elements = new double[this->size];

}

 

Vector:: Vector(int size, double *elements){

/*Создание матрицы*/

this->size = size;

this->elements = new double[this->size];

/*Заполнение матрицы*/

for (int i=0; i < this->size; i++){

this->elements[i] = elements[i];

}

}

 

/* Получение значения элемента */

double Vector:: getElement(int i){

return this->elements[i];

}

 

/* Установка значения элемента */

void Vector:: setElement(int i, double element){

this->elements[i] = element;

}

 

/* Получение количества строк */

int Vector:: getRowCount(){

return 1;

}

 

/* Получение количества столбцов */

int Vector:: getColCount(){

return this->size;

}

 

Пример 3. Реализовать метод для сложения двух квадратных матриц двумя способами: с помощью функции и перегруженного оператора.

Реализация метода на языке программирования С++ может иметь следующий вид:

 

/* Функция*/

SquareMatrix SquareMatrix:: addition(SquareMatrix A, SquareMatrix B){

int n = this->size;

/*Объявление результирующей матрицы*/

double **C = new double*[n];

for (int i=0; i < n; i++){

C[i] = new double[n]; }

/* Вычисление суммы матриц*/

for (int i = 0; i < n; i++){

for (int j = 0; j < n; j++){

C[i][j] = A.elements[i][j] + B.elements[i][j];

} }

/* Создание матрицы */

return SquareMatrix(n, C);

}

 

/* Перегруженный оператор сложения */

SquareMatrix SquareMatrix:: operator +(SquareMatrix B){

int n = this->size;

/* Объявление результирующей матрицы*/

double **C = new double*[n];

for (int i=0; i < n; i++){

C[i] = new double[n];

}

/* Вычисление суммы матриц*/

for (int i = 0; i < n; i++){

for (int j = 0; j < n; j++){

C[i][j]=this->elements[i][j] + B.elements[i][j];

}

}

/* Создание матрицы */

return SquareMatrix(n, C);

}


1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 |

Поиск по сайту:



Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.01 сек.)