Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Краткие теоретические сведения




Класс Exception является прямым потомком базового класса TObject. Вместе со своими потомками он предназначен для обработки исключительных ситуация (исключений), возникающих при некорректных действиях программы: например, в случае деления на 0, при попытке открыть несуществующий файл, при выходе за пределы выделенной области динамической памяти и т. п. Рассматриваются основные свойства исключений и их использование для повышения надежности программ.

При работе в среде Delphi эксперименты с исключениями плохо прослеживаются, т. к. при каждом исключении среда перехватывает управление программой. В этом случае бывает полезно отменить такое поведение среды. Для этого вызовете опцию Tools, Debugger Options и на странице Language Exceptions уберите флажок в переключателе Stop on Delphi Exceptions.

Для обработки исключений в Object Pascal предусмотрен механизм защищенного блока, который может записываться в двух различных видах. Первый имеет следующий вид:

try

<операторы>

except

<обработчики исключений>

else <операторы>

end;

 

Второй определяется в виде

try

<операторы>

finally

<операторы>

end;

 

Защищенный блок начинается зарезервированным словом try (попытаться [выполнить]) и завершается словом end. Существуют два типа защищенных блоков — except (исключить) и finally (в завершение), отличающихся способом обработки исключения. В блоке except порядок
выполнения операторов таков: сначала выполняются операторы секции try... except; если операторы выполнены без возникновения исключительной ситуации, работа защищенного блока на этом прекращается и управление получает оператор, стоящий за end; если при выполнении части try возникло исключение, управление получает соответствующий обработчик в секции except, а если таковой не найден — первый из операторов, стоящих за словом else.

В блоке finally операторы в секции finally...end получают управление всегда, независимо оттого, возникло ли исключение в секции try...finally или нет. Если исключение возникло, все операторы в секции try...finally, стоящие за «виновником» исключения, пропускаются и управление получает первый оператор секции finally...end. Если исключения не было, этот оператор получает управление после выполнения последнего оператора секции try...finally.

Обработчики исключений в блоке except имеют такой синтаксис:

on < класс исключения> do <оператор>;

Здесь on, do — зарезервированные слова; <класс исключения> — класс обработки исключения; <оператор> — любой оператор Object Pascal.

Обратите внимание: имя класса служит своеобразным ключом выбора, а собственно обработка осуществляется оператором, стоящим за do (этот оператор может быть составным, так что обработка исключения может занимать произвольное количество операторов Object Pascal).

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

Если важен лишь факт возникновения исключительной ситуации и несущественен тип связанной с ним ошибки, можно оставлять только необходимый код реакции на любую ошибку.

try

………..

except

ShowMessage(‘Ошибка’);

………………

end;

Защищенные блоки могут вкладываться друг в друга на неограниченную глубину и встречаться в блоке обработки исключительной ситуации.

Класс Exception является родительским для всех классов исключений. У этого класса имеется множество дочерних классов, каждый из которых отвечает за конкретное исключение. При возникновении исключительной ситуации объекты классов обработчиков создаются и уничтожаются автоматически. Таких классов очень много, поэтому рассмотрим только некоторые:

EAbort — обработка любой исключительной ситуации;

EIntError — любая ошибка в целочисленных вычислениях, среди
которых отметим такие: EDivByError — деление на 0, EintOverload — переполнение;

EMatcError — любая ошибка при выполнении вычислений с плавающей запятой, среди которых: EZeroDivide — вещественное деление на 0; EOverflow — переполнение; EInfalidArgument — аргумент функции вне допустимого диапазона;

EArrayError — ошибка при работе с массивами;

EConvertError — ошибка в функциях StrToInt и StrToFloat;

EFOpenError — ошибка при открытии файла;

EInOutError — любая ошибка в файловых операциях;

EInvalidGridOperator — любая ошибка при работе с таблицами;

EInvalidGraphOperator — недопустимая графическая операция.

Рассмотрим еще некоторые исключительные ситуации, которые будут работать с объектами, рассматриваемыми в следующих лабораторных работах: EStrimError — произвольная ошибка при работе с потоками данных, EThread — ситуация борьбы за общий ресурс в программе с несколькими потоками событий, EDatabaseError — ошибка при работе с базами данных.

Пример 1

