Практична робота "Знайомство з середовищем Delphi"

Про матеріал
Освоєння інтегрованого середовища розробки додатків Delphi і отримання початкових навичок у проєктуванні Windows-додатків з використанням компонентів Delphi та у налаштуванні цих додатків.
Перегляд файлу

Практична робота №5

ЗНАЙОМСТВО З СЕРЕДОВИЩЕМ DELPHI

Мета: Освоєння інтегрованого середовищарозробки додатків Delphi і отримання початкових навичок у проектуванні Windows-додатків з використанням компонентів Delphi та у налаштуванні цих додатків.

ТЕОРЕТИЧНІ ВІДОМОСТІ

1. Початкові відомості про інтегроване середовище розробки додатків Delphi

Після запуску Delphi на екрані з'являються п'ять вікон (рис. 1):

  1. Головне вікно вгорі екрану.
  2. Вікно Конструктора форми (порожня форма з ім'ям Forml) під головним вікном праворуч.
  3. Вікно редактора властивостей об'єктів ліворуч унизу – Object Inspector.
  4. Вікно Дерева об'єктів під головним вікном ліворуч – Object TreeView.
  5. Вікно редактора коду (позиціонується там же, де вікно Конструк­тора форми, перемикання клавішею F12, Shift+F12 – здійснює ви­бір однієї із декількох форм для перемикання) – Unitl.pas.

Вікно редактора коду майже повністю закрите вікном стартової форми. Це вікно можна перемістити, щоб бачити одночасно і вікно Конструктора форми (так зроблено на рисунку 1).

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Рис. 1. Вигляд екрану після запуску Delphi


 

Головне вікно інтегрованого середовища Delphi (IDE) має вигляд, що зображений на рисунку 2. Вікно містить: рядок заголовка з іменем IDЕ (Delphi 7) і ім'ям проекту (за замовчуванням Project 1); під ним рялок головного меню IDE; нижче головного меню ліворуч – панелі інструментів; праворуч від них – Палітра компонентів, що складається зі сторінок із закладками.

 

 

Рис. 2. Головне вікно IDE

Панелі інструментів:

Безымянный Standard - Стандартна;

Безымянный View - Вид;

Безымянный Debug - Налагодження;

Безымянный Custom - Користувач

 

Палітра Компонентів (Component Palette):

Пункти меню головного вікна IDE

Пункт

Призначення

File

Файл

Робота з файлами

Edit

Виправлення

Редагування

Search

Пошук

Пошук фрагментів

View

Вид

Вибір, що показувати

Project

Проект

Операції з проектом

Run

Запуск

Прогін і налагодження

Component

Компоненти

Робота з компонентами

Database

Бази Даних

Робота з базами даних

Tools

Інструменти

Використання зовнішнього інструментарію

Windows

Вікно

Перелік вікон для вибору фокуса

Help

Допомога

Контекстна допомога

 

Вікно форми (Forml) являє собою проект Windows-Вікна майбут­ньої програми. Програміст розміщує на формі потрібні компоненти з Палітри компонентів.

Вікно оглядача Дерева об'єктів (Object Tree View) призначене для наочного відображення зв'язків між окремими компонентами, розміще­ними на активній формі або в активному модулі даних.

Вікно Інспектора об'єктів (Object Inspector) призначене для пере­гляду і редагування властивостей компонента. Воно містить дві вкладки: Properties (власти­вості) і Events (події). Сторінка Властивості служить для установки по­трібних значень властивостей компонента, сторінка Події дозволяє ви­значити реакцію компонента на ту чи іншу подію.

Вікно Редактора коду, яке можна побачити, відсунув­ши вбік вікно форми, призначене для набору тексту програми. На поча­тку роботи над новим проектом це вікно редактора коду містить сфор­мований Delphi початковий шаблон програми, який надалі доповнюєть­ся програмістом.

2. Склад проекту Delphi

Проект Delphi складається з форм, модулів, установок параметрів проекту, ресурсів і т.д. Вся ця інформація розміщається у файлах. Біль­шість із цих файлів автоматично створюються Delphi. До складу проек­ту входять наступні файли (у дужках зазначені розширення імен фай­лів):

  • файл проекту (dpr);
  • файли опису форм (dfm);
  • файли модулів і модулів форм (pas);
  • файл параметрів проекту (dof);
  • файл параметрів середовища (cfg);
  • файл опису ресурсів (res);
  • файл конфігурації вікон (dsk).

Файл проекту є центральним файлом додатка і являє собою програ­му. Це текстовий файл, що використовується для зберігання інформації про форми й модулі. В ньому знаходяться оператори ініціалізації й запус­ку програм на виконання. Відображення коду файла проекту у вікні Ре­дактора коду задається командою меню Project|View Source (Проект|Перегляд джерела).

Файл опису форми створюється Delphi автоматично при конструю­ванні форми й містить характеристики форми і її компонентів. За необ­хідності можна відобразити цей файл у вікні Редактора коду в тексто­вому виді командою View as Text (Переглянути як текст) контекстного меню форми або комбінацією клавіш Alt+F12. Повернення до візуаль­ного подання форми виконується командою View as Form (Перегляну­ти як форму) контекстного меню тексту файла опису форми або комбі­нацією клавіш Alt+F12.

Файл модуля. Кожній створюваній формі відповідає файл модуля, використовуваний для зберігання коду. Можуть бути модулі без форм, але форми без модулів не існують. Як правило, весь код розташовується в модулях.

Файл ресурсів містить значки, растрові зображення й курсори.

Також можуть створюватися файли резервних копій.

Після компіляції створюється виконуваний файл (ехе) з ім'ям прое­кту. Він є автономним виконуваним файлом, для якого більше нічого не потрібно, якщо тільки не використовуються бібліотеки, що знаходяться в dll, осх і т.д., а також якщо не використовується підтримка пакетів часу виконання.

Для кожного модуля після компіляції створюється об'єктний файл модуля (dcu). Це відкомпільований файл модуля (pas), що компонуєть­ся в остаточний виконуваний файл.

3. Налаштування програми

Процес усунення помилок у програмі називається налаштуванням (debugging), а самі помилки в програмі досить часто називають жучками (bugs). Серед помилок, які допускаються в програмі, виділяють синтаксичні помилки, помилки часу виконання і логічні помилки.

Синтаксичні помилки – це помилки, пов’язані з порушенням синтаксису (тобто правил граматики) мови програмування. Прикладом такої помилки, що зустрічається досить часто, є пропуск символу «крапка з комою», яким розділяються оператори у програмах, написаних мовою Delphi. При виявленні синтаксичної помилки компілятор видає повідомлення про помилку (Errors), вказуючи її передбачуване місце розташування і пояснюючи можливий її зміст. Досить часто компілятор виводить натяки (Hints)  та попереджувальні повідомлення (Warnings) про деякі дещо незвичні конструкції у програмі.

Для запуску процесу компіляції програми слід обрати пункт меню Project ► Compile Project (гаряча клавіша Ctrl+F9).

Можливим є також вибір пункту меню Run ►Run (гаряча клавіша F9 або клік мишкою над інструментальною кнопкою ). В останньому випадку, насправді, мова йде про запуск програми на виконання. Але перед виконанням програми, якщо у її тексті здійснювалася корекція, будуть автоматично виконані компіляція та редагування зв’язків. У разі відсутності синтаксичних помилок та помилок у редагуванні зв’язків програма буде автоматично запущена на виконання, інакше їх необхідно усунути.

Можливий також безпосередній запуск редактора зв’язків після виконання компіляції або ж одразу. Для цього потрібно виконати команду Project ► Build Project.

Деякі помилки проявляються тільки під час виконання програми, у зв’язку з чим вони носять відповідну назву - помилки часу виконання (runtime errors). У термінології Delphi такі помилки називаються винятками (Exceptions). З появою таких помилок програма завершується аварійно з видачею пояснювального повідомлення. У середовищі поява таких помилок призводить до переривання виконання програми і виведення вікна з інформацією про вид виключення. Прикладами таких помилок часу виконання є ділення на нуль, одержання великих числових значень, які не можуть бути записані в комірку пам’яті (переповнення).

Часто найбільш неприємними помилками є логічні помилки – помилки в самому алгоритмі, а також помилки, спричинені елементарною неуважністю (наприклад, використання в програмі операції * замість операції +, задавання неправильного числового значення, використання одного імені змінної замість іншого). Такі помилки компілятор найчастіше виявити не може (за винятком випадків, коли вони призводять до порушення синтаксису). Мало того, логічні помилки можуть не проявити себе і під час виконання програми як помилки часу виконання.

Для виявлення логічних помилок здійснюється тестування програми, яке виражається в її запуску з кількома характерними наборами вхідних даних і перевірці відповідних їм результатів. При цьому в жодному разі не можна обмежуватися одноразовою перевіркою програми – повинні бути відслідковані всі окремі випадки вхідних даних, з якими програма може зіткнутися. Тільки після перевірки правильності функціонування програми на багатьох характерних наборах даних можна отримати високу (але не абсолютну) гарантію її правильності.

Для виявлення більшості логічних помилок передбачений спеціальний засіб, що зветься налаштувальником (Debugger).

Робота в режимі налаштування – це насамперед виконання програми по кроках з відслідковуванням послідовності виконання операторів програми та значень, які набувають змінні після виконання того або іншого кроку.

Для виконання фрагменту програми по кроках можна використовувати такі команди меню:

  • Run ►Trace Into (Трасування із заходом у ...) – покрокове виконання програми із заходом у процедури та функції з наступним покроковим виконанням їх рядків (аналогом є натискання клавіші F7 або клік мишкою над інструментальною кнопкою );
  • Run ► Step Over (По крокам без заходу у ...) – покрокове виконання рядків програми, при якому виклик пілпрограми вважається за одну команд, тобто вхід у неї не проводиться (аналогом є затискання клавіші F8 або клік мишкою над інструментальною кнопкою );
  • Run ►Trace to Next Source Line (Трасування до наступного рядка) – перехід до наступного рядка програми (аналогом є натискання клавіші Shift+F7);
  • Run ► Run to Cursor (Виконати до курсору) – команда виконує програму до того виконуваного оператора, на якому розташований курсор у вікні редактора коду (аналогом є натискання клавіші F4);
  • Run ► Run Until Return (Виконати до виходу з функції) – виконання програми до виходу з поточної функції і зупинка на операторі, наступному за викликом цієї функції, з залишенням курсору у рядку, в якому було здійснене звертання до функції (аналогом є натискання клавіші Shift+F8 або клік мишкою над інструментальною кнопкою );
  • Run ►Show Execution Point (Показати точку виконання) – команда показує на екрані виконуваний рядок коду та переміщує на нього курсор.

Досить часто для налаштування програми використовуються так звані точки переривання. Щоб ввести просту (безумовну) точку переривання. достатньо у вікні редактора коду клікнути мишкою на лівій межі вікна навпроти необхідної рядка коду. При цьому здійсниться забарвлення рядка, а навпроти нього на лівій межі вікна коду з’явиться червона кулька. Якщо тепер запустити програму на виконання, то кожен раз коли керування перейде до рядка, в якому вказана точка переривання, відбувається переривання виконання. Відміна точки переривання здійснюється повторним кліком мишкою на лівій межі вікна коду навпроти рядка з точкою переривання. Точку переривання можна встановити командою Run ► Add Breakpoint ► Source Breakpoint з введенням номера рядка, де повинно здійснюватися переривання.

Дія точки переривання дещо аналогічна натисканню клавіші F4, але перевага точок переривання полягає в тому, що можна одночасно вказати декілька таких точок в різних місцях коду і в різних модулях. Програма в цьому разі виконується до першої точки переривання, яка зустрінеться під час виконання. Після аналізу проміжних результатів можна продовжити виконання програми, натиснувши інструментальну кнопку .

Точки переривання можна встановлювати тільки на виконуваних oпeраторах. Прибрати точку переривання можна, виконавши ті ж дії, що виконувалися для її встановлення.

Для перегляду значення змінних у момент зупинки програми досить навести курсор мишки на ім’я необхідної змінної в коді програми. Якщо ж є необхідність відслідковувати стан одразу декількох змінних, їх можна додати у вікно перегляду Watches List.

За умовчанням вікно перегляду стану змінних автоматично виводиться у режимі налаштування ліворуч від вікна коду. У разі відсутності потреби у цьому вікні, його можна закрити. Щоб викликати раніше закрите вікно перегляду стану змінних, необхідно вибрати в головному меню опцію View ► Debug Windows ► Watches або ж натиснути комбінацію клавіш Ctrl+Alt+W.

Для додавання змінних у вікно Watches List достатньо здійснити подвійний клік мишкою в цьому вікні і ввести назву змінної в рядок Expression вікна, яке відкриється після кліку.

За умовчанням у режимі налаштування ліворуч від вікна коду під вікном Watches List виводиться вікно локальних змінних Local Variables. У цьому вікні виводяться значення локальних змінних процедур і функцій (у тому числі їх формальних параметрів). У разі закриття вікна локальних змінних, його повторне відкриття здійснюється вибором в головному меню опції View ►Debug Windows ► Local Variables або ж натисканням комбінації клавіш Ctrl+Alt+L.

Якщо вміст вікна локальних змінних визначається автоматично, то вміст вікна Watches List визначається програмістом.

ПРИКЛАД СТВОРЕННЯ НОВОГО ПРОЕКТУ ТА ЙОГО НАЛАШТУВАННЯ

Розглянемо можливу послідовність дій по налаштуванню програми на прикладі задачі розробки програми відшукання коренів квадратного рівняння

Далі окремі групи дій умовно розіб'ємо на етапи з метою їх структуризації.

Етап 1. Конструювання форми.

Завантажимо Delphi. Захоплюючи по черзі межі форми при натиснутій лівій кнопці мишки, підберемо зручні розміри форми.

Далі слід розмістити на формі компоненти відповідно до вимог задачі. Задача передбачає наявність засобів із забезпечення введення трьох чисел, виведення результатів обчислень та безпосередньої реалізації процесу обчис лень.

Проектування форми будемо здійснювати, орієнтуючись на рис. 3.

Рис. 3. Можливий початковий вигляд форми

Виберемо на вкладці Standard компоненти Memo, ТРаnеl, три компоненти TEdit, три компоненти TLabel та компонент TButton, а на вкладці Additional – компонент TBitBtn. Розмістимо ці компоненти згідно рис. 3.

Компонент TEdit (однорядкове редаговане текстове поле) застосовують для введення та (або) відображення досить довгих текстових рядків. Для зміни тексту, що міститься в ньому, достатньо змінити значення його властивості Text, що можна виконувати як на етапі проектування програми, так і програмними засобами. Ми будемо використовувати три таких компонент для введення трьох коефіцієнтів рівняння.

Компонент TLabel (Мітка) призначений для виведення різних повідомлень (підказок, результатів обчислень і т. д.). Ми будемо його використовувати для виведення підказок, що випереджають введення (значення якого з коефіцієнтів потрібно набрати у відповідному редакторі). Для зміни .тексту, що міститься в цьому компоненті, досить змінити значення його властивості Caption, що також можна робити як на етапі проектування програми, так і програмними засобами.

Компонент TButton (Кнопка) призначений для керування програмою. Ми вдамося до нього для організації обчислень і забезпечення виведення.

Компонент TBitBtn (Кнопка з зображенням) є різновидом кнопки TButton. Ми застосуємо один з варіантів цього компонента, який служить для видачі сигналу про припинення роботи програми. Ця кнопка не є обов’язковою, оскільки припинення роботи програми забезпечується кліком над кнопкою закриття форми або натисканням сполучення клавіш Alt+F4. Замість цього компонента можна використовувати і звичайну кнопку TButton з відповідним опрацьовувачем події OnClick.

Багаторядкове редаговане текстове поле TMemo застосуємо для виведення результату обчислень. Компонент ТМето вживають для уведення, редагування й (або) відображення досить довгих текстів, які можуть містити кілька рядків. Цей текст може корегуватися як на етапі візуального проектування, так і програмно, для чого необхідно змінювати властивість Lines (Рядки) цього компонента.

Відповідно до специфіки розв’язуваної задачі здійснимо такі зміни властивостей компонентів:

  • Форма:
    Position — poScreenCenter
    Caption — Приклад
  • Панель:
    Align — alBottom
    BevelOuter — bvNone
    Caption — очистимо
  • Мітки Label1, Lаbеl2 та Label3:
    Caption — відповідно тексти Коефіцієнт а, Коефіцієнт b. Коефіцієнт c
  • Редактори Edit1, Edit2 та Edit3:
    Text — 0
  • Багаторядкове поле:
    Align — alClient
    Lines — очистимо
  • Кнопка Button1:
    Caption — Обчислити
  • Кнопка Close:
    Kind — bkClose

 У результаті форма набуде вигляду, зображеного на рис. 4.

 Зміна значень властивостей буде автоматично приводити до зміни тексту модуля. В результаті текст модуля прийме наступний вид:

unit Unit1;

 

interface

 

uses

  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

  Dialogs, StdCtrls, Buttons, ExtCtrls;

 

type

  TForm1 = class(TForm)

    Panel1: TPanel;

    Edit1: TEdit;

    Edit2: TEdit;

    Edit3: TEdit;

    Button1: TButton;

    BitBtn1: TBitBtn;

    Label1: TLabel;

    Label2: TLabel;

    Label3: TLabel;

    Memo1: TMemo;

    private

    { Private declarations }

    public

    { Public declarations }

    end;

 

var

  Form1: TForm1;

 

implementation

 

{$R *.dfm}

 

end.

Рис. 4. Можливий остаточний вигляд форми

Як це видно з наведеного вище тексту модуля, Delphi автоматично вставив у клас розміщені на формі компоненти, надавши їм стандартні імена (якщо компонент при проектуванні форми перейменовувати, змінюючи значення властивості Name, то відповідно буде змінюватися текст модуля).

Етап 2. Написання початкового коду.

Насамперед перейдемо у вікно коду та впишемо у секції private опису класу форми такий рядок:

a, b, с: Real;

Тим самим ми опишемо змінні для позначення коефіцієнтів рівняння, вказавши, що вони приймають дійсні значення.

Виконаємо подвійний клік мишкою над зображенням форми у вікні Дерево Об’єктів або над будь-яким вільним місцем форми в її вікні. У відповідь на клік мишкою Delphi автоматично вставить у код модуля перед термінатором end з крапкою такий код:

procedure TForm1.FormCreate(Sender: TObject);

begin

 

end;

Це код так званого опрацьовувача події OnCreate (За створенням) для форми.

Слово procedure вказує, що опрацьовувач є так званою підпрограмою-процедурою. Складене ім’я TForml.FormCreate – це ім’я процедури, що складається з двох частин: імені класу TForml і власне імені процедури FormCreate. Після імені процедури в круглих дужках зазначено опис параметра, з яким вона буде викликатися (Sender: TObject). У нашій програмі параметр Sender використовуватися не буде. У більш складних програмах за допомогою цього параметра програміст може визначити, який компонент згенерував дану подію (у цьому випадку подія OnCreate). У загальному випадку у процедури може бути кілька параметрів; вони також можуть бути відсутніми. Перший рядок розглянутого фрагмента коду називається заголовком процедури (він завершується символом «крапка з комою»).

Слідом за заголовком процедури розташовується її тіло (у даному випадку воно порожнє й містить тільки так звані операторні дужки begin та end). Щоб опрацьовувач події виконував які-небудь дії, його тіло повинне бути наповнене операторами. Відзначимо, що відразу ж за заголовком може розміщуватися секція описів, у якій програміст описує допоміжні елементи, необхідні для реалізації тіла процедури.

Крім вставки коду опрацьовувана події, Delphi автоматично модифікує опис класу, вставляючи в нього перед словом private заголовок опрацьовувана події:

procedure FormCreate (Sender: TObject);

Модифікуємо код опрацьовувана події OnCreate форми, надавши йому такого вигляду:

procedure TForml.FormCreate(Sender: TObject);

begin

DecimalSeparator :=’.’;

end;

Справа в тому, що якщо використовується русифікована версія Windows, то в ній як роздільник цілої та дробової частин дійсного числа використовується не десяткова точка, як це має місце в мовах програмування (у тому числі і в Delphi), а кома. Результатом цього може бути неправильна робота деяких підпрограм, що перетворюють рядки до дійсних чисел (наприклад, StrToFloat). Системна змінна DecimalSeparator містить символ, що використовується як роздільник цілої та дробової частин дійсних чисел. Єдиний оператор процедури TForml.FormCreate на початку роботи програми змінює цей символ на символ «крапка», що використовується в Delphi та у не русифікованій версії Windows.

Клікнемо тепер мишкою над кнопкою Обчислити. У відповідь на клік мишкою Delphi автоматично вставить у код модуля перед термінатором end з крапкою такий код:

procedure TForml.ButtonlClick(Sender: TObject);

begin

end;

 

Це код так званого опрацьовувана події OnClick (За кліком) для кнопки Обчислити. Взагалі кажучи, при кліку мишкою в працюючій програмі виникає подія OnClick, що зв’язується з компонентом, над яким був здійснений клік.

Якщо опрацьовувач події відсутній, то подія ніяк не опрацьовується; за умови його наявності клік мишкою активізує опрацьовувач і забезпечує вико¬нання дій, записаних у цьому опрацьовувані.

Крім того, в опис класу перед словом private буде автоматично вставлений заголовок опрацьовувача події:

procedure ButtonlClick(Sender: TObject);

Модифікуємо код процедури TForml.ButtonlClick, надавши йому такого вигляду:

 

procedure TForml.ButtonlClick(Sender: TObject);

begin

a := StrToFloat(Editl.Text) ;

b := StrToFloat(Edit2.Text) ;

a := StrToFloat(Edit3.Text) ;

d:=b*b-4*a*a;

if d < 0

Memol.Lines.Add('The equation has no roots');

Memol.Lines.Add('xl = '

+ FloatToStr((-b + Sqrt(d)) / 2 * a) ) ) ;

