- •3. Система программитрования турбо паскаль
- •3.1 Окно среды разработчика
- •3.2. Элементы диалоговой среды
- •3.3. Команды редактора
- •3.4. Модули
- •4. Общие сведения о языке паскаль
- •4.1 Алфавит языка
- •4.2. Типы данных в TurboPascal 7.0
- •4.3. Операции и выражения в языке Паскаль
- •4.4 Стандартные функции в языке Паскаль
- •5. Линейные алгоритмы
- •5.1. Структура программы на языке Паскаль
- •5.2. Конструкция «следование»
- •6. Разветвляющиеся алгоритмы
- •And, * (умножение), / (деление), div, mod;
- •6.1. Операторы условных переходов
- •Var a, b, c : Real; lv : Boolean;
- •Var a, b, c : Real; lv : Boolean;
- •Var X, y : Real;
- •6.2. Оператор безусловного перехода
- •Var n, p, X : Real;
- •20: WriteLn('Факториал числа ' , n:4:2,' равен ' ,p:4:2);
- •7. Циклические алгоритмы
- •7.1. Цикл с предусловием While
- •X, xn, xk, dx, y, s, p: real;
- •7.2. Цикл с постусловием repeat
- •X1, x0, X, eps: real;
- •7.3. Цикл с параметром for
- •I: integer; c: char;
- •7.4. Принудительное завершение цикла
- •X, xn, xk, dx: real;
- •8. Символьный тип
- •8.1. Особенности символьного типа
- •8.2. Объявление символьной переменной
- •8.3. Операции с символами
- •Строковые переменные
- •9.1. Определение и типы строк
- •9.2. Упакованный строковый тип
- •9.3. Строковый тип
- •9.5. Примеры работы со строками
- •9.6. Индивидуальные задания по работе со строками и символами
- •10. Массивы
- •10.1. Организация данных в массиве
- •10.2. Объявление массивов
- •10.3. Ввод и вывод значений элементов массива
- •10.4. Подсчет количества элементов по заданному условию
- •10.5. Поиск минимального элемента массива
- •10.6. Вычисление произведения ненулевых элементов массива
- •10.7. Сортировка элементов массива
- •10.8. Заполнение массива случайными числами
- •10. 9. Индивидуальные задания по работе с массивам
- •11. Процедуры и функции
- •11.1. Понятие подпрограммы
- •11.2. Описание процедуры
- •11.3. Описание функции
- •11.4. Области действия имен
- •11.5. Индивидуальные задания по разработке процедур и функций
- •Var k,l; real;
11. Процедуры и функции
11.1. Понятие подпрограммы
В практике программирования возникают ситуации, когда в разных местах программы повторяется один и тот же набор операторов, выполняемый при различных исходных данных. Если набор операторов образует достаточно большой фрагмент программы, то целесообразно записать его один раз, представив в качестве самостоятельного программного объекта. Часть программы, оформленную в качестве самостоятельной конструкции и допускающую обращение к ней из разных точек основной программы с соответствующими исходными данными, называют подпрограммой.
При вызове подпрограммы основной процесс приостанавливается, параметры процедуры (формальные параметры) заменяются на передаваемые ей значения из основной программы (фактические параметры) и управление передается на начало подпрограммы. После выполнения подпрограммы меняющиеся параметры (параметры-переменные) возвращаются в основную программу и выполнение приостановленной основной прораммы продолжается.
В языке TURBO PASCAL используются две разновидности подпрограмм: ПРОЦЕДУРЫ (PROCEDURE) и ФУНКЦИИ (FUNCTION). Процедура обеспечивает вычисление одного или нескольких значений, а функция - одного значения. Поэтому обращение к функции можно использовать в соответствующих выражениях наряду с переменными и константами. Они имеют разный механизм обращения и форму объявления. Вызов подпрограммы осуществляется простым упоминанием имени процедуры в операторе вызова процедуры или имени функции в выражении.
Все подпрограммы языка Pascal делятся на две группы:
- стандартные (встроенные). В основной программе они не описываются, а вызываются на выполнение по имени. Примервстроенныхпроцедур: WRITE(X), WRITELN(X), READ(S), READLN(S). Встроенные функции: SIN(X), LN(X) и др.
- определяемые (создаваемые) программистом. Они описываются в разделе объявлений программы. Структура подпрограмм аналогична структуре основной программы. Такие подпрограммы можно не только объявлять в самой программе, но и вызывать из заранее подготовленной библиотеки, что существенно сокращает объем компилируемого исходного текста.
Применение подпрограмм позволяет:
- редуцировать задачу, применить методику нисходящего проектирования программ, последовательно понижая их сложность до получения возможности их реализации. Это дает обозримость, структурированность, читабельность;
- уменьшить объем программы;
- обеспечить универсализацию модулей и возможность применения их для других задач и других исходных данных;
- создать условия для автономной работы нескольких исполнителей.
Однако подпрограммы требуют особого оформления, что, впрочем, не является чрезмерно затратным процессом.
11.2. Описание процедуры
Описание процедуры имеет следующую структуру:
PROCEDURE ИМЯ (СПИСОК ФОРМАЛЬНЫХ ПАРАМЕТРОВ);
РАЗДЕЛ ОПИСАНИЙ
BEGIN
РАЗДЕЛ ОПЕРАТОРОВ (тело процедуры)
END;
Первую строку называют заголовком процедуры.
Формальные параметры (параметры) обеспечивают передачу данных из основной программы в процедуру и обратно. Для них должны быть перечислены имена формальных параметров и их типы. Операторы тела подпрограммы рассматривают список формальных параметров как своеобразное расширение раздела описаний: все переменные из этого списка могут использоваться в любых выражениях внутри подпрограммы. Таким способом осуществляется настройка алгоритма подпрограммы на конкретную задачу.
Возможно использование параметров следующих видов:
- параметры-значения;
- параметры-переменные;
- параметры-процедуры;
- параметры-функции.
Параметры-значения предназначены для передачи данных из основной программы в процедуру. Он объявляется только своим типом. Перед вызовом подпрограммы это значение вычисляется, полученный результат лишь копируется во временную память и передается подпрограмме. Любые возможные изменения в подпрограмме параметра-значения никак не воспринимаются вызывающей программой, так как в этом случае изменяется копия фактического параметра. Значение этой переменной в вызывающей программе не изменяется.
Параметры-переменные обеспечивают передачу данных из основной программы в процедуру и(или) обратно. При объявлении перед ними необходимо ставить зарезервированное слово VAR. При вызове подпрограммы передается сама переменная, а не ее копия (фактически в этом случае подпрограмме передается адрес переменной). Изменение параметра-переменной приводит к изменению самого фактического параметра в вызывающей программе.
Параметры-переменные используются как средство связи алгоритма, реализованного в подпрограмме, с внешним миром: с помощью этих параметров подпрограмма может передавать результаты своей работы вызывающей программе. Разумеется, в распоряжении программиста всегда есть и другой способ передачи результатов - через глобальные переменные. Однако злоупотребление глобальными связями делает программу, как правило, запутанной, трудной в понимании и сложной в отладке. В соответствии с требованиями хорошего стиля, программирования рекомендуется там, где это возможно, использовать передачу результатов через фактические параметры-переменные.
Параметры-процедуры указываются после служебного слова PROCEDURE.
Параметры-функции размещаются после служебного слова FUNCTION.
Пример заголовка процедуры
PROCEDURE KRL (A,B:REAL; FUNCTION F(X:REAL):REAL);
PROCEDURE P(X,Y:REAL); VAR R:REAL);
В этом примере A,B - параметры-значения, FUNCTION - параметр-функция, PROCEDURE - параметр-процедура, R - параметр-переменная. Список формальных параметров необязателен и может отсутствовать. В этом случае объявляется процедура без параметров, например, процедура рисования строки звездочек фиксированной длины по месту установки курсора.
Обращение к процедуре (вызов процедуры) осуществляется с помощью оператора-процедуры, имеющего следующую структуру:
ИМЯ_ПРОЦЕДУРЫ(СПИСОК ФАКТИЧЕСКИХ ПАРАМЕТРОВ).
Значения фактических параметров присваиваются формальным параметрам при вызове процедуры
Имена фактических и формальных параметров могут не совпадать (даже лучше, если они не будут совпадать, потому что при этом есть вероятность сделать меньше ошибок). Однако необходимо придерживаться следующих правил:
- количество фактических и формальных параметров должно быть одинаковым;
- порядок следования фактических параметров при обращении должен совпадать с порядком следования соответствующих формальных параметров;
- соответствующие фактические и формальные параметры должны быть одного типа.
Представленный ниже пример поясняет изложенное. В программе задаются два целых числа 5 и 7, эти числа передаются процедуре INC2, в которой они удваиваются. Один из параметров передается как параметр-переменная, другой - как параметр-значение. Значения параметров до и после вызова процедуры, а также результат их удвоения выводятся на экран.
а : Integer = 5;
b : Integer = 7 ;
{-----------------}
ProcedureInc2 (varc: Integer; b: Integer); {Заголовок процедуры в объявлении}
begin {Начало тела процедуры Inc2}
с := с + с;
b := b + b;
WriteLn ( 'удвоенные: ', c:5, b:5);
end; {Окончание тела inc2}
{--------------}
begin {Начало тела основной программы}
WriteLn('исходные: ', a:5, b:5);
Inc2(a,b); {Вызов процедуры с передачей фактических параметров}
WriteLn('результат: ', a:5, b:5)
end. {Окончание основной программы}
В результате прогона программы будет выведено на монитор:
- "исходные: 5 7" (это значения переменных до вызова процедуры);
- "удвоенные: 10 14" (это значения, которые выводятся в самой процедуре под именами формальных параметров. В данном случае переменная В является внутренней переменной процедуры);
- "результат: 10 7" (это значения переменных основной процедуры, в том числе и переменной В).
Как видно из примера, удвоение второго формального параметра (В) в процедуре INC2 не вызвало изменения фактической переменной В, так как этот параметр описан в заголовке процедуры как параметр-значение. Этот пример может служить еще и иллюстрацией механизма «накрывания» глобальной переменной одноименной локальной: хотя переменная В объявлена как глобальная (она описана в вызывающей программе перед описанием процедуры), в теле процедуры ее «закрыла» локальная переменная В, объявленная как параметр-значение.