- •Модуль и его структура
- •Структура модуля
- •Список uses
- •Интерфейс
- •Реализациия
- •Инициализация и завершение
- •Ключевые слова
- •Слово const
- •Слово type
- •Слово var
- •Комментарии
- •Переменные
- •Типы данных и переменные
- •Преобразование типов
- •Знаки операций
- •Массивы
- •Одномерные массивы
- •Многомерные массивы
- •Функции Low и High
- •Динамические массивы
- •Короткая строка
- •Длинная строка
- •Расширенная строка
- •Строка с терминальным нулем
- •Операции со строками Слияние
- •Извлечение символа
- •Управляющие символы в строках
- •Разбиение литерала по строкам программы
- •Сравнение строк
- •Строковые функции
- •Форматирование строк
- •Множества
- •Объявление записи
- •Оператор with
- •Массивы записей
- •Совместимость типов данных
- •Указатели
- •Статические и динамические переменные
- •Размещение динамических переменных
- •Разыменование указателя
- •Управление вычислениями Операторы if, then, else
- •Выполнение нескольких инструкций.
- •Вложенные условия.
- •Циклы Элементы структуры цикла
- •Цикл for…
- •Функции Pred и Succ
- •Цикл while
- •Цикл repeat
- •Управление циклами
- •Оператор goto
- •Оператор case
- •Область видимости идентификаторов
- •Подпрограммы
- •Процедуры и функции
- •Объявление и определение подпрограммы
- •Параметры подпрограмм
- •Локальные процедуры и функции
- •Перегрузка подпрограмм
- •Параметры по умолчанию
- •Включение внешнего файла в модуль
Функции Pred и Succ
Функции Pred и Succ применяются к данным перечислимого типа, например – Char, byte, integer и т.д. Функция Pred возвращает значение, которое предшествует значению ее аргумента. Например, Pred(10) вернет число 9, Pred(100) вернет 99, и т.д.
Следующие три цикла идентичны:
var
X : Integer;
begin
X := 10;
for I := 0 to 9 do DoSomething;
for I := 0 to X - 1 do DoSomething;
for I := 0 to Pred(X) do DoSomething;
end;
Когда счетчик цикла изменяется от 0 и надо сделать 10 итераций, легко ошибиться в сторону «лишней» итерации. Использование Pred с одной стороны, может решить проблему с лишней итерацией, а с другой стороны, Pred(X) элегантней чем X – 1.
Функция Succ возвращает значение, которое следует за ее аргументом. В циклах с уменьшением счетчика полезно применять Succ так:
for I := 100 downto Succ(X) do DoSomething;
Цикл while
Условие цикла while проверяется перед очередной итерацией. Итерации повторяются пока условие истинно.
var
X : Integer;
begin
X := 0;
while X < 1000 do
begin
X := DoSomeCalculation;
DoSomeMore;
end;
{ ...продолжение }
end;
В этом примере подразумевается, что функция DoSomeCalculation, рано или поздно, вернет значение 1,000. Пока эта функция возвращает числа меньше 1,000, цикл продолжается. Как только переменная X примет значение большее или равное 1,000, условие цикла станет ложным и повторение операторов тела цикла прекратится – произойдет переход к оператору, следующему за телом цикла.
Помните, что проверка окончания цикла производится в точке while. Поэтому все операторы, которые находятся ниже строки, в которой переменная условия цикла приняла новое значение, выполняются до конца.
В общем случае в качестве условия цикла рекомендуется использовать логическую переменную. Ее значение надо устанавливать в теле цикла:
var
Stop : Boolean;
begin
Stop := False;
while not Stop do begin
DoSomeStuff;
Stop := SomeFunctionReturningABoolean;
DoSomeMoreStuff;
end;
end;
Если в какой–то момент времени выполнения программы переменная Stop примет значение true – выполнение цикла прекратится.
Применение цикла while иллюстрирует следующая программа. Создайте новый проект и поместите на форму кнопку (Button) и блокнот (Memo). Дважды щелкните на кнопке и напишите следующий код обработчика события:
procedure TForm1.Button1Click(Sender: TObject);
var
I : Integer;
begin
I := 5;
Memo1.Lines.Clear;
while I > -1 do
begin
Memo1.Lines.Add('До перехвата '+
IntToStr(I) + ' сек.');
Dec(I);
end;
Memo1.Lines.Add('Цель с радара исчезла');
end;
Запустите программу и в окне блокнота увидите текст:
До перехвата 5 сек.
До перехвата 4 сек.
До перехвата 3 сек.
До перехвата 2 сек.
До перехвата 1 сек.
До перехвата 0 сек.
Цель с радара исчезла
В этой программе объявлена переменная I, которой перед входом в цикл присвоено значение 5. Далее начинается цикл. На каждой итерации цикла в компонент Memo1 добавляется строка текста, а значение переменной I уменьшается на 1. Как только переменная I станет равной -1, итерации прекращаются и в Memo1 выводится заключительная строка.
Нетрудно сообразить, что точно такого же результата можно добиться и с помощью цикла for . . . downto.
Строго говоря, область применения цикла while (repeat) – реализация итерационных вычислений когда число шагов (итераций) заранее неизвестно.
Рассмотрим подпрограмму, которая реализует итерационный метод решения уравнения Кеплера
E – e sin(E) = M
где e и M – заданные вещественные значения, а неизвестной является вещественная переменная E. Для решения этого уравнения применяется метод последовательных приближений (итераций) по схеме
Ek+1 = M + e sin(Ek), k=0,1,2,. . .
с начальным приближением E0 = M. Итерации выполняют до тех пор, пока не будет достигнута заданная точность, например Ek+1 – Ek 10-9.
function SolveEquation_While(const e,M : real):real;
{ Решение уравнения Кеплера в цикле while }
const
Eps = 1e-9;
var
Eold,Enew : real;
Stop : boolean;
begin
Eold := M;
Stop := false;
while not Stop do
begin
Enew := M + e * Sin(Eold);
Stop := Abs(Eold-Enew)<=Eps;
Eold := Enew;
end;
Result := Enew;
end;
Синтаксис цикла while имеет вид
while cond_expr do
begin
statements;
end;
Тело цикла (statements) выполняется итеративно пока условие цикла cond_expr есть True. Исходное состояние условия цикла необходимо обеспечить до входа в него. В теле цикла должны присутствовать операторы, так или иначе влияющие на состояние условия цикла. В противном случае получим бесконечный цикл (зависание системы).
Когда условное выражение cond_expr становится ложным, цикл прекращается.
Если тело цикла состоит из единственного оператора, ключевые слова begin и end необязательны.