
- •Задание № 2 Абстрактный тип данных
- •1) Список строк (string list)
- •2) Стек строк (string stack)
- •3) Множество строк (string set)
- •4) Вещественная матрица (matrix)
- •5) Кусочно-постоянная функция (step function)
- •6) Многочлен (polynomial)
- •7) Граф (graph)
- •8) Дата и время (datetime)
- •Задание № 3 Реализация абстрактных классов
4) Вещественная матрица (matrix)
Вещественным числом считается тип double. Нужно реализовать вещественную матрицу -- понятие линейной алгебры. Нужно обеспечить пользователя класса естественным интерфейсом для работы с матрицами и составления вычислительных программ. Для удобства тестирования и отладки введем строковое представление матрицы, похожее за инициализатор двумерного массива. Так, строка «{{1, 0, 0}, {0, 1, 0.5}}» обозначает матрицу 2 на 3:
| 1 0 0 |
| 0 1 0.5 |
Пробелы в строке не имеют значения. Теперь можно кратко записывать проверки вида:
if( matrix::identity( 2 ) != matrix( "{{1,0},{0,1}}" ) )
error( "matrix::identity" );
Обязательные операции:
matrix( int n, int m ) // размера n на m из 0.0
matrix( double ) // 1 на 1 с этим элементом
matrix( double*, int m ) // матрица-строка из массива длины m
matrix( int n, double* ) // матрица-столбец из массива длины n
matrix( char* ) // из строкового представления (см. выше)
static matrix matrix::identity( int n ) // возвращает единичную матрицу размера n
static matrix matrix::diagonal( double* vals, int n ) // возвращает
// диагональную матрицу размера n с заданными элементами по главной диагонали
int matrix::rows() // число строк
int matrix::columns() // число столбцов
matrix::set( int i, int j, double val ) // присвоить значение элементу [i][j].
matrix matrix::matrix[ i ] // i-я строка в виде новой матрицы
matrix matrix::matrix[ j ] // j-й столбец в виде новой матрицы
// таким образом, становится возможным обращение: m[1][2],
// но только на чтение, т.к. конструируются новые объекты-матрицы и
// исходные значения становятся недоступны на запись.
// как этого избежать и допустить присваивание в таком же стиле --
// см. дополнительные возможности.
// все арифметические операции выбрасывают исключение,
// если матрицы несовместимы по размерам
matrix + matrix
matrix += matrix
matrix - matrix
matrix -= matrix
matrix * matrix
matrix *= matrix
-matrix // унарный минус, применить ко всем элементам
matrix == matrix // точность сравнения задана статической константой matrix::EPS
matrix != matrix
Дополнительные возможности:
!matrix // обратная матрица
matrix | matrix // конкатенировать (приписать) матрицы вертикально
// (вторую справа от первой)
matrix / matrix // конкатенировать (приписать) матрицы горизонально
// (вторую под первой)
// реализовать операции индексирования эффективно:
// избежать копирования (конструирования) строк и столбцов.
// обеспечить возможность присваивания вида m[1][2] = 5.0;
double matrix::determinant() // определитель
matrix matrix::solve() // решить любым способом неоднородную систему из n линейных
// алгебраических уравнений с n неизвестными, представленную матрицей
// размера n на (n+1). Вернуть решение в виде матрицы 1 на n.
// выбросить исключение в случае неразрешимости системы (опять же, с учетом EPS)
// обязательно запиште какой-нибудь тест в таком виде:
// x = (A|b).solve(); if( A*x != b ) { error( "solve" ); }