Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование delphi.doc
Скачиваний:
806
Добавлен:
09.02.2015
Размер:
2.97 Mб
Скачать

Отладка программы. При построении сложных программ могут возникать ошибки. Их принято делить на 3 группы:

  1. синтаксические;

  2. ошибки времени выполнения;

  3. алгоритмические.

Наиболее простые из них синтаксические – ошибки набора текста – они исправляются в процессе компиляции программы. Ошибки времени выполнения – ошибки, возникающие при несоответствии типов введенных параметров типам используемых переменных, или ошибки вычислений (например, деление на 0) – отслеживаются также легко уже при первых запусках программы. Будем считать, что программа запускается из оболочки Delphi. После возникновения такой ошибки необходимо нажать «Ok» в окне сообщения об ошибке, а затем завершить выполнение программы – пункт меню «Run/Program reset» или нажать комбинацию клавиш <Ctrl><F2>. При возникновении такой ошибки курсор в программе будет указывать на строку, вызвавшую ошибку. Наиболее сложно обнаружить алгоритмические ошибки. Программа компилируется без ошибок, не дает ошибок при пробных запусках, но при анализе результатов выясняется, что результат неправильный. Необходимо вручную «прокрутить» алгоритм – требуется отладка программы.

Для трассировки программы (проверка «логики алгоритма»), т. е. выполнения программы по шагам, необходимо выполнить следующие действия. В пункте меню выбрать пункт «Run/Step over» или «Run/Trace in to» (клавиши <F8> и <F7> соответственно), команда «Run/Trace in to» отличаются более детальной трассировкой. Для прекращения трассировки и продолжения выполнения программы в автоматическом режиме необходимо выбрать пункт «Run/Run» или нажать <F9>. Остановить программу можно с помощью команды «Run/Program reset» или нажать комбинацию клавиш <Ctrl><F2>. Иногда необходимо выполнить трассировку с определенной строки программы. Для этого курсор подводят к интересующей строке и выполняют команду «Run/Run to cursor» или нажимают <F4>. Часто известно возможное место ошибки в алгоритме – тогда используют точку останова. Программист устанавливает на нужной строке курсор и ставит там точку останова с помощью команды «Run/Add Breakpoint» или нажав <F5>. Выбранная строка будет отмечена. Для снятия точки останова необходимо на этой строке снова нажать <F5>. При выполнении программа дойдёт до точки останова, затем программист сможет трассировать программу с помощью <F7> и <F8>. При необходимости можно указать условие остановки на точке останова (эта настройка осуществляется в окне «Breakpoints», пункт меню «Run/Add breakpoints»).

При выполнении программы по шагам часто необходимо не только проверять правильность «логики алгоритма», но и знать значения некоторых переменных. Для этого выполняют команду «View/Watch/Add watch» и вводят имя интересующей переменной либо подводят курсор к переменной, значение которой необходимо просмотреть, и нажимают <Ctrl><F5>. При трассировке программы в этом случае в окне «Watch list» можно наблюдать изменение значений интересующих переменных.

3.2. Создание программы «Степенные ряды»

Задача. Необходимо рассчитать значения функций ex и ln(x), заданных с помощью рядов, с определенной точностью. Точность и аргумент функции вводятся с клавиатуры. Результат работы сравнить со значениями стандартных функций.

Формулы разложения в ряд экспоненты и логарифма представлены в табл. 3.4.

Таблица 3.4

Функция

Разложение в ряд

Стандартная функция

Замечания

exp(x)

Exp(x)

ln(x)

Lnxp1(x+1)

Необходим модуль Math

|x|<1

Примерный вид окна программы представлен на рис. 3.4.