Необходимо заполнить таблицу числа по следующему правилу: генерируется случайное число, а затем в ячейке компонента StringGrid1 сохраняется обратное значение. Заранее не известно, был ли сгенерирован 0, и будет ли допустима операция деления. Для корректной работы данной программы необходимо задавать защищенный блок; процедура формирования таблицы будет иметь вид:

procedure TForm1.Button1Click(Sender: TObject);

var i,j:Integer;

a:real;

begin

with StringGrid1 do

begin

ColCount:=SpinEdit1.Value+1;

RowCount:=SpinEdit2.Value+1;

for i:=1 to ColCount do

for j:=1 to RowCount do

Try {Начало блока}

a:=Random(10);

Cells[i,j]:=FloatToStr(1/a);

except

On EZeroDivide do ShowMessage('Деление на ноль в ячейке '+IntToStr(i)+’,’ +IntToStr(j)); {Проверка класса ошибки}

end;

end;

end;

Если необходимо использовать поля и методы класса-обработчика, то можно перед именем класса поставить идентификатор и двоеточие:

On EObject:Expecrion do ………….

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

В некоторых случаях бывает необходимо инициализировать исключительную ситуацию самостоятельно. Для этого используется зарезервированное слово raise (возбудить). Если этот оператор вставить в секцию Try…except или try…finally, то немедленно начнет работу секция обработки исключительной ситуации. Если данный оператор встретился в секции except…end или finally…end, то считается, что данный защищенный блок на текущем уровне вложенности завершил свою работу и управление передается вышестоящему уровню.

В качестве примера рассмотрим программу, в которой необходимо ввести шестнадцатеричное число в компоненте Edit, перевести его в десятичное число и включить данный цвет. Функция, переводящая строку, которая является шестнадцатеричным числом, в десятичное число имеет вид:

function HexStrToInt(s:string):integer;

function hex(c:char):integer;

begin

case c of

'0'..'9':Result:=ord(c)-ord('0');

'A'..'F':Result:=ord(c)-ord('A')+10;

end;

end;

Var i:integer;

begin

result:=0;

if s[1]='$' then delete(s,1,1);

For i:=1 to length(s) do

Result:=result*16+hex(s[i]);

end;

Функция hex на основании символа возвращает число. Если данный символ является цифрой или латинской буквой от A до F, то возвращаемое число будет истинно, однако если это не так, то результат будет просчитан неправильно. Следовательно, в операторе case необходимо учесть ветвь иначе, где должна вызываться исключительная ситуацию. Тогда функция hex будет иметь вид:

function hex(c:char):integer;

begin

case c of

'0'..'9':Result:=ord(c)-ord('0');

'A'..'F':Result:=ord(c)-ord('A')+10;

else

raise EConvertError.Creat

(‘Недопустимое представление шестнадцатеричного числа ’);

end;

end;

В данном примере оператор raise инициализирует событие EConvertError, которое возникает при ошибке комвертации и в качестве параметра передает необходимое сообщение.

Практическое задание

Проверьте все программы из данной лабораторной работы.

 

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

1. Поясните понятие «исключительная ситуация»

2. Как отменить перехват управления программой средой Делфи

3. Какие два защищенных блока существуют и в чем их отличие

4. Как осуществляется поиск нужного обработчика исключений в блоке except

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


Практическая работа №5

Лабораторная работа №5

 

Тема. Обработка одномерных массивов. Разработка программ с одномерными массивами

Цель работы: изучить средства организации циклических вычислительных процессов; овладеть практическими навыками работы с массивами; освоить применение компонента StringGrid для создания приложения, в котором используются массивы.

 

Ход работы

1 Повторить теоретический материал

2 Ответить на контрольные вопросы

3 выполнить практическое задание

4 Составить отчет

 

Краткие теоретические сведения

Массив – это структурированный тип данных, состоящий из фиксированного числа однотипных элементов. Массив имеет размеры, определяющие, сколько элементов хранится в структуре. Обращение к отдельным элементам массива производится по его индексу (порядковому номеру).

Если при описании массива задан один индекс, массив – одномерный, если два индекса – двухмерный, если n индексов – n-мерный. Одномерные массивы используются для представления векторов, двухмерные – для представления матриц.

Объявление массива

Перед использованием массив должен быть объявлен:

type

имя_типа = array [тип_индексов] of тип_элементов;

var

имя_массива: имя_типа;

Массивы могут быть определены непосредственно в разделе описания переменных следующим образом.

var