Memol.Lines.Add('x2 = '

+ FloatToStr((-b - Sqrt(d)) / 2 * a) ) ) ;

end;

Етап 3. Виконаємо компіляцію.

Як це видно з рис. 5, компілятор виявив 3 синтаксичних помилок та 1 натяк і вивів відповідні пояснення. Червоним кольором виділений рядок, у якому вперше було знайдено помилку, а курсор розміс¬титься за яким-небудь символом цього рядка. Програміст повинен шукати синтаксичну помилку перед курсором за текстом програми, причому не обов’язково у цьому ж рядку.

Помилки і попередження мають такий вигляд:

[Error] Unit1.pas(47): Undeclared identifier: 'd' – Невизначений символ 'd';

[Warning] Unit1.pas(49): Comparing signed and unsigned types – widened both operands – Порівняння знакового та беззнакового операндів — розширюються обидва операнди;

[Error] Unit1.pas(58): Statement expected but end of- file found - Очікувався оператор, апе знайдений кінець файлу;

[Fatal Error] Project1.dpr(5): Could not compile used unit 'Unitl .pas' - Компілятор не зміг зібрати модуль Unit1.pas'

Перше повідомлення говорить про те, що змінна d (для запису значення дискримінанту) використовується, але не визначена у програмі. Тому опише¬мо її у розділі implementation модуля Unitl:

