Каталог Индекс раздела
Назад Оглавление Вперед

Лабораторная работа N 6
ПРОЦЕДУРЫ И ФУНКЦИИ

1. ЦЕЛЬ РАБОТЫ: Изучение методов использования функций и процедур языка Паскаль.

2. ОСНОВНЫЕ СВЕДЕНИЯ

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

В языке Паскаль существует два вида подпрограмм: процедура (PROCEDURE) и функция (FUNCTION). Подпрограммы объявляются в разделе описания за разделом переменных. Параметры, записываемые в обращении к подпрограммам, называются фактическими; параметры, указанные в описании подпрограмм - формальными. Фактические параметры должны соответствовать формальным по количеству, порядку следования и типу. Параметры, объявленные в основной (главной) программе, действуют в любой подпрограмме и называются глобальными. Параметры, объявленные в подпрограмме, действуют только в этой подпрограмме и называются локальными.

2.1. Процедуры

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

Пример 1. Процедура без параметров, которая печатает строку из 60 звездочек.

procedure  pr;
  var      i :  integer ;
  begin
    for i :=1 to 60 do write (' * ');    
    writeln
end.

Пример 2. Процедура c параметрами.

Даны 3 различных массива целых чисел (размер каждого не превышает 15). В каждом массиве найти сумму элементов и среднеарифметическое значение.

program  lab_6 ;
 var i, n, sum: integer;  sr :  real;
 procedure work (r:integer;  var s:integer; var s1:real); {процедура work}
  var mas : array[1..15] ofinteger ;      { объявление массива мas}
      j : integer;
 begin
    s:=0;
    for j:=1 to r do begin    {ввод элементов массива mas}
      writeln(' Введи элемент - ', j);  read(mas[j]);
      s:=s+mas [j];    
      end;
    s1:=s/r;
 end;
 begin   { главная программа}
   for i:=1 to 3  do begin
      write ('введите размер',i, ' массива'); readln(n);
      work (n, sum, sr);           {вызов процедуры work}
      writeln ('сумма элементов =',sum);
      writeln ('среднеарифметическое значение =',sr:4:1);
      end;
end.

В программе трижды вызывается процедура work, в которой формальные параметры r, s, s1 заменяются фактическими n, sum, sr. Процедура выполняет ввод элементов массива, вычисляет сумму и среднее значение. Переменные s и s1 возвращаются в главную программу, поэтому перед их описанием ставится служебное слово var.

Локальные переменные mas, j действуют только в процедуре. Глобальные - i, n, sum, sr доступны во всей программе.

2.2. Функции, определяемые программистом

Набор встроенных функций языка Паскаль достаточно широк (ABS, SQR, TRUNC и т.д.). Если в программу включается новая, нестандартная функция, то ее необходимо описать в тексте программы, после чего можно обращаться к ней из программы. Обращение к функции осуществляется в правой части оператора присваивания, с указанием имени функции и фактических параметров. Функция может иметь собственные локальные константы, типы, переменные, процедуры и функции. Описание функций аналогично описанию процедур. Отличительные особенности функций:

Пример 3. Написать подпрограмму-функцию степени аx, где a, x - любые числа. Воспользуемся формулой аx = ex ln a

program p2;           
 var f, b, s, t, c, d : real; { глобальные параметры}

 function  stp (a, x : real) : real;
 var y : real;  { локальные параметры}
 begin
    y := exp (x * ln ( a)) ;
    stp:= y; {присвоение имени функции результата вычислений подпр-мы}
 end;  { описание функции закончено }

begin 	    {начало основной программы }
    d:= stp(2.4, 5); {вычисление степеней  разных  чисел и переменных }
    writein (d, stp(5,3.5));
    read (f, b, s, t);
    c := stp(f, s)+stp(b, t);
    writeln (c);  
end.

2.3. Рекурсия

В языке Паскаль процедуры и функции могут вызывать сами себя, т.е. обладать свойством рекурсивности. Рекурсивная функция обязательно должна содержать в себе условие окончания рекурсивности, чтобы не вызвать зацикливания программы. При каждом рекурсивном вызове создается новое множество локальных переменных. Т.о. переменные, расположенные вне вызываемой функции, не изменяются.

Пример 4. Составить рекурсивную функцию, вычисляющую факториал числа n следующим образом: n!= 1, если n = 1 и n!= ( n -1 )! n, если n > 1

function   f ( n : integer): integer;
  begin 
    if  n = 1 then  f :=l  else f := n * f ( n -1 )  { функция f вызывает саму себя}
  end;

3. ВЫПОЛНЕНИЕ РАБОТЫ

  1. Разобрать приведенные выше программы.
  2. С использованием процедур выполнить свой вариант задания Лабораторной работы.
  3. Используя подпрограммы-функции, написать программу вычисления значения определенного интеграла от заданной в варианте функции методом трапеций. Для этого используется формула

    .

    Число отрезков деления принять равным n=10 и n=20, оба результата вывести на экран. Вычисление интеграла и f(x) оформить в виде функций. Найти погрешность вычисления интеграла.

Варианты заданий

  1. f(x)=(sin2 x+cos x)/(2 x2 +8) ; a=0; b=1.
  2. f(x)=(sh x + ch x)/(3 + x2) ; a=1; b=2.
  3. f(x)=(sh2 x - ex )/(2+x); a=0; b=1.
  4. f(x)=(ex -2)/(sin2 x + 5) ; a=2; b=4.
  5. f(x)=(3 sin x - cos x)/(ch2 x +2) ; a=1; b=3.
  6. f(x)=(ch x - sh2 x)/(6+2 x2) ; a=0; b=1.
  7. f(x)=(sin x + sh x)/ (x2 +2 x +3) ; a=0; b=2.
  8. f(x)=(x3 + 4 x)/(sin2 x +5) ; a=1; b=2.

4. КОНТРОЛЬНЫЕ ВОПРОСЫ

  1. Что такое подпрограмма? Виды подпрограмм в Паскале.
  2. Что такое формальные и фактические параметры ? Локальные и глобальные?
  3. В чем отличие функции и процедуры?
  4. Можно ли обращаться к подпрограммам без предварительного их описания?
  5. Что такое рекурсия? Где находится окончание рекурсии ?
  6. Локальные переменные в рекурсиях, их связь.

Каталог Индекс раздела
Назад Оглавление Вперед