русс | укр

Мови програмуванняВідео уроки php mysqlПаскальСіАсемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование


Linux Unix Алгоритмічні мови Архітектура мікроконтролерів Введення в розробку розподілених інформаційних систем Дискретна математика Інформаційне обслуговування користувачів Інформація та моделювання в управлінні виробництвом Комп'ютерна графіка Лекції


Основные понятия и элементы языка 7 страница


Дата додавання: 2014-11-28; переглядів: 768.


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):


<== попередня лекція | наступна лекція ==>
Основные понятия и элементы языка 6 страница | Основные понятия и элементы языка 8 страница


Онлайн система числення Калькулятор онлайн звичайний Науковий калькулятор онлайн