var

d: Real;

Друга помилка – це помилка, обумовлена неправильним синтаксисом оператора if: в цьому операторі пропущено службове слово then. Впишемо це слово після умови d < 0.

Останнє повідомлення – це узагальнююче повідомлення про наявність синтаксичних помилок.

Таким чином, ми виявили тільки дві помилки.

 

Рис. 5. Результат компіляції

Виконаємо повторну компіляцію. В результаті отримаємо повідомлення ще про одну помилку: [Error] Unitl.pas(51):  'END' expected but ')' found – очікувалося 'END', але знайдено')'.

Якщо клікнути мишкою над цим повідомленням, то курсор займе місце перед останньою закриваючою дужкою у рядку

+ FloatToStr((-b - Sqrt(d)) / 2 * а)));

Аналізуючи оператор (а він займає два рядки), виявляємо зайву закриваючу дужку. Знищимо дужку перед символом. Помічаємо також, що у наступному операторі має місце така ж сама помилка. Тому виправимо і цю помилку.

Відзначимо, що компілятор під час першого сеансу своєї роботи не виявив ці помилки. Більш того, під час другого сеансу була виявлена тільки одна помилка, хоч їх було дві.

Етап 4. Натиснемо інструментальну кнопку , запускаючи програму на виконання, і переконаємось, що компіляція пройде успішно і програма почне виконуватися. Якщо ввести значення а= 1, b = 2, с= 1, то ми переконаємося, що отримані корені, є правильними. Однак для а=1, b = 5, с = 2 будуть отримані неправильні корені. Тому треба вже шукати логічні помилки.

