Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Delphi -Мет по лабраб_ Часть_2.doc
Скачиваний:
3
Добавлен:
01.07.2025
Размер:
2 Мб
Скачать
☆
      1. Отладка логических ошибок

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

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

Составление тестов – непростая задача. Тесты должны быть с одной стороны, достаточно простыми, чтобы результат легко проверялся, с другой стороны – достаточно сложными, чтобы комплексно проверить алгоритм.

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

Количество тестов и их сложность зависят от алгоритма. Комплекс тестов должен быть таким, чтобы все ветви схемы алгоритма были пройдены, по крайней мере, по одному разу. Несовпадение результатов, выдаваемых приложением с результатами тестов – признак наличия ошибок. Эти ошибки проявляются в том, что результат расчета оказывается неверным либо происходит переполнение, деление на 0 и другие ошибки.

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

Итерационные циклы

Большое место среди циклов с неизвестным числом повторений занимают циклы, когда в процессе повторения тела цикла образуется последовательность значении y1, y2,…,yn,…, сходящаяся к некоторому пределу а, т. е.

.

Каждое новое значение уn в такой последовательности определяется с учетом предыдущего уn-1 и является по сравнению с ним более точным приближением к искомому результату (пределу) а. Циклы, реализующие такую последовательность приближений (итераций), называются итерационными.

В итерационных циклах условие продолжения (окончания) цикла основывается на свойстве безграничного приближения значений уn к пределу а при увеличении n. Итерационный цикл заканчивают, результат отождествляют со значением уn, т.е. считают, что уn ≈ а, если для некоторого значения n выполняется условие

,

где ε – допустимая погрешность вычисления результата.

Типичным примером итерационного циклического процесса может служить задача вычисления суммы бесконечного ряда. Понятие суммы связано с понятием сходимости бесконечного ряда. Бесконечный ряд значений t0, t1, ..., tn, ... называется сходящимся, если сумма sn = t0 + t1, ...,tn,… его первых (n + 1) слагаемых при беспредельном возрастании n стремится к некоторому пределу S, который и называется суммой ряда, т. е.

; .

Общий член tn сходящегося ряда при этом стремится к нулю, т. е.

; .

Следовательно, последовательность s1, s2, ..., sn, ... является искомой последовательностью значений и определяет следующее условие окончания суммирования:

или .

Пример.

Вычислить с погрешностью ε=10-4 значение функции s=cos(x), используя разложение в ряд:

,

где .

Для решения задачи необходимо, во-первых, определить значение очередного слагаемого tn, во-вторых, осуществлять накопление суммы по итерационной формуле:

.

Для определения tn в данном примере из-за наличия факториала целесообразно использовать не прямое вычисление, а рекуррентное соотношение: .

Подставим в формулу, определяющую tn, вместо n величину (n-1):

.

Определим сомножитель :

.

Напомним, что m!=1·2·…·m, поэтому

.

Начальное значение t0=1 находится подстановкой в формулу для общего члена tn при n=0.

procedure TForm1.Button1Click(Sender: TObject);

var

eps, s, t, f, x, y: real;

n: integer;

begin

eps:=StrToFloat(Edit1.Text);

x:=StrToFloat(Edit2.Text);

s:=0;

t:=1;

n:=1;

while abs(t)>eps do

begin

s:=s+t;

f:=-sqr(x)/(2*n*(2*n-1));

t:=t*f;

n:=n+1

end;

y:=cos(x);

Memo1.Lines.Add('S= '+FloatToStr(s)+' Y= '+FloatToStr(y))

end;

end.

Так как надобности в запоминании значений всех слагаемых tn и промежуточных сумм sn нет, то в программе используются простые переменные: s – очередное значение суммы ряда, t – очередное значение члена ряда, f – очередное значение сомножителя .

Для проверки полученного результата осуществляется вызов стандартной функции cos(x), значение которой присваивается переменной y. Для организации цикла с предусловием, в котором условие является условием продолжения цикла.