Организация работы с массивами в программах сложной модульной структуры

Страницы работы

Фрагмент текста работы

самого массива, но и фактическое число компонент вектора или строк и столбцов матрицы. Это приводит к появлению дополнительных переменных в списках параметров (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 передается через список фактических параметров. Процедура осуществляет вывод элементов матрицы на дисплей.

Обратите внимание на идентификацию полей записи: сначала записывается имя самой записи, а через точку - имя поля. В процедуре показано, что эти имена могут и совпадать, но путать их не следует.

4. Специальные способы хранения и обработки матриц

Некоторые подпрограммы из стандартных библиотек для работы с матрицами требуют предварительной упаковки матриц в одномерные массивы. Этот способ называется векторным хранением матриц. Он дает преимущества в объеме используемой памяти при работе с большими сильно разреженными матрицами (с большим количеством нулевых элементов) и с матрицами специального вида: треугольного, симметричного, диагонального. При этом матрица упаковывается точно так же, как и хранится в памяти - по столбцам.

При преобразовании матриц общего вида (т.е. не треугольных, не симметричных и не диагональных) к векторному следует пользоваться простой формулой, устанавливающей связь индекса одномерного массива k с индексами строки i и столбца j двумерного:

k = i + (j-1)N max

где Nmax - число столбцов, заявленных при описании двумерного массива.  Для обратного преобразования индексы строки и столбца вычисляются следующим образом:

Похожие материалы

Информация о работе