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

Учебное пособие 1159

.pdf
Скачиваний:
4
Добавлен:
30.04.2022
Размер:
823.79 Кб
Скачать

Function Pos

Отыскивает в строке St первое вхо-

(SubSt, St: String): Integ-

ждение подстроки SubSt и возвра-

er;

щает номер позиции, с которой она

 

начинается. Если подстрока не най-

 

дена, возвращается ноль.

procedure SetLength

Устанавливает новую (меньшую)

(St: String; NewLength;

длину NewLength строки St. Если

Integer);

NewLength больше текущей длины

 

строки, обращение к SetLength иг-

 

норируется.

function StnngOfChar

Создает строку, состоящую из

(Ch: Char; Count:

Count раз повторенного.символа Ch.

Integer): string;

 

Function Uppercase

Возвращает исходную строку S, в

(const S: String): String;

которой все строчные латинские

 

буквы заменены на заглавные.

Подпрограммы преобразования строк в другие типы

 

 

Function StrToCurr

Преобразует символы строки St в

(St: String): Currency;

целое число типа Currency. Строка

 

не должна содержать ведущих или

 

ведомых пробелов.

Function StrToFloat

Преобразует символы строки St в

(St: String): Extended;

вещественное число. Строка не

 

должна содержать ведущих или ве-

 

домых пробелов.

Function StrToInt

Преобразует символы строки St в

(St: String): integer;

целое число. Строка не должна со-

 

держать ведущих или ведомых про-

 

белов.

Function StrToIntDef

Преобразует символы строки St в

(St: Sttring; Default: In-

целое число. Если строка не содер-

teger): Integer;

жит правильного представления це-

 

лого числа возвращается значение

 

Default.

1

2

 

39

Function StrToIntRange

Преобразует символы строки St в

(St: String; Min, Max:

целое число и возбуждает исключе-

Longint): Lomgint;

ние ERangeError, если число выхо-

 

дит

из

заданного

диапазона

 

Min...Max.

 

 

 

Procedure Val

Преобразует строку символов St во

(St: String; var X; Code:

внутреннее

представление

целой

Integer);

или

вещественной переменной X,

 

которое определяется

типом этой

 

переменной. Параметр Code содер-

 

жит ноль, если преобразование

 

прошло успешно, и тогда в X по-

 

мещается результат

преобразова-

 

ния, в противном случае он содер-

 

жит номер позиции в строке St, где

 

обнаружен ошибочный символ, и в

 

этом случае содержимое Х не меня-

 

ется. В строке St могут быть веду-

 

щие и/или ведомые пробелы.

 

Подпрограммы обратного преобразования

 

 

 

 

 

Function FloatToStr

Преобразует

вещественное

значе-

(Value: Extended):

ние Value в строку символов.

 

Strings;

 

 

 

 

 

Function FloatToStrF

Преобразует

вещественное

значе-

(Value: Extended; Format:

ние Value в строку символов с уче-

TFloatFormat; Precision,

том формата Format и параметров

Digits: Integer): String;

Precision и Digits (см. пояснения

 

ниже).

 

 

 

Function FormatFloat

Преобразует

вещественное

значе-

(Format: String; Value:

ние Value в cтроку символов с уче-

Extended): String;

том спецификаторов формат Format

 

(см. пояснения ниже).

 

 

Function IntToStr

Преобразует целое значение Value в

(Value: integer): String;

строку символов.

 

 

1

 

 

2

 

 

 

 

40

 

 

 

procedure Str

Преобразует число Х любого веще-

(X [:Width [:Decimals]];

ственного или целого типов в стро-

var St: String) ;

ку символов St; параметры Width и

 

Decimals, если они присутствуют,

 

задают

формат

преобразования:

 

Width

определяет

общую ширину

 

поля, выделенного под соответст-

 

вующее символьное представление

 

вещественного или целого числа X,

 

a Decimals - количество символов в

 

дробной части (этот параметр имеет

 

смысл только в том случае, когда Х-

 

вещественное число).

При преобразовании с помощью функций StrToXXX строка может содержать недопустимые для типа XXX символы. В этом случае возбуждается исключительная ситуация EConvertError. При обратных преобразованиях XXXToStr формат получаемой строки зависит от установленных в Windows системных параметров: разделителей даты, времени, целой и дробной частей вещественного числа.

5 Операторы языка

5.1 Оператор присваивания Оператор присваивания является одним из наиболе часто