Етап 5. Відкриємо вікно Watches List (Ctrl+Alt+W), додамо в нього змінну d, поміс¬тимо курсор у рядок, наступний за обчисленням значення дискримінанта d, і натиснемо клавішу F4. Після введення вказаних вище значень коефіцієнтів переконуємося, що дискримінант обчислений невірно’ (у вікні Watches List виведено значення d, що дорівнює 9, замість 17). Помічаємо, що у тексті програми оператор

d := b * b - 4 * а * а;

неправильний. Виправляємо помилку:

d: = b * b – 4 * a * c;

Якщо виконати ті ж дії, що й раніше, то ми переконаємося, що тепер у вікні для змінної d буде виведене 0. Таким чином десь вище є логічна помилка, яку треба виправити.

Етап 6. Не перериваючи виконання програми, додамо у вікно Watches List змінні а, b, с (точніше, Forml.a, Forml.b, Forml.c). Бачимо, що змінна с має значення 0, хоч уведення її здійснювалося. У той же час змінна а має значення 2, хоч в неї уводилося значення 1. Для відшукання помилки, припиняємо виконання програми і натискаємо клавішу F8 для нового запуску програми у режимі налаштування. Після декількох натискань клавіші F8 (при цьому будуть по черзі забарвлюватися виконувані рядки) і введення вказаних трьох значень, ми помічаємо, що третій оператор уведення замість того, щоб записати значення 1 у замінну с, записав його у змінну а (це можна було побачити дещо раніше, але людина звичайно бачить ті значення, що явно виділяються – тут значення 0 у змінній с).

