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).
При работе с вектором или матрицей необходимо оперировать не только с элементами самого массива, но и с фактическим числом компонент вектора или строк и столбцов матрицы. Это приводит к появлению дополнительных переменных в списках параметров (m и n в вышеприведенных примерах), что не всегда удобно. Язык С++ позволяет организовать специальный тип данных - структуры, которые будут содержать в себе всю необходимую информацию об объекте: векторе, матрице или их совокупностях. Структура – это тип данных, конструируемый программистом из стандартных или ранее определенных типов, причем эти типы могут быть различными. В качестве элемента структуры могут использоваться как данные простых типов (целые, вещественные), так и сложные - массивы и другие структуры. Структуры вещественного вектора и вещественной матрицы могут быть описаны следующим образом:
...
// структура вещественного вектора
struct SVector
{
int n;
double V[100];
};
// структура вещественной матрицы
struct SMatrix
{
int m,n;
double A[10][10];
};
...
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.