Информатика и технология программирования


Итоговый экзамен (семестр) - часть 2


Переопределить операцию сложения матриц, результат - объект-значение, операнды не меняются.

Комментарии : объект разреженная матрица представлен динамическим массивом структурированных переменных elem. Elem содержит " координаты" коэффициента и его значение. Кроме того объект содержит текущую размерность массива количество ненулевых коэффициентов. Частная проблема при сложении матриц определение размерности выходного массива коэффициентов. Сложение происходит в два этапа сначала определяется размерность выходных данных, а затем происходит само формирование выходного массива коэффициентов. Алгоритм сложения : создается массив коэффициентов в промежуточном (выходном) объекте. Затем в него переносятся коэффициенты первого объекта. Для каждого из коэффициентов второго объекта проверяется, есть ли соответствующий ему в первом объекте. Если есть, то коэффициент суммируется с коэффициентом первого объекта, иначе добавляется в выходной объект. Поскольку операция возвращает копию (значение) объекта-результата и объект имеет динамические данные, обязателен конструктор копирования. Используется также служебный метод (приватный), производящий поиск заданного коэффициента и возвращающий его индекс в динамическом массиве. Сложение корректно выполняется для всех случаев, в том числе и для полностью нулевых матриц. Отсутствует реакция объектов на отсутствие динамической памяти в операторе new.


struct elem{
int x,y; // координаты коэффициента


double k; // значение коэффициента


};


class matrix{
elem *pd; // Динамический массив коэффициентов


int sz; // Размерность массива


int find(int,int); // Поиск позиции коэффициента


public:
matrix(matrix&#38); // Конструктор копирования


matrix(); // Конструктор нулевой матрицы


~matrix();
matrix operator+(matrix&#38); // Переопределенная операция сложения


};


matrix::matrix(){
sz=0; pd=new elem; // Для единообразия объектов выделяем память


}


matrix::~matrix(){ // Деструктор


delete pd;
}


matrix::matrix(matrix &#38two){ // Конструктор копирования




Начало  Назад  Вперед



Книжный магазин