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

Если типы Vector и Matrix ранее определены, то их можно использовать при определении соответствующих структур:

...

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

     struct SVector

       {

       int n;

       Vector V;

       };

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

     struct SMatrix

       {

       int m,n;

       Matrix A;

       };

...

После служебного слова struct (структура) задается идентификатор структуры, а затем идет  описание ее элементов также, как обычно описываются переменные в С++. В структуре SMatrix содержится три элемента: переменные целого типа m и n, представляющие собой число строк и столбцов матрицы, и двумерный массив A, содержащий элементы матрицы. Таким образом, эта структура содержит полную информацию о матрице. Определение структур SVector и SMatrix имеется в модуле define.h.

Далее можно использовать типы SVector и SMatrix для описания конкретных объектов программы – векторов и матриц, например:

     SVector X,Y;

     SMatrix A,B,C;

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

Листинг 2

#include <iostream.h>

#include <conio.h>

#include “define.h”

void OutMatS(SMatrix, int, int);  // прототип функции OutMatS

void main()

{

// описание матрицы как структуры

     SMatrix 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;

// вывод матрицы на дисплей с помощью OutMatS

clrscr();

     OutMatS(B,5,2);

     getch();

}

//  модуль, содержащий OutMatS;

     // функция вывода матрицы на дисплей

void OutMatS(SMatrix A, int w, int p)

{

  int i,j;

  for (i=1; i<=A.m; i++)

    {

    for (j=1; j<=A.n; j++)

      {

      cout.width(w);

      cout.precision(p);

      cout<<A.A[i][j]<<"  ";

      }

    cout<<endl;

    }

}

В главной программе переменная В определяется как объект типа SMatrix. Затем в ней присваиваются значения элементам объекта B, сначала B.m и B.n, а затем и самим элементам матрицы. Далее следует обращение к функции OutMatS(), куда объект B передается через список фактических параметров. Процедура осуществляет вывод элементов матрицы на дисплей.

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

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

-  непосредственно выполнять операции присваивания с объектами типа структур:                                          B=A;

-  делать структуру возвращаемым значением функции:                   С=AddMat(A,B);

что нельзя делать при работе с обычными массивами.

Программа для перемножения матрицы на вектор, аналогичная приведенной на листинге 1, будет выглядеть следующим образом:

Листинг 3

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

#include <iostream.h>

#include <conio.h>

#include “define.h”

SVector MultMatVecS(SMatrix, SVector);

void main()

{

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

     int m,n;

     SMatrix A;

     SVector X,Y;

     …

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

    …

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

    …

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

     Y=MultMatVecS(A,X);

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

}

Помимо прочего, освоение работы со структурами является важным шагом к объектно-ориентированному программированию.

4. Динамические массивы