Вказану помилку можна було побачити ще після першої компіляції. Річ у тому, що тоді ми не звернули увагу на натяк, в якому вказувалося, що змінна с оголошена, але ніколи не використовується.

Таким чином, ми переконалися, що навіть натяк (Hint) може свідчити про помилку і треба звертати увагу не тільки на повідомлення про помилки, але й на попередження та натяки.

Таким чином, треба виправити оператор

а := StrToFloat(Edit3.Text);

записавши його так:

с := StrToFloat(Edit3.Text);

Якщо тепер запустити програму на виконання, то буде отриманий правильний результат, який однак ще не свідчить про відсутність логічних помилок, оскільки ми ще не перевіряли випадок відсутності коренів.

Етап 7. Запустимо програму на виконання і введемо тепер такі значення: а= 1, b = 2, с = 3. У цьому разі ми бачимо, що, з одного боку, програ¬ма виводить повідомлення про відсутність коренів, а, з другого боку, вона видає аварійне повідомлення.

Натискаючи декілька разів клавішу F8, бачимо, що оператори викону¬ються у потрібній послідовності, але після виведення повідомлення про від¬сутність коренів, здійснюється перехід до рядка, у якому обчислюється та ви¬водиться перший корінь, хоч цей рядок не повинен виконуватися. Справа в тому, що у програмі використаний невірний для цієї задачі формат оператора if.

