Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
методичка по программироваю 2 семестр.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
1.26 Mб
Скачать

Лабораторная работа № 4 Программирование с использованием подпрограмм пользователя

Цель работы — овладение навыками алгоритмизации и программирования задач с использованием подпрограмм пользователя различных видов, овладение навыками написания подпрограмм и обращения к ним, использования параметров подпрограмм по значению и по ссылке.

Задания для самостоятельной подготовки

1. Изучить:

— правила записи подпрограмм различных видов и способов обращении к ним;

— способы передачи параметров в подпрограмму;

— правила записи программ, использующих подпрограммы различных видов;

— порядок выполнения программ, использующих подпрограммы.

2. Разработать алгоритм решения в соответствии с заданием.

3. Составить программу решения задачи с использованием

А) подпрограммы-функции

Б) подпрограммы-процедуры.

4. Подготовить тестовый вариант программы и исходных данных.

Теоретические сведения

Подпрограмма – это логически завершенный компонент про-

граммы. Подпрограмма представляет собой некоторую функцию об-

работки информации, которая отображает конкретный набор аргу-

ментов в некоторый набор результатов. Определение подпрограммы

состоит из двух частей: спецификации и реализации.

Спецификация (прототип) подпрограммы включает:

тип подпрограммы: function (функция), procedure (процедура).

function – подпрограмма явно возвращает только один результи-

рующий объект данных; procedure – подпрограмма возвращает бо-

лее одного значения или действия подпрограммы сводятся только к

модификации ее аргументов вместо возвращения результата;

имя подпрограммы;

формальные параметры: аргументы (порядок следования, тип

каждого аргумента) и результаты (порядок следования, тип каждого

результата).

Реализация подпрограммы (тело подпрограммы) включает:

описание локальных данных, используемых подпрограммой;

операторы, задающие действия, которые должна выполнить

подпрограмма.

Локальные данные и операторы инкапсулированы (спрятаны), так

что ни локальные данные, ни операторы по отдельности не доступны

пользователю подпрограммы. Пользователь может только вызвать

подпрограмму. В тело подпрограмм могут входить определения дру-

гих (вложенных) подпрограмм.

Вызывающая программа – программа (подпрограмма), которая

обращается к подпрограмме (вызывает подпрограмму).

Оператор вызова – оператор вызывающей программы, с помо-

щью которого она обращается к подпрограмме. Оператор вызова

подпрограммы содержит:

имя подпрограммы;

список фактических параметров.

Фактические параметры – это элементы вызывающей программы

(константы, переменные, массивы и др.), значения которых переда-

ются в подпрограмму или возвращаются из нее. При вызове подпро-

граммы значения фактических параметров присваиваются соответст-

вующим формальным параметрам (типы фактических и формаль-

ных параметров должны совпадать!).

Вызываемая программа – подпрограмма, к которой обращает-

ся вызывающая программа. Вызываемая программа возвращает уп-

равление вызывающей программе, которая продолжает свое выпол-

нение с оператора, следующего за оператором вызова.

Обмен информацией между вызывающей и вызываемой програм-

мами может осуществляться с использованием глобальных данных

или передачей параметров.

Глобальные данные

Глобальные данные – это данные (константы, переменные, мас-

сивы и др.), объявленные в начале программы и доступные в подпро-

граммах и «главной программе» (основном блоке программы).

Глобальные данные следует использовать только для передачи

информации от одной программы (подпрограммы) к другой. Напри-

мер, одна подпрограмма формирует значения данных, а другая под-

программа использует эти значения

Способы передачи параметров

Когда вызывающая программа обращается к подпрограмме, тре-

буется связать фактические параметры вызывающей программы с

формальными параметрами подпрограммы. Чаще всего применяются

два подхода: либо фактический параметр вычисляется, и полученное

значение передается формальному параметру (передача значением);

либо формальному параметру становится доступен адрес значения

фактического параметра (передача по ссылке).

Передача значением

В этом случае формальный параметр a обрабатывается в под-

программе как локальная переменная, инициализируемая в начале

выполнения подпрограммы значением соответствующего фактиче-

ского параметра x.

В операторе вызова фактическим параметром может быть:

константа;

