- •Модуль и его структура
- •Структура модуля
- •Список uses
- •Интерфейс
- •Реализациия
- •Инициализация и завершение
- •Ключевые слова
- •Слово const
- •Слово var
- •Комментарии
- •Слово type
- •Переменные
- •Типы данных и переменные
- •Преобразование типов
- •Знаки операций
- •Массивы
- •Одномерные массивы
- •Многомерные массивы
- •Функции Low и High
- •Динамические массивы
- •Короткая строка
- •Длинная строка
- •Расширенная строка
- •Строка с терминальным нулем
- •Операции со строками Слияние
- •Извлечение символа
- •Управляющие символы в строках
- •Разбиение литерала по строкам программы
- •Сравнение строк
- •Строковые функции
- •Форматирование строк
- •Множества
- •Объявление записи
- •Оператор with
- •Массивы записей
- •Совместимость типов данных
- •Указатели
- •Статические и динамические переменные
- •Размещение динамических переменных
- •Разыменование указателя
- •Управление вычислениями Операторы if, then, else
- •Выполнение нескольких инструкций.
- •Вложенные условия.
- •Циклы Элементы структуры цикла
- •Цикл for…
- •Функции Pred и Succ
- •Цикл while
- •Цикл repeat
- •Управление циклами
- •Оператор goto
- •Оператор case
- •Область видимости идентификаторов
- •Подпрограммы
- •Процедуры и функции
- •Объявление и определение подпрограммы
- •Параметры подпрограмм
- •Локальные процедуры и функции
- •Перегрузка подпрограмм
- •Параметры по умолчанию
- •Включение внешнего файла в модуль
Цикл repeat
Цикл repeat почти идентичен циклу while. Отличие состоит в том что здесь условие цикла проверяется в точке окончания, т.е. после каждого выполнения операторов тела цикла.
В качестве примера рассмотрим предыдущее упражнение, но теперь вместо while применим repeat:
procedure TForm1.Button1Click(Sender: TObject);
var
I : Integer;
begin
I := 5;
Memo1.Clear;
repeat
Memo1.Lines.Add('До перехвата '+
IntToStr(I) + ' сек.');
Dec(I);
until I = -1;
Memo1.Lines.Add('Цель с радара исчезла');
end;
В результате выполнения этого кода мы увидим в окне блокнота результат аналогичный предыдущему упражнению. Отметим, что в цикле repeat нет надобности ограничивать тело цикла словами begin – end так как их роль здесь выполняют ключевые слова repeat и until.
Область применения цикла repeat – реализация итерационных вычислений когда число шагов (итераций) заранее неизвестно. Приведем пример подпрограммы, которая реализует итерационный метод решения уравнения Кеплера с циклом repeat.
function SolveEquation_Repeat(const e,M : real):real;
{ Решение уравнения Кеплера в цикле repeat }
const
Eps = 1e-9;
var
Eold,Enew : real;
Stop : boolean;
begin
Eold := M;
Stop := false;
repeat
Enew := M + e * Sin(Eold);
Stop := Abs(Eold-Enew)<=Eps;
Eold := Enew;
until Stop;
Result := Enew;
end;
Какой из двух циклов использовать – решает программист. В качестве критерия выбора здесь можно использовать ту особенность циклов while и repeat, что while может не выполняться вообще, а тело цикла repeat безусловно выполняется один раз.
Синтакис цикла repeat имеет следующий вид
repeat
statements;
until cond_expr;
Цикл repeat повторяет выполнение блока операторов, обозначенных как statements пока условие cond_expr есть False. Исходное состояние цикла необходимо подготовить до входа в него. Среди операторов statements должен быть такой, который модифицирует условие цикла. В противном случае возможен бесконечный цикл и зависание системы. Повторение блока statements прекращается в точке until при cond_expr=true.
Управление циклами
Для управления циклами в Object Pascal имеются две весьма полезные процедуры.
Процедура Continue используется для пропуска группы операторов, расположенных между точкой ее вызова и концом цикла. Например, в зависимости от какого–то условия часть операторов тела цикла выполнять не надо. В такой ситуации можно воспользоваться процедурой Continue:
var
Done : Boolean;
Error : Boolean;
begin
Done := False;
{Начало цикла}
while not Done do
begin
{Здесь находится безусловно выполняемый код }
Error := SomeFunction; {формируем условие}
if Error then Continue; {пропуск до конца если Error=true}
{ Здесь находятся операторы, которые не надо выполнять
при Error=true }
end; {конец цикла}
end;
Процедура Break прерывает выполнение цикла независимо от текущего его состояния.
Пусть в целочисленном массиве нам надо найти заданное число. Принудительно завершая цикл сразу как только заданное число найдено, мы попутно можем узнать и запомнить индекс элемента массива, в котором оно записано:
var
MyArray : array [0..99] of Integer;
Index : Integer;
SearchNumber : Integer;
I : Integer;
Diagnostics : string;
const
sCaption = ’Заданное число ’;
begin
FillArray; { Процедура инициализации массива }
Index := -1;
{Ввод искомого числа из компонента Edit1}
SearchNumber := StrToInt(Edit1.Text);
Diagnostics := sCaption + Edit1.Text + ’ ’;
for I := 0 to High(MyArray) do
begin
if MyArray[I] = SearchNumber then
begin
Index := I;
Break;
end;
end;
if Index <> -1 then
Label1.Caption:= Diagnostics +
’- содержит элемент номер ’+
IntToStr(Index)
else
Label1.Caption := Diagnostics + ’- не найдено. ’;
end;
Процедуры Continue и Break можно вызывать только в теле цикла for, while или repeat. На вызов любой из этих процедур вне цикла компилятор отреагирует сообщением об ошибке:
Error: BREAK or CONTINUE outside of loop.
