Н. Вирт - Программирование на языке Модула-2 (1160777), страница 31
Текст из файла (страница 31)
Таким образом, последовательностьоператоров исполняется хотя бы один раз.$ЦиклДо = REPEAT ПослОператоров UNTIL Выражение.Пример:REPEAT k: = i MOD j;i:=j:j:=kUNTIL j=09.8. Цикл с шагомЦикл с шагом означает, что последовательность операторов должнаисполняться многократно с изменением значения некоторой переменной по прогрессии.Эта переменная называется управляющейпеременной цикла с шагом. Она не может быть компонентойструктурной переменной, не может импортироваться и бытьпараметром. Ее значение не должно меняться последовательностью операторов.155$ЦиклСШагом = FOR Идентификатор ":="$Выражение ТО Выражение$[BY КонстВыражение] DO ПослОператоров END.Цикл с шагомFOR v:=A TO В BY С DO SS ENDозначает многократное исполнение последовательности операторов SS при том условии,что v принимает значения А,А+С, А+2С, ... , А+nС, где А+nС - последнее значение, непревосходящее В.
Переменная v называется управляющей переменной, или параметром цикла, А начальным значением, В - границей, С - шагом. Значения А и В должны быть совместимы (!) с v;С должно быть константой типа INTEGER или CARDINAL. Если шаг не задан, предполагается,что он равен 1. Примеры:FOR i:=1 ТО 80 DO j:=j+a[i] ENDFOR i:=80 TO 2 BY -1 DO a[i]:=a[i-1] END9.9. Безусловный циклБезусловный цикл определяет многократное исполнение последовательности операторов.Он заканчивается исполнением какого-либо оператора выхода в последовательности операторов.$БезусловныйЦикл = LOOP ПослОператоров END.Пример:LOOPIF t1^.ключ>х THEN t2:=tl^.левый; p:=TRUEELSE t2:=t1^.правый; р:-FALSEEND;IF t2=NIL THENEXITEND;t1:=t2ENDЦиклы с условием продолжения, условием окончания и шагом могут быть записаны опомощью безусловного цикла, содержащего единственный оператор выхода. Использование этихциклов полезно, поскольку они отражают наиболее часто встречающиеся ситуации, когдазавершение зависит либо от единственного условия до или после повторяемойпоследовательности операторов, либо по достижении границы арифметической прогрессии.
В тоже время безусловный цикл необходим для записи повторяющихся процессов, в которыхзавершение заранее не определено. Он также полезен в ситуации, пример которой приведен выше.Операторы выхода содержатся в безусловном цикле контекстуально, а не синтаксически.9.10. Оператор присоединенияОператор присоединения определяет переменную запись и последовательностьоператоров. В операторах этой последовательности квалификация идентификаторов компонент156может быть опушена, если они используются для ссылки на переменную, заданную в заголовкеоператора присоединения. Если обозначение дает компоненту структурной переменной, селекторвычисляется один раз (до исполнения последовательности операторов). Оператор присоединенияоткрывает новую область видимости.$ОператорПрисоединения = WITH Обозначение$DO ПocлОператоров END.Пример:WITH t^ DOключ:=0; левый:=NIL;правый: =NILEND9.11.
Операторы выхода и возвратаОператор возврата состоит из слова RETURN, за которым, возможно, следует выражение.Он приводит к завершению процедуры (или тела модуля), а выражение определяет значение,возвращаемое как результат процедуры-функции. Тип этого выражения должен быть совместимпо присваиванию с типом результата, определенным в заголовке процедуры (см. гл. 10).Процедура-функция требует присутствия оператора возврата, задающего значениерезультата. Таких операторов может быть несколько, но выполняется только один из них.
Всобственно процедурах под оператором возврата подразумевается конец тела процедуры. Поэтомуявное задание оператора возврата рассматривается как дополнительная, возможно, дляисключительных ситуаций, точка завершения.Оператор выхода состоит из слова EXIT. Он определяет завершение охватывающего егобезусловного цикла и передачу управления на оператор, следующий за этим безусловным циклом(см. п.9.9).10.
ОПИСАНИЯ ПРОЦЕДУРОписание процедуры состоит из заголовка процедуры и блока, называемого телом процедуры.Заголовок определяет идентификатор процедуры и формальные параметры . Блок содержитописания и операторы. Идентификатор процедуры повторяется в конце описания процедуры.Имеются два вида процедур, а именно собственно процедура и процедура-Функция.Последняя активируется обозначением Функции, входящим в выражение, и вырабатываетрезультат, являющийся операндом выражения. Собственно процедура активируется вызовомпроцедуры.
Для процедуры-Функции в описании после списка параметров указывается типрезультата. Ее тело должно содержать оператор RETURN, определяющий результат процедурыфункции.Все константы, переменные, типы, модули и процедуры, описанные в блоке,составляющем тело процедуры, локальны для процедуры. Значения локальных переменных,включая и определенные в локальных модулях, не определены до входа в процедуру. Посколькупроцедуры в свою очередь могут быть описаны как локальные объекты, описания процедур могутбыть вложенными. Для каждого описанного объекта можно определить уровень его вложенности.Если объект локален для процедуры уровня к, то его уровень равен k+1.
Объекты, описанные вмодуле, являющемся единицей компиляции (см. гл.14), имеют по определению уровень 0.Помимо Формальных параметров и локальных объектов, в процедуре доступны такжеобъекты, описанные в окружении процедуры (за исключением объектов, имеющих имена,совпадающие с именами локальных объектов).157Использование идентификатора процедуры в вызове внутри ее описания предполагаетрекурсивную активацию процедуры.$$$$ОписаниеПроцедуры = ЗаголовокПроцедуры ";"Блок Идентификатор .ЗаголовокПроцедуры = PROCEDURE Идентификатор[ФормальныеПараметры].$Блок = {Описание} [BEGIN ПослОператоров] END.$Описание = CONST {ОписаниеКонстанты ";"}|$TYPE {ОписаниеТипа ";"}|$VAR {ОписаниеПеременной ";" }|$ОписаниеПроцедуры ";" | ОписаниеМодуля ";".10.1.
Формальные параметрыФормальные параметры - идентификаторы, обозначающие Фактические параметры,задаваемые при вызове процедуры. Соответствие между Формальными и Фактическимипараметрами устанавливается при вызове процедуры. Имеется два вида параметров: параметрызначения и параметры-переменные. Разновидность параметра указывается в списке Формальныхпараметров. Параметры-значения представляют собой локальные переменные, которым в качественачальных значений присваиваются результаты вычисления соответствующих Фактическихпараметров.
Параметры-переменные соответствуют Фактическим параметрам, являющимсяпеременными, и они подставляются вместо этих переменных. Параметры-переменныеуказываются символом VAR, у параметров-значений символа VAR нет.Формальные параметры локальны для процедуры, т.е. областью их видимости служитпрограммный текст, составляющий описание процедуры.$ФормальныеПараметры =$"(" [ФПСекция {":" ФПСекция}]")"[":" КвалИдент].$ФПСекция = [VAR] СписИдент ":" ФормТип.$ФормТип = [ARRAY OF] КвалИдент.Тип каждого Формального параметра указывается в списке формальных параметров. Вслучае параметров-переменных он должен совпадать (!) с типом соответствующего фактическогопараметра (см. п.9.2 и гл.12, где приведены исключения).
В случае параметров-значенийФормальный тип должен быть совместим по присваиванию с фактическим типом (см. п.9.1). Еслипараметром является массив, должна использоваться формаARRAY OF Tв которой опушена спецификация границ индексов. В таком случае говорят, что параметрявляется гибким массивом. Тип Т должен совпадать с типом элементов фактического массива, адиапазон индексов отображается на целые от 0 до N—1, где N - число элементов. Доступ кФормальному массиву только поэлементный, и он может передаваться фактическим параметром,если для соответствующего Формального параметра не заданы границы индексов. Процедурафункция без параметров имеет пустой список параметров.
Она может быть вызвана обозначениемФункции также с пустым списком Фактических параметров.158Ограничение: Если Формальный параметр определяет тип процедуры, тосоответствующий Фактический параметр должен быть либо процедурой, описанной на уровне 0,либо переменной (или параметром) типа этой процедуры и не может быть стандартнойпроцедурой.Примеры описаний процедур:PROCEDURE Read(VAR x:CARDINAL);VAR i:CARDINAL; ch:CHAR;BEGIN i:=0;REPEAT ReadChar(ch)UNTIL (ch>="0")&(ch<="9");REPEAT i:=10*i+(ORD(ch)-ORD("0"));ReadChar(ch)UNTIL (ch<"0")OR(ch>"9");x: = iEND ReadPROCEDURE Write(x,n:CARDINAL);VAR i:CARDINAL;buf:ARRAY[1..10]OF CARDINAL;BEGIN i:=0;REPEAT INC(i); buf[i]:=x MOD 10; x:=x DIV 10UNTIL x=0;WHILE n>i DOWriteChar(" ");DEC(n)END;REPEAT WriteChar(CHR(buf[i]+ORD("0")));DEC(i)UNTIL 1=0;END WritePROCEDURE log2(x:CARDINAL):CARDlNAL;VAR у:CARDINAL; (*предполагается х>0 *)BEGIN x:=x-1; y:=0;159WHILE x>0 DOx:=x DIV 2; y:=y+1END;RETURN уEND log210.2.
Стандартные процедурыСтандартные процедуры являются предопределенными. Некоторые из них - встраиваемыепроцедуры и не могут быть описаны явно, т.е. они применимы к классам типов операндов или жеимеют несколько возможных форм списка параметров. Стандартные процедуры перечисленыниже.ABS(x)абсолютное значение: тип результата совпадает с типом аргумента.CAP(ch)если ch - строчная буква, то соответствующая прописная буква: если ch прописная буква, она же является и результатом.CHR(x)литера с порядковым номером х.