Лекция 8. Подпрограммы языка Pascal.
3.
Примеры использования подпрограмм и функций
Часто, при составлении программы приходится один и
тот же фрагмент алгоритма вычислений оформлять при различных входных
данных. Чтобы избежать повтора на языке
Паскаль предусмотрена возможность оформления таких фрагментов в подпрограммы.
Значит, подпрограмма-
это автономная часть программы, описывающая определенный алгоритм, и допускающая
обращения к ней по имени из любой части основной программы.
На языке Паскаль их два вида – процедура и
функция. Оформляются подпрограммы
аналогично программе, т.е., содержат заголовок, раздел описания переменных
подпрограммы, операторную часть.
Описание процедуры
Описание процедуры
начинается с заголовка, который является обязательным (в отличие от заголовка
программы). Заголовок состоит из служебного слова Procedure,
за которым следует имя процедуры и, в круглых скобках - список формальных
параметров. В конце заголовка ставится точка с запятой. Общий вид описания
процедуры (в квадратных скобках заключена часть, которая может отсутствовать):
Procedure Имя [(список формальных параметров)];
Описательная
часть
Begin
Тело процедуры
End;
При вызове процедуры
ее формальные параметры заменяются соответствующими фактическими.
Фактические
параметры – это параметры, которые становятся вместо формальных
при вызове процедуры.
Между формальными и фактическими параметрами должно
быть соответствие, как по их типам, так
и по количеству.
Описание функции
Заголовок функции состоит из слова Function, за которым указывается имя функции,
затем в круглых скобках записывается список формальных параметров, далее
ставится двоеточие и указывается тип результата функции.
В теле функции обязательно должен быть хотя бы
один оператор присваивания, в левой части которого стоит имя функции, а в
правой – ее значение. Иначе значение функции не будет
определено.
Таким образом, общий вид описания функции следующий:
Function Имя [(список формальныъ параметров)]:тип
результата;
Описательная часть
Begin
Тело функции, в котором обязательно должно быть присваивание:
Имя функции:=значение;
End;
Процедура и
функция - это именованная последовательность описаний и операторов. При использовании процедур или функций
ПАСКАЛЬ - программа должна содержать текст процедуры
или функции и обращение к процедуре или функции. Тексты процедур и функций помещаются
в раздел описаний процедур и
функций.
Процедура может содержать
такие - же разделы описаний, что и
ПАСКАЛЬ - программа, а именно: разделы описания модулей, меток, констант, типов, переменных, процедур
и функций.
ПЕРЕДАЧА ИМЕН ПРОЦЕДУР И ФУНКЦИЙ В КАЧЕСТВЕ
ПАРАМЕТРОВ.
Во многих задачах, особенно в задачах вычислительной математики,
необходимо передавать имена процедур и функций в качестве параметров. Для этого в TURBO PASCAL введен новый тип данных - процедурный или
функциональный, в зависимости от того, что описывается.
Описание процедурных и функциональных типов
производится в разделе
описания типов:
type
FuncType
= Function(z: Real): Real;
ProcType
= Procedure (a,b: Real; var x,y: Real);
Функциональный и процедурный тип определяется как заголовок процедуры и
функции со списком формальных параметров,
но без имени. Можно определить функциональный или процедурный тип без
параметров, например:
type
Proc = Procedure;
После объявления процедурного или функционального
типа его
можно
использовать для описания
формальных параметров - имен процедур и функций.
Кроме того, необходимо написать те реальные
процедуры или функции, имена которых будут передаваться как фактические
параметры. Эти процедуры и функции должны компилироваться в режиме
дальней адресации с ключом {$F+}.
ОПЕРАТОРЫ ВЫХОДА
Для завершения работы программ, процедур и функций без предварительного
перехода по меткам к закрывающему end
в TURBO PASCAL введены процедуры Exit и Halt.
Вызов Exit
завершает работу своего программного блока
и передает управление вызывающей
программе. Если Exit
выполняется в подпрограмме, то выполнение этой подпрограммы прекратится, и
далее будет выполняться следующий за вызовом этой подпрограммы оператор. Если Exit выполняется в основной программе, выход из нее будет эквивалентен
ее нормальному завершению.
Вызов процедуры Halt, где бы она не находилась, завершает работу программы и передает
управление операционной системе.
Процедура Halt
имеет структуру Halt(n), где n - код
возврата, который может быть
проанализирован операционной системой с помощью команды IF ERRORLEVEL. Значение n=0 соответствует нормальному
завершению работы программы. Вызов процедуры Halt без
параметра эквивалентен вызову Halt(0).
3. Примеры использования подпрограмм и функций
Рассмотрим использование процедуры на
примере программы поиска максимума из двух целых чисел.
var x,y,m,n: integer;
procedure MaxNumber(a,b: integer; var max: integer);
begin
if a>b then
max:=a else max:=b;
end;
begin
write('Введите x,y ');
readln(x,y);
MaxNumber(x,y,m);
MaxNumber(2,x+y,n);
writeln('m=',m,'n=',n);
end.
Аналогичную
задачу, но уже с использованием функций, можно решить так:
var x,y,m,n: integer;
function MaxNumber(a,b: integer): integer;
var
max: integer;
begin
if a>b then
max:=a else max:=b;
MaxNumber := max;
end;
begin
write('Введите x,y ');
readln(x,y);
m := MaxNumber(x,y);
n := MaxNumber(2,x+y);
writeln('m=',m,'n=',n);
end.
Представленная
ниже программа с процедурой вычисления корней квадратного уравнения не
возвращает в основную программу ничего (просто выводит результат на экран).
Однако можно написать такую процедуру, которая будет использовать глобальные
переменные x1 и x2. В результате в основной ветке
программы можно будет использовать полученные корни квадратного уравнения.
Программа на
языке Паскаль:
var
a, b, c: real;
procedure sq (a,b,c: real);
var d, x1, x2: real;
begin
d := b * b - 4 * a * c;
if d
>= 0 then begin
x1 := (-b + sqrt (d)) / (2 * a);
x2 := (-b - sqrt (d)) / (2 * a);
if x1 = x2 then
writeln ('x1 = ', x1:6:2)
else
writeln ('x1 = ', x1:6:2, '; x2 = ', x2:6:2)
end
else
writeln ('Корней нет!')
end;
begin
write ('a = '); readln (a);
write ('b = '); readln (b);
write ('c = '); readln (c);
writeln (a:6:2,'x*x + ',b:6:2,'x + ',c:6:2,' = 0');
sq (a, b, c);
readln
end.
Найти наибольший по модулю элемент матрицы
Задача
В матрице целых чисел найти наибольший (максимальный) по модулю
элемент. Вывести на экран его индексы и значение.
Похожие задачи
Максимальный по модулю элемент массива
Решение
В языке
Паскаль есть функция
abs(), которая возвращает абсолютное значение переданного ей числа,
т. е. его модуль. Воспользуемся ей в условии оператора ветвления при сравнении
элементов.
Требуется
найти не только значение элемента матрицы, но и его индексы. Поэтому будем
определять только последние, так как по ним всегда можно получить значение. До
цикла перебора двумерного массива присвоим переменным mi
и mj значение 1. Тем самым предположим, что первый
элемент и есть наибольший по модулю.
В цикле будем
сравнивать модуль значения каждого элемента с модулем того, что находится в
позиции [mi, mj]. Если
абсолютное значение текущего элемента больше, то перезапишем указанные
переменные, присвоив им индексы этого элемента.
const
N = 6; M = 5;
var
arr: array[1..N,1..M] of integer;
i,j,mi,mj: byte;
begin
randomize;
mi := 1;
mj
:= 1;
for i:=1 to N do begin
for j:=1 to M do begin
arr[i,j] :=
random(100)-50;
write(arr[i,j]:4);
end;
writeln;
if abs(arr[i,j]) >
abs(arr[mi,mj]) then begin
mi := i;
mj := j;
end;
end;
writeln ('Item [',mi,',',mj,'] = ',arr[mi,mj]);
end.