
C _Учебник_МОНУ
.pdfБагатофайлові програми |
309 |
Розв‟язок. У файлі MyLib.h зробимо потрібні оголошення й заголовки фу- |
|
нкцій. Використаємо директиву #define, щоб задати константі k |
значення 8. |
#ifndef MyLibH #define MyLibH #define k 8
//Оголошення типів matr (“матриця”) і vekt (“вектор”) typedef double matr[k][k], vekt[k];
//Оголошення прототипів функцій
void elem_Matr(matr c);
void elem_Vect(matr c, vekt v); double G(matr c);
#endif
У файлі MyLib.cpp пропишемо визначення функцій, прототипи яких розміщено у файлі MyLib.h.
#pragma hdrstop
#include <math.h> // Долучення математичної бібліотеки
#include "MyLib.h"
#pragma package(smart_init)
// Визначення функції розрахунку елементів матриці void elem_Matr(matr c)
{for(int i=0; i<k; i++) for(int j=0; j<k; j++)
if(sin(i+j)>0)
c[i][j] = pow((i+j+2.)/(7*i+1)+j,4./3)-3.7*(i+j); else
c[i][j] = M_PI*pow( sin(i-j),3);
}
// Визначення функції розрахунку елементів вектора void elem_Vect(matr c, vekt v)
{for(int i=0; i<k; i++) { v[i]=0;
for(int j=0; j<k; j++) v[i]+=c[i][j];
}
}
// Пошук найближчого елемента до середнього арифметичного double G(matr c)
{int ni=0, nj=0, i, j; double sr=0; for(i=0; i<k; i++) for(j=0; j<k; j++)
sr += c[i][j]/pow(k,2); for(i=0; i<k; i++) for(j=0; j<k; j++)
if(fabs(sr-c[i][j])<fabs(sr-c[ni][nj]))
{ ni=i; nj=j; } return c[ni][nj] ;
}


|
Багатофайлові програми |
311 |
//--------------- |
Виведення елементів вектора ------------------- |
|
void __fastcall TForm1::Button2Click(TObject *Sender) |
|
{elem_Vect(a, x); // Виклик підпрограми обчислення елементів вектора for(int i=0;i<k;i++)
SG2->Cells[0][i] = FormatFloat("0.000",x[i]);
}
//--------------- Виведення значення скаляра ---------------------
// Виведення значення скаляра
void __fastcall TForm1::Button3Click(TObject *Sender) { Edit1->Text = FormatFloat("0.000",G(a));
}
Приклад 9.2 Створити заголовний файл, який містить функцію обчислення визначника квадратної матриці.
Розв‟язок. Матриця називається верхньотрикутною, якщо значення всіх її елементів, розташованих під головною діагоналлю, дорівнюють нулю. Визначник трикутної матриці дорівнює добуткові всіх її діагональних елементів. Отже, для обчислення визначника матриці її слід звести до верхньотрикутної. Для цього треба обчислити коефіцієнти за формулою fi aik / aii і додати до еле-
ментів і-го рядка відповідні елементи k-го рядка, помножені на fi . Процес триває n-1 кроків. Отже, значення елементів трикутної матриці визначаються за
формулою |
a |
|
a |
|
|
aik akj |
. Тут a |
|
– опорний елемент (він лежить на головній |
|
ij |
|
kk |
||||||
|
ij |
|
|
|
akk |
|
|
||
|
|
|
|
|
|
|
|
|
|
діагоналі); |
i, |
j, k |
|
– |
індекси рядків та стовпчиків матриці, n – вимірність матри- |
ці. Слід врахувати, що на головній діагоналі матриці не повинно бути нульових елементів, оскільки вони є дільниками у формулі. Тому, якщо опорний елемент є нульовим, слід переставити нижні рядки матриці в такий спосіб, щоб елемент головної діагоналі став ненульовим. При перестановці рядків матриці знак визначника зміниться на протилежний.
Створимо заголовний файл Det.h, який міститиме перейменування типу матриця matr і дві функції: зведення матриці до верхньотрикутної triangular() і обчислення визначника determinant().
У заголовному файлі Det.h уведемо потрібні оголошення й заголовки функцій:
#ifndef DetH #define DetH
//Описання типу матриці (вказівник на двовимірний масив) typedef float** matr;
//Прототипи функції, які можуть бути викликані в програмі
void triangular (matr a, int, int); /*Зведення матриці
до верхньотрикутної */ float determinant (matr, int); //Обчислення визначника
#endif
Для поставленого завдання щодо обчислення визначника, можна в заголовному файлі оголосити прототип лише функції determinant(), яка безпосе-

