Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
kitkat_otvety.doc
Скачиваний:
3
Добавлен:
01.08.2019
Размер:
3.29 Mб
Скачать

Билет 17

  1. Объявление и использование процедур. Локальные и глобальные переменные. Способы передачи параметров. Рекурсия в процедурах.

  2. Цикл for.

1) Использование процедур позволяет: 1) упростить логику программ; 2) уменьшить общий объем программы; 3) подпрограммы могут быть использованы повторно при решении других задач. Процедуры объявляются в разделе процедур и функций. Описание процедуры начинается с заголовка, в котором задается имя процедуры и список формальных параметров с указанием их типов; процедура может быть без параметров, тогда в заголовке указывается только её имя. В общем виде: procedure <имя процедуры> (<список формальных параметров>); Список формальных параметров может включать в себя параметры-значения, параметры-переменные, перед которыми ставится зарезервированное слово Var. Тело процедуры в Паскале в точности повторяет структуру главной программы. В нем могут присутствовать разделы описания меток (label), констант (const), типов данных (type), переменных (var) и других процедур и функций, входящих в состав данной процедуры. Наличие вложенных процедур и функций отличает Паскаль и от Си, и от Бейсика. Собственно вычислительная часть тела процедуры начинается со служебного слова begin и заканчивается соответствующим end, после которого в отличие от главной программы следует не точка, а точка с запятой. Досрочный выход из тела функции или тела процедуры осуществляется по оператору exit.

Переменные, описанные в основной программе, являются гло­бальными по отношению к внутренним процедурам и функциям. Это означает, что они доступны в подпрограммах, описанных внутри основной программы. Переменные, опи­санные внутри процедур и функций, называются локальными. Они порождаются при каж­дом входе в подпрограмму и уничтожаются при выходе из этой подпрограммы, т.е. ло­кальные переменные существуют только при выполнении подпрограммы и недоступны в основной программе.

Если имя локальной переменной совпадает с именем глобальной пере­менной, то при выполнении подпрограммы такая глобальная переменная становится не­доступной, т.е. «закрывается» локальной переменной. В программе на Паскале все переменные главной программы являются глобальными. К таковым же относятся и все переменные, объявленные в модулях, подключаемых к программе с помощью директивы Uses. Переменные любого блока могут выступать в качестве глобальных по отношению ко всем вложенным блокам.

Фрагмент программы от заголовка процедуры до завершающей операторной скобки end принято называть блоком. Для Паскаля характерна возможность использования вложенных блоков и с каждым из них можно связать натуральное число, соответствующее уровню вложения. Так, например, в блок A могут быть вложены два последовательных блока первого уровня - блоки B и C. Если же блок C вложен в блок B, входящий, в свою очередь в блок A, то блок C уже имеет уровень два по отношению к блоку A. В теле любого блока могут содержаться обращения к вложенным блокам своего первого уровня или к последовательным блокам такого же уровня. Блок не имеет права напрямую обратиться к своим процедурам второго или более высокого уровня вложенности. Если процедура A обращается к процедуре B, то описание процедуры B должно предшествовать описанию процедуры A. Рекурсия – это способ организации вычислительного процесса, при котором подпрограмма в ходе выполнения составляющих её операторов обращается сама к себе. Рекурсивный алгоритм может вызвать переполнение стека. Если программа включает рекурсивную цепочку из двух или более процедур, одна из них должна объявляться (но не описываться) первой с добавкой forward. Соответствующее объявление носит название опережающего. procedure <имя процедуры>(<параметры>); forward;

Описание опережающей процедуры располагается после других процедур рекурсивной цепочки, но в ее заголовке список параметров может уже не указываться.

Для обращения к процедуре достаточно задать ее имя с последующим набором фактических параметров: <имя процедуры> (<список фактических параметров>); Между фактическими и формальными параметрами должно быть строгое соответствие, то есть 1)одинаковое количество; 2)одинаковый порядок следования; 3)одинаковый тип для соответствующих параметров. При вызове процедуры сначала передаются параметры, при этом параметры-значения передаются по значению, а параметры-переменные – по ссылке.

Отличие этих двух способов передачи параметров заключается в следующем. Параметры по значению содержат копии передаваемых данных. При завершении работы эти копии уничтожаются. Механизм работы с параметрами по значению: вычисляется значение соответствующего параметра, затем оно копируется в стек, оттуда передается в подпрограмму, в подпрограмме копия фактического параметра присваивается формальному параметру. Изменение значений данного параметра внутри процедуры не приводит к изменению значения соответствующего фактического параметра. Следовательно, такие параметры можно использовать только для передачи в процедуру входных данных. Параметры по ссылке содержат не сами значения, а их адреса в памяти. Процедура, зная адрес фактического параметра, может извлечь его, произвольно изменить и разместить по указанному адресу новое значение. В качестве фактического параметра могут быть использованы только переменные. По адресу стараются передавать массивы, т.к. поместить в стек адрес намного эффективнее, чем пересылать туда каждый элемент массива. Следовательно, такие параметры нужно использовать для того, чтобы вернуть результат работы процедуры в вызывающую программу. При использовании параметра-константы перед ним в заголовке процедуры должно стоять зарезервированное слово const. Параметр-константа передается также по ссылке, но значение параметра-константы нельзя изменить внутри процедуры. При попытке сделать это компилятор выдаст ошибку. Следовательно, параметр-константу можно использовать в том случае, когда мы хотим быть уверенными, что фактический параметр не изменится внутри процедуры. При описании выходного параметра перед ним в заголовке процедуры следует ставить зарезервированное слово out. Этот параметр передается по ссылке, его можно использовать только для возврата результата, так как память, занимаемая соответствующим фактическим параметром, в момент обращения к процедуре очищается.

2)Цикл For – это цикл с параметром. For – счетный оператор цикла. Такой цикл следует использовать в том случае, когда заранее известно число повторений выполнения последовательности операторов. Существуют два варианта оператора. Первый вариант – с увеличением счетчика: for <счетчик> := <начальное значение> to <конечное значение> do <оператор>; Второй вариант - с уменьшением счетчика: for <счетчик> := <начальное значение> downto <конечное значение> do <оператор>. Счетчиком является переменная порядкового типа – параметр цикла. Начальное и конечное значение – выражения того же типа. Оператором, выполняемым в цикле и образующим тело цикла, может являться также составной оператор. Оператор for действует следующим образом. В начале вычисляются начальное и конечное значение счетчика. Далее счетчику присваивается начальное значение. Затем значение счетчика сравнивается с конечным значением. Пока счетчик меньше или равен конечному значению (либо >= для downto), выполняется очередная итерация цикла. В противном случае происходит выход из цикла. Выполнение очередной итерации включает в себя сначала выполнение тела цикла, а затем присвоение счетчику цикла следующего значения. Если в первом варианте начальное значение больше конечного или во втором варианте меньше конечного, то цикл не выполнится ни разу. Цикл выполняется для to <конечное значение> - <начальное значение> + 1 раз. Если внутри одного оператора цикла встречается другие операторы цикла, то такие циклы называются вложенными. Внутренний цикл должен целиком размещаться внутри внешнего и не пересекаться с ним.

Для гибкого управления циклическими операторами for, while и repeat в состав Object Pascal включены две процедуры без параметров:

break - реализует немедленный выход из цикла; действие проце­дуры заключается в передаче управления оператору, стоя­щему сразу за концом циклического оператора;

continue - обеспечивает досрочное завершение очередного про­хода цикла; эквивалент передачи управления в самый конец циклического оператора.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]