Материал: Методические указания к лабораторным работам № 5-6 по дисциплине «Информатика» для студентов направления подготовки 11.03.03. Ромащенко М.А

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

крышкой – из подпрограммы можно смотреть «вверх» и нельзя «вниз». Т.е. подпрограмме доступны только те объекты верхнего уровня, которые описаны до описания данной подпрограммы. Эти объекты называются глобальными по отношению к подпрограмме.

Имена, локализованные в подпрограмме, могут совпадать с ранее объявленными глобальными именами. В этом случае считается, что локальное имя «закрывает» глобальное и делает его недоступным.

Задание 3 – Изучить описание подпрограмм. Закрепить знания о формальных и фактических параметрах.

Описание подпрограммы состоит из заголовка и тела подпрограммы. Заголовок процедуры имеет вид

procedure <имя> (список формальных параметров);

Заголовок функции имеет вид

function <имя> (список формальных параметров): <тип>;

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

procedure sb(a, x, y: real; b: integer; c: char); function summa(x, y: real; rx, glob: integer): real;

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

Любой из формальных параметров подпрограммы может быть

параметром-значением, параметром-переменной или параметром-

4

константой. Выше были даны примеры параметров-значений. Если параметры определяются как параметры-переменные, перед ними ставится зарезервированное слово var, а если это параметры-константы, то слово const, например:

procedure demo(var a: real; b: real; const c: string);

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

Если параметр определен как параметр-переменная, то при вызове подпрограммы передается сама переменная, а не ее копия. Изменение параметра-переменной приводит к изменению самого фактического параметра

ввызывающей программе.

Вслучае параметра-константы в подпрограмму также передается сама переменная или вычисленное значение, однако компилятор блокирует любые присваивания параметру-константе нового значения в теле подпрограммы.

Следующий пример позволяет наглядно увидеть отличие между типами формальных параметров. Абсолютно одинаковые действия над переменными приводят к разным результатам, что объясняется тем, что один формальный параметр описан как параметр-переменная (var c: integer), а второй как параметр-значение (b: integer)

program demo; var

a, b: integer;

procedure Inc2 (var c: integer; b: integer); begin

c:=c+c;

b:=b+b;

writeln(`удвоенные =`, c:5, b:5);

end;

begin

a:=5; b:=7;

writeln(`исходные =`, a:5, b:5); Inc2(a, b);

5

writeln(`результат =`, a:5, b:5);

end.

В результате выполнения программы на экране будет выведено:

исходные =

5

7

удвоенные =

10

14

результат =

10

7

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

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

Задание 4 – ознакомиться с понятием рекурсия.

Рекурсия – это такой способ организации вычислительного процесса, при котором подпрограмма, в ходе выполнения составляющих ее операторов, обращается сама к себе. Например, вычисление факториала при помощи рекурсии представлен на рис. 2. А ниже представлен соответствующий программный код.

6

Рис. 2. Алгоритм рекурсивного вычисления факториала

program Factorial; var

n: integer;

function Fact (n: integer): integer; {рекурсивная функция вычисляющая n!} begin

if n<0 then begin

writeln (''Ошибка в задании N'); Fact:=0;

end else

if n=0 then Fact:=1

else

Fact:=n*Fact(n-1);

end;

begin

writeln('Введите N'); readln(n);

writeln('N! = ', Fact(n)); readln;

end.

7

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

2.2. Лабораторные задания

Задание 1 – Составьте структурную схему алгоритма и напишите программу на языке Паскаль для работы с одномерными массивами в соответствии со своим вариантом. Массивы должны заполняться пользователем вручную. При выполнении задания необходимо использовать

подпрограммы!

1.даны четыре одномерных массива A, B, C, D, сформировать новый массив из сумм элементов каждого массива

2.даны четыре одномерных массива A, B, C, D, сформировать новый массив из произведений элементов каждого массива

3.даны четыре одномерных массива A, B, C, D, сформировать новый массив из минимальных значений элементов каждого массива

4.даны четыре одномерных массива A, B, C, D, сформировать новый массив из максимальных значений элементов каждого массива

5.даны четыре одномерных массива A, B, C, D, сформировать новый массив из средних арифметических элементов каждого массива

6.даны четыре одномерных массива A, B, C, D, вычислить их скалярные произведения A и B, C и D

7.даны четыре одномерных массива A, B, C, D, определить количество отрицательных элементов в каждом массиве

8.даны четыре одномерных массива A, B, C, D, определить количество положительных элементов в каждом массиве

9.даны четыре одномерных массива A, B, C, D, упорядочить элементы в каждом из них в порядке возрастания

10.даны четыре одномерных массива A, B, C, D, упорядочить элементы в каждом из них в порядке убывания

Задание 2 – Составьте структурную схему алгоритма и напишите программу на языке Паскаль для работы с двухмерными массивами в соответствии со своим вариантом. Массивы должны заполняться автоматически случайными числами. При выполнении задания необходимо

использовать подпрограммы!

8

Смотрите также:

0501_5+6
1-1
11
11 Горм +
113
1198
14
1433
1511
1632