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

11.Исключения

Подготовка к работе

  1. По рекомендованной литературе изучить класс исключений и их обработку.

  2. Разработать алгоритмы решения задач.

  3. Составить программы решения задач.

Контрольные вопросы

  1. Что такое исключение?

  2. Классы исключений и их свойства.

  3. Оператор tryexcept. Назначение, структура и применение.

  4. Оператор tryfinally. Назначение, структура и применение.

  5. Глобальные и локальные обработчики исключений.

  6. Обработчик исключения ondo.

  7. Исключение EZeroDivide.

  8. Исключение ERangeError.

  9. Как включить отработку исключения ERangeError.

  10. Как отключить перехват исключения системой.

Задание к работе

  1. Создать программу, обрабатывающую исключения с использованием оператора tryexcept. Проект – консольное приложение.

  2. Создать программу, обрабатывающую исключение с использованием оператора tryfinally. Проект – консольное приложение.

В заданиях надо рассчитывать функции f1(x) и f2(x) при x = i*h. i - индекс цикла (целые числа в интервале -10...10). Шаг изменения h. Варианты заданий приведены в табл. 11 .10.

табл. 11.10. Варианты заданий

Функция 1

Функция 2

f1(x)

h1

тип

f2(x)

h2

тип

1

1/x

/5

real

200+x

10

byte

2

1/sin(x)

/5

single

(300+x)*50

100

word

3

1/cos(x)

/5

extended

300+x

10

shortint

4

tg(x)

/5

real

(200+x)*200

10

smallint

5

ctg(x)

/5

single

100+x

15

byte

6

1+1/x

/10

extended

(300-x)*50

20

word

7

2+1/sin(x)

/10

real

50+x

30

shortint

8

3+1/cos(x)

/10

single

200+x

10

smallint

9

4+tg(x)

/10

extended

250+x

50

byte

10

5+ctg(x)

/10

real

200-x

30

word

11

1-1/x

/20

single

200+x

10

shortint

12

2-1/sin(x)

/20

extended

(200+x)*200

10

smallint

13

3-1/cos(x)

/20

real

400+x

100

byte

14

4- tg(x)

/20

single

200+x

10

word

15

5-ctg(x)

/20

extended

100-x

30

shortint

Необходимо отслеживать два исключения:

    • Деление на 0 (исключение EZeroDivide).

    • Выход за пределы диапазона (исключение ERangeError).

Внимание:

Встроенный отладчик Delphi перехватывает все исключительные ситуации и формирует свои сообщения о них в диалоговом окне, которое пользователь перед продолжением программы должен закрыть. Чтобы избежать этого, следует отменить использование отладчика, сбросив флаг «Встроенный отладчик» в окне команды Сервис=>Опции отладчика.

Чтобы отслеживать исключения в операциях с числами, необходимо в окне команды Проект=>Опции... на вкладке «Компилятор» установить флаги директив компилятора:

  • Проверка области.

  • Проверка ввода/вывода.

  • Проверка переполнения.

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

Пример выполнения

Вариант задания:

  • f1(x) = 1/sin(x), h1 = /8, тип данных для f1(x) Real.

  • f2(x) =100+x, h2 = 20, тип данных для f2(x) Byte

Задание 1

Создать программу обработки исключений, использующую оператор tryexcept. Проект – консольное приложение. Окно работающего приложения задания 1 показано на рис. 11 .25 для трех вариантов: исключений нет, ошибка деления на 0, ошибка диапазона.

Листинг программы

program Prg_11_1;

{$APPTYPE CONSOLE}

uses

SysUtils,RusTrans;

const

h1=pi/8;

h2=20;

var

f:boolean=false;

i,imax,imin,i_error:integer;

y:array[-10..10] of real;

b:array[-10..10] of byte;

begin

writeln(Rus('Введите Imin и Imax в пределах -10...10'));

write(' Imin=');

readln(imin);

write(' Imax=');

readln(imax);

try

for i:=imin to imax do

begin

i_error:=i; // i, если ошибка

y[i]:=1/sin(i*h1);

end;

for i:=imin to imax do

begin

i_error:=i; // i, если ошибка

b[i]:=100+i*h2;

end;

except

on EZeroDivide do

begin

writeln(Rus('Деление на 0'));

writeln(Rus('при i='),i_error);

f:=true;

end;

on ERangeError do

begin

writeln(Rus('Ошибка диапазона'));

writeln(Rus('при i='),i_error);

f:=true;

end;

end;

if not f then writeln('OK');

readln;

end.

рис. 11.25. Окно работающего приложения задания 1

Задание 2

Создать программу обработки исключений, использующую оператор tryfinally. Проект – консольное приложение.

Листинг программы

program Prg_11_2;

{$APPTYPE CONSOLE}

uses

SysUtils,RusTrans;

const

h1=pi/6; //шаг для f1

