Название: Информатика.Алгоритмы и программы вычислительных задач микроэлектроники - Метод.(Н.В. Усольцев)

Жанр: Информатика

Просмотров: 886


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

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

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

void MultMat(int n, int m, int l, double A[10][10], double B[10][10],

double C[10][10]),

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

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

// одномерный массив - вещественный вектор

typedef double Vector[100];

 

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

typedef double Matrix[10][10];

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

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

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

void MultMat(int n, int m, int l, Matrix A, Matrix B, Matrix C)

 

Пример использования типа Matrix в программе для перемножения двух матриц иллюстрируется следующим текстом.

Листинг 1

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

 

#include <iostream.h>

#include <conio.h>

#include “define.h”

 

void MultMat(int, int, int, Matrix, Matrix, Matrix);

 

void main()

{

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

     int m1,n1,m2,n2;

     Matrix A,B,C;

     …

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

            …

 

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

            …

 

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

     MultMat(m1,n1,n2,A,B,C);

 

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

}

 

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