Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


Лабораторная работа№ 5. Обработка исключительных ситуаций. Программирование с использованием одномерных массивов



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

Обработка исключительных ситуаций

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

Стандартный обработчик (метод TApplication.HandleException), вызываемый по умолчанию, информирует пользователя о возникновении ошибки и завершает выполнение программы. Для обработки исключительных ситуаций внутри программы используется оператор Try, который перехватывает исключительную ситуацию и дает возможность разработчику предусмотреть определенные действия при ее возникновении.

Конструкция блокаTry… Finally:

Try

операторы, выполнение которых может привести

к возникновению исключительной ситуации

Finally

операторы, выполняемые всегда, вне зависимости

от возникновения исключительной ситуации

End;

При возникновении исключительной ситуации в одном из операторов управление сразу передается первому оператору блока Finally.

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

Конструкция блокаTry…Except:

Try

операторы, выполнение которых может привести

к возникновению исключительной ситуации

Except

операторы, выполняемые только в случае

возникновения определенных исключительных ситуаций

End;

При возникновении исключительной ситуации управление передается в блок Except, иначеблокExcept пропускается. Такая конструкция позволяет определить причину возникшей проблемы и рекомендовать пользователю определенные действия для ее исправления. В простейшем случае в разделе Except пишутся операторы, выполняемые при возникновении любой исключительной ситуации. Для определения типа возникшей ошибки в разделе Except используется конструкция, работающая по схеме оператора Case:

Onтип исключительной ситуации 1 Do оператор 1;

Onтип исключительной ситуации 2 Do оператор 2;

Elseоператоры, выполняемые, если не определен тип

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

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

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

Для преднамеренного инициирования исключительной ситуации применяются процедуры Abort, Assert(b: Boolean)и ключевое слово Raise:

Raise ( тип исключения).Create(текст сообщения);

Таблица 5.1

Типы исключительных ситуаций

Тип исключительной ситуации Причина
EAbort Намеренное прерывание программы, генерируемое процедурой Abort
EArrayError Ошибка при операциях с массивами: использование ошибочного индекса массива, добавление слишком большого числа элементов в массив фиксированной длины (для использования требует подключения модуля MxArrays)
EConvertError Ошибка преобразования строки в другие типы данных
EDivByZero Попытка целочисленного деления на ноль
ERangeError Целочисленное значение или индекс вне допустимого диапазона (при включенной директиве проверки границ массива {$R+})
EIntOverflow Переполнение при операции с целыми числами (при включенной директиве {$Q+ })
EInvalidArgument Недопустимое значение параметра при обращении к математической функции
EZeroDivide Деление на ноль числа с плавающей точкой
EOutOfMemory Недостаточно памяти
EFileNotFound Файл не найден
EInvalidFileName Неверное имя файла
EInvalidOp Неправильная операция с плавающей точкой
EOverFlow Переполнение при выполнении операции с плавающей точкой
EAssertionFailed Возникает при намеренной генерации исключительной ситуации с помощью процедуры Assert (при включенной директиве {$С+})

Функции ShowMessage и MessageDlg

Для вывода сообщений применяются функции ShowMessage и MessageDlg. ФункцияShowMessage (Msg: String) отображает диалоговое окно с заданным в Msg сообщением и кнопкой OK для закрытия окна. В заголовке окна отображается имя выполняемой программы.

Функция MessageDlg(Const Msg: WideString; DlgType: TMsgDlgType; Buttons: TMsgDlgButtons; HelpCtx: Longint): Word отображает диалоговое окно с заданными кнопками. Параметр Msg содержит текст сообщения. Параметр DlgType определяет вид отображаемого окна (см. табл. 5.2).

Например: If MessageDlg (‘Вы действительно хотите завершить работу? ’, mtConfirmation, [mbOk, mbNo], 0)=mrNo Then CanClose: =False;

Функция MessageDlg отображает диалоговое окно в центре экрана. Первый ее параметр — сообщение, выводимое в окне. Второй параметр – тип окна – может принимать следующие значения: mtWarning (предупреждение), mtError (ошибка), mtlnformation (информация), mtConfirmation (подтверждение). Третий параметр задает кнопки в диалоговом окне, его значения: mbYes, mbNo, mbOK, mbCancel, mbAbort, mbRetry, mblgnore, mbAll, mbHelp. Четвертый параметр определяет темы помощи, появляющиеся при щелчке на кнопке помощи или нажатии F1 во время отображения диалогового окна.

Таблица 5.2

Вид отображаемого окна, определяемого параметром DlgType

