Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ООП всі лабораторні.doc
Скачиваний:
2
Добавлен:
28.08.2019
Размер:
1 Мб
Скачать
☆

3.1.2. Відладка логічних помилок

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

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

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

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

Кількість тестів і їх складність залежать від алгоритму. Комплекс тестів повинен бути таким, щоб всі гілки схеми алгоритму були пройдені, принаймні, по одному разу. Неспівпадання результатів, що видаються додатком з результатами тестів, – ознака наявності помилок. Ці помилки виявляються в тому, що результат розрахунку виявляється невірним або відбувається переповнювання, ділення на 0 і ін.

Для локалізації місця помилки рекомендується поступати таким чином. У вікні Редактора Коди встановіть курсор в рядку перед підозрілою ділянкою і натисніть клавішу F4 (виконати до курсору). Виконання додатка буде зупинено на тому рядку модуля, в якому був встановлений курсор. Поточне значення будь-якої змінної можна побачити, якщо накрити курсором ідентифікатор змінної на 1-2 сек. Натискаючи клавішу F8 (покрокове виконання), можна відрядковий виконувати програму, контролюючи вміст змінних і правильність обчислень.

3.2. Приклад створення додатка

Завдання: створити Windows-додаток, який виводить таблицю значень функції і її розкладання в ряд у вигляді суми

для значень x від xn до xk з кроком h=(xk - xn)/10.

У панелі інтерфейсу передбачити можливість управління виведенням початкових даних і погрішності обчислень.

Один з можливих варіантів панелі інтерфейсу створюваного застосування показаний на рис.3.1.

3.2.1. Розміщення компонентів на Формі

Замість компонента Edit використовуваний компонент SpinEdit, який забезпечує відображення і редагування цілого числа з можливістю його зміни за допомогою подвійної кнопки.

Рис. 3.1

Компонент SpinEdit знаходиться на сторінці Samples Палітри Компонентів. У тих випадках, коли об'єм інформації, що виводиться, перевищує розмір поля компонента Memo, доцільно забезпечити його лінійками прокрутки. У властивості ScrollBars компонента Memo1 встановимо значення ssVertical – з'явиться вертикальна лінійка прокрутки. Привласнимо модулю ім'я UnCiklAlg.

3.2.2. Текст модуля UnCiklAlg

Unit UnCiklAlg;

interface

uses

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

StdCtrls, ExtCtrls, Spin;

type

TForm1 = class(TForm)

Memo1: TMemo;

Button1: TButton;

Label1: TLabel;

Label2: TLabel;

Label3: TLabel;

Edit1: TEdit;

Edit2: TEdit;

SpinEdit1: TSpinEdit;

CheckBox1: TCheckBox;

CheckBox2: TCheckBox;

CheckBox3: TCheckBox;

procedure FormCreate(Sender: TObject);

procedure Button1Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);

begin

SpinEdit1.text:='3'; // початкове значення N

Edit1.text:='0.1'; // початкове значення Xn

Edit2.text:='2.0'; // початкове значення Xk

Memo1.Clear;

Memo1.Lines.Add('Лабораторна робота №3 - Циклічний алгоритм');

end;

procedure TForm1.Button1Click(Sender: TObject);

var xn,xk,x,h,c,s,y,al,del:extended;

n,k:integer;

begin

n:=StrToInt(SpinEdit1.Text);

xn:=StrToFloat(Edit1.Text);

xk:=StrToFloat(Edit2.Text);

if CheckBox1.Checked then

Memo1.Lines.Add(‘Початкові дані: n=’+IntToStr(n)+

' Xn='+FloatToStrF(xn,ffFixed,6,1)+

' Xk='+FloatToStrF(xk,ffFixed,6,1));

h:=(xk-xn) *0.1; // крок h

x:=xn;

repeat // цикл по x

c:=-x*x*0.5;

S:=1;

for k:=1 to n do

begin

s:=s+c*(2*k*k+1);

c:=-c*x*x/((2*k+1)*(2*k+2));

end;

y:=(1-x*x*0.5)*cos(x)-0.5*x*sin(x);

if CheckBox2.Checked then

if CheckBox3.Checked then

begin

al:=s-y; // абсолютна погрішність

del:=abs((s-y)/y)*100; // відносна погрішність

Memo1.Lines.Add('x='+FloatToStrF(x,ffFixed,6,2)+

' S='+ FloatToStrF(s,ffFixed,6,3)+

' Y='+ FloatToStrF(у,ffFixed,6,3)+

' A='+ FloatToStrF(al,ffFixed,6,3)+

' D='+ FloatToStrF(del,ffFixed,6,0)+'%');

end

else

begin

al:=s-y;

Memo1.Lines.Add('x='+FloatToStrF(x,ffFixed,6,2)+

' S='+ FloatToStrF(s,ffFixed,6,3)+

' Y='+ FloatToStrF(у,ffFixed,6,3)+

' A='+ FloatToStrF(al,ffFixed,6,3));

end

else

if CheckBox3.Checked then

begin

del:=abs((s-y)/y)*100;

Memo1.Lines.Add('x='+FloatToStrF(x,ffFixed,6,2)+

' S='+ FloatToStrF(s,ffFixed,6,3)+

' Y='+ FloatToStrF(у,ffFixed,6,3)+

' D='+ FloatToStrF(del,ffFixed,6,0)+'%');

end

else

Memo1.Lines.Add('x='+FloatToStrF(x,ffFixed,6,2)+

' S='+ FloatToStrF(s,ffFixed,6,3)+

' Y='+ FloatToStrF(у,ffFixed,6,3));

x:=x+h;

until x>xk;

end;

end.