самого массива, но и фактическое число компонент вектора или строк и столбцов матрицы. Это приводит к появлению дополнительных переменных в списках параметров (m и n в вышеприведенных примерах), что не всегда удобно. Все три используемых в практикуме языка позволяют применять специальный тип данных - записи или структуры, которые содержат в себе всю необходимую информацию о векторе, матрице или их совокупностях.
Записи представляют собой сложную структуру данных, образуемую из данных других типов, причем эти типы (в отличие от массивов) могут быть различными. Компонент записи называется полем записи. В качестве поля записи могут использоваться как данные простых типов (целые, вещественные), так и сложные - массивы и другие записи. Для обращения к конкретному полю записи используется составное имя, состоящее из идентификатора записи и идентификатора поля, разделенных точкой. Правила описания записей и работы с ними иллюстрируется ниже на простом примере программы, которая задает значения элементов вещественной матрицы и передает ее в виде записи в подпрограмму, которая выводит ее на экран.
На первый взгляд может показаться, что использование записей неудобно из-за сложной идентификации ее компонентов, однако, это не совсем так и во многих программах их применение позволяет достигнуть существенного упрощения. Кроме того, освоение работы с записями является важным шагом к объектно-ориентированному программированию.
Рассмотрим следующий пример программы на языке C++.
#include “define99.h”
void Murka(mnMatrix); // прототип функции Murka
void main()
{
// описание типа
mnMatrix B;
// задание матрицы
B.m=3;
B.n=4;
B.A[1,1]=1.1; B.A[1,2]=1.2; B.A[1,3]=1.3; B.A[1,4]=1.4;
B.A[2,1]=2.1; B.A[2,2]=2.2; B.A[2,3]=2.3; B.A[2,4]=2.4;
B.A[3,1]=3.1; B.A[3,2]=3.2; B.A[3,3]=3.3; B.A[3,4]=3.4;
// обращение к Murka
Murka(B);
}
// модуль Murka;
#include <iostream.h>
#include “define99.h”
void Murka(mnMatrix A);
{
int i,j;
for (i=1; i<=A.m; i++)
{
for (j=1; j<=A.n; j++)
cout<<A.A[i][j] ' ');
cout<<endl;
}
}
Определение типов данных - записей выполняется в отдельном модуле define99.h по причинам, о которых говорилось в разделе 2. В нем определяются два типа: mnMatrix - матрица, содержащая m строк и n столбцов и nVector - вектор, содержащий n компонентов. После служебного слова struct (структура) идет описание полей записи так, как обычно описываются переменные в С++. В данном случае запись содержит три поля: переменные целого типа m и n, представляющие собой число строк и столбцов матрицы, и двумерный массив A, содержащий элементы матрицы. Таким образом, эта запись содержит полную информацию о матрице. Аналогично описывается запись, соответствующая одномерному массиву - вектору, но в данном примере она не используется.
В главной программе переменная В и в подпрограмме Murka переменная A определяются как переменные типа mnMatrix. В главной программе присваиваются значения полям записи B, сначала B.m и B.n, а затем и самим элементам матрицы. Далее следует обращение к процедуре Murka, куда запись B передается через список фактических параметров. Процедура осуществляет вывод элементов матрицы на дисплей.
Обратите внимание на идентификацию полей записи: сначала записывается имя самой записи, а через точку - имя поля. В процедуре показано, что эти имена могут и совпадать, но путать их не следует.
Некоторые подпрограммы из стандартных библиотек для работы с матрицами требуют предварительной упаковки матриц в одномерные массивы. Этот способ называется векторным хранением матриц. Он дает преимущества в объеме используемой памяти при работе с большими сильно разреженными матрицами (с большим количеством нулевых элементов) и с матрицами специального вида: треугольного, симметричного, диагонального. При этом матрица упаковывается точно так же, как и хранится в памяти - по столбцам.
При преобразовании матриц общего вида (т.е. не треугольных, не симметричных и не диагональных) к векторному следует пользоваться простой формулой, устанавливающей связь индекса одномерного массива k с индексами строки i и столбца j двумерного:
k = i + (j-1)N max
где Nmax - число столбцов, заявленных при описании двумерного массива. Для обратного преобразования индексы строки и столбца вычисляются следующим образом:
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.