используемых в Pascal и служит для изменения значения параметра или свойства обекта. Оператор представляет собой комбинацию символов < := >, которая читается как ―присвоить значение‖. Символы < := > всегда пишутся слитно, без разделяющих пробелов. Запись

Num:=3;

означает, что идентификатору Num будет присвоено значение 3. Следует отметить, что запись Num=3 не является опе-

ратором присваивания, не изменяет значения идентификатора

41

и используется для логической проверки равенства: выражение (Num=3) истинно, если значение идентификатора равно 3 и ложно в противном случае.

5.2 Составной оператор и пустой операторы Составной оператор - это последовательность произволь-

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

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

Begin

....

begin

....

....

end;

End.

Фактически весь раздел операторов, обрамленный словами begin и end, представляет собой один составной оператор. Это удобно при необходимости ―группировки‖ нескольких операторов в одно целое.

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

5.3 Условный оператор Условный оператор позволяет проверить некоторое усло-

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

42

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

Структура условного оператора имеет следующий вид: if <условие> then <оператор1> else <оператор2>; где if, then, else - зарезервированные слова (если,

то, иначе); <условие> - произвольное выражение логического типа; <оператор1> и <оператор2> — любые операторы языка.

Условный оператор работает по следующему алгоритму. Вначале вычисляется условное выражение <условие>. Если результат есть True (истина), то выполняется <оператор1>, а <оператор2> пропускается; если результат есть False (ложь), наоборот, <оператор1> пропускается, а выполняется <оператор2>. Например:

var

X, Y, Max: Integer; begin

. . .

if X > Max then Y:= Max else Y:= X; end;

При выполнении этого фрагмента переменная Y получит значение переменной X, если только это значение не превышает Мах, в противном случае Y станет равно Мах.

Условными называются выражения, имеющие одно из двух возможных значений: истина или ложь. Такие выражения чаще всего получаются при сравнении переменных с помощью операций отношения = , <> , > , >= , < , <=. Сложные логические выражения составляются с использованием логических операций and (логическое И), or (логическое ИЛИ) и not (логическое НЕ). Например:

if (a > b) and (b <> 0) then ...

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

Часть else <оператор2> условного оператора может быть опущена. Тогда при значении True условного выражения

выполняется <оператор1>, в противном случае этот оператор

43

пропускается:

Поскольку любой из операторов <оператор1> и <оператор2> мог быть любого типа, в том числе и условным, а в то же время не каждый из «вложенных» условных операторов может иметь часть else <оператор2>, то возникает неоднозначность трактовки условий. Эта неоднозначность в Object Pascal решается следующим образом: любая встретившаяся часть else соответствует ближайшей к ней сверху тексту программы части then условного оператора.

Пример: программа «Угадай число».

Данная программа случайным образом выбирает целое число в диапазоне 0... 1000 и запоминает его. Пользователь пытается угадать его и вводит свое число. Сравнив ввод с запомненным значением программа сообщает, больше, меньше или равно введенное число запомненному. Ввод продолжается до угадывания, после чего программа предлагает сыграть еще раз.

Поскольку пользователь вводит только числа, изменим форму fmExample: вместо компонента edInput типа TEdit поместим на форму одноименный компонент типа TMaskEdit. Выберите опцию File \ New Application, щелкните по компоненту edInput и удалите его с помощью клавиши Delete, затем поместите на его место компонент MaskEdit (страница Additional), назовите его edInput (свойство Name) и в его свойство EditMask поместите строку ―0999;1;‖, что обеспечит возможность ввода в данном редакторе только целых чисел в нужном диапазоне.

В секцию private описания класса fmExample поместите объявление целочисленного поля X:

private

{ Private declarations }

X: integer;

Для обработчика события OnActivate формы fmExample напишите такой код:

procedure TfmExainple.FormActivate(Sender: TOb-

44

ject); begin

X := Random(1001); //Загадываем случайное число edInput.SetFocus; //Передаем строке edInput фокус ввода Caption := 'Угадай целое число в диапазоне 0...1000';

IbOutput.Caption :== 'Введите число:'; end;

Поместите в обработчик события OnClick кнопки bbRun такой код:

procedure TfmExample.bbRunClick(Sender: TObject); var

Y: Integer; begin

if edinput.Text =' ' then Exit;

//Если нет входного текста, прекращаем работу

//Преобразуем ввод в число:

Y := StrToInt(Trim(edinput.Text));

edInput.Text := '

'; // Очищаем ввод

edInput.SetFocus;

// Устанавливаем фокус ввода

