Коднянко В.А. |
К их числу относятся:
13.1. Составной оператор Это простая структура следующих друг за другом операторов, заключенных в операторные скобки begin … end.Синтаксис составного оператора :Begin Оператор1 Оператор2 … ОператорN End; Составной оператор применяется в тех случаях, когда какое-либо действие необходимо применить не к одному, а сразу к нескольким операторам. Пример :Begin R:= X; X:= Y; Y:= R; End; 13.2. Условный оператор If Синтаксис допускает два вида оператора :if логическое выражение then оператор1 else оператор2; и его усеченный вариант :
Оператор работает следующим образом. Сначала вычисляется логичес-кое выражение. Если оно истинно, то выполняется оператор1, иначе – оператор2. Усеченный оператор выполняет оператор1 только в случае истинного значения логического выражения и не производит никаких действий в случае его ложности.Примеры :
Допустима вложенность условных операторов внутри составного условного оператора. Например , операторуif L1 then if L2 then St1 else St2 else St3; эквивалентен оператор if L1 then begin if L2 then St1 else St2; end else St3; В этом операторе для повышения структурированности использованы операторные скобки begin … end. При конструировании сложного условного оператора во избежание логических ошибок следует отдавать предпочтение структурному способу записи такого оператора.13.3. Оператор варианта Case Синтаксис оператора :Case Selector of Const1: Оператор1; Const2: Оператор2; … ConstN: ОператорN [else Оператор]; End; Selector может быть любой простой тип кроме Real. Каждая из Const1 … ConstN может быть значение, несколько перечисленных через запятую значений или отрезок типа. Оператор Else, как видно из описания, может отсутствовать. В том случае, если он присутствует, то действует общее правило: перед словом Else не должно быть символа ";" (точка с запятой). Поясним работу оператора Case на примере: Case i of 0 : x := 0; 1,3 : x := 1; 10 .. 15: x := 2 else x := 3; End; При выполнении оператора Case управление будет передано тому оператору, который помечен константой, являющейся значением переменной i. Например, если к моменту выполнения Case-оператора i = 0, то будет выполнен оператор x := 0. Иначе, если i = 1 или i = 3, то будет выполнен оператор x := 1; иначе, если значение i в диапазоне 10 .. 15, то будет выполнен оператор x := 2; наконец, если i не равно ни одной из вышеперечисленных констант, то будет выполнен оператор x := 3, следующий за словом else (иначе).13.4. Оператор цикла For – Do Синтаксис оператора имеет две разновидности:For счетчик цикла:=нач.знач. To конеч.знач. Do оператор For счетчик цикла:=нач.знач. Downto конеч.знач. Do оператор Здесь конструкция For .. Do называется заголовком цикла, оператор – телом цикла.Для циклов должны соблюдаться следующие правила и ограничения :
Первая разновидность оператора цикла For работает следующим образом. Сначала счетчик цикла принимает нач.знач. и выполняется оператор, расположенный вслед за словом Do. Затем значение счетчика будет увеличено на шаг счетчика 1 и вновь будет выполнен оператор и т. д., пока счетчик не переберет все значения от нач.знач. до конеч.знач. Пример.
В результате в переменной s будет накоплена сумма первых 44 элементов массива z. Другая разновидность оператора For отличается лишь отрицательным шагом –1 счетчика. Пример.
Будет получен тот же результат. 13.5. Оператор цикла While – Do Синтаксис оператора :While логическое выражение Do оператор; Цикл выполняет оператор , расположенный вслед за словом Do до тех пор, пока истинно логическое выражение, расположенное за словом While ("выполняй, пока истинно").Пример.
В этом примере цикл будет выполняться до тех пор, пока не выполнится условие x < 101.667. В теле цикла переменная X с каждым шагом цикла увеличивает свое значение на 5.617 так, что на определенном шаге условие x < 101.667 впервые не будет выполнено. В этот момент без входа в тело цикл закончит работу. 13.6. Оператор цикла Repeat – Until Синтаксис оператора :Repeat Оператор1; Оператор2; … ОператорN; Until логическое выражение; Цикл работает, пока логическое выражение ложно ("повторяй, пока не выполнится"). Пример. s:= 0; i:=0; Repeat Inc (i); s:= s + z[i]; Until (i = 44); В этом примере цикл будет выполняться до тех пор, пока не выполнится условие i = 44. Результат будет тот же, что в примере для For-цикла.13.7. Операторы Break и Continue Оператор Break может быть размещен в теле цикла. При его выполнении цикл прекращает работу и считается выполненным.Пример. s:= 0; i:=0; Repeat Inc (i); s:= s + z[i]; if (s > 14) then Break; Until (i = 44); В этом примере цикл будет выполняться до тех пор, пока не выполнится условие i = 44 или если в операторе if переменная s превысит значение 14. Оператор Continue также может быть размещен в теле цикла. При его выполнении управление независимо от того, где он расположен, сразу передается в начало цикла для выполнения следующего шага.Пример. s:= 0; i:=0; Repeat Inc (i); s:= s + z[i]; if (s > 20) then Continue; if (s > 14) then Break; Until (i = 44); В этом примере если в первом операторе if выполнится условие s > 20, то сработает оператор Continue. Он сразу передаст управление на первый оператор в теле цикла – Inc (i), предотвратив тем самым выполнение ниже-следующих операторов – второго if и Until. 13.8. Вложенные циклы В теле оператора цикла могут быть размещены другие операторы цикла. Такие структуры называются вложенными циклами. Язык допускает любую глубину вложенности циклов. При использовании вложенных циклов необходимо иметь в виду следующее :
Вложенные циклы используются в ситуациях, когда на каждом шаге наружного цикла необходимо полностью выполнить внутренний цикл. Пример. Const n = 15; m = 24; Var i,j: Byte; R,Tau,s: Real; z: array[1..n, 1..m] of Real; … {заполнение массива z с использованием вложенных циклов} Tau:= Pi/m;
Приведенный пример содержит две структуры вложенных циклов. Первая структура предназначена для заполнения элементов двумерного массива z с помощью математической формулы Наружный цикл со счетчиком i в теле цикла содержит два оператора – оператор присваивания (вычисление значения вспомогательной переменной R с целью сокращения времени вычислений) и оператор внутреннего цикла со счетчиком j. Поскольку наружный цикл в своем теле содержит несколько операторов, то они заключены в операторные скобки begin … end. Эта структура работает следующим образом. После входа в наружный цикл переменная i (счетчик этого цикла) примет значение 1. Далее будет вычислено значение переменной R при i = 1. После этого будет выполнен внутренний цикл со счетчиком j, где j на каждом шаге будет последовательно принимать значения 1, 2, 3, … m (i при этом остается неизменным и равным 1). В результате будут вычислены элементы z11, z12, …, z1m первой строки массива. Затем будет выполнен возврат к заголовку наружного цикла, где значение счетчика i будет увеличено на 1 (т. е. i станет равно 2) и вновь будет выполнены операторы, расположенные в его теле. В результате будут определены элементы z21, z22, …, z2m второй строки массива и т.д.Вторая структура вложенных циклов предназначена для вычисления суммы положительных элементов массива z. Для этого сначала переменной s будет присвоено значение 0, а затем во вложенных циклах будет накоплена требуемая сумма в ячейку s.13.9. Оператор записи With В ранних версиях языка оператор использовался для более удобного доступа к полям записи. Пример :Var Student : Record Fam: String[30]; Name: String[20]; Age: Word; End; … Student.Fam:= 'Колокольников'; Student.Name:= 'Павел'; S:=Student.Fam + ' '+Student.Name; {предыдущих три оператора эквивалентны следующим} With Student do 13.10. Оператор Try – Except – End Это новейшее средство языка. Блок Try – Except – End используется для предотвращения исключительных ситуаций (ИС), которые могут возникнуть при выполнении программы. К их числу относятся сбои в работе аппаратуры, ошибки вычислений (например деление на нуль), попытки присвоить значение, выходящее за пределы типа и т. д.Синтаксис :Try {операторы, способные генерировать ИС} Except {операторы, обрабатывающие генерированные ИС} end; Блок Try – Except – End работает следующим образом. Выполнение начинается с операторов, расположенных в блоке Try – Except. Если в каком-либо операторе возникает ИС, то она подавляется и затем выполняются все операторы, расположенные в блоке Except – End. В результате предотвращается аварийное прерывание программы. Использование блока Try – Except – End открывает возможность программного контроля за ИС.Пример. i:= 0; n:= 8; Try i:= n div i; {Деление на нуль. Оператор генерирует ИС} n:= i + 9; Except ShowMessage('Ошибка. Деление на нуль в операторе i := n / i'); End; Результатом выполнения блока операторов будет появление на экране формы с сообщением "Ошибка. Деление на нуль в операторе i := n / i", после чего программа продолжит работу с оператора, следующего за словом End, а не с оператора n := i + 9.Если бы оператор i := n div i не был защищен блоком Try – Except – End, то возникшая при его выполнении ИС привела бы к нежелательному аварийному завершению программы.13.11. Оператор On – End При возникновении ИС язык позволяет не только предотвратить прерывание программы, но и определить, какого именно вида была ИС. Для этого в блоке Except – End можно использовать оператор On –Do.Пример i:= 0; n:= 8; Try i:= n div i; {Деление на нуль. Оператор генерирует ИС} n:= i + 9; Except On Ex: EdivByZero do ShowMessage('Деление на нуль'); End; В этом примере сообщение о возникновении ИС будет выдано только в случае, когда ИС будет только деление на нуль (EdivByZero). Во всех остальных случаях ИС будет предотвращена, однако никакого сообщения о ее возникновении выдано не будет. Объявленная в блоке Except – End переменная Ex может быть любым именем (здесь Ex используется только для примера).13.12. Оператор Try – Finally – EndБлок Try – Finally – End также используется для предотвращения ИС, которые могут возникнуть при выполнении программы. В отличие от блока Try – Except – End блок Try – Finally – End используется для освобождения ресурсов памяти, закрытия файлов и пр. в случае возникновения ИС.Синтаксис :Try {операторы, способные генерировать ИС} Finally {операторы освобождения ресурсов памяти } end; Блок Try – Finally – End работает следующим образом. Выполнение начинается с операторов блока Try – Finally, которые в правильно написанной программе должны содержать операторы выделения ресурсов памяти. Если в каком-либо операторе возникает ИС, то управление сразу передается к операторам блока Finally – End, где производится освобождение памяти, закрытие файлов и пр. В результате, с одной стороны, предотвращается аварийное прерывание программы и, во вторых, корректно освобождается ранее зарезервированная память, выполняется ряд других необходимых операций.Отметим, что блок Finally – End выполняется всегда вне зависимости от того, была или не была сгенерирована ИС.Пример.
|