- •2.1.3. Слова-идентификаторы
- •2.1.4. Комментарии
- •2.2.2. Константы
- •2.2.3. Переменные
- •2.3.2. Вещественные типы данных
- •2.3.3. Символьные типы данных
- •2.3.4. Булевские типы данных
- •2.3.5. Определение новых типов данных
- •2.3.6. Перечисляемые типы данных
- •2.3.7. Интервальные типы данных
- •2.3.8. Временной тип данных
- •2.3.9. Типы данных со словом type
- •2.4.2. Арифметические операции
- •2.4.3. Операции отношения
- •2.4.4. Булевские операции
- •2.4.5. Операции с битами
- •2.4.6. Очередность выполнения операций
- •2.5.2. Консольный вывод
- •2.6.1. Заголовок программы
- •2.6.2. Подключение модулей
- •2.6.3. Программный блок
- •2.7.2. Оператор присваивания
- •2.7.3. Оператор вызова процедуры
- •2.7.4. Составной оператор
- •2.7.5. Оператор ветвления if
- •2.7.6. Оператор ветвления case
- •2.7.7. Операторы повтора - циклы
- •2.7.8. Оператор повтора for
- •2.7.9. Оператор повтора repeat
- •2.7.11. Прямая передача управления в операторах повтора
- •2.7.12. Оператор безусловного перехода
- •2.8.2. Стандартные подпрограммы Арифметические функции
- •2.8.3. Процедуры программиста
- •2.8.4. Функции программиста
- •2.8.5. Параметры процедур и функций
- •2.8.6. Опущенные параметры процедур и функций
- •2.8.7. Перегрузка процедур и функций
- •2.8.8. Соглашения о вызове подпрограмм
- •2.8.9. Рекурсивные подпрограммы
- •2.8.10. Упреждающее объявление процедур и функций
- •2.8.11. Процедурные типы данных
- •2.9.2. Стандартные модули языка Delphi
- •2.9.3. Область действия идентификаторов
- •Глава 3. Объектно-ориентированное программирование (ооп). Часть I
- •Глава 6. Интерфейсы
- •Глава 7. Проект приложения.
- •Глава 8. Меню, строка состояния и панель инструментов. Часть I
- •Глава 8. Меню, строка состояния и панель инструментов. Часть II
- •Глава 8. Меню, строка состояния и панель инструментов. Часть II
- •Глава 8. Меню, строка состояния и панель инструментов. Часть IV
- •Глава 9. Окна диалога. Часть I
- •Глава 9. Окна диалога. Часть II
- •Глава 9. Окна диалога. Часть III
2.7.9. Оператор повтора repeat
Оператор повтора repeat используют в тех случаях, когда тело цикла должно быть выполнено перед тем, как произойдет проверка условия завершения цикла. Он имеет следующий формат:
repeat
<оператор 1>;
...
<оператор N>;
until <условие завершения цикла>;
Тело цикла выполняется до тех пор, пока условие завершения цикла (выражение булевского типа) не станет истинным. Оператор repeat имеет две характерные особенности, о которых нужно всегда помнить:
между словами repeat и until может находиться произвольное число операторов без операторных скобок begin и end;
так как условие завершения цикла проверяется после выполнения операторов, цикл выполняется, по крайней мере, один раз.
В следующем примере показано, как оператор repeat применяется для суммирования вводимых с клавиатуры чисел. Суммирование прекращается, когда пользователь вводит число 0:
program Console;
{$APPTYPE CONSOLE}
uses
SysUtils;
var
S, X: Integer;
begin
S := 0;
repeat
Readln(X);
S := S + X;
until X = 0;
Writeln('S=', S);
Writeln('Press Enter to exit...');
Readln;
end.
Часто бывает, что условие выполнения цикла нужно проверять перед каждым повторением тела цикла. В этом случае применяется оператор while, который, в отличие от оператора repeat, содержит условие выполнения цикла, а не условие завершения.
2.7.10. Оператор повтора while Оператор повтора while имеет следующий формат:
while <условие> do
<оператор>;
Перед каждым выполнением тела цикла происходит проверка условия. Если оно истинно, цикл выполняется и условие вычисляется заново; если оно ложно, происходит выход из цикла, т.е. переход к следующему за циклом оператору. Если первоначально условие ложно, то тело цикла не выполняется ни разу. Следующий пример показывает использование оператора while для вычисления суммы S = 1 + 2 + .. + N, где число N задается пользователем с клавиатуры:
program Console;
{$APPTYPE CONSOLE}
uses
SysUtils;
var
S, N: Integer;
begin
Readln(N);
S := 0;
while N > 0 do
begin
S := S + N;
N := N - 1;
end;
Writeln('S=', S);
Writeln('Press Enter to exit...');
Readln;
end.
2.7.11. Прямая передача управления в операторах повтора
Для управления работой операторов повтора используются специальные процедуры-операторы Continue и Break, которые можно вызывать только в теле цикла.
Процедура-оператор Continue немедленно передает управление оператору проверки условия, пропуская оставшуюся часть цикла (рисунок 2.4):
Рисунок 2.4. Схема работы процедуры-оператора Continue
Процедура-оператор Break прерывает выполнение цикла и передает управление первому оператору, расположенному за блоком цикла (рисунок 2.5):
Рисунок 2.5. Схема работы процедуры-оператора Break
2.7.12. Оператор безусловного перехода
Среди операторов языка Delphi существует один редкий оператор, о котором авторы сперва хотели умолчать, но так и не решились. Это оператор безусловного перехода goto ("перейти к"). Он задумывался для того случая, когда после выполнения некоторого оператора надо выполнить не следующий по порядку, а какой-либо другой, отмеченный меткой, оператор.
Метка - это именованная точка в программе, в которую можно передать управление. Перед употреблением метка должна быть описана. Раздел описания меток начинается зарезервированным словом label, за которым следуют имена меток, разделенные запятыми. За последним именем ставится точка с запятой. Типичный пример описания меток:
label
Label1, Label2;
В разделе операторов метка записывается с двоеточием. Переход на метку выполняется с помощью зарезервированного слова goto, за которым следует имя метки:
program Console;
{$APPTYPE CONSOLE}
uses
SysUtils;
label
M1, M2;
begin
M1:
Write('Желаем успеха ');
goto M2;
Write('А этого сообщения вы никогда не увидите!');
M2:
goto M1;
Writeln('в освоении среды Delphi!');
Writeln('Press Enter to exit...');
Readln;
end.
Эта программа будет выполняться бесконечно, причем второй оператор Write не выполнится ни разу!
Внимание! В соответствии с правилами структурного программирования следует избегать применения оператора goto, поскольку оно усложняет понимание логики программы. Оператор goto использовался на заре программирования, когда выразительные возможности языков были скудными. В языке Delphi без него можно успешно обойтись, применяя условные операторы, операторы повтора, процедуры Break и Continue, операторы обработки исключений (последние описаны в главе 4).
2.8. Подпрограммы 2.8.1. Общие положения
В практике программирования часто встречается ситуация, когда одну и ту же группу операторов требуется выполнить без изменений в нескольких местах программы. Чтобы избавить программиста от многократного дублирования одинаковых фрагментов, была предложена концепция подпрограмм. В этом разделе мы расскажем о том, как эта концепция реализована в языке Delphi.
Подпрограммой называется именованная логически законченная группа операторов, которую можно вызвать по имени (т.е. выполнить) любое количество раз из различных мест программы. В языке Delphi подпрограммы оформляются в виде процедур и функций.
Процедура - это подпрограмма, имя которой не может использоваться в выражениях в качестве операнда. Процедура состоит из заголовка и тела. По структуре ее можно рассматривать как программу в миниатюре. Когда процедура описана, ее можно вызвать по имени из любой точки программы (в том числе из нее самой!). Когда процедура выполнит свою задачу, программа продолжится с оператора, следующего непосредственно за оператором вызова процедуры. Использование имени процедуры в программе называется оператором вызова процедуры.
Функция также является подпрограммой, но в отличие от процедуры ее имя может использоваться в выражениях в качестве операнда, на место которого подставляется результат работы этой функции.
Все процедуры и функции языка Delphi подразделяются на две группы: встроенные и определенные программистом.
Встроенные процедуры и функции являются частью языка и могут вызываться по имени без предварительного описания. В данной главе рассматриваются лишь базовые группы встроенных процедур и функций, остальные будут рассмотрены в других главах по ходу изложения материала.
Процедуры и функции программиста пишутся программистом, т.е. вами, в соответствии с синтаксисом языка и представляют собой локальные блоки. Предварительное описание процедур и функций программиста обязательно.