Значения типа окна Вид отображаемого окна
mtWarning Заголовок «Warning». Значек: желтый треугольник с восклицательным знаком внутри
mtError Заголовок «Error». Значек: красный круг с перечеркиванием внутри
mtInformation Заголовок «Information». Значек: символ “i” на голубом поле
mtConfirmation Заголовок «Confirmation». Значек: символ “? ” на зеленом поле
mtCustom Заголовок соответствует имени выполняемого файла. Без значка

Параметр Buttons указывает кнопки, которые будут находиться в окне (см. табл. 5.3). Список необходимых кнопок заключается в квадратные скобки.

Параметр HelpCtx определяет номер контекстной справки для данного окна.

Результатом выполнения функции является значение, соответствующее нажатой кнопке. Возвращаемое значение имеет имя, состоящее из букв mr и имени кнопки, например: mrYes, mrOK, mrHelp.

Таблица 5.3

Значения параметра Buttons

Значение параметра Тип кнопки Значение параметра Тип кнопки
mbYes Кнопка «Yes» mbRetry Кнопка «Retry»
mbNo Кнопка «No» mbIgnore Кнопка «Ignore»
mbOK Кнопка «OK» mbAll Кнопка «All»
mbCancel Кнопка «Cancel» mbHelp Кнопка «Help»
mbAbort Кнопка «Abort»  

Работа с массивами

Массив – пронумерованная структура данных, элементы которой обладают одним и тем же типом.

Например: 1 5 6 0 7 9 2 – массив целых чисел

a1 a2 a3 a4 a5 a6 a7

1, 2 5, 1 7, 9 2, 1 5, 5 9, 3 4, 8 – массив вещественных чисел

Каждый элемент массива обозначается именем, за которым в квадратных скобках указывается один или несколько индексов, разделенных запятыми, например: a[1], bb[i], c12[i, j*2], q[1, 1, i*j–1]. В качестве индекса можно использовать любые порядковые типы.

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

Тип массива или сам массив определяются соответственно в разделе типов (Type) или переменных (Var) с помощью следующей конструкции:

Array[описание индексов] Of тип элемента массива;

Например:

Const

N_Max=100;

Type

Mas=Array[1.. N_Max] Of тип элементов массива;

Var

A: Mas;

i, n: Byte; {i – порядковый номер (индекс) элемента в массиве А;

n– количество элементов массива А}

Примеры описания массивов.

Const

N_Max=20; // Задание максимального значения размера массива

Type

Mas= Array [1..N] Of Byte; // Описание типа одномерного массива

Var

a: Mas; // а – массив типа Mas;

b: Array [1..10] Of Integer; // b – массив из десяти целых чисел

y: Array [1..5, 1..10] Of Char; // y – двумерный массив символьного типа

Элементы массивов могут использоваться в выражениях так же, как и обычные переменные, например: F: =2*a[3]+a[b[4]+1]*3;

a[n]: =1+sqrt(abs(a[n–1]));

Для доступа к элементу массива необходимо указать его имя и индекс (порядковый номер элемента в массиве): имя_массива [индекс]

Примеры программ

Пример 1. Подсчитать сумму и количество отрицательных и положительных элементов массива.

Const

N_Max=100;

Type

Mas=Array[1.. N_Max] Of Extended;

Var

a: Mas;

i, n, K_Pol, K_Otr: Byte; //K_Pol – количество положительных элементов

Sum_P, Sum_O: Extended; //K_Otr – количество отрицательных элементов

//Sum_P – сумма положительных элементов,

//Sum_O – сумма отрицательных элементов

Begin

// Ввод элементов массива

Sum_P: =0; // Инициализация переменных

K_Pol: =0;

Sum_O: =0;

K_Otr: =0;

For i: =1 To n Do Begin // Подсчет сумм и количества

If A[i]> 0 Then Begin // Если элемент положительный, то

Inc(K_Pol); // подсчитать количество

Sum_P: =Sum_P+A[i]; // и сумму

End;

If A[i]< 0 Then Begin // Если элемент отрицательный, то

Inc(K_Otr); // подсчитать количество

Sum_O: =Sum_O+A[i]; // и сумму

End;

End; // For i

// Вывод результатов

End;

Пример 2. Изменить значения элементов массива по заданному правилу:

- если значение элемента массива четное и положительное, то увеличить его в 2 раза,

- если кратно 3 – уменьшить на 10.

Const

N_Max=100;

Type

Mas=Array[1..N_Max] Of Integer;

Var

A: Mas;

i, n: Byte;

Begin

// Ввод элементов массива

For i: =1 To n Do Begin // Изменение значений элементов

If (A[i]> 0)And(Not Odd(A[i])) Then A[i]: =A[i]*2