Знищимо перед рядком, де виводиться перший корінь рівняння, символ «крапка з комою» і впишемо такий рядок:

else

Якщо тепер запустити програму на виконання, то ми побачимо, що помилка залишилася, але тільки по відношенню до другого кореня.

За допомогою клавіші F8 переконуємося у тому, що у програмі виконується оператор, який обчислює другий корінь рівняння, в той час як його виконання не повинне було мати місце. Справа у тому, що у цьому випадку два оператори

Меmo1.Lines.Add('  xl = '

+ FloatToStr((-b + Sqrt(d)) / 2 * a));

Memol.Lines.Add('  x2 = '

+ FloatToStr((-b - Sqrt(d)) / 2 * a)) ;

повинні розглядатися як один (так званий складений оператор), для чого їх треба укласти у операторні дужки begin - end.

 

Зробимо це і отримаємо такий текст процедури TForml.ButtonlClick:

 

procedure TForml.ButtonlClick(Sender: TObject) ;

begin

a := StrToFloat(Editl.Text);

b := StrToFloat(Edit2.Text);

с := StrToFloat(Edit3.Text);

d:=b*b-4*a*c;

if d < 0 then

Memo1.Lines.Add('The equation has no roots')

else begin

Memo1.Lines.Add('  x1 ='

+ FloatToStr((-b + Sqrt(d)) / 2 * a)) ;

