Все функции пакета, реализующие относительно сложные алгоритмы, имеют возможность демонстрации хода их исполнения. Такая демонстрация оказывается очень полезной при изучении алгоритмов, а также в случае, если для какого-то набора входных данных алгоритм не завершается успешно и необходимо понять причины этого. Демонстрация заключается в выводе на экран или в файл промежуточных данных алгоритма и некоторых специальных сообщений, поясняющих его ход.
Функции, осуществляющие демонстрацию работы алгоритма, вынесены в отдельный вспомогательный модуль для того, чтобы не загромождать тексты функций основного модуля. Имя вспомогательного демонстрационного модуля отличается от соответствующего основного префиксом d (Demo). Так, в рассматриваемом примере, функция DetMat() находится в модуле Matrix (файл matrix.cpp), а функции, демонстрирующие ее работу, – в модуле dMatrix (файл dmatrix.cpp). Демонстрационный модуль должен также находиться в рабочем каталоге и включаться в проект. Однако если демонстрация не используется, есть возможность не включать этот модуль в проект; как это делается, описывается далее.
Для рассматриваемого примера тексты модулей приведены на листингах 1 – 5 в конце этого текста:
- листинг 1 – главная (управляющая программа);
- листинг 2 – модуль Matrix в упрощенном варианте только с функцией DetMat();
- листинг 3 – модуль dMatrix;
- листинг 5 – заголовочный файл модуля Matrix;
- листинг 6 – заголовочный файл модуля dMatrix.
Управление демонстрацией осуществляется с помощью переменной intkeyDemo, которая имеется в списке формальных параметров всех функций, допускающих демонстрацию. Эта переменная может быть объявлена и задана в главной функции, а затем использована при вызове функции. Но удобнее задавать ее значение в списке фактических параметров в виде константы, как показано на листинге 1. Переменная имеет задаваемое по умолчанию значение, равное нулю (см. заголовочный файл matrix.h). Если оно таким и остается, то демонстрация не осуществляется. Положительные значения keyDemo задают вывод демонстрации на экран, а отрицательные – в файл. Абсолютная величина keyDemo определяет степень подробности вывода. При |keyDemo|=1 данные выводятся только при ошибочном завершении алгоритма, при |keyDemo|=2 выводятся самые поверхностные данные, при |keyDemo|=3 – более подробные и т.д. Диапазон допустимых значений keyDemo и характер выводимой при этом информации для каждой функции различны. Их можно определить по документации к функции или опытным путем.
Если вывод демонстрационных данных осуществляется в файл, то можно задать его имя в списке параметров вызова функции, как показано на листинге 1 (третий вариант вызова). Если имя файла не задавать (первый и второй варианты вызова), то будет использоваться имя файла по умолчанию. Оно обычно совпадает с именем функции или очень незначительно от него отличается и имеет расширитель .dat. Имя файла демонстрационных данных для функции DetMat()по умолчанию – detmat.dat.
Если имя файла все-таки задается в списке параметров, то оно принимается переменной stringFileName_,а затем присваивается переменной FileName, являющейся глобальной для основного модуля (в примере – Matrix) и вспомогательного (dMatrix).
Промежуточные данные выводятся при обращении к соответствующей функции из вспомогательного модуля (в рассматриваемом примере это функция MatWriteDetMat()). Операторы вызова этой функции выделяются в тексте тем, что записываются с первой позиции, а также окаймлены директивами препроцессора условной компиляции, например,
#ifdef DEMO
if (keyDemo!=0) MatWriteDetMat(keyDemo,2,k,n,A,0);
#endif
Директивы условной компиляции #ifdef DEMO ... #endif позволяет включить или не включить в текст объектного модуля находящийся между ними оператор, в зависимости от значения константы DEMO. Она определяется в первой строке модуля Matrix #define DEMO
Если эта директива открыта, то константа DEMO получает значение true и оператор внутри #ifdefDEMO ... #endif компилируется. Если демонстрация не используется, и нет желания включать модуль dmatrix.cpp в проект, нужно только закрыть директиву определения константы DEMO символом комментария:
//#defineDEMO
При этом все операторы вызова демонстрирующих функций будут исключены и вспомогательный демонстрирующий модуль в проект можно не присоединять.
Функции демонстрирующих модулей имеют вспомогательный характер и при первом знакомстве с основными алгоритмами их можно внимательно не анализировать. Но в результате выполнения практикума должно сложиться достаточно детальное понимание их текста и студент должен уметь пояснить, как они работают.
Листинг 1
#include <iostream.h>
#include <conio.h>
#include "matrix.h"
void main()
{
// описаниеданных
int n,Err;
double det;
Matrix A;
// задание входных данных
n=3;
A[1][1]= 2; A[1][2]=-4; A[1][3]= 12;
A[2][1]=-1; A[2][2]= 5; A[2][3]=-15;
A[3][1]= 5; A[3][2]=-9; A[3][3]= 31;
// расчет определителя
clrscr();
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.