Else If A[i] Mod 3=0 Then A[i]: =A[i]–10;

End; // For i

// Вывод результатов

End;

Пример 3. Записать положительные элементы массива А в массив В, а отрицательные элементы – в массив С, не меняя порядка следования элементов.

i_b: =0; //i_b количество элементов массива B,

i_c: =0; //i_c количество элементов массива C

For i: =1 to n Do Begin // Формирование новых массивов

If A[i]> 0 Then Begin

Inc(i_b); //Увеличение индекса

B[i_b]: =A[i]; // Запись в массив B

End;

If A[i]< 0 Then Begin

Inc(i_c); //Увеличение индекса

C[i_c]: =A[i]; //Запись в массив

End;

End; // Fori

Пример 4. Упорядочить элементы массива по возрастанию их значений, т.е. для всех элементов массива должно выполняться условие: ai < ai+1.

For k: =1 To n–1 Do // k – номер просмотра массива

For i: =1 To n–k Do // Просмотр элементов массива

If A[i]> A[i+1] Then Begin // Сравнение элементов массива

Tmp: =A[i]; // Перестановка элементов

A[i]: =A[i+1]; // ai и ai+1, если они

A[i+1]: =Tmp; // стоят неправильно

End;

Пример 5. Удалить из одномерного массива все отрицательные элементы.

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

– найти индекс удаляемого элемента;

– сдвинуть элементы, стоящие после него, в начало на один индекс;

– уменьшить размер массива на 1.

i: =1;

While i< =n Do Begin

If В[i]< 0 Then Begin {1} // Если найден отрицательный элемент, то

For j: =i DownTo n–1 Do {2} // сдвинуть элементы, стоящие после

В[j]: =В[j+1]; // удаляемого, на одну позицию

Dec(n); {3} // Уменьшить размер массива

Dec(i); // Возврат к предыдущему индексу

End; // If

Inc(i);

End; // While

Пример 6. Циклический сдвиг элементов массива на k позиций влево:

k: =k Mod n;

For j: =1 To k Do Begin

Tmp: =A[1];

For i: =1 To n–1 Do

A[i]: =A[i+1];

A[n]: =Tmp;

End;

Компонент TStringGrid

При работе с массивами ввод и вывод информации на экран удобно организовывать в виде таблиц. Компонент TStringGridпредназначен для отображения информации в виде двумерной таблицы, каждая ячейка которой представляет собой окно однострочного редактора (аналогично строке ввода TEdit). Доступ к информации осуществляется с помощью свойства:

Cells[ACol: Integer; ARow: Integer]: String,

где ACol, ARow – соответственно номер столбца и строки элемента двумерного массива. Нумерация осуществляется с нуля.

Свойства ColCount и RowCount устанавливают соответственно количество столбцов и строк в таблице, а свойства FixedCols и FixedRows задают количество столбцов и строк фиксированной зоны. Фиксированная зона выделена другим цветом, и в нее запрещен ввод информации с клавиатуры.

5.5. Порядок выполнения задания

В массиве А из n элементов поменять местами максимальный и минимальный элементы. Значение n вводить в компонент TEdit, А – в компонент TStringGrid. Результат после нажатия кнопки типа TButton вывести в компонент TStringGrid.

5.5.1. Настройка компонента TStringGrid

1. На вкладке Additional в меню компонент щелкните мышью по пиктограмме для установки на форму компонентов StringGrid1и StringGrid2.

2. Установите компонент в нужном месте формы и отрегулируйте его размер.

3. В инспекторе объектов установите значения свойств TStringGrid:

ColCount равным 7 (семь столбцов), RowCount равным 2 (две строки),

FixedCols – 0 (нет столбцов с фиксированной зоной), FixedRows – 1 (одна строка с фиксированной зоной для подписи индексов элементов массива).

4. В свойстве Options (ЛКМ на знак « + », стоящий слева от Options) установите свойство goEditing в положение Trueдля компонентов StringGrid1 и StringGrid2 (по умолчанию в компонент TStringGrid запрещен ввод информации с клавиатуры).

Панель диалога приведена на рис. 5.1.

Рис. 5.1. Панель диалога

Блок – схема алгоритма

Код программы

unit Unit1;

Interface

Uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Buttons, Grids, MxArrays;

Type

TForm1 = class(TForm)

Label1: TLabel;

Edit1: TEdit;

Button1: TButton;

StringGrid1: TStringGrid;

Label2: TLabel;

Button2: TButton;

BitBtn1: TBitBtn;

StringGrid2: TStringGrid;

Label3: TLabel;

Button3: TButton;

Memo1: TMemo;