Багатофайлові програми |
313 |
void triangular(matr a, int n, int k) // Визначення функції triangular()
{for(int i=k+1; i<n; i++)
{ float koef = a[i][k]/a[k][k];// Обчислення коефіцієнта
for(int j=0; j<n; j++) // Обчислення елементів в обраному рядку a[i][j] = a[i][j] - a[k][j]*koef;
}
}
// Визначення функції обчислення визначника матриці float determinant(matr a, int n)
{ for(int i=0; i<n; i++)
{ if(a[i][i]==0) // Якщо опорний елемент дорівнює нулю, change(a, n, i); // викликати функцію переставляння рядків матриці
triangular(a, n, i);// Обчислення стовпчика трикутної матриці
}
float det=1;
for(int i=0; i<n; i++)
det *= a[i][i]; |
// Перемноження діагональних елементів |
if(znak<0) det=-det; |
// Змінення знака визначника |
return det; |
|
}
Головний файл проекту Unit1.cpp.
#include <vcl.h> #pragma hdrstop #include "Unit1.h"
#include "Det.h" // Долучення створеного заголовного файла Det.h
#pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1;
//-------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner)
{
}
//-------------------------------------------------------------
Багатофайлові програми |
315 |
Для виклику у початковій програмі другої й третьої форм слід долучити відповідні заголовні файли Unit2.h і Unit3.h до Unit1.h. Для цього можна виконати команду File / Include Unit Hdr і обрати потрібні файли або власноруч написати на початку файла Unit1.cpp:
#include "Unit2.h" #include "Unit3.h"
Глобальна змінна а оголошена зі словом extern у Unit3.h. Оскільки цей файл долучено до Unit1.cpp, то змінна а в ньому є відома (навпаки зробити не можна). Визначення цієї змінної може бути розміщено як в Unit1.cpp, так і в Unit3.cpp. В даному прикладі визначення масиву а розміщено в Unit1.cpp.
Слід звернути увагу, що для виклику форм використовуються функції Show() та ShowModal(). Різниця поміж ними полягає в тому, що перша просто відкриває ще одну форму, при цьому завжди є можливість перемкнутися до першої форми. Друга відкриває форму, і перемкнутися до інших форм, допоки відкрито цю форму, є неможливо.
Масив а заповнюється значеннями в Unit1, а використовується – в Unit3.
Файл Unit1.cpp:
#include <vcl.h> #pragma hdrstop #include "Unit1.h"
#include "Unit2.h" // Долучити файл з другою формою #include "Unit3.h" // Долучити файл з третьою формою
#pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1;
//-----------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
:TForm(Owner)
{SG1->Cells[0][1]="x"; SG1->Cells[0][2]="y";
for(int i=1; i<SG1->ColCount; i++) SG1->Cells[i][0]=IntToStr(i);
}
//-----------------------------------------------------------
int a[2][10]; |
// Визначення масиву координат (глобальна змінна) |
//------------------- |
Випадкові числа --------------------------- |
void __fastcall TForm1::Button1Click(TObject *Sender)
{randomize();
for(int i=0; i<10; i++)
{a[0][i]=random(500)+5;
a[1][i]=random(400)+5; for(int j=0; j<2; j++)
SG1->Cells[i+1][j+1]=a[j][i];
}
}

|
Багатофайлові програми |
317 |
Файл Unit3.h: |
|
|
#ifndef Unit3H |
|
|
#define Unit3H |
|
|
#include <Classes.hpp> |
|
|
#include <Controls.hpp> |
|
|
#include <StdCtrls.hpp> |
|
|
#include <Forms.hpp> |
|
|
class TForm3 : public TForm |
|
|
{ __published: // IDE-managed Components |
|
|
TButton *Button1; |
|
|
TButton *Button2; |
|
|
void __fastcall Button1Click(TObject *Sender); |
|
|
void __fastcall Button2Click(TObject *Sender); |
|
|
private: |
// User declarations |
|
public: |
// User declarations |
|
__fastcall TForm3(TComponent* Owner); |
|
}; //------------------------------------------------------------
extern PACKAGE TForm3 *Form3; //------------------------------------------------------------
extern int a[2][10]; //Оголошення (не визначення!) масиву координат
#endif
Файл Unit3.cpp:
#include <vcl.h> #pragma hdrstop #include "Unit3.h"
#pragma package(smart_init) #pragma resource "*.dfm" TForm3 *Form3;
//------------------------------------------------------------
__fastcall TForm3::TForm3(TComponent* Owner) : TForm(Owner)
{
}
//---------- |
Нарисувати ламану за координатами (числами масиву) ------- |
|
void __fastcall TForm3::Button1Click(TObject *Sender) |
||
{ Canvas->MoveTo(a[0][0],a[1][0]); |
// Перейти у першу точку |
|
Canvas->Pen->Color=clRed; |
// і встановити червоний колір. |
|
for(int i=1; i<10; i++) |
// Послідовно у циклі |
|
|
Canvas->LineTo(a[0][i],a[1][i]); // з‟єднати лініями всі точки. |
|
} |
|
|
//-------------------- |
Вихід ---------------------------------- |
|
void __fastcall TForm3::Button2Click(TObject *Sender) { Close();
}
