- •1.Интегрированная среда разработки Delphi
- •2.Структура программы и типы в языке Delphi
- •3.Линейные структуры
- •4.Структуры с ветвлениями
- •5.Циклы с неизвестным числом повторений
- •6.Циклы с заданным числом повторений
- •Задание к работе
- •7.Массивы
- •8.Файлы
- •9.Подпрограммы
- •10.Динамическая память Подготовка к работе
- •Контрольные вопросы
- •Задание к работе
- •Задание 1
- •Задание 2
- •11.Исключения
11.Исключения
Подготовка к работе
По рекомендованной литературе изучить класс исключений и их обработку.
Разработать алгоритмы решения задач.
Составить программы решения задач.
Контрольные вопросы
Что такое исключение?
Классы исключений и их свойства.
Оператор try…except. Назначение, структура и применение.
Оператор try…finally. Назначение, структура и применение.
Глобальные и локальные обработчики исключений.
Обработчик исключения on…do.
Исключение EZeroDivide.
Исключение ERangeError.
Как включить отработку исключения ERangeError.
Как отключить перехват исключения системой.
Задание к работе
Создать программу, обрабатывающую исключения с использованием оператора try… except. Проект – консольное приложение.
Создать программу, обрабатывающую исключение с использованием оператора try… finally. Проект – консольное приложение.
В заданиях надо рассчитывать функции 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
Создать программу обработки исключений, использующую оператор try…except. Проект – консольное приложение. Окно работающего приложения задания 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
Создать программу обработки исключений, использующую оператор try…finally. Проект – консольное приложение.
Листинг программы
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. Однако оператор try…finally не обрабатывает исключение. Поэтому при возникновении ошибки срабатывает системный обработчик исключения и выдает свое сообщение, показанное на рис. 11 .26.
рис. 11.26. Сообщение системного обработчика исключений в задании 2
Выводы
При исполнении программ возможны исключения (ситуации с ошибками). Примеры исключений - деление на ноль EZeroDivide, выход значений за пределы допустимого диапазона ERangeError.
Встроенный отладчик Delphi перехватывает все исключительные ситуации и формирует свои сообщения о них в диалоговом окне, которое пользователь перед продолжением программы должен закрыть. Чтобы избежать этого, следует отменить использование отладчика, сбросив флаг «Встроенный отладчик» в окне команды Сервис=>Опции отладчика.
Чтобы отслеживать исключения в операциях с числами, необходимо в окне команды Проект=>Опции... на вкладке «Компилятор» установить флаги директив компилятора: Проверка области, Проверка ввода/вывода, Проверка переполнения.
Для обработки исключений используются обработчики исключений (глобальные и локальные). Глобальные обработчики определены в ИСР и вызываются автоматически, если отладчик подключен. Локальные обработчики создает пользователь.
Для локальной обработки исключений определен оператор try…except…end. В секции try размещаются операторы, в которых могут возникнуть исключения, а в секции except обработчики исключений. При обнаружении исключения исполнение операторов секции try прекращается, управление передается нужному обработчику в секции except.
Обработчик исключения имеет формат on <исключение> do <оператор> end.
Для обнаружения исключений определен оператор try…finally. В секции 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) |
Операции преобразования единиц |
|
Применяются для преобразования единиц измерения углов. Аргумент тригонометрических функций может исчисляться в:
|
|
Вызов |
Операция |
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 |