имя_массива: array [тип_индексов] of тип_элементов;

Ниже показаны примеры определений массивов.

type

klass = array [1..30] of integer; //массив из 30 целых чисел

var

mas1: klass;

mas2, mas3: array [1..5] of extended; //массив из 5 вещественных чисел

Элементы массива хранятся в памяти последовательно друг за другом. При обращении к конкретному элементу массива его индекс записывается в квадратных скобках непосредственного после имени массива. Например, элементы массива mas1 могут обозначаться так: mas1[1], mas1[2], …, mas1[30].

Элементы массива могут использоваться в выражениях так же, как и переменные других типов.

a:=b+mas1[i+1]; mas2[j]:=sqr(mas3[i]);

Если массивы имеют идентичный тип, то к ним допускается применять операцию присваивания. mas2:=mas3;

 

Основные алгоритмы для работы с массивами

К типичным действиям с массивами можно отнести – поиск в массиве заданного элемента; поиск в массиве максимального или минимального элементов; сортировка массива.

Поиск в массиве

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

Часто такие задачи дополняются требованием определить количество найденных совпадений с образцом, либо определить сумму, произведение или среднее арифметическое элементов, совпадающих с образцом.

Пример 1

Найти сумму положительных и количество отрицательных элементов массива а[1..15].

procedure TForm1.Button1Click(Sender: TObject);

var a:array[1..15] of integer; //объявление массива a

s, i, k: integer; //k-количество нулевых элементов

begin

{Ввод исходных данных в массив a}

for i:=1 to 15 do

a[i]:=StrToInt(StringGrid1.Cells[i-1,0]);

{Определение суммы положительных и количества отрицательных элементов массива}

k:=0; s:=0;

for i:=1 to 15 do

if a[i]>=0 then s:=s+a[i] else k:=k+1;

{Вывод суммы(s) и количества(k)}

Memo1.Lines.Add('Сумма положительных элементов s = ' + IntToStr(s)+ ' Кол-во отрицательных элементов k = ' +IntToStr(k));

end;

 

Поиск в массиве минимального (максимального) элемента

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

Пример 2 Дан массив a[1..5]. Найти максимальный элемент массива и его порядковый номер. Предполагается, что такой элемент единственный.

procedure TForm1.Button1Click(Sender: TObject);

var a: array[1..5] of real;

i, nmax: integer;max: real;

begin

{Ввод исходных данных в массив a}

for i:=1 to 5 do

a[i]:=StrToFloat(StringGrid1.Cells[i-1,0]);

{Поиск макс. элемента и его порядкового номера}

max:=a[1]; nmax:=1;

for i:=2 to 5 do

if a[i]>max then begin

max:=a[i]; nmax:=i;

end;

Memo1.Lines.Add('max='+FloatToStrF(max,ffFixed,8,3)+' nmax='+IntToStr(nmax));

end;

 

Применение компонента StringGrid для работы с массивами. При работе с массивами ввод и вывод информации на экран удобно организовывать с помощью компонента StringGrid.

Пиктограмма компонента StringGrid находится на странице Additional Палитры компонентов.

Компонент StringGrid используется для отображения информации в виде таблицы. Таблица содержит две зоны – фиксированную и рабочую. Фиксированная зона служит для вывода наименований строк и столбцов рабочей зоны и управления их размерами с помощью «мыши». Фиксированная зона выделена другим цветом, в нее запрещен ввод информации с клавиатуры. Количество строк и столбцов фиксированной зоны устанавливается в свойствах FixedRows и FixedCols соответственно. Если фиксированная зона не используется, в Инспекторе объектов значения свойств FixedRows и FixedCols устанавливаются равными 0.

Рабочая зона содержит RowCount строк и ColCount столбцов информации. Нумерация строк и столбцов таблицы начинается с нуля. Доступ к информации в таблице осуществляется с помощью свойства Cells [ACol, ARow: integer]: string. Координаты каждой ячейки таблицы задаются парой чисел, первое является номером столбца, второе – номером строки. Например, ячейка с координатами Cells [3,5] расположена в четвертом столбце и шестой строке.

По умолчанию в компонент StringGrid запрещен ввод информации с клавиатуры, поэтому для компонента StringGrid необходимо в Инспекторе объектов дважды щелкнуть «мышью» на символе + свойства + Option и в открывшемся списке опций установить значение goEditing в True.

 

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...