procedure Draw(vis : boolean); virtual; end;
{розділ implementation}
constructor TRoundRect.Create(a, b, c, d : integer; owner : TWinControl);
begin
inherited Create(a, b, owner);
w:=c; h:=d; end;
procedure TRoundRect.Draw(vis : boolean);
begin
inherited;
with figure do begin
shape:=stRoundRect; width:=w; height:=h;
left:=x–w div 2; top:=y–h div 2; end; end;
Пізнє зв'язування Розглянемо дію успадкованого методу Show об’єкта TCircle. Оскільки цей метод у TCircle не перевизначався, його реалізація береться з об’єкта TPoint:
procedure TPoint.Show;
begin
Draw(true); end; {викликає метод Draw}
Дія методу Show залежить від реалізації методу Draw. Перевизначати метод Show не треба, оскільки його реалізація правильна за умови, що успадкований метод Draw перевизначений (малює коло). Описи цих методів були розміщені в батьківському об'єкті TPoint. Згідно із стандартно прийнятим статичним (раннім) механізмом виклику підпрограм завжди виконуватиметься програмний код Draw базового об’єкта TPoint, а саме:
procedure TPoint.Draw(vis : boolean);
begin
with figure do begin
shape:=stCircle; brush.Style:=bsClear;
width:=2; height=width; {ширина та висота фігури – 2 пікселі}
left:=x–1; top:=у–1;
visible:=vis; end; end; {буде намальована точка, а не коло}
Щоб уникнути цієї ситуації, у декларації методу Draw базового об’єкта TPoint використовують службове слово virtual: procedure Draw(vis : boolean); virtual;
У цьому випадку адреса виклику потрібного методу Draw визначається лише на етапі виконання програми, оскільки змінна, що містить метод Draw, створюється динамічно під час роботи програми. Виклик батьківського методу Show об’єктом TCircle веде до виклику вже перевизначеного методу Draw:
procedure TCircle.Draw(vis: boolean); {буде намальовано коло}
begin
inherited;
with figure do begin
left:=x–radius; top:=у–radius;
width:=2*radius; height:=width; end; end;
Цей механізм називають динамічним або пізнім зв’язуванням, а метод Draw – віртуальним методом. Метод, який описаний у батьківському типі як віртуальний, повинен бути описаний як віртуальний в усіх його нащадках. Важливо пам’ятати, що якщо об’єктний тип містить хоча б один віртуальний метод, то до складу об’єкта обов’язково повинен належати конструктор і його виклик має передувати виклику віртуального методу.
Переваги об’єктно-орієнтованого програмування найбільш відчутні під час створення складних і великих за обсягом програм. Об’єктифікація функцій і процедур за ознакою належності до певного об’єкта спрощує процес програмування й навігацію у тексті програми на етапі розробки. Завдяки наслідуванню і поліморфізму програмістові не потрібно описувати однотипні методи у похідних об’єктах, дії яких однакові.
Практична робота №29 була створена на основі практичної роботи (№7) книги Глинський Я. М., Анохін В. Є., Ряжська В. А. Паскаль. Turbo Pascal i Delphi. Навчальний посібник. – Львів: СПД Глинський, 2007. – 140-150 с.
Порядок виконання роботи:
1. Завантажте середовище візуального програмування Delphi.
Запуск Delphi виконують клацанням на піктограмі Delphi (1 раз ЛКМ) або за допомогою каскадного меню Start – Programs – Borland Delphi 7 – Delphi 7
2. Розташуйте на формі об’єкти Button1 i Panel1.
Для цього використайте компоненти Button та Panel із сторінки Standard палітри компонентів середовища програмування Delphi.
3. Введіть описи об’єктів, які будуть використовуватися у програмі.
Для цього відкрийте вікно тексту програми і після рядка type {цей рядок вже є у програмі} вставте програмний код описів типів TPoint, TCircle та TRoundRect з теоретичних відомостей до практичної роботи. Описи конструкторів та методів цих об’єктів введіть у цьому ж вікні після ключового слова implementation.
4. Збережіть створений на даний момент проект та текст програми.
Для цього виберіть команду головного меню File – Save All (Зберегти Все) або натисніть на кнопку Save All панелі інструментів. У першому рядку вікна, яке з’явиться (Save Unit1 As) під заголовком Save in: (Зберегти в:), за допомогою випадаючого меню виберіть ім’я робочого диска, після чого знайдіть і відкрийте свою власну папку. Задайте назву для файлу тексту програми, попередньо знищивши запропоновану комп’ютером назву Unit1.pas, PRGRM29.pas Þ Save. У наступному вікні Save Project1 As дайте назву файлові проекту, стерши запропоновану комп’ютером назву Project1.dpr, PRJCT29.dpr Þ Save. У подальшому періодично, зокрема перед черговими запусками проекту на виконання, зберігайте файли програми (File – Save All, вводити імена файлів вже не потрібно).
5. У розділі оголошення змінних введіть опис глобальних змінних програми.
var Form1 : TForm1; {цей рядок вже є у програмі}
Point : TPoint;
Circle : TCircle;
RoundRect : TRoundRect;
count : integer;
6. Запрограмуйте дії, які необхідно виконати на момент створення форми.
procedure TForm1.FormCreate(Sender : TObject);
var і, middleX, middleY : integer;
begin
Panel1.Color:=clBlack; {зачорнюємо панель мішені}
count:=0; {обнулюємо лічильник}
middleX:=Panel1.ClientWidth div 2; {середина панелі у ширину}
middleY:=Panel1.ClientHeight div 2; {середина панелі у висоту}
{створюємо прямокутник світло-зеленим кольором}
RoundRect.Create(middleX, middleY, 30, 20, Panel1);
RoundRect.Set_Color(clLime);
RoundRect.Show; {малюємо прямокутник}
for і:=1 to 10 do {малюємо 10 концентричних кіл}
begin {створюємо коло світло-жовтим кольором}
Circle.Create(middleX, middleY, і*10, Panel1);
Circle.Set_Color(clYellow);
Circle.Show; end; end; {малюємо кола}
7. Змініть надпис на кнопці з „Button1” на „Постріл”.
Властивість Caption компоненти Button1 – „Постріл”.
8. Запрограмуйте кнопку „Постріл”.
procedure TForm1.Button1Click(Sender : TObject);
var x1, y1, shiftX, shiftY : integer;
begin
randomize;
{два випадкові числа множини для зміщення прямокутника}
ShiftX:=random(100) mod 3–1; ShiftY:=random(100) mod 3–1;
RoundRect.Move(ShiftX*8, ShiftY*8);
{зміщуємо прямокутник на 8 пікселів у випадковому напрямку}
with RoundRect.figure do begin
{це координати випадкової точки в деякому околі}
x1:=left+(random(120)–60); {цілі – точка влучення}
y1:=top+(random(80)–40);
Point.Create(x1, y1, Panel1); {створюємо точку білим кольором}
Point.Set_Color(clWhite); Point.Show; {малюємо точку}
if (x1 > left) and (x1 < left+width) and (y1 > top) and (y1 < top+height) then
{якщо влучено у ціль, то збільшуємо лічильник влучень}
begin messagedlg(’ Влучення !!! ’, mtInformation, [mbOk], 0);
inc(count); end;
if (left < 0) or (left+width > Panel1.ClientWidth)
or (top < 0) or (top+height > Panel1.ClientHeight) then
{Якщо ціль вийшла із зони прицілу (за панель), то закінчуємо роботу}
begin messagedlg(’ Кінець гри !!! Усього було ’+inttostr(count)
+’ влучень ’, mtInformation, [mbOk], 0);
Form1.Close; end; end; end;
9. Збережіть програму та переконайтесь у її працездатності.
Для цього виконайте команду: File – Save All. Запустити програму на виконання можна декількома способами: виконати команду Run – Run головного меню; клацнути на кнопці Run панелі інструментів; натиснути на функціональну клавішу F9.
10. Створіть exe – файл програми.
Виконайте команду головного меню Project – Build All.
11. Вийдіть із середовища Delphi та запустіть створену програму.
Запустіть exe – файл з іменем проекту зі своєї власної папки.
12. Продемонструйте створений проект викладачеві.
13. Закрийте всі відкриті вікна. Завершіть роботу. Здайте звіт.
Контрольні запитання:
1. Які основні інструменти має середовище програмування Delphi ?
2. Що представляє собою наступний об’єкт середовища Delphi: Button ?
3. Що представляє собою наступний об’єкт середовища Delphi: Panel ?
4. Що представляє собою наступний об’єкт середовища Delphi: Form ?
5. Які властивості має наступний об’єкт середовища Delphi: Button ?
6. Які властивості має наступний об’єкт середовища Delphi: Panel ?
7. Які властивості має наступний об’єкт середовища Delphi: Form ?
8. Як можна використовувати кнопки у програмах середовища Delphi ?
9. Яким чином відбувається робота з об’єктами (компонентами) у Delphi ?
10. Як можна змінювати властивості об’єктів (компонентів) у Delphi ?
11. Які принципи лежать в основі об’єктно-орієнтованого програмування ?
12. Які специфікатори доступу до об’єктів використовують у Object Pascal ?
13. Що представляють собою об’єкти в середовищі програмування Delphi ?
14. Яким чином можна створити новий об’єкт у мові Object Pascal ?
15. Що представляють собою інкапсуляція, поліморфізм та успадкування ?
16. Яким чином можна створювати віртуальні функції у середовищі Delphi ?
17. Яким чином можна побудувати ієрархічне дерево графічних об’єктів ?
18. Як можна перевизначати методи в середовищі програмування Delphi ?
Студенти повинні знати:
1. загальну характеристику середовища візуального програмування Delphi;
2. основні принципи роботи у середовищі візуального програмування Delphi;
3. загальну характеристику компонентів середовища Delphi;
4. основні принципи побудови програм та алгоритмів
для створення об’єктів і роботи з ними;
5. оператори, операції, типи даних та стандартні
процедури і функції мови програмування Object Pascal;
6. основні принципи об’єктно-орієнтованого програмування;
7. стандартні події і властивості компонентів середовища Delphi,
їх призначення та основні принципи використання.
Студенти повинні вміти:
1. працювати у середовищі візуального програмування Delphi;
2. ефективно використовувати основні інструменти середовища
програмування для роботи у Delphi з проектами та компонентами;
3. здійснювати вибір необхідних компонентів для побудови проекту;
4. ефективно використовувати властивості компонентів
при роботі з проектами у середовищі програмування Delphi;
5. створювати, редагувати, виконувати тестування та
налагодження програм (проектів) для роботи із об’єктами
у середовищі візуального програмування Delphi.
Порядок оформлення звіту:
Звіт повинен складатися з наступних частин:
1. Тема роботи.
2. Мета роботи.
3. Хід роботи.
4. Висновки до роботи.
Практична робота №30
Побудова інтерпретатора
математичних виразів у Delphi.
Мета: Навчитися користуватися основними елементами інтерфейсу середовища програмування Delphi для побудови, редагування, налагодження та виконання програм (проектів) для створення об’єктів і роботи з ними; програмно реалізовувати деревоподібні графи.
Прилади, обладнання та інструменти:
Для виконання практичної роботи використовується ПК з наступним програмним забезпеченням: операційна система Windows XP; середовище Delphi.
Теоретичні відомості:
задача:
Розробити інтерпретатор для обчислення значення математичних виразів, заданих як рядки символів. У виразах обмежитись операціями додавання та множення, які застосовуються до чисел і змінних.
Аналіз задачі
Розглянемо вираз х2+2х+4. Цей вираз може бути зображений у вигляді деревоподібної структури графа. Щоб обчислити вираз, поданий графом, наприклад для х=1, необхідно, починаючи з нижнього рівня, обчислювати значення у вершинах і поступово підніматися до кореня.
Зведемо задачу до двох підзадач: побудова дерева за заданим виразом; обчислення значення виразу згідно з побудованим деревом.
Для реалізації першої підзадачі в розділі опису типів type опишемо новий тип даних – базовий (батьківський) об’єкт „вершина дерева”. Назвемо цей тип TElement – тип „елемент дерева”. Такий базовий тип матиме спільні для усіх вершин дерева властивості, а саме: вказівники left і right на ліву та праву вершини підпорядкованого дерева (типу ^TElement) і функцію rezult, яка обчислює результат у цій вершині:
{тип PTElement – вказівник на тип TElement}
PTElement = ^TElement;
PPlus = ^Plus; {тип PPlus – вказівник на тип Plus}
PMult = ^Mult; {тип PMult – вказівник на тип Mult}
PNumber = ^Number; {тип PNumber – вказівник на тип Number}
TElement = object
protected {вказівники на ліву і праву гілки піддерева}
left, right : PTElement;
constructor Create(1, r : PTElement);
{конструктор створює об’єкт за вказівниками на ліву і праву вершини}
public
destructor Erase; {деструктор знищує вказівники на ліву і праву вершини піддерева}
function rezult: double; virtual; end;
Методи побудованого об’єкта опишемо у розділі implementation так:
constructor TElement.Create(1, r : PTElement);
begin
left:=1; right:=r; end;
destructor TElement.Erase;
begin
Dispose(left); Dispose(right); end;
function TElement.rezult : double;
begin
{порожня заготовка віртуальної функції базового класу,
яка ніколи не викликатиметься} end;
Специфікатор доступу protected для вказівників left і right означає, що ззовні свого об’єкта вони є недоступними, але видимі для нащадків цього об’єкта. Для конструктора TElement цей специфікатор означає, що він може бути виконаний з конструктора об’єкта-нащадка.
Розглянемо деструктор TElement.Erase. Деструктор викликається для знищення об’єкта (наприклад, командою Dispose). Під час виклику TElement.Erase для вершини дерева буде ініційоване виконання цього деструктора для вершин лівого і правого піддерев. Отже, шляхом рекурсивного виклику деструктора буде знищене ціле дерево.
Функція результату rezult має обчислювати і повертати значення дерева математичного виразу. Ця функція буде в усіх об’єктах, але її реалізації залежатимуть від конкретного нащадка і відрізнятимуться. Тому для предка вона є нереалізованою. Крім того, висновок про те, функція якого із похідних об’єктів має викликатися, приймається лише на етапі виконання програми після побудови дерева конкретного математичного виразу (це і є пізнє або динамічне зв’язування). Такі функції називають віртуальними і позначають ключовим словом virtual.
Вершиною (елементом) побудованого дерева може бути операція „ + ”, „ * ” або число. Тому успадкуємо від об’єкта TElement три об’єкти-нащадки: два для арифметичних дій („ + ” – Plus, „ * ” – Mult) та для числа (Number). Узагальнюючи, для дерева математичного виразу сформулюємо такі правила:
правило 1. Вершини „число” та „змінна” (об’єкт Number) завжди розташовуються на найнижчому рівні та не мають піддерев. Тому для цього об’єкта вказівники на ліву і праву підпорядковані вершини будуть нульовими (nil), а функція результату rezult повертає константу чи значення змінної;
правило 2. Вершини арифметичних дій („ + ” та „ * ”) завжди мають як ліву, так і праву гілки. Для об’єктів Plus і Mult двома гілками піддерева будуть вказівники на змінні типу TElement. Функція-результат для цих об’єктів має викликати функції rezult для лівої та правої підпорядкованих вершин, а також виконати операції додавання чи множення. Тому виклики функцій rezult для підпорядкованих вершин спричинять рекурсивні виклики функцій результату до низу дерева.
Важливо пам’ятати, що оскільки підпорядковані вершини об’єкта Plus чи Mult є однотипними (базового типу TElement), то стають правомірними виклики функцій rezult цих вершин незалежно від їх конкретного типу. Зважаючи на те, що у базовому об’єкті функція результату описана як віртуальна, механізм пізнього (динамічного) зв’язування забезпечує виклик успадкованої функції rezult вершини потрібного об’єкта, а не порожню заготовку функції TElement.rezult. У задачі ми вимушені використовувати механізм пізнього зв’язування, оскільки математичний вираз задаватиметься на етапі виконання програми в режимі діалогу і структура дерева на момент опису створюваних об’єктів невідома.
Існування базового об’єкта TElement дає змогу використовувати єдиний для всіх побудованих об’єктів деструктор TElement.Erase – завдяки однотипності вершин знищуються об’єкти об’єктів Plus, Mult та Number.
Опишемо об’єкти-нащадки. Почнемо з об’єкта Number:
Number = object(TElement)
private
f : double {дійсне число міститься у приватній змінній f}
public
constructor Create(float : double);
function rezult: double; virtual; end;
Методи типу Number опишемо у розділі implementation так:
constructor Number.Create(float : double);
begin
{конструктор присвоює числу f певне значення,
а вказівники на підпорядковані вершини обнулює}
inherited Create(nil, nil); f:=float; end;
function Number.rezult : double;
begin
rezult:=f; end; {функція результату повертає число f}
Об’єкт Number характеризує число, яке повинно міститися у конкретній вершині. Відповідно до правила 1 цей об’єкт піддерев не має. Тому під час виклику конструктора базового об’єкта замість вказівників на ліву і праву гілки передаються nil (нульові) вказівники.
Функція rezult повертає значення числа. Кваліфікатор virtual в описі цієї функції у базовому об’єкті означає: якщо доступ до змінної похідного об’єкта Number виконуватиметься через вказівник на базовий об’єкт, то викликатиметься функція rezult похідного, а не базового об’єкта. Проілюструємо це на прикладі:
var n : PNumber; {тут n – вказівник на об’єкт Number}
t : PTElement; {тут t – вказівник на об’єкт TElement}
... ... ... ... ... ... ... {n^ – змінна типу Number}
New(n, Create(9)); t:=n; t^.rezult;
{викликається метод rezult об’єкта Number, а не об’єкта TElement.
Тому повертається число 9, а не виконується
порожня заготовка віртуального методу rezult об’єкта TElement}
У цьому фрагменті викликається функція Number.rezult. Опишемо об’єкти, що реалізують операції, спираючись на сформульовані правила.
Plus = object(TElement)
public
constructor Create(1, r : PTElement);
function rezult : double; virtual; end;
Реалізація конструктора та методу rezult об’єкта Plus має такий вигляд:
constructor Plus.Create(1, r : PTElement);
begin
inherited Create(1, r); end; {викликаємо конструктор базового об’єкта}
function Plus.rezult : double;
begin
{результатом є сума результатів лівої та правої підпорядкованих вершин}
rezult:=left^.rezult+right^.rezult; end;
Конструктор цього об’єкта лише викликає конструктор базового об’єкта згідно з першим правилом. Функція rezult обчислює значення на лівій і правій гілках, а тоді їх підсумовує. Аналогічно описуємо об’єкт Mult:
Mult = object(TElement)
public
constructor Create(1, r : PTElement);
function rezult : double; virtual;
end;
... ... ... ... ... ... ... {розділ implementation}
constructor Mult.Create(1, r : PTElement);
begin
inherited Create(1, r); end;
function Mult.rezult : double;
begin
rezult:=left^.rezult*right^.rezult; end;
Якщо гілки є піддеревами, то викликається функція rezult для вершини кожного піддерева, і так аж до останнього рівня, де rezult повертає значення числа чи змінної. Тому достатньо викликати rezult для кореня, після чого буде обчислено значення виразу для всього дерева.
Отже, ми отримали набір об’єктів, якими зручно реалізувати дерево, побудоване на підставі математичного виразу. Для завершення реалізації першої підзадачі розглянемо функцію, яка будує дерево за заданим у вигляді рядка символів математичним виразом. У виразі змінна х позначається малою латинською буквою, значення змінної х міститься у полі редагування Edit3. Функція form формує дерево внаслідок рекурсивних викликів. Спочатку функція виокремлює доданки, далі кожен з доданків розкладає на множники, потім опрацьовує змінні та числа.
{s – рядок символів, результат – вказівник на вершину дерева побудованого виразу}
function form(s : string): PTElement;
var PtrPlus : PPlus;
PtrMult : PMult;
PtrNumber : PNumber;
p, l : integer; {p – позиція оператора „ + ” чи „ * ”}
s1, s2 : string; {шукані операнди вершини „ + ” чи „ * ”}
begin
l:=Length(s); {l – довжина заданого рядка символів}
{якщо в рядку є операція „ + ”, то знаходимо підрядки s1 і s2, – операнди операції „ + ”}
if Pos(’ + ’, s) > 1 then begin
p:=Pos(’ + ’, s); s1:=Copy(s, 1, p–1); s2:=Copy(s, p+1, l–p);
New(PtrPlus, Create(form(s1), form(s2)));
{створюємо об’єкт Plus з підвершинами – знайденими операндами операції „ + ”,
які аналізуватимуться рекурсивними викликами функції form}
form:=PtrPlus; end {повертаємо вказівник на вершину побудованого дерева}
else if Pos(’ * ’, s) > 1 then begin
p:=Pos(’ * ’, s); s1:=Copy(s, 1, p–1); s2:=Copy(s, p+1, l–p);
{аналогічно розбиваємо рядок на операцію „ * ” і два операнди s1 і s2}
{створюємо об’єкт Mult і рекурсивно викликаємо функцію form для знайдених операндів}
New(PtrMult, Create(form(s1), form(s2))); form:=PtrMult; end
{якщо рядок є змінною х, створюємо об’єкт „ число ” й ініціалізуємо
його числовим значенням змінної х з поля Edit3}
else if s = ’ x ’ then begin
New(PtrNumber, Create(StrToFloat(Form1.Edit3.Text))); form:=PtrNumber; end
{якщо вираз задано правильно, в результаті відсіювання операторів
„ + ”, „ * ” і змінних „ х ” в рядку s залишається константа.
Створюємо об’єкт „число” й ініціалізуємо його числовим значенням рядка s}
else begin New(PtrNumber, Create(StrToFloat(s))); form:=PtrNumber; end; end;
Отже, за допомогою засобів об’єктно-орієнтованого програмування можна створити зручний для використання та розширення набір програмних засобів, які розв’язують задачу побудови інтерпретатора математичних виразів. Продемонстровані прийоми використання об’єктів застосовуються для побудови й опрацювання таких структур даних, як дерева, стеки, черги, динамічні списки.
Практична робота №30 була створена на основі практичної роботи (№8) книги Глинський Я. М., Анохін В. Є., Ряжська В. А. Паскаль. Turbo Pascal i Delphi. Навчальний посібник. – Львів: СПД Глинський, 2007. – 151-160 с.
Порядок виконання роботи:
1. Завантажте середовище візуального програмування Delphi.
Запуск Delphi виконують клацанням на піктограмі Delphi (1 раз ЛКМ) або за допомогою каскадного меню Start – Programs – Borland Delphi 7 – Delphi 7
2. Змініть заголовок форми з „Form1” на „Обчислення виразу”.
Властивість Caption форми (Form1).
3. Відмовтеся від системних кнопок форми.
Для цього задайте значення False в усіх позиціях властивості BorderIcons: biSystemMenu, biMinimize, biMaximize та biHelp. Роботу з програмою завершуватимемо натисканням на кнопку „Вихід”.
4. Розташуйте на формі наступні об’єкти: Label1, Label2, Label3, Label4, Label5, Edit1, Edit2, Edit3, Edit4, Button1, Button2, ComboBox1, GroupBox1, GroupBox2, GroupBox3 та задайте їх властивості.
Для цього використайте відповідні піктограми (Label, Edit, Button, ComboBox, GroupBox) сторінки Standard палітри компонентів Delphi. Задайте наступні значення властивостей цих об’єктів: – компонент Label1: Caption – „х”; – компонент Label2: Caption – „f(х)”; – компонент Label3: Caption – „х=”; – компонент Label4: Caption – „f(х)=”; компонент Label5: Caption – „десяткових знаків”;– компоненти Edit1, Edit2, Edit3, Edit4: Text – „ ”; – компонент Button1: Caption – „Обчислити”; – компонент Button2: Caption – „Вихід”; – компонент GroupBox1: Caption – „Вирази”; – компонент GroupBox2: Caption – „Результати обчислень”; – компонент GroupBox3: Caption – „Точність”.
5. Введіть описи об’єктів і функцій,
які будуть використовуватися у програмі.
Для цього відкрийте вікно тексту програми і після рядка type {цей рядок вже є у програмі} вставте програмний код опису типів вказівників PTElement, PNumber, PPlus, PMult та об’єктних типів TElement, Number, Plus, Mult з теоретичних відомостей до практичної роботи. Програмний текст конструкторів та методів цих об’єктів, а також функції формування дерева form введіть у цьому вікні після ключового слова implementation.
6. Збережіть створений на даний момент проект та текст програми.
Для цього виберіть команду головного меню File – Save All (Зберегти Все) або натисніть на кнопку Save All панелі інструментів. У першому рядку вікна, яке з’явиться (Save Unit1 As) під заголовком Save in: (Зберегти в:), за допомогою випадаючого меню виберіть ім’я робочого диска, після чого знайдіть і відкрийте свою власну папку. Задайте назву для файлу тексту програми, попередньо знищивши запропоновану комп’ютером назву Unit1.pas, PRGRM30.pas Þ Save. У наступному вікні Save Project1 As дайте назву файлові проекту, стерши запропоновану комп’ютером назву Project1.dpr, PRJCT30.dpr Þ Save. У подальшому періодично, зокрема перед черговими запусками проекту на виконання, зберігайте файли програми (File – Save All, вводити імена файлів вже не потрібно).
7. Введіть математичні вирази у поля Edit1 і Edit2 та очистіть поля результатів Edit3 та Edit4. Запрограмуйте кнопку „Вихід”.
Зверніть увагу на те, що у виразах допускаються лише операції „ + ”, „ * ”, дійсні числа та змінна х, задана малою латинською літерою. Вираз у полі х (Edit1) не може містити змінну х. Для набору символу десяткової крапки у дійсних числах потрібно використовувати символ, передбачений операційною системою комп’ютера. Тестовий приклад і результати обчислень: x – 2+6*4+8*2.4583; f(x) – x*x+2.221*x+5.2321; x= – 45.666400000; f(x)= – 2192.077263360; точність – 9 десяткових знаків.
procedure TForm1.Button2Click(Sender: TObject);
begin
Close {закриваємо вікно програми}
end;
8. Задайте початкову точність обчислень, що дорівнює двом десятковим знакам. Створіть список можливих значень цієї величини у ComboBox1.
Для цього значення властивості Text об’єкта ComboBox1 задайте як число 2, а у Items введіть стовпчик чисел від 0 до 9.
9. Запрограмуйте кнопку „Обчислити”.
procedure TForm1.Button1Click(Sender : TObject);
var dec : integer;
x, fx : PTElement;
begin
{задаємо кількість знаків після десяткової крапки}
dec:=StrToInt(ComboBox1.Text);
{х – вказівник на вершину дерева, побудованого за виразом у полі Edit1}
x:=form(Edit1.Text);
{результат обчислення х записуємо як рядок символів у полі Edit3}
Edit3.Text:=FloatToStrF(x^.rezult, ffFixed, 25, dec);
fx:=form(Edit2.Text);
{fx – вказівник на вершину дерева, побудованого за виразом у Edit2}
{результат обчислення f(x) записуємо як рядок символів уEdit4}
Edit4.Text:=FloatToStrF(fx^.rezult, ffFixed, 25, dec); end;
10. Запрограмуйте функцію, яка виконуватиметься
після зміни числа у полі ComboBox1.
Для цього запрограмуйте подію Change об’єкта ComboBox1 так, щоб виконувались дії для кнопки „Обчислити” (функція Button1Click):