h2=40; //шаг для f2

var

f:boolean=false; //флаг ошибки

i,Imin,Imax,i_error,dy:integer;

s:string;

y:array[-10..10] of real;

b:array[-10..10] of byte;

begin

writeln(Rus('Введите Imin и Imax в пределах -10...10'));

write(' Imin=');

readln(imin);

write(' Imax=');

readln(imax);

try //Секция Try

for i:=Imin to Imax do //Начало оператора 1

begin

i_error:=i; // i, если ошибка

if sin(i*h1)=0

then

begin

f:=true; //Установить флаг ошибки

writeLn(Rus('Деление на 0')); // Об ошибке

writeln(Rus('при i='),i_error);

end

else f:=false;

y[i]:=1/sin(i*h1);

end;

for i:=Imin to Imax do //начало оператора 2

begin

i_error:=i; //i, если ошибка

dy:=i*h2;

if (dy<-30) or (dy>225)

then

begin

f:=true; //Установить флаг ошибки

writeLn(Rus('Ошибка диапазона')); // Об ошибке

writeln(Rus('при i='),i_error);

end

else f:=false;

b[i]:=30+i*h2;

end;

finally //Секция Finally

if not f then writeln('OK'); //OK, если ошибок нет

end; //Конец Try...Finally

readln; //Пауза

end.

Окно работающего приложения задания 2 в целом совпадает с окном задания 1. Однако оператор tryfinally не обрабатывает исключение. Поэтому при возникновении ошибки срабатывает системный обработчик исключения и выдает свое сообщение, показанное на рис. 11 .26.

рис. 11.26. Сообщение системного обработчика исключений в задании 2

Выводы

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

  2. Встроенный отладчик Delphi перехватывает все исключительные ситуации и формирует свои сообщения о них в диалоговом окне, которое пользователь перед продолжением программы должен закрыть. Чтобы избежать этого, следует отменить использование отладчика, сбросив флаг «Встроенный отладчик» в окне команды Сервис=>Опции отладчика.

  3. Чтобы отслеживать исключения в операциях с числами, необходимо в окне команды Проект=>Опции... на вкладке «Компилятор» установить флаги директив компилятора: Проверка области, Проверка ввода/вывода, Проверка переполнения.

  4. Для обработки исключений используются обработчики исключений (глобальные и локальные). Глобальные обработчики определены в ИСР и вызываются автоматически, если отладчик подключен. Локальные обработчики создает пользователь.

  5. Для локальной обработки исключений определен оператор tryexceptend. В секции try размещаются операторы, в которых могут возникнуть исключения, а в секции except обработчики исключений. При обнаружении исключения исполнение операторов секции try прекращается, управление передается нужному обработчику в секции except.

  6. Обработчик исключения имеет формат on <исключение> do <оператор> end.

  7. Для обнаружения исключений определен оператор tryfinally. В секции try размещаются операторы, в которых могут возникнуть исключения, а в секции finally операторы, исполняемые всегда. При возникновении исключения исполнение операторов секции try прекращается, управление передается первому оператору секции finally. После исполнения секции finally в случае ошибки появиться сообщение системного обработчика исключений.

Приложения

Арифметические функции

Вызов

Функция

Тип аргумента

Тип функции

Abs(x)

Sqr(x)

Модуль

Квадрат

Integer или

Extended

как у аргумента

Sin(x)

Cos(x)

ArcTan(x)

Sqrt(x)

Int(x)

Frac(x)

Pi

Синус

Косинус

Арктангенс

Квадратный корень

Целая часть

Дробная часть

Число  (20цифр)

Extended

Extended

Exp(x)

Ln(x)

Экспонента = ex

Натуральный логарифм

Real

Real

Trunc(x)

Отсечение дробной части

Extended

Int64

Random

Случайное в окне 0..1

-

Real

Random(x:Integer)

Случайное в окне 0..x-1

Integer

Integer

Randomize

Инициализация ГСЧ

По системным часам

Функции для величин порядкового типа

Вызов

Функция

Тип аргумента

Тип функции

High(x)

Low(x)

Pred(x)

Succ(x)

Максимальное значение

Минимальное значение

Предшествующий

Последующий

Порядковый,

включая Int64

Как у аргумента

Odd(x)

Нечетность

(True, если х нечетное)

Longint

Boolean

Дополнительные функции для целого типа

Вызов

Функция

Тип аргумента

Тип функции

Inc(x [, N ])

Dec(x[,N])

Инкремент х на N (или 1)

Декремент х на N (или 1)

Longint

Longint

Hi(x)

Lo(x)

Старший байт

Младший байт

Word или Integer

Byte

Swap(w)

Обмен между 1-м и 2-м байтами в Word

Word

Word

Функции преобразования типа

Вызов

Функция

Тип аргумента

Тип функции

Chr(i)

Символ с кодом i

Byte

Char