{ Параметр Tag = 0 означает угадывание числа, иначе - ответ на вопрос, будет ли пользователь играть после угадывания } if Tag = 0 then

if X < Y then // Угадывание числа mmOutput,Lines.Add ('X <'+IntToStr(Y) ) else if X > Y then

mmOutput.Lines.Add ('X> '+lntToStr(Y) ) else

begin

mmOutput.Lines.Add ('X = '+IntToStr(Y));

// Звук для привлечения внимания

MessageBeep(MB_OK);

IbOutput.Caption := 'Вы угадали! Введите 1,

если хотите повторить:'

Tag := 1; // Следующий ввод - ответ на вопрос

end

 

else

// Анализ ответа

if Y = 1 then

 

begin

 

X := Random (1001);

// Новое число

45

 

IbOutput.Caption := 'Введите число:';

Tag:=0; // Следующий ввод - угадывание end else Close;

end;

Комментарий к программе

При активизации окна программы обработчик FormActivate с помощью генератора случайных чисел по команде X := Random (1001) помещает в поле Х случайное целое число в диапазоне от 0 до 1001. Каждый компонент Delphi имеет целочисленное свойство Tag, которым программист может распоряжаться по своему усмотрению. Прорамма использует это свойство формы fmExample для разделения алгоритма обработки события OnClick кнопки bbRun на два варианта: пользователь угадывает число (Tag = 0) или отвечает на предложение сыграть еще раз (Tag = 1). В момент создания экземпляра класса TfmExmplе - объекта fmExample - все его поля обнуляются, поэтому первоначальной Tag = 0 и программа анализирует угадывание числа. При угадывании срабатывает составной оператор

begin

mmOutput.Lines.Add ('X = '+IntToStr(Y)); MessageBeep(MB_OK);

IbOutput.Caption := 'Вы угадали! Введите 1, если хотите повторить:'

Tag := 1; // Следующий ввод - ответ на вопрос end

и Tag получает значение 1 (стандартная процедура MessageBeep заставляет звуковую систему ПК издать короткий звуковой сигнал). Теперь очередной щелчок по кнопке bbRun будет означать, что пользователь подготовил ответ на вопрос и программа анализирует его. Если пользователь ввел число, отличное от 1, произойдет обращение к методу Close формы fmExample и программа прекратит работу.

5.4 Операторы повторений

46

// Начальное значение Sum 47

Вязыке Object Pascal имеются три различных оператора,

спомощью которых можно запрограммировать повторяющиеся фрагменты программ.

Счетный оператор цикла FOR имеет такую структуру: for <параметр_цикла> := <нач. знач> to <кон. знач> do

<оператор>;

Здесь for, to, do - зарезервированные слова {для, до, выполнить), <параметр_цикла> - переменная типа Integer (точнее, любого порядков вого типа); <нач. знач> - начальное значение - выражение того же типа; <кон. знач> - конечное значение - выражение того же типа, <оператор> - произвольный оператор Object Pascal.

При выполнении оператора for вначале вычисляется выражение <нач. знач> и осуществляется присваивание <параметр цикла>:=<нач. знач>. После этого циклически повторяется:

• проверка условия <параметр цикла> <= <кон. знач>; если условие не выполнено, оператор for завершает свою работу;

• выполнение оператора <оператор>;

• наращивание переменной <параметр цикла> на едини-

цу.

Пример В качестве иллюстрации применения оператора for рассмотрим программу, осуществляющую ввод произвольного целого числа N и вычиление суммы всех целых чисел от 1 до N. Для нового приложения (опция File \ New Application) создайте такой' обработчик bbRunClick

procedure TfmExample.bbRunClick(Sender: TObject) ; var

i,N,Sum : Integer; begin

if edInput.Text = ' ' then Exit; N := StrToInt(edInput.Text); edInput.Text :=' '; edInput.SetFocus;

Sum := 0;

for i := 1 to N do // Цикл формирования суммы

Sum := Sum+i;

mniOutput.Lines.Add ('Сумма всех целых чисел ';

' в диапазоне 1. . '+IntToStr (N) + ' равна '+IntToStr (Sum) ); end;

Отметим два обстоятельства. Во-первых, условие, управляющее работой оператора for, проверяется перед выполнением оператора <оператор>: если условие не выполняется в самом начале работы оператора for, исполняемый оператор не будет выполнен ни разу. Другое обстоятельство - шаг наращивания параметра цикла строго постоянен и равен (+1). Существует другая форма оператора:

for <пар. цик>: = <нач. знач> downto <кон. нач> do <оператор>

