Работа с векторами и матрицами (Лабораторная работа № 1), страница 2

3.  Двумерные массивы хранятся в одномерной последовательности ячеек памяти по строкам. Поэтому для правильной передачи в функцию возможности работать с индексами строки и столбца необходимо указать количество элементов в строке, т.е. количество столбцов, объявленных при описании матрицы в главной функции:

void MatrixWork(int n, int m, double A[][10])

{

...

}

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

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

Наиболее удобным выходом из этой ситуации может быть следующее решение. В отдельном заголовочном файле define.h описывается тип Matrix как двумерный вещественный массив:

... 

// двумерный массив - вещественная матрица

typedef double Matrix[10][10];

...  или

...

#define MatSize 10  

// двумерный массив - вещественная матрица

typedef double Matrix[MatSize+1][MatSize+1];

... 

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

В этой и последующих работах рекомендуется использовать заголовочный файл define.h, который содержит описания как типа Matrix, так и типа Vector, а также других вариантов одномерных и двумерных массивов. Необходимо только следить, чтобы этот файл находился в рабочем каталоге и заданные там размеры массивов соответствовали необходимым в данной задаче, но не превышали предельных.

Представим теперь функцию MultMatVec(), осуществляющую умножение матрицы A на вектор X, в результате чего получается вектор Y:        

С использованием типов Vector и Matrix заголовок функции MultMatVec()  будет иметь вид:

void MultMatVec(int n, int m, Matrix A, Vector X, Vector Y)

В главной функции также используем типы Vector и Matrix. Программа для перемножения матрицы и вектора может быть представлена следующим текстом.

Листинг 1

// программа для умножения матрицы на вектор

#include <iostream.h>

#include <conio.h>

#include “define.h”

void MultMatVec(int, int, Matrix, Vector, Vector);

void main()

{

// описание данных

     int m,n;

     Matrix A;

     Vector X,Y

     …

// ввод матрицы A

    …

// ввод вектора X

    …

// перемножение

     MultMatVec(m,n,A,X,Y);

// вывод результата

}

Главная программа и функция MultMatVec() могут быть  размещены в разных файлах и перед исполнением объединены и головной программой в общий проект (project).

3. Использование структур

 для работы с векторами и матрицами

При работе с вектором или матрицей необходимо оперировать не только с элементами самого массива, но и с фактическим числом компонент вектора или строк и столбцов матрицы. Это приводит к появлению дополнительных переменных в списках параметров (m и n в вышеприведенных примерах), что не всегда удобно. Язык С++ позволяет организовать специальный тип данных - структуры, которые будут содержать в себе всю необходимую информацию об объекте: векторе, матрице или их совокупностях. Структура – это тип данных, конструируемый программистом из стандартных или ранее определенных типов, причем эти типы могут быть различными. В качестве элемента структуры могут использоваться как данные простых типов (целые, вещественные), так и сложные - массивы и другие структуры. Структуры вещественного вектора и вещественной матрицы могут быть описаны следующим образом:

...

// структура вещественного вектора

     struct SVector

       {

       int n;

       double V[100];

       };

// структура вещественной матрицы

     struct SMatrix

       {

       int m,n;

       double A[10][10];

       };

...