- •Рабочая программа
- •Тематический план учебной дисциплины
- •Основные теоретические положения
- •Тема 2.5 Массивы
- •Одномерный массив
- •Способы описания одномерного массива
- •Ввод элементов массива
- •Ввод элементов массива
- •Вывод элементов массива
- •Двумерные массивы
- •Способы описания двумерного массива
- •Тема 2.6 Подпрограммы: процедуры и функции
- •Тема 2.7 Строки символов
- •Способы описания строк
- •Тема 2.8 Множество
- •Операции над множествами
- •Тема 2.9 Записи
- •Описание фиксированной записи
- •Описание вариантной записи
- •Тема 2.10 Файлы данных
- •Описание файловых переменных
- •Стандартные процедуры и функции для работы с файлами
- •Тема 2.11 Динамические структуры данных
- •Указательная переменная может находиться в трех состояниях:
- •Действия с указателями
- •Стандартные процедуры для работы с динамической памятью
- •Создание прямого односвязного списка
- •Методические указания по методике отладки программ в интегрированной среде PascalAbc Изучение интегрированной среды Pascal abc
- •Перечень рекомендуемых учебных изданий, интернет-ресурсов, дополнительной литературы
Тема 2.6 Подпрограммы: процедуры и функции
При создании сложной программ возникает необходимость декомпозиции (разделении) ее на подзадачи. Тurbo Pascal имеет различные средства для деления программы на части. На верхнем уровне (больших задач) – это модули, на нижнем уровне (элементарных подзадач) – это процедуры и функции.
Процедура – независимая именованная часть программы, которую можно вызвать по имени для выполнения определенных действий. Процедура не может выступать как операнд в выражении. Упоминание имени процедуры в тексте головной программы приводит к активизации процедуры и называется ее вызовом.
Например: Readln(x), Delete(St, 5, 2)
Функция предназначена для вычисления какой-либо скалярной (простой) величины. Имя функции может входить в выражение как операнд. В теле функции имени функции хотя бы раз должно быть присвоено значение.
Например: Ord(‘F’), Sqrt(a+b)
Все процедуры и функции языка Тurbo Pascal делятся на две группы:
встроенные (стандартные) - хранятся в стандартных библиотечных модулях ;
пользовательские - описываются в разделе описаний головной программы.
Описание подпрограммы-процедуры
Procedure Имя (Список формальных параметров); {Заголовок процедуры}
Label
Const {раздел описаний локальных (внутренних) данных}
Typе
Var
Procedure
Function
Begin {операторы процедуры}
. . .
End;
Описание подпрограммы-функции
Function Имя (Список формальных параметров):тип результата; {Заголовок функции}
Label
Const {раздел описаний локальных ( внутренних) данных}
Type
Var
Procedure
Function
Begin {операторы функции}
…
Имя:= выражение;
End;
где
Procedure , Function – служебные слова;
Имя – имя пользовательской процедуры/функции;
Список формальных параметров – состоит из имен параметров с указанием типов параметров, которые перечисляются через «;». Если несколько параметров имеют один тип, то их можно сгруппировать, разделив имена запятой. Если в качестве параметра используется структурированный тип данных (массив, множество, запись или файл), то он должен быть описан в разделе описаний типов Type головной программы. Список формальных параметров может отсутствовать.
Например: type ff=array[1..5,1..10] of real;
Procedure Max( s:ff; k,n:integer);
Тип результата функции– любой простой (вещественный, целочисленный, логический, символьный) , строка символов или ранее определенный пользовательский. Тип результата не может быть : массивом, множеством, записью или файлом.
Например: Function Factorial (x:byte) :real;
Результатом вычисления процедуры могут быть несколько величин, в том числе и структурированных типов (массив, множество, запись, файл или строка). Результат присваивается параметрам-переменным. Перед такими параметрами в списке формальных параметров ставится служебное слово Var, действие которого распространяется до ближайшей тоски с запятой.
Например: Procedure Kol ( st:string[100]; var k1,k2:integer; var L:Boolean);
Выходные параметры
Область действия переменной определяется местом ее объявления. Если переменная используется только в рамках одной процедуры/функции, то она называется локальной. Если действие распространяется на несколько вложенных процедур/функций, то такая переменная называется глобальной. Локальные данные во внешнем окружении не действуют. Выделение памяти под локальные данные происходит автоматически в начале выполнения подпрограммы, а освобождение – после выполнения последнего оператора подпрограммы. Если имена глобальных и локальных идентификаторов совпадают, то действует только внутренний локальный идентификатор.
Различают формальные параметры – параметры, определенные в заголовке подпрограммы, и фактические – выражения, задающие конкретные значения при обращении к подпрограмме. В момент замены формальных параметров фактическими должны выполняться следующие условия:
количество формальных и фактических параметров должно быть одинаковым;
должен совпадать порядок следования параметров;
должны совпадать их типы.
Классификация способов передачи параметров (формальных):
по механизму передачи:
передача по значению – value;
передача по адресу (ссылке) – adr;
по взаимодействию вызываемой и вызывающей подпрограмм:
только как входной параметр- in (input);
только как выходной параметр – out (output);
как входной и как выходной параметр – inout (input|output).
Язык Pascal поддерживает 3 способа передачи параметров: value-in (параметры значения), adr-in (параметры-константы), adr-inout (параметры-переменные).
Перед параметрами- (value-in) в списке формальных параметров дополнительных служебных слов не ставится. В ячейки памяти формального параметра, выделенные при вызове подпрограммы, передается копия значения фактического параметра и обратно не возвращается. В качестве фактических параметров нельзя использовать файловый тип данных.
Перед параметрами-константами (adr-in) в списке формальных параметров ставится служебное слово Const. В ячейки памяти формального параметра, выделенные при вызове подпрограммы, передается копия адреса фактического параметра. По имеющемуся адресу разрешено только считывать значение фактического параметра, а изменять запрещено. В качестве фактических параметров нельзя использовать файловый тип данных.
Перед параметрами-переменными (adr-inout) в списке формальных параметров ставится служебное слово Var. В ячейки памяти формального параметра, выделенные при вызове подпрограммы, передается копия адреса фактического параметра. По имеющемуся адресу разрешено считывать значение фактического параметра и изменять их. Измерение значений в ячейках памяти фактических параметров происходит во время выполнения операторов подпрограммы. В качестве фактических параметров можно использовать любой тип данных.
Например:
Type ff=file of real;
massiv= array[1..20,1..30] of char;
. . .
Procedure poisk ( Const a:massiv; n,k:integer; Var x:ff );
параметры- параметры- параметры-
константы значения переменные
Процедура Exit( ) – используется для досрочного выхода из подпрограммы.
Например:Описать функцию, определяющую первое отрицательное число в массиве.
Type mas=array[1..100] of real;
Function minus ( Const b:mas; n:integer) : real;
Var i:integer; {описание локальных данных}
Begin
minus:=0; {функции присваивается значение}
For i:=1 to n do
If b[i]<0 then begin
minus:=b[i]; {функции присваивается значение}
Exit {досрочное завершение функции}
end;
end;
Пример 1: Используя
подпрограмму вычисления факториала
вычислить биноминальный коэффициент
для натуральных чисел n
и m.
С использованием подпрограммы-процедуры Fact |
|
|
Program z1; Var n,m:integer; C,P,Fn,Fm: real;
{процедура нахождения факториала числа х} Procedure fact(x:integer; var p:real); Var i:integer; {локальные данные} Begin P:=1; For i:=1 to x do P:=P*i{p-результат выполнения процедуры} End;
{операторы головной программы} Begin Writeln(‘введите n, m’); Readln(n,m); Fact(n,Fn); {Fn -факториал числа n} Fact(m,Fm); {Fm- факториал числа m} Fact(n-m,P); { p- факториал числа n-m} C:=Fn/(Fm*P); Writeln(‘биноминальный коэффициент =’, C:8:1) End.
|
С использованием подпрограммы-функции Factor |
|
головная
Ввод n,m
C=Factor(n) / (Factor(m)*Factor(n-m))
конец
|
Program z2; Var n,m:integer; C: real;
{функция нахождения факториала числа х} Function factor(x:integer):real; Var i,p:integer; {локальные данные} Begin P:=1; For i:=1 to x do P:=P*i; Factor:=p {функции присваивается значение} End;
{операторы головной программы} Begin Writeln(‘введите n, m’); Readln(n,m); C:=Factor(n) / (Factor(m)*Factor(n-m)); Writeln(‘биноминальный коэффициент =’, C:8:1) End.
|
