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

практикум

.pdf
Скачиваний:
45
Добавлен:
13.05.2015
Размер:
1.34 Mб
Скачать

Программирование в среде Deplhi 41

read(s);

A:=A+[s];

end;

end.

2. Распечатать содержимое множества:

......

Var B:set of 1..100; k:byte;

begin

for k:=1 to 100 do

if k in B then Write(k);

......

end.

3.Сокращение проверок в операторе if:

Оператор if (k=5) or (k=1) or (k=8) then .... можно записать более изящно: if k in [5,1,8] then ....

6.1.Типы данных для работы со строками

6.1.1. Короткие строки типа ShortString и String[N]

Короткие строки имеют фиксированное количество символов. Строка ShortString может содержать 255 символов. Строка String[N] может содержать N символов, нонеболее255. Первыйбайтэтихпеременныхсодержитдлинустроки.

6.1.2. Длинная строка типа String

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

6.1.3. Широкая строка типа WideString

Введена для обеспечения совместимости с компонентами, основанными на OLE-технологии. От типа String отличается только тем, что для представления каждого символа используется не один, а два байта.

6.1.4. Нуль-терминальная строка типа PChar

Представляет собой цепочку символов, ограниченную символом #0. Максимальная длина строки ограничена только доступной программе памятью. Нуль-терминальные строки широко используются при обращениях к API-

функциям Windows (API – Application Program Interface – интерфейс прикладных программ).

42

6.1.5. Представление строки в виде массива символов

Строка может быть описана как массив символов. Если массив имеет нулевую границу, он совместим с типом PChar.

Var

MasS : array[1…100] of Char;

В отличие от нуль-терминальной строки здесь длина имеет фиксированное значение и не может меняться в процессе выполнения программы.

6.2. Компонент TListBox

Компонент TListBox представляет собой список, элементы которого выбираются при помощи клавиатуры или мыши. Список элементов задается свойством Items, методы Add, Delete и Insert которого используются для добавления, удаления и вставки строк. Объект Items (TString) хранит строки, находящиеся в списке. Для определения номера выделенного элемента используется свойство ItemIndex.

6.3. Компонент TComboBox

КомбинированныйсписокTComboBox представляетсобойкомбинациюсписка TListBox и редактора TЕdit, поэтому практически все свойства заимствованы у этих компонентов. Для работы с окном редактирования используется свойство Text как в TEdit, а для работы со списком выбора - свойство Items как в TListBox. Cуществует Пять модификаций компонента, определяемых его свойством Style. В модификации csSimple список всегда раскрыт, в остальных он раскрывается после нажатия кнопки справа от редактора.

6.4. Компонент TBitBtn

Компонент TBitBtn расположен на странице Additonal палитры компонентов и представляет собой разновидность стандартной кнопки TButton. Его отличительная особенность – наличие растрового изображения на поверхности кнопки, которое определяется свойством Clyph. Кроме того, имеется свойство Kind, которое задает одну из 11 стандартных разновидностей кнопок. Нажатие любой из них, кроме bkCustom и bkHelp закрывает модальное окно и возвращает впрограммурезультатmr*** (напримерbkOk - mrOk). КнопкаbkClose закрывает главное окно и завершает работу программы.

6.5. Обработка событий

Обовсехпроисходящихвсистемесобытиях, такихкаксозданиеформы, нажатие кнопки мыши или клавиатуры и т.д., ядро Windows информирует окна путем посылки соответствующих сообщений. Среда DELPHI позволяет принимать и обрабатывать большинство таких сообщений. Каждый компонент содержит обработчики сообщений на странице Events инспектора объектов.

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

Программирование в среде Deplhi 43

в верхней части окна инспектора объектов и выбрать необходимый компонент. Затем, на странице Events, нажатием левой клавиши мыши, выбрать обработчик и дважды щелкнуть по его левой (белой) части. В ответ DELPHI активизирует окно текста программы и покажет заготовку процедуры обработки выбранного события.

Каждыйкомпонентимеетсвойнаборобработчиковсобытий, однаконекоторые изнихприсушибольшинствукомпонентов. Наиболеечастоприменяемыесобытия представлены в табл. 6.1.

 

Таблица 6.1

 

 

 

Событие

Описание события

OnActivate

Форма получает это событие при активации

 

OnCreate

Возникает при создании формы (компонент TForm). В

 

 

обработчике данного события следует задавать действия,

 

 

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

 

 

