Тема: Робота з модулями в середовищі Delphi
ЛАБОРАТОРНА РОБОТА №5 Мета роботи: ознайомлення з використання модулів і DLL (Dynamic Linked Library = бібліотека, що динамічно зв'язується) Завдання:розробити алгоритми розв'язку завдань та скласти програму розв'язку завдань. Короткі теоретичні відомості
Хід виконання лабораторної роботи 1. Створити програму, що використовує модуль комплексної арифметики Complex, який містить 4 функції: додавання, віднімання, множення й розподіл. Програма повинна виконати функцію 1 з комплексними операндами Comp1=a + i*b і Comp2=c + i*d b і функцію розподілу Comp1 на нуль. Варіанти завдань у Табл. 5.1. Проект – додаток. 2. Повторити завдання 1, модуль у вигляді DLL Complex2. Проект – додаток. Таблиця 5.1. Варіанти завдань
Приклад виконання лабораторної роботи Завдання 1 Створити програму, що використовує модуль комплексної арифметики Complex, що містить 4 функції: додавання, віднімання, множення й розподіл. Програма повинна виконати функцію додавання з комплексними операндами Comp1=6 + i*8 і Comp2=7 + i*11 функцію розподілу Op1 на нуль. 1. Командою File=>New викликаємо вікно архіву й вибираємо в ньому Unit (модуль без форми). Одержуємо у вікні Редактора коду сторінку шаблону модуля з іменем Unit1. 2. У редакторі коду перетягуєм код модуля. Секції Initialization і Finalization не використовуємо. 3. Збережемо модуль із іменем Complex.Pas. 4. Компілюємо модуль. 5. Командою Файл => Створити => Додаток створюємо проект програми. Форма додатка наведена на рис. 5.1. Рисунок 5.1. Форма програми Форма містить:
6. У коді модуля форми програми додаємо: § У рядок uses посилання на модуль Complex. § У розділ var змінні a,b,c,d типу real і Comp1, Comp2, Comp3 типу Tcomplex. 7. Створюємо оброблювачі натискання кнопок. 8. Зберігаємо проект під унікальним іменем. Лістинг модуля Complex: unit Complex; // Комплексна арифметика 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. Проект – додаток. 1. Командою Файл => Створити => Викликаємо вікно архіву й вибираємо в ньому DLL. Одержуємо у вікні Редактора коду сторінку шаблону DLL з іменем Project1. 2. У редакторі коду заносимо в неї код DLL. Підпрограми ті ж, що в модулі Complex завдання 1. Секція begin…end – порожня. 3. Збережемо DLL з іменем Complex2.Pas. 4. Компілюємо DLL. Підсумок Complex2.dll. 5. Тому що DLL не експортує типів, то створюємо допоміжний модуль Complex1, що містить тільки інтерфейсову частину з описом типу Tcomplex і імен викликуваних підпрограм DLL. Зберігаємо його під іменем Complex1. 6. Командою Файл => Створити => Додаток створюємо проект програми. Форму робимо аналогічної завданню 1. 7. У коді модуля форми програми додаємо: § У рядок uses посилання на модуль Complex1. § У розділ var змінні a, b, c, d типу real, Comp1, Comp2, Comp3 типу Tcomplex. 8. Створюємо оброблювачі натискання кнопок. 9. Зберігаємо проект під унікальним іменем. Лістинг 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;
Interface
Type Tcomplex=record// Тип комплексного числа Re, Im: real end; // Викликувані функції function Addc(x,y:Tcomplex):Tcomplex; External 'Complex2' Index 1; function Subc(x,y:Tcomplex):Tcomplex; External 'Complex2' Index 2; function Multc(x,y:Tcomplex):Tcomplex; External 'Complex2' Index 3; function Divc(x,y:Tcomplex):Tcomplex; External 'Complex2' Index 4; Implementation end. Лістинг модуля форми програми такий же, як у завданні 1, тільки в рядку uses додане посилання на модуль Complex1. У цьому модулі встановлюється зв'язок з DLL. Висновки 1. Для роботи з програмами які часто використовуються застосовують модулі й DLL 2. Модуль або DLL - це набір готових підпрограм, що зберігаються в компільованому виді. 3. Модуль зв'язується із головною програмою при компонуванні. 4. DLL зв'язується із головною програмою динамічно: DLL завантажується на час звертання до її підпрограм. 5. Та сама DLL може використовуватися декількома паралельно працюючими програмами.
Контрольні питання 1. Що таке модуль? Його призначення й створення. 2. Структура модуля. 3. Призначення й зміст секцій Interface, Implementation, Initialization, Finalization. 4. Зв'язування модуля із головною програмою. 5. Що таке DLL? Її призначення й створення. 6. Структура DLL. 7. Експортовані й внутрішні підпрограми DLL. 8. Призначення й зміст списку Exports. 9. Зв'язування DLL із зухвалою програмою. 10. Способи виклику підпрограм з DLL. ©2015 arhivinfo.ru Все права принадлежат авторам размещенных материалов.
|