Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Основы программирования в Delphi. Учебно-методическое пособие
.pdf
Основы программирования в Delphi
Здесь между except и else приводится список нескольких стандартных типов ситуаций между ключевыми словами on...do и соответствующих каждому
из них операторов-обработчиков, выполняемых, если возникает эта ситуация.
...
try
<последовательность защищенных операторов>
finally
<последовательность операторов, которые выполняются всегда, неза-
висимо от того перехвачена ситуация или нет>
end;
<следующий оператор>
...
Эти блоки отличаются друг от друга лишь способом обработки перехва-
ченной в исключительной ситуации. Если все операторы в последовательности
выполнялись без возникновения исключительной ситуации, то в блоке Except
управление передается на следующий оператор, в блоке finally на оператор,
следующий за словом finally. Если при выполнении одного из защищенных
операторов возникла исключительная ситуация, то следующие за ним защи-
щенные операторы пропускаются, причем в блоке finally управление передается
опять на оператор, следующий за словом finally. В блоке же Exception управление передается тому оператору-обработчику, тип исключительной ситуации которого соответствует возникшей ситуации, и после его выполнения - следующему оператору. Если в списке операторов-обработчиков не обнаружен тип
возникшей ситуации, то управление передается операторам, стоящим между
else...end. Если при этом область else отсутствует, то выполняется стандартная
обработка ситуации, предусмотренная в среде Delphi. Следует учитывать, что
поиск нужного обработчика осуществляется с начала списка вниз до первого,
соответствующего. Поэтому, если в списке имеется несколько типов ситуаций,
соответствующих возникшей, то выполняется обработчик, встретившийся первым.
Если для составителя программы важен лишь сам факт возникновения ис-
ключительной ситуации, то возможна следующая программная конструкция:
...
try
<последовательность защищенных операторов>
except
<операторы, которые выполняются при возникновении ИС>
61

Основы программирования в Delphi
end;
...
, которая отличается от блока finally тем, что область <операторы…> здесь вы-
полняется только в случае возникновения исключительной ситуации. Защищенные блоки могут вкладываться друг в друга на любую глубину, причем в
любой области, где возможно вставить оператор try...end.
Пример. Программа с обработкой исключительных ситуаций. Про-
стейший калькулятор (Рис. 7.1).
Рис. 7.1 Обработка исключений в Delphi 7
Листинг программы, в котором приведены обработчики нажатия всех пя-
ти кнопок приложения следующий:
procedure TForm1.FormCreate(Sender: TObject);
begin
Edit1.Clear;
Edit2.Clear;
end;
procedure TForm1.Button1Click(Sender: TObject);
var a,b,c:byte;
begin
62

Основы программирования в Delphi
try
a:=StrToInt(Edit1.text);
b:=StrToInt(Edit2.text);
c:=a+b;
label2.Caption:=IntToStr(c);
except
on Erangeerror do MessageDlg('Результат вычисления выходит за'+
' пределы диапазона допустимых значений',mtError,[mbOk],0);
on Econverterror do MessageDlg('Проверьте'+
' значения в edit', mtError, [mbOk],0);
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
var a,b,c:byte;
begin
try
a:=StrToInt(Edit1.text);
b:=StrToInt(Edit2.text);
c:=a-b;
label2.Caption:=IntToStr(c);
except
on Erangeerror do MessageDlg('Результат вычисления выходит за'+
' пределы диапазона допустимых значений', mtError, [mbOk],0);
on Econverterror do MessageDlg('Проверьте'+
' значения в edit', mtError, [mbOk],0);
end;
end;
procedure TForm1.Button3Click(Sender: TObject);
var a,b,c:byte;
begin
try
a:=StrToInt(Edit1.text);
b:=StrToInt(Edit2.text);
c:=a*b;
label2.Caption:=IntToStr(c);
63

Основы программирования в Delphi
except
on ERangeerror do MessageDlg('Результат вычисления выходит за'+
' пределы диапазона допустимых значений',
mtError,[mbOk],0);
on EConverterror do MessageDlg('Проверьте'+
' значения в edit', mtError, [mbOk],0);
end;
end;
procedure TForm1.Button4Click(Sender: TObject);
var a,b,c:extended;
begin
try
a:=StrToFloat(Edit1.text);
b:=StrToFloat(Edit2.text);
c:=a/b;
label2.Caption:=FloatToStrf(c, fffixed, 8, 2);
except
on EZeroDivide do MessageDlg('Нельзя делить на нуль!!!', mtError,[mbOk],0);
on Econverterror do MessageDlg('Проверьте'+
' значения в edit', mtError, [mbOk],0);
end;
end;
КОНТРОЛЬНЫЕ ВОПРОСЫ
1. Что такое исключительная ситуация?
2. Какие исключительные ситуации могут возникнуть при составлении про-
грамм?
3. Перечислите основные операторы Delphi для обработки исключительных си-
туаций.
64

Основы программирования в Delphi
65