например установка начальных значений

 

OnKeyPress

Возникает при нажатии клавиши на клавиатуре. Параметр

 

 

Key имеет тип Char и содержит ASCII-код нажатой

 

 

клавиши (клавиша Enter клавиатуры имеет код #13,

 

 

клавиша Esc - #27 и т.д.). Обычно это событие

 

 

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

 

 

нажатие одной из клавиш

 

OnKeyDown

Возникает при нажатии клавиши на клавиатуре.

 

 

Обработчик этого события получает информацию о

 

 

нажатой клавише и состоянии клавиш Shift, Alt и Ctlr, а

 

 

также о нажатой кнопке мыши. Информация о клавише

 

 

передается параметром Key, который имеет тип Word

 

OnKeyUp

Является парным событием для OnKeyDown и возникает

 

 

при отпускании ранее нажатой клавиши

 

OnClick

Возникает при нажатии кнопки мыши в области

 

 

компонента

 

OnDblClick

Возникает при двойном нажатии кнопки мыши в области

 

 

компонента

 

6.6. Порядок выполнения индивидуального задания

Задание: написать программу подсчета числа слов в произвольной строке. В качестверазделителяможетбытьлюбоечислопробелов. Длявводастрокиработы с ними использовать TComboBox. Ввод строки заканчивать нажатием клавиши Enter. Для выхода из программы использовать кнопку Close.

Панель диалога будет иметь вид (рис. 5.1). Текст программы приведен ниже.

unit Unit6; interface

44

TLabel

TComboBox

TLabel

TLabel

TBitBtn

Рис. 6.1

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

type

TForm1 = class(TForm) Label1: TLabel; ComboBox1: TComboBox; BitBtn1: TBitBtn;

Label2: TLabel;

Label3: TLabel;

procedure FormActivate(Sender: TObject);

procedure ComboBox1KeyPress(Sender: TObject; var Key: Char); procedure ComboBox1Click(Sender: TObject);

private

{Private declarations } public

{Public declarations } end;

var

Form1: TForm1; implementation

// Обработка события нажатия клавиши
procedure TForm1.ComboBox1KeyPress(Sender: TObject; var Key: Char); begin
if key=#13 then begin // Если нажата клавиша Enter, то...
ComboBox1.Items.Add(ComboBox1.Text); // Строка из окна
// редактирования заносится в список выбора ComboBox1.Text:=''; // Очистка окна редактирования
end;
end;
procedure TForm1.ComboBox1Click(Sender: TObject); var st : string;
n,i,nst: integer; begin
nst:=ComboBox1.ItemIndex; // Определение номера выбранной строки st:=ComboBox1.Items[nst]; //Занесениевыбраннойстрокивпеременнуюst if st[1]<>' ' then n:=1 // Если строка начинается со слова, то n=1
else n:=0; // иначе n=0
for i:=1 to length(st)-1 do // Перебор всех символов в строке
if (st[i]=' ') and (st[i+1]<>' ') then Inc(n); // Если i-тый символ - пробел,
// а i+1- не пробел , то увеличиваем число слов на еденицу
Label3.Caption:=IntToStr(n); // Вывод числа слов в Label3 end;
end.
6.7. Индивидуальные задания
ВовсехзаданияхисходныеданныевводитьспомощьюсвойстваText всвойство Items компонента TComboBox. Скалярный результат выводить c помощью компонентаTLabel. ВводстрокизаканчиватьнажатиемклавишиEnter. Длявыхода из программы использовать кнопку Close. Для расчетов вводить несколько различных строк.

Программирование в среде Deplhi 45

{$R *.dfm}

// Обработка события активизации формы procedure TForm1.FormActivate(Sender: TObject); begin

ComboBox1.SetFocus; // Передача фокуса ComboBox1 end;

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

2.Дана строка, состоящая из групп нулей и единиц. Найти и вывести на экран самую короткую группу.

3.Дана строка, состоящая из групп нулей и единиц. Подсчитать количество

46

символов в самой длинной группе.

4.Дана строка, состоящая из групп нулей и единиц. Найти и вывести на экран группы с четным количеством символов.

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

6.Дана строка, состоящая из букв, цифр, запятых, точек, знаков “+” и “-“. Выделить подстроку, которая соответствует записи целого числа (т.е. начинается со знака “+” или “-“ и внутри подстроки нет букв, запятых и точек).

7.Данастрокасимволов, состоящаяизбукв, цифр, запятых, точек, знаков“+” и “-“. Выделить подстроку, которая соответствует записи вещественного числа с фиксированной точкой

8.Данастрокасимволов, состоящаяизбукв, цифр, запятых, точек, знаков“+” и “-“. Выделить подстроку, которая соответствует записи вещественного числа с плавающей точкой

9.Дана строка символов, состоящая из произвольных десятичных чисел, разделенных пробелами. Вывести на экран числа этой строки в порядке возрастания их значений.

10.Дана строка символов, состоящая из произвольных десятичных чисел, разделенных пробелами. Вывести четные числа этой строки.

11.Дана строка символов, состоящая из произвольного текста на английском языке, словаразделеныпробелами. Вывестинаэкрансловаэтоготекставпорядке, соответствующем латинскому алфавиту.

12.Дана строка символов, состоящая из произвольного текста на английском языке, слова разделены пробелами. Вывести на экран порядковый номер слова, накрывающего k-ю позицию (если на k-ю позицию попадает пробел, то номер предыдущего слова).

13.Дана строка символов, состоящая из произвольного текста на английском языке, слова разделены пробелами. Разбить исходную строку на две подстроки, причем первая длиной k-символов (если на k-ю позицию попадает слово, то его следует отнести ко второй строке, дополнив первую пробелами до k-позиций).

14.Дана строка символов, состоящая из произвольного текста на английском языке, слова разделены пробелами. Вывести на экран порядковый номер слова максимальной длины и номер позиции строки с которой оно начинается.

15.Дана строка символов, состоящая из произвольного текста на английском языке, слова разделены пробелами. Вывести на экран порядковый номер слова минимальной длины и количество символов в этом слове.

16.Дана строка символов, состоящая из произвольного текста на английском языке, слова разделены пробелами. В каждом слове заменить первую букву на прописную.

17.Дана строка символов, состоящая из произвольного текста на английском языке, слова разделены пробелами. Удалить первые k слов из строки, сдвинув на их место последующие слова строки.

Программирование в среде Deplhi 47

18.Дана строка символов, состоящая из произвольного текста на английском языке, слова разделены пробелами. Поменять местами i- и j-е слова.

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

20.Дана строка символов, состоящая из произвольного текста на английском языке, слова разделены пробелами. Заменить буквы латинского алфавита на соответствующие им буквы русского алфавита.

21.Дана строка символов, в которой могут встречаться цифры, пробелы, буква “E” и знаки “+”, “-“. Из данной строки выделить подстроки, разделенные пробелами. Определить, является ли первая подстрока числом. Если да, то выяснить: целое или вещественное число, положительное или отрицательное.

22.Дана строка символов, содержащая некоторый текст на русском языке. Разработать программу форматирования этого текста, т.е. его разбиения на отдельные строки ( по k символов в каждой строке ) и выравнивания по правой границе путем вставки между отдельными словами необходимого количества пробелов.

23.Дана строка символов, содержащая некоторый текст на русском языке. Заменить буквы русского алфавита на соответствующие им буквы латинского алфавита.

24.Данастрокасимволов, содержащаянекоторыйтекст. Разработатьпрограмму, которая определяет, является ли данный текст палиндромом, т.е. читается ли он слева направо так же, как и справа налево ( например, «А роза упала на лапу Азора»).

25.Составить программу, которая читает построчно текст другой программы ( ввестисклавиатуры) наязыкеPascal, обнаруживаеткомментарииивыводитих на экран.

26.Составить программу, которая читает построчно текст другой программы ( ввести с клавиатуры ) на языке Pascal, подсчитывает количество ключевых слов «begin» и «end» и выводит на экран соответствующее сообщение.

27.Разработать программу, котораязаданное целоечислоот1 до1999 выводит на экран римскими цифрами.

28.Дана строка символов, в которой могут встречаться цифры, пробелы, буква “E” и знаки “+”, “-“. Определить количество действительных чисел в строке.

29.Дан текст из k символов. Вывести на экран только строчные русские буквы, входящие в этот текст.

30.Дан текст из k символов. Вывести на экран в алфавитном порядке все различные прописные русские буквы, входящие в этот текст.

48

ТЕМА 7. ПРОГРАММИРОВАНИЕ С ИСПОЛЬЗОВАНИЕМ МЕХАНИЗМА ОБРАБОТКИ ИСКЛЮЧИТЕЛЬНЫХ СИТУАЦИЙ.

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

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

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

СредаDelphi имеетдвеконструкциидляобработкиисключительныхситуаций.

try

 

try

 

except

 

finally

on <тип искл.. ситуации1> do <оператор>;

и

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

on <тип искл.. ситуации2> do <оператор>;

 

end;

 

 

else

 

 

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

 

 

end;

 

 

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

Если исключительная ситуация не возникает, то сначала выполняются операторы, расположенные внутри блока try finally, а затем – внутри блока finally … end. При возникновении исключительной ситуации выполнение сразу передается в блок finally, который обычно служит для корректного завершения программы, т.е. закрытияфайлов, очисткидинамическивыделеннойпамятиит.д.

Когда возникаетнеобходимость всамостоятельной обработке исключительной

Программирование в среде Deplhi 49

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

Некоторые, наиболее распространенные типы исключительных ситуаций представлены в табл. 7.1.

 

Таблица 7.1.

 

 

 

Тип исключительной

Причина

ситуации

 

 

Eabort

Намеренное прерывания программы

 

EArrayError

Ошибка при операциях с массивами: использование

 

 

ошибочного индекса массива, добавление слишком большого

 

 

числа элементов в массив фиксированной длины

 

EConvertError

Ошибка преобразования строки в другие типы данных

 

EDivByZero

Попытка целочисленного деления на ноль

 

ERangeError

Целочисленное значение или индекс вне допустимого

 

 

диапазона (при включенной директиве проверки границ

 

 

массива {$R+})

 

EIntOverflow

Переполнение при операции с целыми числами (при

 

 

включенной директиве {$Q+ })

 

EZeroDivide

Деление на ноль числа с плавающей точкой

 

EOutOfMemory

Недостаточно памяти

 

EFileNotFound

Файл не найден

 

EInvalidFileName

Неверное имя файла

 

EInvalidOp

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

 

EOverFlow

Переполнение при выполнении операции с плавающей

 

 

точкой

 

EAssertionFailed

Возникает при намеренной генерации исключительной

 

 

ситуации с помощью процедуры Assert (при включенной

 

 

директиве { $С+ })

 

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

Возникновение исключительной ситуации может быть инициировано преднамеренно. ДляэтогоможноиспользоватьпроцедуруAbort (классEAbort). В отличие от Break и Exit она позволяет осуществить выход из глубоко вложенных циклов и процедур. Можно также использовать процедуру

Assert(expr : Boolean [; const msg: string]), у которой первый параметр представляетсобойлогическоевыражение, авторойсодержиттекстсообщения.

p 10

50

Если значение первого параметра становится false, то происходит генерация исключительной ситуации EAssertionFailed и появляется диалоговое окно с соответствующим сообщением. Искусственно генерировать исключительную ситуацию можно также с использованием ключевого слова raise:

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

7.2. Системы счисления

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

R = anan1 ... a1a0 , a1 ...ak = an pn + an1 pn1 + ...+ a1 p1 + a0 p0 + an1 pn1 + ...+ ak pk ,

где ai – цифры, p – основание системы счисления. Количество цифр равно p. Для записи цифр в общем случае может быть использован любой набор p символов. Обычно при используются символы 0 9 , для p 10 добавляются буквы латинского алфавита A, B, C, D, E, F которые в десятичной системе представляют числами 10, 11, 12, 13, 14, 15. Например

R= (2A, B)16 = 2 161 + A 160 + B 161 = 2 16 +10 1+11/16 = (42,6875)10

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

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

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

Припереводецелойчасти, онаделитсянаоснованиеновойсистемысчисления, остаток представляет очередную цифру a0 , a1, ... , an , а частное снова делится на

основание. Процессповторяетсядотехпор, покачастноенестанетравнымнулю. Заметим, что цифры получаются в порядке, обратном порядку их следования в записи числа.

Припереводедробнойчастионаумножаетсянаоснованиесистемысчисления. Целая часть полученного числа представляет очередную цифру a1, a2 , ... , ak , а

дробная часть опять умножается на основание системы. Расчеты ведут до получения требуемого количества цифр.

7.3. Порядок выполнения индивидуального задания

Задание Написать обучающую программу , позволяющую освоить операции сложения, вычитания, умножения, целочисленногоделенияинахожденияостатка от целочисленного деления для любых двух целых чисел, записанных в семнадцатеричнойсистемесчисления. Дляобозначениячиселиспользоватьцифры от 0 до 9 и буквы от a до g (прописные или строчные).