Замена зарезервированного слова to на downto означает, что шаг наращивания параметра цикла равен (-1), а управляющее условие приобретает вид <параметр. цикла> = <кон. знач>.

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

Оператор цикла WHILE с предпроверкой условия: while <условие> do <оператор>;

Здесь while, do - зарезервированные слова (пока выполняется условие, делать); <условие> - выражение логического типа; <оператор> - произвольный оператор Object Pascal.

Если выражение <условие> имеет значение True, то выполняется <оператор>, после чего вычисление выражения <условие> и его проверка повторяются. Если <условие> имеет значение False, оператор, while прекращает свою работу.

Пример Программа отыскивает так называемое «машинное эпсилон» - такое минимальное, не равное нулю вещественное число, которое после прибавления его к 1,0 еще дает результат, отличный от 1,0. В учебной програм ме используется один из вещественных типов - Real, занимающий 8 смежных байт и представляющий дробные 48(вещественные) числа с точ-

ностью 15...16 значащих цифр. В дискретной машинной арифметике всегда существуют такие числа 0<x<eps, что 1,0 + x = 1,0. Дело в том, что внутреннее представление типа Real может дать «лишь» приблизительно 1019 возможных комбинаций значащих J разрядов в отведенных для него 8 байтах. Конечно же, это очень большое число, но оно несопоставимо с бесконечным множеством вещественных чисел. Аппроксимация бесконечного непрерывного множества и вещественных чисел конечным (пусть даже и очень большим) множеством их внутреннего машинного представления и приводит к появлению «машинного эпсилон».

Для нового приложения (опция File \ New Application) создайте такой обработчик bbRunClick:

Procedure TfmExample.bbRunClick(Sender: TObjedt);

Var

Epsilon: Real; begin

Epsilon := 1;

while (l+Epsilon/2)>l do Epsilon := Epsilon/2; ibOutput.Caption:=‘Машинное эпсилон =‘+FloatToStr (Epsilon) end;

Оператор цикла REPEAT…UNTIL с постпроверкой усло-

вия:

repeat <тело цикла> until <условие>;

Здесь repeat и until – зарезервированные слова (повторить до тех пор, пока не будет выполнено условие); тело цикла – произвольная последовательность операторов, <условие> - выражение логического типа.

Операторы такого цикла выполняются хотя бы один раз, после чего вычисляется выражение <условие>. Если его значение True, то оператор цикла завершает свою работу, в противном случае цикл повторяется.

Для правильного выхода из циклов while и repeat условие выхода должно меняться внутри самого тала цикла. В

противном случае циклы становятся ―бесконечными‖ и приво-

49

дят к ―зависанию‖ программы.

Для гибкого управления циклическими оператолрами в состав Object Pascal включены две процедуры баз параметров:

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

CONTINUE – обеспечивает досрочное завершение очередного цикла, передавая управление в самый конец циклического оператора.

5.5 Оператор выбора Оператор выбора позволяет выбрать одно из возможных

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

Структура оператора выбора такова:

case <ключ выбора> of <список выбора> [else <операторы>] end;

Здесь case, of, else, end зарезервированные слова (случай, из, иначе, конец); <список выбора> - одна или более конструкций вида:

<константа выбора>:<оператор>; где <константа выбора> - константа того же типа, что и

<ключ выбора>, <оператор> - произвольный оператор. Оператор выбора работает следующим образом: вначале

вычисляется значение выражения <ключ выбора>, а затем в последовательности операторов списка выбора отыскивается такой, которому предшествует константа, равная вычисленному значению. Найденный оператор выполняется, после чего оператор цикла завершает свою работу. Если в списке выбора не будет найдена константа, соответствующая вычисленному значению ключа выбора, управление передается операторам, стоящим за словом else. Часть else <операторы> можно опускать. Тогда при отсутствии в списке выбора нужной константы ничего не произойдет и оператор выбора просто завершит свою работу. | 50

Любому из операторов списка выбора может предшествовать не одна, а несколько констант выбора, разделенных запятыми.

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

Для упрощения ввода операндов и знака поместим на учебную форму еще два компонента. Выберите File \ New Application, переименуйте компонент Iblnput в ibInput1 и cправа от него поместите компонент ComboBox (страница Standard), назовите его cbSign (свойство Name). Раскройте диалоговое окно свойств Items этого компонента и введите четыре строки со знаками математических действий в такой последовательности:

+

-

*

/

И, наконец, справа от cbSign разместите еще один компонент Edit (страница Standard) и назовите его edInput2. He забудьте очистить свойства Text у всех трех компонентов.