Основы программирования в Delphi
8. ПРОГРАММИРОВАНИЕ С ИСПОЛЬЗОВАНИЕМ РЕКУРСИИ
Рекурсивным называется описание объекта или процесса, частично состоящее и определяемое с помощью самого описываемого объекта или процесса.
Рекурсия - это способ организации вычислительного процесса, при котором
программа (функция или процедура) в ходе выполнения обращается сама к себе.
Классическим примером является вычисление факториала числа:
n! = 1*2*3…(n-1)*n.
Рекурсивное описание вычисления факторила выглядит следующим образом:
n!=(n-1)!*n, 0! = 1.
1. Рекурсивная функция:
function factorial(n:word):extended;
begin
if n=0 then result:=1
else result:=factorial(n-1)*n
end;
Примечание: Тип результата вычислений (extended) выбран из за боль-
шего диапазона допустимых значений быстрорастущей функции n!.
2. Нерекурсивная функция:
function factorial(n:word):extended;
var k:word;
begin
result:=1;
if n>1 then for k:=2 to n do
result:=result*k;
end;
При выполнении рекурсивной программы осуществляется многократный
переход от текущего уровня организации алгоритма к нижнему уровню после-
довательно, до тех пор, пока не будет получено тривиальное решение задачи.
Рекурсивная форма записи алгоритма обычно выглядит изящнее итерационной
66

Основы программирования в Delphi
и дает более компактный программный код, но при выполнении работает го-
раздо медленнее и может вызвать переполнение программного стека.
Рекурсивный вызов может быть прямым, как в вышеприведенном примере,
и косвенным. В этом случае подпрограмма обращается к себе опосредованно,
то есть путем вызова другой подпрограммы, в которой содержится обращение к
первой.
Procedure P1(<список параметров 1>);
Forward;
Procedure P2(<список параметров 2>);
begin
...
P1(<список параметров 1>);
...
end;
Procedure P1;
begin
...
P2(<список параметров 2>);
...
end;
В этом примере обращение к процедуре P1() записано раньше, чем ее
описание, что недопустимо в языке программирования Delphi. Для разрешения
этой ситуации используется опережающее описание с помощью директивы
Forward.
Примечание. Для предотвращения зацикливания рекурсивной подпро-
граммы необходимо предусмотреть обязательный выход на тривиальное решение, то есть на ветвь, не содержащую обращение подпрограммы к самой
себе.
Примеры рекурсивных вычислений.
1. Найти максимальный элемент в массиве используя метод деления массива
пополам max (a1 …an ) = max(max ( a1 …a
), max( a
n/2
n/2+1
…an ))
type vek=array[1..50] of extended;
function maxR(x:vek; m,n:integer):extended ;
67

Основы программирования в Delphi
var k:integer;
begin
if m=n then result:=x[m]
else begin k:=(m+n) div 2;
if maxR(x,m,k)>maxR(x,k+1,n)
then result:=maxR(x,m,k)
else result:=maxR(x,k+1,n);
end;
end;
2. Найти максимальный элемент в массиве используя очевидное соотношение:
max (a1…an ) = max(max(a1…a
n-1
), an)
function maxRn(x:vek; n:integer):extended;
begin
if n=1 then result:=x[1]
else if maxRn(x,n-1)>x[n] then result:=maxRn(x,n-1)
else result:=x[n];
end;
Пример. Рассмотрим небольшой пример нахождения максимального
элемента одномерного массива двумя способами: обычным и рекурсивным.
Внешний вид работающего приложения показан на рис. 8.1
68

Основы программирования в Delphi
Рис. 8.1 Использование рекурсии в Delphi
Листинг приложения соответственно выглядит следующим образом:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Grids, StdCtrls;
type
TForm1 = class(TForm)
Edit1: TEdit;
Label1: TLabel;
Button1: TButton;
StringGrid1: TStringGrid;
Button2: TButton;
Label2: TLabel;
Label3: TLabel;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
69

Основы программирования в Delphi
public
{ Public declarations }
end;
type vek=array[1..50] of byte;
var Form1: TForm1;
a:vek;
n,k:integer;
implementation
{$R *.dfm}
function maxRn( x:vek; n:integer ):byte;
begin
if n=1 then result:=x[1]
else
if maxRn(x,n-1)>x[n] then result:=maxRn(x,n-1)
else result:=x[n];
end;
function max( x:vek; n:integer ):byte;
begin
result:=x[1];
for k:=1 to n do
if x[k]>result then result:=x[k];
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
n:=5; edit1.Text:=inttostr(n);
StringGrid1.colcount:=n;
randomize;
for k:=0 to n-1 do
StringGrid1.cells[k,0]:=inttostr(random(100));
end;
procedure TForm1.Button1Click(Sender: TObject);
begin // Изменить
n:=strtoint(edit1.Text);
StringGrid1.colcount:=n;
randomize;
for k:=0 to n-1 do
StringGrid1.cells[k,0]:=inttostr(random(100));
70
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