Label4: TLabel;

procedure FormCreate(Sender: TObject);

procedure Button1Click(Sender: TObject);

procedure Button3Click(Sender: TObject);

procedure Button2Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

Const

Nmax=100; // Максимальный размер массива

Type // Объявление типа одномерного массива размером Nmax

Mas = Array[1..Nmax] Of Extended;

Var

Form1: TForm1;

A: Mas; // Объявление одномерного массива

i, n: Byte;

Implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);

Begin

Edit1.Text: ='10'; // Ввод размера массива

n: =StrToInt (Edit1.Text);

Memo1.Clear;

StringGrid1.ColCount: =n; // Задание числа столбцов в таблицах

StringGrid2.ColCount: =n;

For i: =0 To n–1 Do Begin //Заполнение верхней строки поясняющими

StringGrid1.Cells[i, 0]: =' i='+IntToStr(i+1); // подписями

StringGrid2.Cells[i, 0]: =' i='+IntToStr(i+1);

End;

End;

procedure TForm1.Button1Click(Sender: TObject); // Изменить

Begin // размер таблицы

n: =StrToInt(Edit1.Text); // Количество элементов в массиве

StringGrid1.ColCount: =n;

StringGrid2.ColCount: =n;

For i: =0 To n–1 Do Begin // Заполнение верхней строки поясняющими

StringGrid1.Cells[i, 0]: =' i='+IntToStr(i+1); // подписями

StringGrid2.Cells[i, 0]: =' i='+IntToStr(i+1);

End;

End;

procedure TForm1.Button3Click(Sender: TObject); // Очистить

begin

Memo1.Clear;

Edit1.Text: =’ ’;

For i: =0 To n–1 Do Begin

StringGrid1.Cells[i, 1]: =' ';

StringGrid2.Cells[i, 1]: =' ';

End;

End;

procedure TForm1.Button2Click(Sender: TObject);

Var

iMax, iMin: Byte;

Max, Min, t: Extended;

Begin

{$R+}

Try // Заполнение массива А элементами из таблицы StringGrid1

Memo1.Lines.Add('Исходный массив: ');

For i: =0 To n–1 Do

A[i+1]: =StrToFloat(StringGrid1.Cells[i, 1]);

For i: =1 To n Do

Memo1.Lines.Add('A['+IntToStr(i)+']='+FloatToStrF(A[i], ffFixed, 6, 0));

Except

On ERangeError Do Begin

ShowMessage('Выход за пределы массива. Уменьшите размер массива');

Exit;

End;

On EConvertError Do Begin

ShowMessage('В ячейке отсутствует значение или число введено не правильно. ');

Exit;

End

Else Begin

ShowMessage('Возникла неизвестная исключительная ситуация! ');

Exit;

End;

End;

Try

// Поиск минимального и максимального элементов массива и их индексов

Max: =A[1]; // Инициализация значений

iMax: =1;

Min: =A[1];

iMin: =1;

For i: =1 To n Do Begin

If Max< A[i] Then Begin // Поиск

Max: =A[i]; // максимального элемента

iMax: =i; // и его индекса

End;

If Min> A[i] Then Begin// Поиск

Min: =A[i]; // минимального элемента

iMin: =i; // и его индекса

End;

End;

A[iMax]: =Min;

A[iMin]: =Max;

Except

On EInvalidOp Do Begin

MessageDlg('Неправильная операция с плавающей точкой.',

mtError, [mbCancel], 0);

Exit;

End;

On EOverFlow Do Begin

MessageDlg('Переполнение при выполнении операции'+

'с плавающей точкой. ', mtError, [mbCancel], 0);

Exit;

End

Else Begin

MessageDlg('Возникла неизвестная исключительная ситуация! ',

mtError, [mbCancel], 0);

Exit;

End;

End;

For i: =0 To n–1 Do // Вывод результата в таблицу StringGrid2

StringGrid2.Cells[i, 1]: =FloatToStrF(A[i+1], ffFixed, 6, 0);

Memo1.Lines.Add('Min='+FloatToStrF(Min, ffFixed, 6, 0)+

', iMin='+IntToStr(iMin));

Memo1.Lines.Add('Max='+FloatToStrF(Max, ffFixed, 6, 0)+

', iMax='+IntToStr(iMax));

Memo1.Lines.Add('Результирующий массив: ');

For i: =0 To n–1 Do

Memo1.Lines.Add('A['+IntToStr(i)+']='+

FloatToStrF(A[i+1], ffFixed, 6, 0));

End;

End.

5.6. Индивидуальные задания