Для обработчика события bbRunClick введите такой текст:

procedure TfmExample.bbRunClick(Sender:TObject).; var Х, Y, Z : Real;

begin

{Блокируем работу, если не введены операнды и не выбрано действие}

if (edInput1.Text=' ') or (edinput2.Text=' ') or (cbSign.Itemlndex<0)

then Exit;

// Проверяем правильность ввода 1-го операнда:

try

// Начало защищенного блока

Х := StrToFloat(Trim(edInputl.Text));

except

// Обработка ошибки

ShowMessage(‘Ошибки записи числа:'+edlnputl.Text) ;

51

edInputl.SetFocus;

Exit;

end; // Конец .защищенного блока

// Проверяем правильность ввода 2-го операнда: try // Начало защищенного блока

Y := StrToFloat (Trim (edinput2. Text)) ; except // Обработка ошибки

ShowMessage(‘Ошибка записи числа: '+edlnput2.Text) ; edInput2.SetFocus;

Exit;

end; // Конец защищенного блока // Все правильно: вычисляем результат case cbSign.ItemIndex of

0:Z := X + Y;

1:Z := X - Y;

2:Z := X * Y;

3:try

Z := X / У; except

Z := l.le+38;

// Бесконечность при делении на 0 end;

end;

// Показываем результат

IbOutput.Caption := Trim(edInput1.Text)+' ' +cbSign.Items[cbSign.Itemlndex]+'

'+Trim(edInput2.Text)+’ =’; if Z >= l.le+38

then IbOutput.Caption:= IbOutput.Caption+'бесконечность';

else IbOutput.Caption:=IbOufcput.Caption +FloatToStr(Z);

mmOutput.Lines.Add(IbOutput.Caption); // Очищаем ввод

edInput1.Text := ‘ ‘; edInput2.Text :=’ ‘; cbSign.ItemIndex := -1; end;

Комментарий к программе

52

Вкачестве операндов в программе выбраны переменные веществного типа Real. Следует учесть, что компилятор Delphi

вкачео разделителя целой и дробной частей всегда использует символ « . », в то время, как аналогичный разделитель в Windows зависит от выбранной страны и для России им обычно является запятая « , ». Это означает, вещественные константы в тексте программы вы всегда должны записывать с разделителем «.», а при вводе пользователем программы вещественных чисел он должен использовать разделитель Windows.

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

ВObject Pascal есть средства обработки исключительных ситуаций (исключений), позволяющие избежать краха программы. В нашем обработчике bbRunClick такие средства используются трижды: при преобразовании строковых записей операндов и при делении. Обработчики исключений строятся в

виде таких конструкций:

.

try

<защищенный блок операторов> except

<обработка исключения> end;

Все операторы, располагающиеся между зарезервированными словами try (попробовать) и except (исключение), относятся к защищенному блоку. Если при выполнении любого из них возникнет исключение, управление будет передано в

блок операторов, располагающийся между except и end, но

53

если обработка защищенного блока пройдет без ошибок, блок <обработка исключения> игнорируется и управление передается оператору, следующему за end.

Вблок обработки исключения в учебной программе Calc включен вызов стандартной подпрограммы ShowMessage (показать сообщение), с помощью которой на экране создается окно с текстом сообщения и кнопкой ОК. После появления окна работа программы приостанавливайся в ожидании реакции пользователя. С помощью вызова стандартной подпрограммы Exit завершается работа обработчика bbRunClick и активизируется редактор, в котором обнаружен ошибочный текст.

Впроцессе контроля операции деления в случае ошибки, которая возникает при делении на 0 или на очень малую величину, результату присваивается большая положительная величина 1,1е+38. При выводе сообщения эта величина заменяется на слово «бесконечность».

Для выбора операции в программе используется компонент ComboBox - раскрывающийся список выбора. Свойство Items этого компонента хранит набор строк, которые определяют список выбора Эти строки пронумерованы начиная с нуля. Номер выбранной строки содержит свойство cbSign.ItemIndex, а если не выбрана ни одна строка, это свойство содержит -1.

Если вы ввели строки cbSign.Items в нужной последовательности, индекс выбранной строки будет соответствовать номеру операции (0 – ‗+‘, 1- ‗-‗, 2 – ‗*‘, 3 – ‗/‘ ) и над операндами будет выполнено требуемое деиствие.

5.6 Метки и операторы перехода Можно теоретически показать, что рассмотренных опера-

торов вполне достаточно для написания программ любой сложности. В этом отношении наличие в языке операторов перехода кажется излишним. Более того, современная технология структурного программирования основана на принципе «программировать без GOTO»: считается, что злоупотребление

операторами перехода затрудняет понимание программы, деа-

54

ет ее запутанной и сложной в отладке.

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

Оператор перехода имеет вид: goto <метка>;

Здесь goto - зарезервированное слово (перейти [на метку]), <метка> - метка.

Метка в Object Pascal - это произвольный идентификатор, позволяющий именовать некоторый оператор программы и таким образом ссылаться на него.

Метка располагается непосредственно перед помечаемым оператором и отделяется от него двоеточием. Оператор можно помечать несколькими метками, которые в этом случае отделяются друг от друга двоеточием. Перед тем как появиться в программе, метка должна быть описана. Описание меток состоит из зарезервированного слова label (метка), за которым следует список меток:

label loop, Ibl, lb2; begin

. . .

goto Ibl;

. . .

Ibl: lb2: <операторы>

. . .

goto lb2;

. . .

end;

Действие оператора goto состоит в передаче управления соответствующему меченому оператору.

При использовании меток необходимо руководствоваться следующими правилами:

-метка, на которую ссылается оператор goto, должна быть описана в разделе описаний, и она обязательно должна встретиться где-нибудь к в теле программы;

-метки, описанные в подпрограмме, локализуются в ней,

поэтому передача управления извне подпрограммы на метку

55

внутри нее невозможна.

6 Массивы

Рассмотренные выше простые типы данных позволяют использовать в программе одиночные объекты - числа, символы, строки и т.п. В Object Pascal могут использоваться также объекты, содержащие множено однотипных элементов. Это массивы - формальное объединение нескольких однотипных объектов (чисел, символов, строк и т.п.), рассматриваемое как единое целое.

При описании массива необходимо указать общее количество входящих в массив элементов и тип этих элементов. Например:

var а : array [1..10] of Real; b : array [0..50] of Char; с : array [-3..4] of String;

Как видим, при описании массива используются зарезервированные слова array и of (массив, из). За словом array

вквадратных скобках указывается тип-диапазон, с помощью которого компилятор определяет общее количество элементов массива. Тип-диапазон задается левой и правой границами изменения индекса массива так что массив А состоит из 10 элементов, массив В - из 51, а массив С из 8 элементов. За словом of указывается тип элементов, образующих массив.

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

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

var a: array [1..10] of Integer;

b: array [0..40] of Char;

с: array [-2..2] of Boolean; 56

k: Integer; begin

. . .

b[17] := 'F'; c[-2] := a[l] > 2;

for k := 1 to 10 do a[k]:=0;

. . .

end;

В правильно составленной программе индекс не должен выходите пределы, определенные типом-диапазоном. Компилятор Object Pascal может контролировать использование индексов в программе как на этапе компиляции, так и на этапе прогона программы.

7 Процедуры и функции

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

7.1 Локализация имен Напомню, что вызов подпрограммы осуществляется про-

стым упоминанием имени процедуры в операторе вызова процедуры или имени функции в выражении. В Delphi 32 функцию можно вызывать точно так же, как и процедуру, т.е. без

использования возвращаемого ею значения.

57

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

Описать подпрограмму - это значит указать ее заголовок и тело. В заголовке объявляются имя подпрограммы и формальные параметры, если они есть. Для функции, кроме того, указывается тип возвращаемого ею результата. За заголовком следует тело подпрограммы, которое, подобно программе, состоит из раздела описаний и раздела исполняемых операторов. В разделе описаний подпрограммы могут встретиться описания подпрограмм низшего уровня, и т.д.

Подпрограмма любого уровня имеет обычно множество имен констант, переменных, типов и вложенных в нее подпрограмм низшего уровня. Считается, что все имена, описанные внутри подпрограммы, локализуются в ней, т.е. они как бы «невидимы» снаружи. Таким образом, со стороны операторов, использующих обращение к подпрограмме, она трактуется как «черный ящик», в котором реализуется тот или иной алгоритм. Сказанное относится не только к именам самих подпрограмм, но и к любым объявленным в них именам - типам, константам, пенным и меткам. Все имена в пределах подпрограммы, в которой объявлены, должны быть уникальными и не могут совпадать с именем самой подпрограммы.

При входе в подпрограмму низшего уровня становятся доступными не только объявленные в ней имена, но и сохраняется доступ ко всем именам верхнего уровня.

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

var VI ...;

Procedure S;

58