
- •Лабораторная работа 7 массивы Цель работы
- •Методические указания
- •Вывод элементов I-й строки матрицы
- •Лабораторная работа 8 строки и множества
- •Лабораторная работа 9 комбинированный тип данных (записи)
- •Лабораторная работа 10 подпрограммы с типизированными параметрами -значениями и параметрами-переменными Цель работы
- •Лабораторная работа 11 подпрограммы с параметрами процедурного типа
- •Лабораторная работа 12 параметры-константы, нетипизированные параметры подпрограмм, массивы и строки открытого типа
- •Библиографический список
- •Содержание
- •Редактор м.Е. Цветкова Корректор н.А. Орлова
- •390005, Рязань, Гагарина, 59/1.
Лабораторная работа 10 подпрограммы с типизированными параметрами -значениями и параметрами-переменными Цель работы
Изучение правил оформления подпрограмм и получение навыков создания процедур и функций, имеющих типизированные параметры-значения и параметры-переменные.
Методические указания
Идея использования подпрограмм для выполнения одинаковых действий по отношению к разным однотипным исходным данным реализована в языке Turbo Pascal с помощью процедур и функций. Так как подпрограмма является частью программы, то ее синтаксическая конструкция повторяет с некоторыми особенностями структуру программы в целом. Заголовок подпрограммы служит для задания ей собственного имени, используемого для обращения к ней, и ее формальных параметров. Список формальных параметров включает в себя параметры, с помощью которых в подпрограмму передаются исходные данные, и параметры, предназначенные для возвращения из подпрограммы в основную программу результатов выполнения подпрограммы. Имена формальных параметров служат своеобразными шаблонами, которые при обращении к подпрограмме заменяются конкретными объектами программы. Все необходимые действия в подпрограмме образуют ее тело, заключенное между ключевыми словами begin и end. Между заголовком подпрограммы и ее телом могут содержаться разделы описания необходимых исключительно для самой подпрограммы объектов: ее констант, типов, переменных и подпрограмм.
Заголовок процедуры имеет следующий вид:
procedure <Имя>(<Список формальных параметров>);
Процедура является обобщающим видом подпрограммы. С ее помощью можно выполнять различные действия, например ввод или вывод данных, их сортировку и т.п., а также возвращать в программу несколько результатов, например максимальный элемент массива и его индексы. Функция - это частный случай подпрограммы, которая содержит в своем имени результат (как, например, стандартная функция sin(x)). Функция может возвращать значения, относящиеся к любому порядковому или действительному типу, типу string (без указания длины), к любому указателю. Поэтому в заголовке функции обязательно указывают тип возвращаемого ею значения, а в теле функции должен присутствовать оператор присваивания возвращаемого значения имени функции. В общем случае заголовок функции имеет следующий вид:
function <Имя>(<Список формальных параметров>):<Тип результата>;
Программист может использовать обращение к функции, представляющее собой <Имя_функции>(<Список фактических параметров>), в составе выражений и в списке элементов оператора вывода. Для обращения к процедуре используют оператор вызова процедуры, имеющий следующий вид:
<Имя_процедуры>(<Список фактических параметров>);.
При замене формальных параметров на фактические в обращении к подпрограмме следует соблюдать соответствие в числе, типе и порядке следования параметров.
Для организации правильного взаимодействия с основной программой подпрограмма использует формальные параметры разных видов. Так для передачи исходных данных в подпрограмму применяют параметры-значения, которые могут быть любого типа, кроме файлового. При обращении к подпрограмме происходит замена формального параметра его конкретным значением, которое передается в подпрограмму в виде копии через стек. Стек представляет собой особым образом организованный сегмент памяти компьютера (сегмент стека, размер которого можно изменять директивой). Данные, помещенные в стек, выбираются из него по правилу: последним вошел, первым вышел. Возвращаются результаты выполнения подпрограммы с помощью параметров-переменных, которые описываются в ее заголовке с использованием служебного слова var и могут быть любого типа. При обращении к подпрограмме происходит передача в нее адреса конкретной переменной. Поэтому такой вид передачи часто называют передачей по ссылке. Рассмотрим конкретные примеры реализации и использования подпрограмм.
Пример 1. Написать подпрограмму, подсчитывающую количество заданных символов в строке.
Так как результатом выполнения подпрограммы становится целое число, то реализуем необходимые действия с помощью функции. В качестве формальных параметров должны выступать параметры-значения, определяющие количество каких символов и в какой строке следует подсчитать.
function Kol_Sym(sym:char; st:string):byte; {Заголовок функции}
var {Локальные параметры подпрограммы}
i: byte; {Номер символа в строке}
kol: byte; {Количество символов sym в строке st}
begin
kol:= 0;
for i := 1 to length(st) do
if st[i] = sym then kol := kol + 1;
Kol_Sym := kol {Имени функции присваивается результат}
end;
Пример 2. С помощью подпрограмм отсортировать по нарастанию и вывести на экран вектор целочисленных данных из диапазона от 0 до 100. Данные и их количество выбрать произвольно.
Так как результатом выполнения подпрограммы сортировки будет вектор, то оформляем ее в виде процедуры, в которой результат будет возвращаться в формальном параметре-переменной. Этот же параметр будем использовать для передачи исходного вектора в процедуру. Такого же вида подпрограмму применим для организации вывода как исходного, так и отсортированного вектора на экран. Алгоритм решения задачи представлен выше. Сортировка элементов вектора v осуществлена по методу линейного выбора с обменом. В соответствии с приведенным алгоритмом составим программу.
Процедура
Vivod
Процедура Sort i:= 1 (1) n-1 j:= i+1 (1) n v[i]<v[j] ДА buf := v[i]; v[i] := v[j]
v[j] := buf
program Sort_i_Vivod;
const n = 10; {Глобальные объекты программы}
type tip = array [1..n] of byte;
var i : byte;
v : tip;
procedure Vivod(u : tip); {u - формальный параметр-значение}
var i : byte; {Локальная переменная процедуры}
begin
for i := 1 to n do
write(u[i]:4);
writeln
end; {Vivod}
procedure Sort(var s : tip); {s - формальный параметр-переменная}
var
i, j, buf : byte;
begin
for i := 1 to n-1 do
for j := i+1 to n do
if s[i] < s[j] then
begin buf := s[i]; s[i] := s[j]; s[j] := buf end
end; {Sort}
begin {Основная программа}
for i := 1 to n do
v[i] := random(100);
writeln(‘Исходный вектор:’);
Vivod(v); {Вывод исходного вектора на экран}
Sort(v); {Сортировка вектора}
writeln(‘Отсортированный вектор:’);
Vivod(v)
end.
Пример 3. С помощью одной подпрограммы найти сумму элементов с четными номерами массива a и сумму элементов с нечетными номерами массива b, содержащих по na и nb целых чисел соответственно.
Так как результатом означенных действий в обоих случаях будет число, оформим их в виде подпрограммы-функции. Параметрами функции должны быть массив mas, его размер nn и параметр p, задающий четность или нечетность номеров суммируемых элементов. Разрабатываем алгоритм и программу, использующую такую подпрограмму.
Ввод (n, na, nb) Функция Sum
i
:= 1 (1) na
Входные параметры:
mas,
nn,
p
Ввод
(a[i]) s := 0
i := 1 (1) na k := 1 (1) nn
Ввод (b[i]) (p=1) И (k-нечет)
Вывод (Sum(a, na,1)) ДА
Вывод
(Sum(b,nb,2)) s := s +
mas[k]
(p=2) И (k-четн)
ДА
s := s + mas[k]
Sum := s
Program Summa_Elementov;
const n = 10; {Размеры массивов a и b не превышают n}
type vector = array[1..n] of byte;
var na, nb, i : byte;
a, b : vector;
function Sum(mas : vector; nn : byte; p : byte) : word;
var s : word;
k : byte;
begin s := 0;
for k := 1 to nn do begin
if (p = 1) and odd(k) then s := s + mas[k];
if (p = 2) and not odd(k) then s := s + mas[k];
end;
Sum := s
end; { Sum }
begin
writeln(‘Введите размер массива a’);
readln(na);
writeln(‘Введите через пробел элементы массива a’);
for i := 1 to na do read(a[i]);
writeln(‘Введите размер массива b’);
readln(nb);
writeln(‘Введите через пробел элементы массива b’);
for i := 1 to nb do read(b[i]);
writeln(‘Сумма элементов вектора a с нечет. номерами = ‘, Sum(a,na,1));
writeln(‘Сумма элементов вектора b с четн. номерами = ‘, Sum(b,nb,2));
end.
Контрольные вопросы
С какой целью используют подпрограммы?
Что такое формальный параметр подпрограммы?
Чем отличается параметр-значение от параметра-переменной?
Когда для описания действий используют подпрограмму-функцию, а когда - процедуру?
Где могут быть использованы локальные переменные?
Почему нежелательно использовать глобальные переменные для реализации действий в подпрограмме?
Как оформляются заголовки подпрограмм?
Каковы правила обращения к подпрограмме?
Может ли функция иметь параметр-переменную?
Чем отличаются структуры программы и подпрограммы?
Варианты задания
С помощью подпрограммы, подсчитывающей число символов c в строке St, определить количество символов ‘о’ и ‘и ’ в предложении.
С помощью подпрограммы, находящей максимальный элемент в векторе, определить максимальные элементы в векторах из 8 и 10 компонентов.
С помощью подпрограммы сортировки отсортировать по нарастанию два вектора из 10 и 12 целых чисел.
С помощью подпрограммы подсчитать сумму элементов главной диагонали для матриц 4х4 и 5х5 из вещественных чисел.
С помощью подпрограмм сложения и умножения комплексных чисел вычислить: z=z1 + z2*z3.
С помощью подпрограммы вычисления расстояния между двумя точками найти расстояния между тремя точками на плоскости.
С
1
2
1 2 3
1 2 3 4
1 2 3 4 5
1 2 3 4
1 2 3
2
1
помощью подпрограммы вычислить скалярное произведение двух пар векторов из3 и 4 компонентов.С помощью подпрограммы вывода
элементов вектора получить на экране
С помощью подпрограмм ввода и вывода вектора
*
* *
* *
* *
*
С помощью подпрограммы, строящей на экране
ромб из символов, построить два ромба из разных знаков
С помощью подпрограммы, определяющей сумму
n
членов ряда, вычислить с погрешностью
0.001 exp(x)
=
.
С помощью подпрограммы, находящей максимальный элемент в векторе, найти вектор максимальных элементов строк матрицы 5х5.
С помощью подпрограммы транспонировать матрицы 4х5 и 5х5.
С помощью подпрограммы нахождения корня по методу Ньютона определить корни уравнения exp(x) - xxx = 0 с погрешностью 0.001 на отрезках [1, 2] и [4, 5].
С помощью подпрограммы вычисления интеграла из n прямоугольников вычислить с погрешностью 0.001
.
С помощью подпрограмм ввода и вывода записи заполнить массив из трех записей с полями: Ф.И.О., год рождения, должность и вывести его на экран.
С помощью подпрограммы, определяющей принадлежность символа к заданному множеству, установить количество гласных букв в предложении.
С помощью подпрограммы вычисления корня квадратного из заданного числа по методу Ньютона найти с погрешностью 0.001 корень из 13 и 23.
С помощью подпрограммы определения количества слов в заданной строке установить число слов в двух разных предложениях.
С помощью подпрограммы подсчитать количество кратных 7 чисел на отрезке [11, 81] и кратных 13 чисел на отрезке [100, 200].
С помощью подпрограммы преобразовать десятичные числа 121 и 17
в двоичные.
С помощью подпрограммы преобразовать двоичные числа 111100101 и 1011 в десятичные.
С помощью подпрограммы установить количество цифр в числах 549 и 675412.
С помощью подпрограммы, определяющей, является ли число простым, установить принадлежность чисел 29 и 121 к простым числам.
С помощью подпрограммы вывести состав чисел 1407 и 123, начиная со старшего разряда .