Создания класса матрицы (практическое задание). Работа с матрицами чрезвычайно распространенная задача, которая ставится перед обучающимися программированию. Здесь я попытался разложить по полочкам эту, в общем то не сложную, но требующую осмысления задачу. Итак : пишем класс матрицы. Для примера, возьмем следующую задачу : есть матрица NxN в которой необходимо найти разность между максимальным и минимальным элементом в каждом ряду. Cоздадим заголовочный файл matrix.h. В него будет занесено описание класса matrix (обычная практика разделения описания и тела класса, используется для дальнейшего включения заголовочного файла в другие программы проекта) и matrix.cpp, в него будет занесено тело класса. Необходимо сразу понять, что здесь создается объект "матрица". Этот объект обладает некоторыми свойствами и некоторыми методами, через которые с объектом можно работать. Сначала напишем файл matrix.h. В нем опишем все, что нужно для работы класса. #pragma once // нужна для того,
чтобы компилятор class CMatrixStr // назовем нашу матрицу так Что матрицу характеризует? Количество столбцов и количество строк. Это внутренние данные, поэтому определим эти данные в область для внутреннего использования. private: Для хранения данных нужна память, а т.к. в С++ выделение динамической памяти происходит блоками, то используем для эмуляции доступа массив указателей на блоки памяти, т.е. указатель на указатель. Будем хранить данные типа float float ** FloatData; Т.к. для нашей задачи необходимо нахождение минимальных и максимальных значений и дальнейшая работа с этими значениями (получение разности), то и для них оставим по указателю. float * DataMin; На этом внутренние данные
закончились, и переходим к работе с методами.
Для установки и считывания одного элемента: float GetAt(int Row,int Col);
// получить Однако проще заполнить сразу все элементы: void Fill(); В конце концов, необходимо нахождение минимальных и максимальных значений: void MinMax(int Row); Найти еще полдела, нужно еще показать, что нашли. void Display(); Теперь файл matrix.h выглядит следующим
образом. Перейдем к собственно телу матрицы
(matrix.cpp) #include "iostream.h" //
для работы cin Опишем конструктор класса (вызывается при объявлении переменной с типом CMatrixStr). Конструктор запускается с параметрами количества строк и количества столбцов. Если вдруг эти параметры будут пропущены, то, чтобы не ломалась программа, при объявлении конструктора задаются единицы. CMatrixStr::CMatrixStr(int Row,int Col) Выделим динамически память для хранения минимального и максимального значения каждого ряда полученной матрицы. DataMin = new float[Rows]; Для хранения собственно данных
матрицы сначала выделим память для массива
указателей на каждый ряд матрицы Теперь для каждого ряда выделяем
память для хранения элементов в колонках и
попутно забиваем новые значения нулями и
присваиваем нулевые значения для минимального и
максимального элемента. CMatrixStr::~CMatrixStr() for (int j=0;j<Rows;j++){ и для массива указателей на ряды и на
массивы минимальных и максимальных значений Методы "получить значение элемента" и "установить значение элемента" необходимы для защищенного доступа к элементам матрицы извне. Т.к. при запросе на запись и получение данных проверяются переданные параметры, то в программе гарантировано не будет выхода за границы массива. Причем при передаче неправильных границ массива можно активизировать диагностические сообщения, которых здесь нет по причине учебного задания. float CMatrixStr::GetAt(int Row,int Col) void CMatrixStr::MinMax(int Row) DataMin[Row]=FloatData[Row][0]; Теперь сравниваем каждое значение в колонке for (int i=1;i<Cols;i++){ if (DataMin[Row] >
FloatData[Row][i]) if (DataMax[Row]< FloatData[Row][i]) Заполнение матрицы рядами цифр по одной - тяжелое занятие. Пусть за нас компьютер заполнит матрицу случайными значениями void CMatrixStr::Fill() Осталось только вывести матрицу на печать void CMatrixStr::Display() А программа будет совсем простая файл main.cpp: #include "iostream.h"
При запуске должно получиться примерно следующее Row ?:3 Вот и все. Теперь можно преобразовывать матрицу по своему усмотрению, например, добавить метод транспонирования матрицы или сортировки столбцов и строк. Скачать полный текст zd_prog.arj (52kb) |
© Авторские разработки http://progcpp.narod.ru при цитировании ссылка обязательна. |