Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Гладков_Кулютникова.doc
Скачиваний:
8
Добавлен:
03.11.2018
Размер:
1.36 Mб
Скачать

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

В тексте песни припев дается только один раз, если нужно его повторить, то указывается одно слово “припев”, под которым подразумевается текст, приведенный ранее.

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

Более того, рекомендуется большую задачу разбивать на отдельные смысловые задачи (подпрограммы), программировать их отдельно, отлаживать, а затем объединять в единую программу. Использование подпрограмм считается хорошим стилем программирования. При этом уменьшается в целом объем программы и уменьшается время на ее отладку.

Любая программа может содержать несколько подпрограмм, каждая из которых так же может содержать подпрограммы.

В Паскале имеется два вида подпрограмм: процедура (procedure) и функция (function).

Процедура может возвращать в качестве ответа несколько значений, а функция - только одно. Работа с процедурами и функциями состоит из двух частей:

1) описание процедуры или функции;

2) вызов ее на исполнение (передача управления компьютером) с одновременной передачей исходных данных, необходимых для работы процедуры или функции.

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

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

procedure имя [(список параметров)];

oписание данных;

begin

oператоры процедуры или тело процедуры

end;

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

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

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

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

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

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

function имяф(список_параметров): тип_возвращаемого_значения;

oписание данных;

begin

Операторы функции или тело функции;

имяф := выражение; {обязательный оператор, формирующий

возвращаемое функцией значение}

end;

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

Задача 1. Напишите функцию, определяющую является ли заданный символ русской гласной буквой.

Решение. В качестве параметра в функцию будет передаваться символ. А результат должен определять является или не является (да или нет), т.е. значение функции должно быть логическим.

function gl (ch: char): boolean;

begin

gl := pos (ch, ‘аеиоуыэюя’) <> 0;

end;

Задача 2. Даны два действительных числа x, y. Вычислите значение выражения z := (sign x + sign y)· sign (x + y), где sign - функция, определяющая знак числа, т.е. .

Решение. В качестве передаваемого параметра будем использовать значение вещественной переменной. Функция будет принимать значение -1, 0 или 1, т.е. целое.

var x, y, z: real;

function sign (a: real): integer;

begin

if a < 0 then sign := -1

else if a = 0 then sign := 0

else sign := 1;

end;

begin {тело основной программы}

writeln (‘задайте значения x и y’);

readln (x, y);

z := (sign (x) + sign (y)) * sign (x + y);

writeln (‘z = ‘, z);

end.

Упражнение. Решите предложенную задачу без описания функции.

Задача 3. Напишите функцию, определяющую следующее за данным простое число.

Решение. Передаваемый параметр - целое число, значение функции - целое число.

function pr (a: integer): integer;

var i: integer; {возможные делители числа}

aa: integer; {число - кандидат на простое}

f: boolean; {равно true, если нашли простое число}

begin

f := false; {простое число еще не нашли}

aa := a;

repeat

aa := aa + 1;

i := 1;

repeat

i := i + 1;

until aa mod i = 0;

if aa = i then begin f := true; pr := aa end; {нашли простое число}

until f;

end;

Упражнение. Измените функцию так, чтобы она определяла, является ли число простым. С помощью этой функции найдите все простые числа в заданном массиве целых чисел.

Задача 4. Напишите функцию, проверяющую принадлежит ли заданный элемент двумерному массиву. С помощью этой функции проверить все ли элементы одномерного массива принадлежат заданному двумерному.

Решение. Просматриваем двумерный массив, сравнивая каждый его элемент с элементом одномерного массива. Если нашли совпадение, то элемент имеется в двумерном массиве. Напишем две дополнительные процедуры для вывода одномерного и двумерного массивов.

const nn = 5; mm = 5;

type mas2 = array [1..nn, 1..mm] of integer;

mas1 = array [1..nn] of integer;

var a: mas2; {исходный двумерный массив}

b: mas1; {исходный одномерный массив}

n, m, i, j: integer;

f: boolean;

function prov (a: mas2; n, m: integer; x: integer): boolean;

{проверяет, принадлежит ли x двумерному массиву}

var i, j: integer;

f: boolean;

begin

f := false; {еще не нашли}

i :=1;

while (i <= n) and not f do

begin j :=1;

while (j <= m) and not f do

if a[i, j] = x

then f := true {нашли}

else j := j + 1; {переходим к следующему}

if not f then i := i + 1

end;

prov := f

end;

procedure wri1 (a: mas1; n: integer);

{вывод одномерного массива}

var i : integer;

begin

writeln;

writeln (‘одномерный массив’);

for i := 1 to n do write (a[i], ‘ ‘)

end;

procedure wri2 (a: mas1; n, m: integer);

{вывод двумерного массива}

var i, j : integer;

begin

writeln (‘одномерный массив’);

for i := 1 to n do

begin

writeln;

for j := 1 to m do write (a[i, j], ‘ ‘);

end;

end;

begin {основная программа}

write (‘введите количество строк и столбцов’);

readln (n, m);

for i := 1 to n do

for j := 1 to m do a[i, j] := random (10);

for i := 1 to n do b[i] := random (10); {или b[i] := i}

wri2(a, n, m);

wri1 (b, n); writeln;

f := true;

i := `;

while (i <= 1) and f do

begin f := f and prov (a, n, m, b[i]);

if f then i := i + 1; {если данный элемент есть в двумерном массиве, то переходим к анализу следующего элемента двумерного массива}

end;

if f then writeln (‘входят все’)

else writeln (‘не входит ’, i, ‘элемент’);

end.

Упражнения.

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

2. Найдите значение интеграла методом трапеций, оформив вычисление подинтегрального выражения в виде функции.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]