Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Основы программирования в Delphi. Учебно-методическое пособие

.pdf
Скачиваний:
0
Добавлен:
07.09.2026
Размер:
1 Мб
Скачать
☆
Основы программирования в 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
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]