StrToInt(s)

Строку в целое

String

Integer

IntToStr(x)

Целое в строку

Int64

String

StrToInt64(s)

Строку в целое

String

Int64

Int64ToStr(x)

Целое в строку

Integer

String

StrToFloat(s)

Строку в вещественное

String

Extended

FloatToStr(x)

Вещественное в строку

Extended

String

FloatToStrF(

(<значение>,  <формат>,  <цифр всего>,  <дробных цифр>)

Вещественное в строку с форматом

Extended

String

Форматы для функции FloatToStrF

Имя

Значение

Примеры

ffGeneral

Общий числовой формат

ffExponent

Научный (экспоненциальный).

'-d.ddddE+dddd'

d – цифра,

. – отделяет дробную часть,

E – признак порядка.

Мантисса (значащая часть) и порядок.

-1.234E+0002

Знак + у мантиссы пропускается.

Знак + у порядка не пропускается.

В целой части мантиссы по крайней мере одна цифра.

ffFixed

Фиксированный.

'-ddd.ddd'

d – цифра,

. – отделяет дробную часть.

-123.456

ffNumber

Числовой.

'-d, ddd, ddd.ddd'

d – цифра,

, - разделяет тысячи,

. – отделяет дробную часть.

-1, 234.567

Формат ffNumber подобен ffFixed, только выводятся разделители тысяч.

ffCurrency

Денежный.

Отображение результата преобразования управляется параметрами на вкладке «Денежная единица».

Специальные математические операции

Определены в модуле Math и доступны после ссылки на него в разделе объявлений в строке

uses Math;

Арифметические операции

Вызов

Операция

Тип

Примечания

Ceil(x)

Целое вверх

Функция

Floor(x)

Целое вниз

Frexp(x)

Мантисса и порядок

Процедура

Power(x,y)

Возводит x в любую степень y

Функция

IntPower(x,y)

Возводит x в целую степень y

LdExp(x,p)

Возводит x в степень 2p

LnXP1(x)

Ln(x+1)

Log10(x)

Логарифм по основанию 10

Log2(x)

Логарифм по основанию 2

LogN(N,x)

Логарифм по основанию N

Infinity

= 1.0 / 0.0

Max(a,b)

Максимальное из двух

Min(a,b)

Минимальное из двух

Poly(x,coef)

Полином от x с коэффициентами coef (массив)

Coef[0] + Coef[1]*X + ... + Coef[N]*(XN)

Операции преобразования единиц

Применяются для преобразования единиц измерения углов.

Аргумент тригонометрических функций может исчисляться в:

  • периодах,

  • радианах (1 период = 2π радиан),

  • градусах (1 период = 360 градусов),

  • градах (1 период = 400 градов, используется в мореходстве).

Вызов

Операция

CycleToRad(x)

Периоды в радианы

RadToCycle(x)

Радианы в периоды

DegToRad(x)

Градусы в радианы

RadToDeg(x)

Радианы в градусы

GradToRad(x)

Грады в радианы

RadToGrad(x)

Радианы в грады

Тригонометрические функции

Вызов

Операция

Тип

Tan(x)

Тангенс

Функция

Cot(x)

Cotan(x)

Котангенс

Sec(x)

Secant(x)

Секанс, 1/cos(x)

Csc(x)

Cosecant(x)

Косеканс, 1/sin(x)

ArcSin(x)

Обратный синус

ArcCos(x)

Обратный косинус

ArcTan2(y,x)

Обратный тангенс ArcTan(y/x)

ArcCot(x)

Обратный котангенс

ArcSec(x)

Обратный секанс

ArcCsc(x)

Обратный косеканс

SinCos(x,s,c)

s=Sin(x), c=Cos(x)

Процедура

Hypot(x,y)

Гипотенуза прямоугольного треугольника

Функция

Гиперболические функции

Вызов

Операция

SinH(x)

Синус гиперболический

ArcSinH(x)

Обратный синус гиперболический

CosH(x)

Косинус гиперболический

ArcCosH(x)

Обратный косинус гиперболический

TanH(x)

Тангенс гиперболический

ArcTanH(x)

Обратный тангенс гиперболический

CotH(x)

Котангенс гиперболический

ArcCotH(x)

Обратный котангенс гиперболический

SecH(x)

Секанс гиперболический

ArcSecH(x)

Обратный секанс гиперболический

CscH(x)

Косеканс гиперболический

ArcCscH(x)

Обратный косеканс гиперболический

Статистические функции

Вызов

Операция

MaxValue(Data)

Максимальное массива Data

MinValue(Data)

Минимальное для массива Data

Mean(Data)

Мат. ожидание массива Data

StdDev(Data)

Стан. отклонение массива Data

RandG(Mean,StdDev)

Гауссовский генератор случайных чисел с математическим ожиданием Mean и среднеквадратичным отклонением StdDev

91

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]