переменная;

выражение;

функция.

Значение фактического параметра при изменении соответст-

вующего ему формального параметра не изменяется.

Передача по ссылке

В этом случае формальный параметр (описание параметра начинается со слова var) обрабатывается в подпрограмме как переменная, адрес которой есть адрес соответствующего фактического параметра .

В операторе вызова фактическим параметром может быть только переменная.

Любое изменение формального параметра есть изменение со-

ответствующего ему фактического параметра .

Функции

Формат спецификации функции:

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

Для возвращения результата функция должна содержать хотя бы

один оператор присваивания следующего вида:

<имя подпрограммы> := <результат>;

где результат – это вычисленное значение в подпрограмме (констан-

та, переменная, элемент массива и другие элементы данных).

Вызов функции включается в оператор языка Pascal.

Пример вызова функции P(x):

y:= P(x); {вызов P(x) в операторе присваивания}

if P(x)>0 then {вызов P(x) в операторах if и writeln }

writeln(P(x));

В качестве примера рассмотрим описание и использование функ-

ции power, которая возводит переменную base в степень exponent –

function power( base, exponent: real): real;

begin

power:= exp( exponent ∗ ln(base));

{exp, ln – встроенные функции Pascal:

exp (x) – ex , ln (x) – натуральный логарифм x }

end;

Вызов функции power может быть, например, таким: writeln

(power(3, 5));

Процедуры

Формат спецификации процедуры:

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

Входные параметры (аргументы) процедуры передаются значени-

ем или по адресу, а выходные параметры (результаты) – по адресу.

Вызов процедуры – это отдельный оператор, который содержит

имя процедуры и список фактических параметров. Например:

P(x); {это вызов процедуры P(x) }

В качестве примера использования процедуры рассмотрим описа-

ние и использование той же самой подпрограммы power. В этом

случае, наряду с аргументами base и exponent, которые передаются

по значению, необходимо добавить в спецификацию процедуры вы-

ходной параметр (результат), который должен быть передан по ссыл-

ке (в примере это pow).

procedure power( base, exponent: real; var pow: real);

begin

pow:= exp( exponent ∗ ln(base));

end;

Пример вызова процедуры power:

power(3, 4, j);

writeln(j);

Передача массивов в качестве параметров

В качестве примера будем использовать подпрограмму вычисле-

ния суммы значений элементов одномерного массива.

. Формальные параметры как массивы с фиксированными размерами

В данном примере для описания типов параметров используется

заранее определенный тип massiv с фиксированной размерностью.

uses crt;

const

N=3;

type

massiv = array[1..N] of integer;

function sum_1( x: massiv ): integer;

var

i : integer;

sum: integer;

begin

sum:= 0;

for i:= 1 to N do

sum:= sum+x[i];

sum_1:= sum;

end;

var {main – главная программа }

i:integer;

a:massiv;

begin

clrscr;

writeln('massiv a');

for i:=1 to N do

readln(a[i]);

writeln('summa= ', sum_1(a));

end.

Формальные параметры как массивы

со «свободными» размерами

Существует несколько возможностей передавать массивы в под-

программу, не указывая их размеры. В языке Pascal для этого можно

использовать функции low, high и sizeof. Использование функций

low, high и sizeof требует подключения модуля crt.

Функции low и high возвращают соответственно наименьшее и

наибольшее значение индекса массива.

Функция sizeof возвращает размер объекта данных в байтах.

Обратите внимание, что в данных примерах описание размеров

фактического массива a начинается с 0.

Передача подпрограммы как параметра

Если необходимо передать в качестве фактического параметра

имя подпрограммы, то соответствующий ему формальный параметр

должен иметь процедурный тип, соответствующий прототипу под-

программы.

В качестве примера рассмотрим программу, которая строит таб-

лицу сумм и произведений целых чисел. Для построения таблицы

используется процедура PrintTable, которая для вычисления значе-

ния таблицы вызывает функцию add (вычисление суммы) или функ-

цию Multiply (вычисление произведения). Имя вызываемой функции

процедура получает как параметр Operation.

В программе описание процедурного типа имеет вид

type

Func = function (x,y;integer):integer;

