Процедуры. Параметры-переменные.
ПроцедурыПроцедурой в Паскале называется именованная последовательность инструкций, реализующая некоторое действие. В нужное место программы процедуру вызывают с помощью оператора вызова. После выполнения процедуры программа перейдет к выполнению оператора, следующего за оператором вызова. Формат описания процедуры:Рrocedure<Имя процедуры>(<форм. параметры>); <Раздел описаний> Begin<Тело процедуры>End;Формальные параметры — перечень имен для обозначения исходных данных и результатов работы процедуры, используемых для описания процедуры, с указанием их типов.Раздел описаний может иметь такие же подразделы, как и раздел описаний основной программы. Однако все описанные здесь объекты доступны лишь в этой процедуре. Они локальны так же, как и имена формальных параметров. Объекты, описанные ранее в разделе описаний основной программы и не переопределенные в процедуре, называются глобальными для этой подпрограммы и доступны для использования. Формат оператора вызова: <имя процедуры> (<фактические параметры>) ;Фактические параметры - данные, с которыми выполняется процедура. Между формальными и фактическими параметрами должно быть соответствие по количеству, типу и порядку следования. Процедуры могут быть без параметров, например, Procedure Р11;. При описании процедур без параметров используются глобальные переменные. Параметры процедурыСуществует два способа передачи фактических параметров в подпрограмму: по значению и по ссылке. Соответственно параметры называются параметрами-значениями и параметрами-переменными.В первом случае значение переменной - фактического параметра при вызове подпрограммы присваивается локальной переменной, являющейся формальным параметром подпрограммы. Изменение локальной переменной никак не отражается на соответствующей глобальной. В качестве фактических параметров может служить любое выражение соответствующего типа.Передача параметров по ссылке отличается тем, что при обращении к подпрограмме имя формального параметра будет указывать на ту же область памяти, что и имя соответствующего фактического параметра. При описании подпрограммы перед именем параметра-переменной ставится служебное слово Var. В этом случае изменения выполняются в ячейках памяти фактических параметров. Поэтому в качестве фактических параметров можно использовать только имена переменных.
Пользовательские функции
Подпрограмма-функция предназначена для вычисления какого-либо параметра. Функция состоит из заголовка итела функции. Заголовок функции имеет вид: Function <имя> (формальные параметры) :<тип>;где Function - служебное слово; <имя>— имя функции, определяемое в соответствии с общими правилами построения идентификаторов; <тип> - тип функции,т.е. тип возвращаемого параметра. Функция может возвращать типы вещественные, порядковые, строкового илюбого указателя.
У этой подпрограммы два основных отличия от процедуры. Первое отличие - заголовок. Второе отличие в том, что процедура может иметь несколько выходных параметров - результатов, а функция только одно значение, передаваемое через ее имя. Именно этим объясняется то, что в теле функции хотя бы один раз имени функции должно присваиваться вычисленное значение.Структура функции такая же, как и процедуры. Передача параметров осуществляется так же, как в процедуре. Функция - это некоторый независимый вспомогательный алгоритм (или имеющая имя часть программы), к которому можно обращаться для выполнения указанной в нем последовательности операций. Функция предназначена для вычисления только одного значения переменной. Вызов функции производится на том шаге основного алгоритма, для реализации которого необходимо использовать значение именно данной функции (в выражениях, других функциях и т.п.).Обращение к функции состоит из имени функции и списка фактических параметров, которые должны совпадать по количеству и типам с формальными параметрами. При обращении к некоторым функциям список параметров может отсутствовать.В теле функции обязательно должна быть команда присваивания, где в левой части стоит имя функции, а в правой - ее значение. В противном случае значение функции не будет определено.Каждое обращение к функции приводит к исполнению компьютером предусмотренных этой функцией операций, которые позволяют найти конкретное значение данной функции. Полученное значение присваивается этой функции и помещается (как говорят, возвращается) в ячейку памяти, адрес которой определяется именем функции {пример - математические функции). Т.е. результат исполнения алгоритма-функции возвращается в основной алгоритм в виде единственного значения этой функции.
Рекурсия
При вычислениях возможны случаи, когда подпрограмма обращается к себе самой. Такую ситуацию называют рекурсией.Примером рекурсии служит подпрограмма вычисления факториала натурального числа:n!=система 1, если n=0; (n-1)!n, если n>0 function f(n:integer ):integer;begin if n=0then f:=lelse f:=f (n-l)*n;end; Обращение кданной функции, например, с фактическим параметром 3,влечет следующие действия. Рекурсия.Рекурсия- это процесс, при котором вспомогательный алгоритм (функция или процедура) вызывает самого себя. Программу с рекурсией позволяют реализовать только некоторые языки программирования (в частности Pascal). Рекурсия позволяет свести общую задачу к другой, более простой задаче.Идея, рекурсии основана на использовании рекуррентных соотношений.Рекуррентное соотношение (рекуррентная формула) позволяет легко найти функцию для некоторого значения аргумента я, если известно ее значение для аргумента /7-1. Рекуррентные соотношения существуют для многих математических функций.Определения с помощью рекуррентных формул иногда называют рекурсивными определениями. Достоинства алгоритмов, в которых используются рекурсии:простота, наглядность и компактность, поскольку использование рекурсии позволяет легко (почти дословно) построитьалгоритм вычисления по рекуррентным.формулам.Недостаток таких алгоритмов: неэкономное использованиеоперативной памяти при их реализации на компьютерах.Текущим уровнем рекурсии называется число рекурсивныхвызовов в каждый конкретный момент времени.Главное требование к рекурсивным процедурам: вызов рекурсивной процедуры должен выполняться по условию, которое накаком-то уровне рекурсии станет ложным.Если условие истинно, то рекурсивный спуск продолжаетсяКогда оно становится ложным, то спуск заканчивается и начинается поочередный рекурсивный возврат из всех вызванных наданный момент копий рекурсивной процедуры.Безусловные рекурсивные процедуры приводят к бесконечным процессам, и на эту проблему нужно обратить особое внимание, так как практическое использование процедур с бесконечным самовызовом невозможно. Такая невозможность вытекаетиз того, что для каждой копии рекурсивной процедуры необходимо выделять дополнительную область памяти, а бесконечнойпамяти не существует.Рекурсии делятся на два вида: прямую и косвенную.При прямой рекурсииво вспомогательном алгоритме осуществляется обращение этого алгоритма к самому себе.
Понятие файла
Файл в Паскаль-программе представляет структурированный тип данных, образованный последовательностью компонентов одного типа. В Паскале имеются три разновидности файлов: типизированные, безтиповые и текстовые. Доступ к физическим файлам происходит через так называемые файловые переменные.Для организации ввода/вывода в программе необходимо выполнить следующие действия:- объявить файловую переменную;- открыть файл для чтения и/или записи;- выполнить операции ввода/вывода;- закрыть файл.В любой момент доступен только один компонент файла. Другие компоненты становятся доступными по мере продвижения по файлу, В отличие от массива число компонентов в файле не фиксируется. Его длина определяется в процессе выполнения программы и ограничивается только доступной памятью. Позиция файла, следующая за последним компонентом файла (или первая позиция пустого файла), помечается специальным маркером, который отличается от любого компонента файла. Для работы с файлами используют специальные процедуры и функции. С их помощью осуществляются все необходимые действия по созданию файлов и доступа к их компонентам. Перед выполнением операций файловая переменная связывается с физическим файлом, после чего он в тексте программы не упоминается. В Паскале есть подпрограммы, применяемые для файлов любого типа, а также подпрограммы для работы только с определенными типами файлов. Для эффективного выполнения операций ввода/вывода из внешних файлов в Паскале целесообразно использовать нетипизированные файлы, так как при работе с ними можно использовать быстрые дисковые операции низкого уровня. Нетипизированные файлы дают возможность прямого доступа к любому файлу на диске независимо от его типа и структуры.