Interface
type
Tcomplex = record // Тип комплексного числа
Re, Im: Real
end;
function Addc(x,y: Tcomplex):Tcomplex; // Комплексне додавання
function Subc(x,y: Tcomplex):Tcomplex; // Комплексне віднімання
function Multc(x,y: Tcomplex):Tcomplex; // Комплексне множення
function Divc(x,y: Tcomplex):Tcomplex; // Комплексний розподіл
Implementation
function Addc(x,y: Tcomplex):Tcomplex;
begin
Result.Re:=x.Re + y.Re;
Result.Im:=x.Im + y.Im;
end; // Addc
function Subc(x,y: Tcomplex):Tcomplex;
begin
Result.Re:=x.Re - y.Re;
Result.Im:=x.Im - y.Im;
end; // Subc
function Multc(x,y: Tcomplex):Tcomplex;
begin
Result.Re:=x.Re*y.Re - x.Im*y.Im;
Result.Im:=x.Re*y.Im + x.Im*y.Re;
end; {Multc}
function Divc(x,y: Tcomplex):Tcomplex;
var z: Real;
begin
z:=sqr(y.Re)+sqr(y.Im);
try // Захист при розподілі на 0
Result.Re:=(x.Re*y.Re + x.Im*y.Im)/z;
Result.Im:=(x.Re*y.Im - x.Im*y.Re)/z;
except // Якщо дільник 0, те
Result.Re:=1.1e309;
Result.Im:=1.1e309
end;
end; {Divc}
end.
Лістинг модуля форми зухвалої програми
unit Prg_13_1_;
Interface
uses
Windows, Messages, Sysutils, Classes, Graphics, Controls, Forms, Dialogs, Stdctrls, Buttons,
Extctrls, Complex;
type
Tform1 = class(Tform)
bbrun: Tbitbtn; // Кнопка Виконати
bbclose: Tbitbtn; // Кнопка Закрити
bbvvod: Tbitbtn; // Кнопка Введення
bbclear: Tbitbtn; // Кнопка Очистити
Edit1: Tedit; // для a
Edit2: Tedit; // для b
Edit3: Tedit; // для c
Edit4: Tedit; // для d
Label1: Tlabel; // Уведіть значення змінних
Label2: Tlabel; // a =
Label3: Tlabel; // b =
Label4: Tlabel; // c =
Label5: Tlabel; // d =
Label6: Tlabel; // Результати
Memo1: Tmemo;
procedure bbrunclick(Sender: Tobject);
procedure bbvvodclick(Sender: Tobject);
procedure bbclearclick(Sender: Tobject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: Tform1;
a,b,c,d: real;
Comp1, Comp2, Comp3:Tcomplex;
Implementation
{$R *.DFM}
procedure Tform1.bbrunclick(Sender: Tobject);
begin
Comp1.Re:=a;
Comp1.Im:=b;
Comp2.Re:=c;
Comp2.Im:=d;
Comp3:=Addc(Comp1,Comp2);
memo1.Lines.Add('Вихідні дані');
memo1.Lines.Add('Comp1='+Floattostr(Comp1.Re)+’+i*'+Floattostr(Comp1.Im));
memo1.Lines.Add('Comp2='+Floattostr(Comp2.Re)+'+i*'+Floattostr(Comp2.Im));
memo1.Lines.Add('');
memo1.Lines.Add('Результат комплексної операції’);
memo1.Lines.Add('Comp3='+Floattostr(Comp3.Re)+'+i*'+Floattostr(Comp3.Im));
end;
procedure Tform1.bbvvodclick(Sender: Tobject);
begin
a:=Strtofloat(Edit1.Text);
b:=Strtofloat(Edit2.Text);
c:=Strtofloat(Edit3.Text);
d:=Strtofloat(Edit4.Text);
end;
procedure Tform1.bbclearclick(Sender: Tobject);
begin
memo1.Clear;
end;
end.
Завдання 2
Повторити завдання 1, реалізувавши модуль у вигляді DLL Complex2. Проект – додаток.
Командою Файл => Створити => Викликаємо вікно архіву й вибираємо в ньому DLL. Одержуємо у вікні Редактора коду сторінку шаблону DLL з іменем Project1.
У редакторі коду заносимо в неї код DLL. Підпрограми ті ж, що в модулі Complex завдання 1. Секція begin…end – порожня.
Збережемо DLL з іменем Complex2.Pas.
Компілюємо DLL. Підсумок Complex2.dll.
Тому що DLL не експортує типів, то створюємо допоміжний модуль Complex1, що містить тільки інтерфейсову частину з описом типу Tcomplex і імен викликуваних підпрограм DLL. Зберігаємо його під іменем Complex1.
Командою Файл => Створити => Додаток створюємо проект програми. Форму робимо аналогічної завданню 1.
У коді модуля форми програми додаємо:
У рядок uses посилання на модуль Complex1.
У розділ var змінні a, b, c, d типу real, Comp1, Comp2, Comp3 типу Tcomplex.
Створюємо оброблювачі натискання кнопок.
Зберігаємо проект під унікальним іменем.
Лістинг DLL Complex2
library Complex2; // Комплексна арифметика
uses Sysutils, Classes;
{$R *.RES}
type
Tcomplex = record // Тип комплексного числа
Re, Im: real
end;
function Cadd(x,y:Tcomplex):Tcomplex; export; // Комплексне додавання
begin
Result.Re:=x.Re + y.Re;
Result.Im:=x.Im + y.Im;
end; // Cadd
function Csub(x,y:Tcomplex):Tcomplex; export; // Комплексне віднімання
begin
Result.Re:=x.Re - y.Re;
Result.Im:=x.Im - y.Im;
end; // Csub
function Cmult(x,y:Tcomplex):Tcomplex; Export; // Комплексне множення
begin
Result.Re:=x.Re*y.Re - x.Im*y.Im;
Result.Im:=x.Re*y.Im + x.Im*y.Re;
end; // Cmult
function Cdiv(x,y:Tcomplex):Tcomplex; Export; // Комплексний розподіл
var z: real;
begin
z:=sqr(y.Re)+sqr(y.Im);
try // Захист при розподілі на 0
Result.Re:=(x.Re*y.Re + x.Im*y.Im)/z;
Result.Im:=(x.Re*y.Im - x.Im*y.Re)/z;
except // Результат, якщо дільник 0
Result.Re:=1.1e309;
Result.Im:=1.1e309
end;
end; // СDiv
exports // Список експорту
Cadd Index 1 Name 'Addc' Resident,
Csub Index 2 Name 'Subc',
Cmult Index 3 Name 'Multc',
Cdiv Index 4 Name ‘Divc’;
begin
end.
Лістинг модуля Complex1
unit Complex1;