Спецификация подпрограммы, имя которой используется в каче-

стве параметра, должна содержать ключевое слово far («дальний вы-

зов»). Это указание необходимо компилятору для правильной гене-

рации исполняемой программы.

Рекурсивные подпрограммы

Слово рекурсия происходит от латинского слова «recursio» – воз-

вращение.

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

щается сама к себе непосредственно или через цепочку вызовов дру-

гих подпрограмм.

Задание

Таблица 6.1

Вариант

Условия задачи

Примечания

1

Вычислить наибольшие корни квадратных уравнений

Все корни дейст­вительные вычислять в подпрограмме

2

Подсчитать число точек, находящихся внутри круга радиусом г с центром в начале координат; координаты заданы массивами Х(100), Y(100)

Расстояние до точки от начала координат вычислять в подпрограмме

3

Определить периметры треугольников, заданных координатами их вершин

ХА (3), ХВ (3), ХС (3)

YA (3), YB (3), YC (3)

Длину стороны треугольников вы­числять в подпро­грамме

4

Вычислить , где v1, v2, v3 – объемы шаров с радиусами r1, r2, r3 соответственно

vi вычислять в подпрограмме

5

Вычислить суммы положительных элементов массивов X (N), Y (M), Z (K)

6

Вычислить среднее арифметическое положительных элементов для массивов A (N1), B (N2), C (N3)

7

Подсчитать количество отрицательных элементов матриц X (10, 15) и Y (20, 12)

Количество отрицательных элементов матрицы вычислять в подпрограмме

8

Вычислить суммы положительных элементов каждой строки для матриц A (5, 4) и B (3, 6)

Сумму положительных элементов строки матрицы вычислять в подпрограмме

9

Вычислить , где xm1 и xm2 - наименьшие элементы массивов X1 (70), X2 (80)

Наименьший элемент одномерного массива вычислять в подпрограмме

10

Вычислить , где s1 и k1 сумма и количество положительных элементов массива Х(N); s2 и k2 сумма и количество положительных элементов массива Y (M)

Сумму и количество положительных элементов массива- в подпрограмме

11

Вычислить , где s1 и k1 сумма и количество отрицательных элементов массива Х(100); s2 и k2 сумма и количество отрицательных элементов массива Y (80)

Вычислять в одной подпрограмме s и k

12

Вычислить и запомнить суммы положительных элементов каждой строки матрицы А (10, 20), В (15, 10)

Сумму положительных элементов строки -в подпрограмме

13

Вычислить , где x1 и x2 – корни уравнения , y1 и y2 -

В подпрограмме-все действительные корни

14

Найти наибольшие элементы и их порядковые номера массивов Х (N) и Y (М)

Наибольший элемент массива и его порядковый номер вычислять в подпрограмме

15

Переписать положительные элементы массива Х(100) и Y (80) в массив Z подряд

Запись в массив Z осуществлять в подпрограмме

16

Найти наименьшие элементы и номера строк и столбцов, в которых они расположены, для матриц А (10, 15) и В (15, 12)

Наименьшие элементы и номера строк и столбцов- в подпрограмме

17

Вывести на печать элементы целочисленных матриц N (5, 8) и М (10, 6), кратные трем

Кратность трем определять в подпрограмме

18

Вычислить ,

где xi и yi заданы массивами

Все суммы вычислять с использованием подпрограммы

19

Вычислить , где xmax – максимальный элемент массива Х (50); ymin – минимальный элемент массива Y (40)

xmax и ymin вычислять в подпрограмме

2. Проверить правильность выполнения программы с помощью тестового варианта исходных данных.

3. Составить блок-схему алгоритма задачи с любым вариантом подпрограммы.

Контрольные вопросы

1. Указать, при каких условиях целесообразно использование подпрограмм, какие выгоды они предоставляют пользователю.

2. Указать, в чем отличие различных видов подпрограмм пользователя.

3. Указать способы обращения к подпрограммам пользователя.

4. Указать способы передачи параметров в подпрограмму.

5. Указать, как организовать подпрограмму без параметров.

6. Перечислить, как согласуются формальные и фактические параметры.

7. Указать конструкции, которые могут быть формальными и фактическими параметрами.