Memo1.Lines.Add ('  x2 = '

+ FloatToStr((-b - Sqrt(d)) / 2 * a));

end ;

end ;

Запуск програми зі значеннями а = 1, b = 2, с = 3 тепер приведе до отримання правильного результату.

Етап 8. Запустимо програму на виконання і введемо нові значення коефіцієнтів: а=2, b=5, с=3. У цьому разі ми бачимо, що обчислені корені (х1=-4, х2=-6) знову є неправильними (повинні бути отримані зна¬чення х1=-1, х2=-1.5). Треба знову здійснювати покрокове виконан¬ня програми, натискаючи клавішу F8. Оскільки ми не передбачили змінні для запису коренів рівняння, прийдеться дивитися на результат, що виводиться на екран користувача. В результаті ми побачимо, що всі обчислення до виведення значення першого кореня виконуються правильно, а сам корінь є невірним. Висновок – є помилка у обчисленні кореня. Уважно подивившись на оператор, ми бачимо, що в ньому порушений порядок виконання операцій, а саме, оскільки операції множення та ділення мають один і той же пріоритет, при обчисленні кореня спочатку здійснюється ділення на 2, після чого отриманий результат помножується на а. Щоб отримати правильний результат, необхідно забрати знаменник  2 * а  у дужки, причому це, звісно, потрібно зробити і при обчисленні другого кореня.