Процесс создания программы происходит по следующему алгоритму:

  1. Запустить Delphi.

  2. Сохранить проект как «Work3», модуль – «Main».

  3. Изменить свойства окна: заголовок «Степенные ряды»  Caption.

  4. Создать поля ввода для значенийX и погрешности Е. Считать, что все числа целые, порядок чисел задавать программно:

  • взять 2 элемента SpinEdit, вкладка Samples, значок ;

  • назвать (свойство Name) один SEValueX – для ввода X, другой SEValueEввод E;

  • настроить минимальные значения элементов на 0  MinValue;

  • настроить максимальное значение для элемента SEValueX9, для SEValueE – 14  MaxValue;

  • изменить шаг дискретизации на 1  Increment.

  1. Добавить 2 элемента для вывода результатов – функция, рассчитанная с помощью ряда, и функция, рассчитанная с помощью стандартной функции:

  • добавить 2 элемента Edit, вкладка Standard, значок ;

  • назвать элементы (свойство Name) для вывода рассчитанной функции ERFun, для стандартной ESFun. Изменить свойство Text на 0 (по умолчанию результат равен «0»);

  • добавить метки для обозначения вводимых и выводимых величин:

  • изменить заголовки (Caption) меток:

  • для поля ввода X – «Введите Х»;

  • для ввода погрешности «Введите погрешность 10^-Е» (погрешность вводить как количество знаков после запятой, например, число 3 будет обозначать погрешность 0.001);

  • для вывода расчетного значения – «Рассчитанная функция»;

  • для вывода стандартного значения функции – «Стандартная функция».

  1. Так как будут рассчитываться 2 функции, добавить переключатель – какая функция рассчитывается:

  • добавить элемент RadioGroup, вкладка Standard, значок ;

  • изменить название на RG Name;

  • изменить заголовок на «Функция»  Caption;

  • добавить названия функций «Экспонента» и «Логарифм», запустив мастер свойства Items:

    • ввести 2 строки: «Экспонента» и «Логарифм»;

    • установить активным первый элемент (нумерация начинается с 0)  ItemIndex установить в 0.

  1. Добавить 2 кнопки для выхода из программы и для начала расчета:

  • добавить элемент Button, вкладка Standard, значок ;

  • кнопки назвать: кнопка выхода BQuit, кнопка расчета BOk Name;

  • изменить заголовки на «Выход» и «Ok»  Caption.

  1. Окно готово!

  2. Запрограммировать выход на кнопку BQuit (команда Close);

  3. Запрограммировать расчет на кнопке BOk: расчет будет осуществлен для функции, которая отмечена элементом RG. Первой является функция «экспонента»:

  • проанализировать ряд, по которому осуществляется расчет функции, и выявить, как получить элемент ряда an, зная элемент an-1. Для расчета экспоненты необходимо элемент ряда умножить на «x / n»;

  • для расчета функции потребуются следующие переменные: для хранения значения функции – переменная Func вещественного типа (тип Real); переменные а и а1 для хранения соответственно n-го и n+1-го членов ряда (также тип Real); переменная е (тип Real) для хранения точности расчета; переменная x (тип Real) для удобства записи формул; переменная n (тип Integer) – счетчик цикла. Эти переменные необходимо описать в разделе var процедуры нажатия на кнопку «Оk». Текст процедуры примет вид:

procedure TForm1.BOkClick(Sender: TObject);

var

Func : real;

A,A1 : real;

e : real;

x : real;

n : integer;

  • присвоить значению переменной x значение элемента SEValueX (свойство Value). При расчете точности необходимо в цикле умножать переменную e на число 0.1 столько раз, сколько требуется знаков после запятой (данное число содержит элемент SEValueE). Для этого после начала процедуры (оператор begin) ввести следующие строки:

x := SEValueX.Value;

e := 1;

For n := 1 to SEValueE.value do e := e * 0.1;

  • выяснить, какая функция рассчитывается, можно по переменной RG.ItemIndex: если она равна 0, то рассчитывается функция «экспонента», а 1 – «логарифм». Для решения такой задачи удобно использовать оператор выбора Case. После расчета точности необходимо добавить:

case RG.ItemIndex of

0 : begin

{Расчет экспоненты}

end;

1 : begin

{Расчет логарифма}

end;

end; {Case}

  • для расчета функции можно использовать оператор цикла с постусловием, так как данная функция может быть рассчитана как минимум один раз. Условием выхода из цикла будет тот факт, что значение очередного члена ряда станет меньше заданной точности. После комментария {Расчет экспоненты} добавить строки:

Func := 1;

a := 1;

n := 1;

repeat

a1 := a * x /n;

Func := Func + a1;

a := a1;

Inc(n);

until(a<e);

  • для вывода результатов расчета необходимо преобразовать числа в строки, так как полем ввода/вывода элемента Edit является строка. После окончания цикла (строка end {Case}) необходимо добавить следующие строки:

ERFun.Text := FloatToStr(Func);

ESFun.Text := FloatToStr(Exp(x));

  1. Расчет экспоненты окончен! Запустить программу, нажав <F9>.

  2. Для улучшения программы:

  • необходимо написать текст расчета функции «логарифм». Так как ряд использует в качестве аргумента x+1, удобно использовать функцию Lnxp1, которая также возвращает натуральный логарифм числа (х+1). Для этого требуется подключить к программе модуль Math. Это можно сделать в разделе описания модулей после слова implementation. Необходимо добавить:

Uses

Math;

  • для автоматического расчета после ввода значений в поля ввода (без нажатия на кнопку «Ok») необходимо назначить элементам SEValueX и SEValueE событие onChange кнопки BOk и сделать невидимой кнопку BOk (эти задачи рассмотрены в 2.2).