Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Синтаксис цикла while имеет вид




 

while cond_expr do

Begin

statements;

end;

 

Тело цикла (statements) выполняется итеративно пока условие цикла cond_expr есть True. Исходное состояние условия цикла необходимо обеспечить до входа в него. В теле цикла должны присутствовать операторы, так или иначе влияющие на состояние условия цикла. В противном случае получим бесконечный цикл (зависание системы).

Когда условное выражение cond_expr становится ложным, цикл прекращается.

Если тело цикла состоит из единственного оператора, ключевые слова begin и end необязательны.

 

Цикл 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.

 

Оператор goto

 

Оператор goto передает управление в точку программы, помеченную идентификатором специального вида – меткой.

Употребление в программах на Object Pascal операторов перехода считается делом недостойным и теоретически избыточным. Передачи управления делают программу непонятной и трудно модифицируемой.

Здесь мы рассматриваем правила goto только потому что такой оператор есть в языке. Тот, кто пока что не знает как обойтись в программе без goto, может его использовать. Но следует сводить количество передач управления в программе к минимуму, а в конечном счете – искоренить эту вредную привычку.

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

Следующий фрагмент кода иллюстрирует применение оператора перехода при решении известной задачи:

 

procedure TForm1.Button1Click(Sender: TObject);

Var

I: Integer;

Label

MyLabel;

Begin

Memo1.Clear;

I:= 0;

MyLabel:

Inc(I);

Memo1.Lines.Add(IntToStr(I));

if I < 5 then goto MyLabel;

end;

 

 

Упражнение. Напишите программу, которая при нажатии на кнопку формы заполняет массив из 100 элементов случайными числами (используйте функцию Random), вводит целое число, заданное пользователем (поместите на форму компонент Edit), ищет заданное число в массиве и выводит сообщение о результате поиска. Как образец, используйте фрагмент кода, приведенный выше.

 

Оператор case

 

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

Рассмотрим следующий пример оператора case:

{

Вычисляем размер штрафа Fine за превышение скорости. Размер штрафа пропорционален величине превышения, выраженной в км/час (AmountOverSpeedLimit). Если скорость превышена более чем на 30 км/час водитель лишается прав на срок JailTime.

}

case AmountOverSpeedLimit of

0: Fine:= 0;

10: Fine:= 20;

15: Fine:= 50;

20,

25,

30: Fine:= AmountOverSpeedLimit * 10;

Else

Begin

Fine:= GoToCourt;

JailTime:= GetSentence;

end;

end; // case

 

Оператор case состоит из нескольких частей. Вначале определяется выражение–селектор. В нашем примере селектором является переменная AmountOverSpeedLimit.

Затем следуют определения ветвей, каждая из которых соответствует либо конкретному значению селектора, либо серии возможных значений селектора. Так, если значение AmountOverSpeedLimit равно 0, будет выбрана ветвь 0:. Переменная Fine получит значение 0.

Если значение AmountOverSpeedLimit равно 10, переменная Fine получит значение 20, и т.д. Как только нужная ветвь найдена и выполнен связанный с ней оператор, оставшиеся случаи игнорируются.

Ситуации когда переменная AmountOverSpeedLimit может оказаться равной 20, 25, или 30 объединены в один случай, которому соответствует вычисление штрафа по формуле

 

Fine:= AmountOverSpeedLimit * 10;.

 

Вместо перечисления значений здесь можно было бы написать и так

 

20..30: Fine:= AmountOverSpeedLimit * 10;.

 

т.е. указать случай как отрезок значений селектора.Наконец, в составе case мы видим оператор else. Блок кода, расположенный после ключевого слова else, будет выполнен если значение селектора не подпадает ни под один из случаев. Наличие else – ветви в составе оператора case необязятельно.

 

ПРАВИЛО. Селектором в операторе case может быть выражение любого упорядоченного типа (Integer, Word, Byte, Char, Cardinal и т.п.).

Ветви оператора case взаимно исключают друг друга – может быть выполнена только одна из них.

Строковый или вещественный типы селекторов недопустимы:

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...