Лекция 8. Подпрограммы языка Pascal.

 

1.     Подпрограмма процедура

2.     Подпрограмма функция

3.     Примеры использования подпрограмм и функций

 

1.       Подпрограмма процедура

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

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

Описание процедуры

Описание процедуры начинается с заголовка, который является обязательным (в отличие от заголовка программы). Заголовок состоит из служебного слова Procedure, за которым следует имя процедуры и, в круглых скобках - список формальных параметров. В конце заголовка ставится точка с запятой. Общий вид описания процедуры (в квадратных скобках заключена часть, которая может отсутствовать):

Procedure Имя [(список формальных параметров)];

Описательная часть

Begin

Тело процедуры

End;

При вызове процедуры ее формальные параметры заменяются соответствующими фактическими.

Фактические параметры – это параметры, которые становятся вместо формальных при  вызове процедуры.

Между формальными и фактическими параметрами должно быть соответствие,  как по их типам, так и по количеству.

 

2.     Подпрограмма функция

 

Описание функции

Заголовок функции состоит из слова 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.