В соответствии с индивидуальным вариантом составить блок–схему алгоритма и программу. Во всех заданиях переменные вводить и выводить с помощью компонента TEdit, массивы – c помощью компонента TStringGrid. Вычисления выполнять после нажатия кнопки типа TВutton. Вывести исходные данные и полученный результат. В местах возможного возникновения ошибок использовать конструкции для обработки исключительных ситуаций.

В одномерном массиве, состоящем из n вещественных элементов, определить:

1. Индексы совпадающих по величине соседних элементов.

2. Произведение между максимальным и минимальным элементами.

3. Сумму между первым и последним отрицательными элементами.

4. Среднее арифметическое элементов, расположенных до последнего положительного значения.

5. Сумму после последнего положительного элемента.

6. Произведение и количество кратных трем элементов, расположенных до первого отрицательного элемента.

7. Минимальный элемент, расположенный между первым и последним нулевыми элементами.

8. Произведение нечетных положительных элементов, расположенных после максимального по модулю элемента.

9. Среднее арифметическое положительных кратных пяти элементов массива, расположенных до минимального элемента.

10. Произведение четных отрицательных элементов, расположенных между первым и вторым положительными элементами.

11. Сумму и количество нечетных элементов, расположенных после последнего отрицательного элемента.

12. Среднее арифметическое модулей кратных семи элементов, расположенных после максимального элемента.

13. Произведение модулей элементов, расположенных между первым и вторым минимальными элементами.

14. Сумму модулей элементов, расположенных между первым и последним нулевыми элементами.

15. Среднее арифметическое модулей четных элементов, расположенных между первым отрицательным и последним положительным элементами.

16. Второй по счету максимальный элемент и его индекс.

17. Максимальное значение между суммами четных и нечетных элементов массива, расположенных до минимального элемента.

18. Максимальное значение среди отрицательных элементов.

19. Минимальное значение среди четных элементов.

20. Произведение элементов, индексы которых совпадают с их значениями.

21. Индекс первого элемента, совпадающего по модулю с заданным числом t или вывести сообщение, что такого нет.

22. Индекс последнего элемента, меньшего заданного числа t или вывести сообщение, что такого нет.

23. Среднее арифметическое элементов, больших по модулю заданному числу t или вывести сообщение, что таких нет.

24. Произведение элементов между первым и последним элементами, равными заданному числу t, или вывести сообщение, что таких нет.

25. Максимальное и минимальное значения элементов, меньших заданного числа t, или вывести сообщение, что таких нет.

26. Произведение неповторяющихся элементов.

27. Наиболее часто встречающийся элемент и его индекс.

28. Среднее арифметическое четных неповторяющихся элементов.

29. Значения и индексы двух элементов, произведение которых максимально.

30. Количество инверсий, т. е. таких пар элементов, в которых большее число находится слева от меньшего.

Задания повышенной сложности

1. Даны массивы А размером n и Вразмером m, в которых числа не повторяются. Записать в новый массив элементы, встречающиеся как в массиве А, так и в В.

2. Удалить из массива А размером n элементы, не входящие в массив В размером m.

3. Заданы два массива из n и m вещественных чисел. Найти наименьшее среди тех элементов первого массива, которые не входят во второй.

4. Преобразовать элементы массива следующим образом: все четные элементы перенести в начало, а остальные – в конец, сохраняя исходное взаимное расположение как среди четных, так и среди остальных элементов.

5. Массив из n действительных чисел оставить без изменения, если он упорядочен по неубыванию или по невозрастанию; в противном случае получить положительные элементы исходного массива, упорядоченные по возрастанию.

6. В массиве В вставить после каждого отрицательного кратного трем элемента его модуль.

7. Удалить из массива Х элементы, входящие в него более одного раза.

8. Определить в массиве наиболее часто встречающееся значение элемента и записать в новый массив те элементы, значения которых меньше найденного.

9. Заменить второй элемент массива max(x1, x2), третий ̶ max(x1, x2, x3) и т. д.

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

11. Создать новый массив из наиболее длинной подпоследовательности подряд идущих убывающих значений.

12. Объединить элементы упорядоченных по неубыванию массивов, не применяя сортировку, в один массив так, чтобы они снова оказались упорядоченными по неубыванию.

13. Создать новый массив, каждый элемент которого рассчитывается как среднее арифметическое стоящих перед ним элементов.

14. Записать в новый массив те элементы, перед которыми находятся все меньшие их значения, а после них – большие.

15. Удалить из массива элементы, образующие возрастающую подпоследовательность.


Поделиться:



Популярное:

Последнее изменение этой страницы: 2016-08-31; Просмотров: 867; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.175 с.)
Главная | Случайная страница | Обратная связь