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

ИнфТехнКомпТехн

.pdf
Скачиваний:
18
Добавлен:
02.04.2015
Размер:
35.33 Mб
Скачать

CloseFile(OutFile);

readln;

// Пауза

end.

 

Внимание:

Size – размер выделяемой памяти в записях (по умолчанию это 128 байт). Для пары процедур GetMem, FreeMem имя указателя и размер памяти должны быть одинаковы. Удалять нужно точно те байты, которые выделялись. В процедуре FreeMem размер можно пропустить, по умолчанию он будет таким же, как в процедуре GetMem.

Выводы

1.В программах применяются переменные:

статические, под которые память выделяется при компоновке на все время работы программы;

динамические, под которые память выделяется в процессе работы на время надобности в них.

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

3.Динамические структуры заданного типа (размера) создаются с использованием типизированных указателей p процедурой New(p), а освобождаются процедурой Dispose(p). В указатель заносится адрес первого байта выделяемой памяти, число байт определяется типом данных.

4.Динамические структуры произвольного размера создаются c использованием указателей p процедурой GetMem(p, Size), а освобождаются процедурой FreeMem(p, Size). В указатель заносится адрес первого байта выделяемой памяти, число байт определяется значением Size (фактически это Size*128).

5.После освобождения памяти рекомендуется сделать указатель неопределенным, пРисвоив ему значение Nil.

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

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

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

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

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

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

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

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

7.Оператор try…except. Назначение, структура и применение.

8.Оператор try…finally. Назначение, структура и применение.

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

10.Обработчик исключения on…do.

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

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

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

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

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

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

201

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

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

Таблица 12.1 - Варианты заданий

 

Функция 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 = π/6, тип данных для f1(x) Real.

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

Задание 1

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

202

Окно работающего приложения задания 1 показано на Рис. 12.1 для трех вариантов: исключений нет, ошибка деления на 0,ошибка диапазона.

 

Рисунок 12.1 – Варианты приложения

 

 

 

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

 

 

 

 

 

program Prg_11_1;

 

 

 

 

 

{$APPTYPE CONSOLE}

 

 

 

 

 

uses

 

 

 

 

 

 

SysUtils,RusTrans;

 

 

 

 

 

const

 

 

 

 

 

 

h1=pi/8;

 

 

 

 

 

 

h2=20;

 

 

 

 

 

 

var

 

 

 

 

 

 

f:boolean=false;

 

y:array[-10..10]

of

real;

i,imax,imin,i_error:integer;

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

 

 

 

 

 

begin

 

Imin и

Imax в пределах -10...10'));

