Демонстрационные возможности программ. Функция для вычисления определителя квадратной матрицы. Модуль для вывода на дисплей или в файл промежуточных данных, страница 3

if (abs(keyDemo)>1) MatWriteDetMat(keyDemo,0,0,n,A,0);

#endif

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

     for (k=1; k<=n-1; k++)

       {

       for (i=k+1; i<=n; i++)

{

if (AW[k][k]==0.0)

{

#ifdef DEMO

if (keyDemo!=0) MatWriteDetMat(keyDemo,2,k,n,A,0);

#endif

           return k;

           }

         c=AW[i][k]/AW[k][k];

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

           AW[i][j]-=c*AW[k][j];

         }  // цикла по i

#ifdef DEMO

if (abs(keyDemo)>1) MatWriteDetMat(keyDemo,1,k,n,AW,0);

#endif

       } // цикла по k

// расчет произведения элементов главной диагонали

     det=1.0;

     for (i=1; i<=n; i++)

       det*=AW[i][i];

#ifdef DEMO

if (abs(keyDemo)>1) MatWriteDetMat(keyDemo,3,0,n,AW,det);

#endif

    return 0;

}

//════════════════════════════════════════════════════════════════════

//    Конец функции DetMat

//════════════════════════════════════════════════════════════════════

//════════════════════════════════════════════════════════════════════

//    Конец модуля Matrix

//════════════════════════════════════════════════════════════════════

Листинг 3

/*

    ╔════════════════════════════════════════════════════════════════╗

    ║  Модуль для вывода на дисплей или в файл промежуточных данных  ║

    ║            при выполнении алгоритмов модуля Matrix             ║

    ╚════════════════════════════════════════════════════════════════╝

*/

// ════════════════════════════════════════════════════════════════════

    #include <stdio.h>

    #include <conio.h>

    #include <string.h>

    #include <stdlib.h>

    #include "dmatrix.h"

// ───────────────────── Глобальные переменные ────────────────────────

     extern int keyDemo;

     extern string FileName;

     string Format;

     FILE *F=NULL;

// ─── Начало функции MatGetRealFormat ────────────────────────────────

void MatGetRealFormat(void)

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

// вещественного числа

{

     string str;

     strcpy(Format,"%");

     itoa(npos,str,10);

     strcat(Format,str);

     strcat(Format,".");

     itoa(ndig,str,10);

     strcat(Format,str);

     strcat(Format,spec);

     strcat(Format,"  ");

}

// ─── Конец функции MatGetRealFormat ─────────────────────────────────

// ─── Начало функции MatOpenOutFile ───────────────────────────────────

void MatOpenOutFile(int keyDemo, int numFrag)

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

{

     if (keyDemo<0)

      {

      if (FileName=="\0") strcpy(FileName,"detmat.dat");

      }

     else strcpy(FileName,"con");

     if (numFrag==0) F=fopen(FileName,"w");

     else            F=fopen(FileName,"a");

}

// ─── Конец функции MatOpenOutFile ──────────────────────────────────

// ─── Начало функции MatWriteDetMat ─────────────────────────────────

void MatWriteDetMat(int keyDemo, int numFrag, int numStep,

               int n, Matrix A, double det)

// функция для вывода данных алгоритма функции DetMat

{

// формирование формата

     MatGetRealFormat();

// вывод по фрагментам

     switch (numFrag)

       {

       case 0: // начальный фрагмент вывода

       MatOpenOutFile(keyDemo,numFrag);

       fprintf(F,"\n=== Функция DetMat ===\n");

MatWriteMat(n,n,A,"Исходная матрица\n");

fclose(F);

       break;

       case 1: // вывод матрицы в цикле