Після виправлення тексту отримуємо правильний результат.

Таким чином, одноразове отримання правильного результату не дає гарантії того, що програма буде правильною. Остання помилка не проявлялася раніше, тому що для коефіцієнта а уводилося значення 1, яке не впливало на результат і у разі попадання цього значення у чисельник, і у разі попадання його у знаменник. Це ще раз говорить про необхідність ретельного підбору тестових даних та багаторазового тестування.

ЗАВДАННЯ НА ПРАКТИЧНУ РОБОТУ

Під час практичної роботи потрібно:

1. Повторити описані у наведеному вище прикладі дії, пов’язані зі створенням та налаштуванням нового додатка.

2. Виконати наведені нижче завдання, пов’язані з розробкою форми (див рис. 6) та набиранням тексту модуля для нового додатка, збережен¬ням його, збереженням з новим іменем, завантаженням проекту з диска, реда¬гуванням та налаштуванням програми.

Рис. 6. Вигляд форми для відтворення

Завдання 1

Створіть додаток, в якому повторіть наведений нижче текст опрацьовувача події OnClick кнопки Button1. З’ясуйте, що виконує програма.

 

procedure TForml.ButtonlClick(Sender: TObject);

var

a, b, c: Integer;

begin

a := StrToInt (Edit1. Text) ;

b := StrToInt(Edit2.Text);

if a > b then

Memo1.Lines.Add(‘1 - Yes’)

else

Memo1.Lines.Add(’1 - No');

c := a * b;

if c > 100 then

Memo1.Lines.Add('2 - Yes')

else

Memo1.Lines.Add('2 - No');

if a mod 2 = b mod 2 then

Memo1.Lines.Add('3 - Yes’)

else

Memo1.Lines.Add('3 - No');

end ;

 

Завдання 2

Нижче наведено код опрацьовувачем події OnClick кнопки Buttonl з син-таксичними помилками. На основі цього коду створіть Windows-додаток, у якому усуньте всі знайдені синтаксичні помилки.

procedure TForml.ButtonlClick(Sender: TObject);

var

a, b, c: Integer;

begin

a := StrToInt(Edit1.Text);

b := StrToInt(Edit2.Text);

if (a >< b) and (b >< 0) then begin

if a * b > 0 then

Memo1.Lines.Add('1 - Yes');

else

Memo1.Lines.Add('1 - No');

else

Memo1.Lines.Add('?') ;

end;

Завдання 3

Нижче наведено варіант коду, що нормує вектор і здійснює виведення результату. У коді містяться помилки. На основі наведеного коду створіть коректно працюючий застосунок.

procedure TForm1.Button1Click(Sender: TObject);

var

a, b, c, d: Real;

begin

a := StrToFloat(Edit1.Text);

a := StrToFloat(Edit2.Text);

c = Sqrt(a * a + b * b);

a = a / d;

b = b / d;

Memo1.Lines.Add(FloatToStr(a) + '  ' + FloatToStr(b));

end;

ВИМОГИ ДО ЗВІТУ

У звіті з практичної роботи (надрукованому на принтері) повинні бути відображені:

  1. Тема роботи. 
  2. Мета роботи.
  3. Короткі теоретичні відомості по темі.
  4. Текст і результати роботи програм.
  5. Висновки по роботі.

КОНТРОЛЬНІ ЗАПИТАННЯ

  1. Які дії треба виконати для створення нового додатка?
  2. Яке призначення основних вікон інтегрованого середовища Delphi?
  3. Яке призначення вікна Дизайнера форми?
  4. Яке призначення вікна коду?
  5. Яке призначення вікна Інспектора об’єктів?
  6. Яке призначення вікна Дерева об’єктів?
  7. Як поділяються помилки у програмі? Опишіть їх особливості.
  8. Опишіть структуру модуля форми.
  9. Що відслідковується при покроковому виконанні програми?
  10. У чому полягає відмінність режимів покрокового виконання Trace Into та Step Over?
  11. Що таке «виконання до курсору»?
  12. Що таке точка переривання і як вона встановлюється та видаляється?
  13. У чому відмінність точки переривання і виконання до курсору?
  14. Чи можна одночасно встановити декілька точок переривання?
  15. Для чого використовується вікно Watches List?

1

docx
Додано
4 березня 2021
Переглядів
1922
Оцінка розробки
Відгуки відсутні
Безкоштовний сертифікат
про публікацію авторської розробки
Щоб отримати, додайте розробку

Додати розробку