writeln(Rus('Введите

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, если

 

 

 

 

 

 

203

 

 

 

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.

Задание 2

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

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

 

 

 

 

 

 

 

program Prg_11_2;

 

 

 

 

 

 

{$APPTYPE CONSOLE}

 

 

 

 

 

 

uses

 

 

 

 

 

 

 

 

 

SysUtils,RusTrans;

 

 

 

 

 

 

const

 

//шаг

для f1 h2=40;

//шаг

для f2

 

h1=pi/6;

 

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

 

 

 

Imin и

Imax в пределах -10...10'));

 

writeln(Rus('Введите

 

write('

Imin='); readln(imin); write('

Imax=');

 

readln(imax);

Try

 

 

 

 

 

 

try

//Секция

 

//Начало оператора

1

 

for i:=Imin to Imax do

 

 

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;

204

for i:=Imin to Imax do

//начало оператора 2

 

begin

 

 

ошибка

 

 

 

i_error:=i;//i, если

 

 

 

dy:=i*h2;

 

 

 

 

 

 

 

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

 

 

 

 

then begin

//Установить

флаг

ошибки

writeLn(Rus('Ошибка

f:=true;

диапазона'));

//Вывод

 

сообщения

об

ошибке

writeln(Rus('при

i='),i_error);

 

 

end

 

 

 

 

 

 

 

else f:=false;

 

 

 

 

 

 

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

 

 

 

 

 

 

end;

//Секция

Finally

 

 

 

finally

//OK, если ошибок

нет

if not f then writeln('OK');

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

 

 

 

readln;

//Пауза

 

 

 

 

 

end.

 

 

 

 

 

 

 

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

2 в целом совпадает с

окном задания 1.

Однако оператор try…finally не

обрабатывает

исключение.

 

 

Выводы

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

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

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

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

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

6.полнение операторов секции try прекращается, управление передается нужному обработчику в секции except.

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

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

9.операторов секции try прекращается, управление передается первому оператору секции finally. После исполнения секции finally в случае ошибки появиться сообщение системного обработчика исключений.

i.Списки

205

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

По указанной литературе изучить определенные в ИСР Delphi списки и основные команды, используемые для работы с ними.

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

1.Списки, их назначение.

2.Компоненты списков ListBox (список) и ComboBox (комбинированный список) в ИСР Delphi. Их назначение и сравнение.

3.Создание в форме компонентов списков.

4.Свойства Count (количество) и Capacity (емкость) компонент списков.

5.Свойства Items (элементы) и ItemIndex (номер элемента) компонент списков. Нумерация элементов списков.

6.Предварительное редактирование списков.

7.Свойство Text (текст) компонента ComboBox.

8.Программное редактирование строк компонентов списков..

9.Метод добавить элемент Add(Item) и его использование.

10.Метод ввести элемент Insert(Index,Item) и его использование.

11.Метод удалить элемент Delete(Index) и его использование.

12.Метод очистки Clear и его использование.

13.Метод поменять элементы Exchange(Index1, Index2) и его использование.

14.Метод переместить элемент Index1 в позицию Index2 Move(Index11, Index2) и его использование.

Задание

1.Активизировать ИСР.

2.Создать пустую форму проекта и задать ее свойства.

3.Заполнить форму компонентами в соответствии с заданием.

4.Посмотреть текст модуля формы в редакторе кода.

5.Написать коды обработчиков событий.

6.Отладить проект.

7.Сохранить проект на локальной машине.

8.Выход из ИСР.

9.Скопировать проект на сервер.

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

Создать проект работы со списками. В проекте предусмотреть:

1.Заполнение комбинированного списка из поля ввода.

2.Редактирование комбинированного списка (ввести строку, переместить строку).

3.Копирование строк из списка ComboBox в список ListBox,

Рекомендуемая форма программы приведена на Рис. 13.1.

206

Рисунок 13.1 - Форма программы

Форма содержит следующие компоненты:

ListBox1 - простой список.

Label1 – метка для заголовка компонента ListBox1.

ComboBox1 - комбинированный список.Label2 – метка для заголовка компонента ComboBox1.

Edit1однострочный редактор для ввода текста. В него вводится текст строки для списка.

Label3 – метка для заголовка редактора Edit1.

Button1– кнопка "Инициализация". Позволяет очистить поле Edit1 и установить там курсор.

Button2 – кнопка "Принять в ComboBox" для заполнения компонента

ComboBox1.

Button3 – кнопка "Редактировать ComboBox". Позволяет вводить, удалять, взаимозаменять и перемещать строки в списке.

Button4 – кнопка "Копировать в ListBox". Позволяет скопировать в ListBox строки, выбираемые в ComboBox.

Выполнение

1.Активизируем ИСР, выбрав Delphi в проводнике Windows.

2.Экран имеет вид, показанный на Рис. 12.2. По умолчанию выводится пустая форма, которую нужно заполнить компонентами. В окне Дерева объектов отображен компонент Форма с именем Form1 по умолчанию

Задание свойств формы.

Выбираем объект Form1 и подбираем его размеры и положение. В окне Инспектора объектов назначаем свойства формы:

Свойство

Значение

 

English

Перевод

English

Русское

Name

Имя

Prg_12_1

 

Caption

Надпись

Prg_12_1

Программирование_ Номер_Задание

Position

Положение

poScreenCenter

В центре экрана

У формы меняется заголовок Form1=> Prg_12_1.

207

Заполнение формы

При заполнении формы в палитре компонент выбирается нужный блок и переносится в форму. Там подбираются его положение и размеры. Затем в окне Инспектора объектов назначаются свойства компонента. Большая часть свойств устанавливается автоматически, их редактировать не следует. Нужные нам компоненты размещаются в палитре компонент на странице Standard.

Для кнопок необходимо добавить функциональность, написав код обработчика события нажатия. При двойном щелчке по кнопке ИСР автоматически объявляет подпрограмму обработчика. В код модуля формы проекта заносятся:

1.В поля объекта заголовок обработчика. Заголовок обработчика формируется автоматически. Его имя содержит записанные без пробелов имя компонента и события с префиксом on, которое отрабатывается.

2.В раздел реализации шаблон обработчика. Он имеет заголовок, совпадающий с заголовком в поле объекта с добавлением имени формы в начале заголовка. В него между операторными скобками begin…end надо внести текст подпрограммы

обработки события.

Для некоторых обработчиков могут потребоваться и локальные переменные.

Листинг модуля формы: unit Prg_12_1_; interface uses

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

type

TPrg_12_1 = class(TForm)

ListBox1: TListBox; ComboBox1: TComboBox; Button1: TButton; Edit1: TEdit;

Button2: TButton;

Label1: TLabel; Label2: TLabel; Label3: TLabel; Button3: TButton; Button4: TButton;

procedure Button1Click(Sender: TObject);

procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure Button4Click(Sender: TObject);

private

{Private declarations } public

{Public declarations } end;

var

Prg_12 1: TPrg_12 1; implementation

{$R *.dfm}

procedure TPrg_12_1.Button1Click(Sender: TObject); begin Edit1.Text:=''; Edit1.SetFocus;

end;

procedure TPrg_12_1.Button2Click(Sender: TObject); begin ComboBox1.Items.Add(Edit1.Text); Edit1.Text:=''; Edit1.SetFocus;

end;

procedure TPrg_12_1.Button3Click(Sender: TObject);

208

begin ComboBox1.Items.Insert(comboBox1.ItemIndex,Edit1.Text); Edit1.Text:='';

Edit1.SetFocus;

end;

procedure TPrg_12_1.Button4Click(Sender: TObject); begin

ListBox1.Items.Add(ComboBox1.Items[ComboBox1.ItemIndex]);

end;

end.

После заполнения панелей компонентами форма примет вид Рис. 13.1. Окно Дерево объектов приобретает вид, показанный на Рис. 13.3. Проверьте по нему правильность введенных компонент, их имена и иерархию.

Рисунок13.3 - Дерево объектов после заполнения формы компонентами

3. Сохраним проект в папке с именем 12_1.

Для этого вызовем команду Файл => Сохранить Проект Как, которая приводит к появлению диалогового окна. В нем нужно попасть в нужную папку и сохранить проект. При сохранении проекта приложения необходимо сохранять проект (с именем Prg_12_1) и модуль формы (с именем Prg_12_1_).

4.Проверим программу в работе. Запускаем программу командой. Выполнить. Возникает окно приложения.

Инициализация. Кнопкой Инициализация очищаем Edit1 и передаем ему фокус ввода. Курсор появляется в поле ввода Edit1.

Заполнение списка ComboBox. Для каждой строки в редакторе Edit1 заносим текст, кнопкой. Принять в ComboBox переносим его в список. Повторяем операцию нужное число раз. Каждый раз проверяем список ComboBox, убеждаясь в появлении новой строки в конце.

Редактирование. В редакторе Edit1 заносим строку текста для ввода в

произвольно выбираемую позицию. В ComboBox выделяем позицию для ввода, ее текст перемещается в верхнюю строку редактирования.

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

Выводы

1. Списки используются для выбора элементов из большого набора.

209

2.В ИСР Delphi определены несколько компонент списков:

ListBox - простой список строк текста для выбора без редактирования.

ComboBox - комбинированный список строк текста с возможностью выбора и редактирования.

ComboBoxEx - расширенный комбинированный список строк с отображением в строках текста и значков.

3.Все списки содержат массив строк текста, для которых применяются свойства:

Items(Index) - массив строк текста с номером Index. Нумерация с 0.

ItemIdent - номер выделенного элемента.

Count - число элементов в списке.

Capacity - максимальное число элементов в списке.

4.Для работы со списками доступны методы:

Add - добавляет элемент в конец списка.

Insert(Index,Item) - добавляет элемент Item в позицию с номером Index. Список переиндексируется.

Delete (Index) - удаляет элемент с номером Index. Список переиндексируется.

Clear - очищает список. Делает Count=0, Capacity=0.

Exchange(Index1, Index2) - меняет местами элементы с номерами Index1 и Index2.

Move(CurIndex, NewIndex) - перемещает элемент из текущей позиции

CurIndex в новую позицию NewIndex.

5.Список ComboBox может отображаться в полной и краткой формах. В первом случае отображаются строка редактирования и список для выбора. Во втором случае список выбора выпадающий, отображается по требованию.

14. Модули

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

1.По рекомендованной литературе изучить назначение и использование модулей и DLL (Dynamic Linked Library = динамически связываемая библиотека);

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

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

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

1.Что такое модуль? Его назначение и создание.

2.Структура модуля.

3.Назначение и содержание секций Interface, Implementation, Initialization, Finalization.

4.Связывание модуля с вызывающей программой.

5.Что такое DLL? Ее назначение и создание.

6.Структура DLL.

7.Экспортируемые и внутренние подпрограммы DLL.

8.Назначение и содержание списка Exports.

9.Связывание DLL с вызывающей программой.

10.Способы вызова подпрограмм из DLL.

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

1.Создать вызывающую программу, использующую модуль комплексной арифметики Complex, содержащий 4 функции: сложение, вычитание, умножение и деление. Вызывающая программа должна выполнить функцию 1 с комплексными операндами Comp1=a + i*b и Comp2=c + i*d b и функцию деления Comp1 на ноль. Варианты заданий в табл. 13.1. Проект – приложение.

210