вторник, 4 декабря 2012 г.

Процедуры и функции в Pascal


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


Подпрограммы решают три важные задачи, значительно облегчающие программирование:
1.    избавляют от необходимости многократно повторять в тексте программы аналогичные фрагменты, т.е. сократить объём программы;
2.    улучшат структуру программы, облегчая понимание при разборе;
3.    уменьшают вероятность появления ошибок, повышают устойчивость к ошибкам программирования и непредвиденным последствиям при модификации.
В этих разделах описываются данные, используемые только внутри подпрограммы и являющиеся промежуточными при её выполнении. Такие данные называются локальными. В подпрограмме могут участвовать переменные, описанные в главной программе. Эти данные называются глобальными, их значения и подпрограмма, и главная программа берут из общей памяти.
Подпрограммы делятся на две категории: процедуры и функции

Процедура — подпрограмма, имеющая любое количество входных и выходных данных.
Любая процедура начинается с заголовка, который является её обязательной частью. Он состоит из служебного слова Procedure, за которым следует имя процедуры, а в круглых скобках — список формальных параметров. После заголовка могут идти те же разделы, что и в программе.
Procedure <Имя>(формальные параметры);
var
 локальные переменные
begin
  тело процедуры
end;
Процедура может быть описана без параметров и с параметрами. Параметры -это данные из заголовка процедуры, как передаваемые её на обработку, так и получаемые в виде результатов.
Для удобства передачи данных в процедуру и получения из неё результата используются формальные и фактические параметры.
Формальные — условные обозначения в описании процедуры — описываются в её заголовке. Фактические — с которыми требуется выполнить процедуру — перечисляются при вызове процедуры. Формальные и фактические параметры должны соответствовать по количеству, типу и порядку следования. Формальные параметры описываются только в заголовке процедуры и больше нигде.
Формальные параметры разделяют на параметры - значения и параметры переменные. Параметры - переменные, в отличие от параметров - значений возвращают измененное значение параметра в главную программу. Измененные, произведенные с параметрами - значениями в главную программу не передаются.
Чаще всего, параметры, соответствующие входным данным, будут являться параметрами - значениями, а те, в которых получается результат, будут параметрами - переменными.
Параметры переменные отмечают в заголовке процедуры словом var:
Procedure <Имя>(параметры - значения; var параметры - переменные);

Пример 1. Рассмотрим написание процедуры, вычисляющей сумму двух целых чисел (S = A +B) и вызов ее в главной программе:
procedure Summa(a,b:integer; var s:integer);
//a,b - параметры - значения, s - параметр - переменная
begin
 s := a + b;
end;
//объявляем глобальные переменные
var
 x,y,res : integer;
begin
 read(x,y);
 Summa(x,y,res); // x,y,res - это фактические параметры
 write(res);
end. Рассмотрим для примера написание процедуры, вычисляющей сумму двух целых чисел (S = A +B) и вызов ее в главной программе:
procedure Summa(a,b:integer; var s:integer);
//a,b - параметры - значения, s - параметр - переменная
begin
 s := a + b;
end;
//объявляем глобальные переменные
var
 x,y,res : integer;
begin
 read(x,y);
 Summa(x,y,res); // x,y,res - это фактические параметры
 write(res);
end.

Функция аналогична процедуре, но имеются два отличия.
      Функция передает в программу результат своей работы – единственное значение, носителем которого является имя своей функции.
      Имя функции может входить в выражение как операнд. Функция возвращает результат в точку своего вызова.
Например, sqr(x) – возведет в квадрат значение х и возвратит в точку вызова вычисленное значение квадрата числа х: y:=sqr(x);
Функция, определенная пользователем, состоит из заголовка и тела функции. Тело функции по структуре аналогично программе. Описание меток, констант, типов и т.д. действительны только в пределах данной процедуры. 
Указать, какое значение следует возвращать функции в качестве результата можно двумя способами:
result := возвращаемый результат;
или
<Имя Функции> := возвращаемый результат;
Структура функции:
Function <Имя>(формальные параметры):тип результата;
var
 локальные переменные
begin
  тело процедуры
  ...
  result := возвращаемый результат;
end;

Пример 2. Рассмотрим написание функции, вычисляющей сумму двух целых чисел (S = A +B) и вызов ее в главной программе:
Function Summa(a,b:integer):integer;
//a,b - параметры - значения тип результата - integer
begin
 result := a + b;
end;
//объявляем глобальные переменные
var
 x,y,res : integer;
begin
 read(x,y);
 res := Summa(x,y) // x,y - это фактические параметры
 write(res);
end.

Пример 3. Заполнить массив по следующем правилу: на четные места ставить номер элемента, на нечетные - номер элемента со знаком “-”.
const
    n = 10;
type
    miniarr = array[1..n] of integer;
var
    a: miniarr;
procedure arr_pro (k:integer; var arr: miniarr);
    var i: byte;
    begin
        writeln ('Заполнение массива через процедуру');
        for i := 1 to k do
        begin
            if (arr[i] mod 2 = 0) then arr[i] := i;
             if (arr[i] mod 2 <> 0) then arr[i] :=- i;
        end;
    end;
function arr_func (k:integer):miniarr;
    var
     i: byte;
     c: miniarr;
    

    begin
        writeln ('Заполнение массива через функцию');
        for i := 1 to k do
        begin
            if (c[i] mod 2 = 0) then c[i] := i;
             if (c[i] mod 2 <> 0) then c[i] :=- i;
        end;
        result := c;
    end;
    
procedure arr_out (k:integer; var arr: miniarr);
    var i: byte;
    begin
        write ('Вывод массива: ');
        for i := 1 to k do
            write (arr[i]:4);
        writeln;
    end;

begin
    arr_pro (n, a);
    arr_out (n, a);
    a := arr_func (n);
    arr_out (n, a);
end.

Задание для самостоятельного выполнения
  1. Написать функцию, которая выводит простые числа и с помощью нее сгенерировать последовательность. Использовать переменную типа bollean. Вывести первые n простых чисел.
  2. Написать программу нахождения чисел Фибоначчи без использования рекурсии. Входной параметр функции - n, выходной - последовательность из m чисел Фибоначчи.
  3. Даны две дроби a/b и c/d. Написать программу для умножения дроби на дробь. Результат должен быть несократимой дробью. Для сокращения дробей (и данных и результата) нужно найти НОД (наибольший общий делитель) числителя и знаменателя. Нахождение НОД двух чисел оформить в виде процедуры.

Домашнее задание
  1. Дано число N. Проверить является ли оно степенью пятерки(написать функцию позволяющую распознавать степени пятерки) через рекурсию
  2. Описать процедуру Add(D,K), добавляющую к целому положительному числу K слева цифру D (D - входной параметр целого типа, лежащий в диапазоне 0-9, K - параметр целого типа, являющийся одновременно входным и выходным). С помощью этой процедуры последовательно добавить к данному числу K слева данные цифры.





Комментариев нет:

Отправить комментарий