Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
inf3.doc
Скачиваний:
15
Добавлен:
15.04.2015
Размер:
389.63 Кб
Скачать

Лабораторная работа 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.

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

  1. С какой целью используют подпрограммы?

  2. Что такое формальный параметр подпрограммы?

  3. Чем отличается параметр-значение от параметра-переменной?

  4. Когда для описания действий используют подпрограмму-функцию, а когда - процедуру?

  5. Где могут быть использованы локальные переменные?

  6. Почему нежелательно использовать глобальные переменные для реализации действий в подпрограмме?

  7. Как оформляются заголовки подпрограмм?

  8. Каковы правила обращения к подпрограмме?

  9. Может ли функция иметь параметр-переменную?

  10. Чем отличаются структуры программы и подпрограммы?

Варианты задания

  1. С помощью подпрограммы, подсчитывающей число символов c в строке St, определить количество символов ‘о’ и ‘и ’ в предложении.

  2. С помощью подпрограммы, находящей максимальный элемент в векторе, определить максимальные элементы в векторах из 8 и 10 компонентов.

  3. С помощью подпрограммы сортировки отсортировать по нарастанию два вектора из 10 и 12 целых чисел.

  4. С помощью подпрограммы подсчитать сумму элементов главной диагонали для матриц 4х4 и 5х5 из вещественных чисел.

  5. С помощью подпрограмм сложения и умножения комплексных чисел вычислить: z=z1 + z2*z3.

  6. С помощью подпрограммы вычисления расстояния между двумя точками найти расстояния между тремя точками на плоскости.

  7. С

    1

    1. 2

    1 2 3

    1 2 3 4

    1 2 3 4 5

    1 2 3 4

    1 2 3

    1. 2

    1

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

  8. С помощью подпрограммы вывода

элементов вектора получить на экране 

  1. С помощью подпрограмм ввода и вывода вектора

*

* *

* *

* *

*

ввести и вывести матрицу 4х4.

  1. С помощью подпрограммы, строящей на экране 

ромб из символов, построить два ромба из разных знаков

  1. С помощью подпрограммы, определяющей сумму

n членов ряда, вычислить с погрешностью 0.001 exp(x) = .

  1. С помощью подпрограммы, находящей максимальный элемент в векторе, найти вектор максимальных элементов строк матрицы 5х5.

  2. С помощью подпрограммы транспонировать матрицы 4х5 и 5х5.

  3. С помощью подпрограммы нахождения корня по методу Ньютона определить корни уравнения exp(x) - xxx = 0 с погрешностью 0.001 на отрезках [1, 2] и [4, 5].

  4. С помощью подпрограммы вычисления интеграла из n прямоугольников вычислить с погрешностью 0.001 .

  5. С помощью подпрограмм ввода и вывода записи заполнить массив из трех записей с полями: Ф.И.О., год рождения, должность и вывести его на экран.

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

  7. С помощью подпрограммы вычисления корня квадратного из заданного числа по методу Ньютона найти с погрешностью 0.001 корень из 13 и 23.

  8. С помощью подпрограммы определения количества слов в заданной строке установить число слов в двух разных предложениях.

  9. С помощью подпрограммы подсчитать количество кратных 7 чисел на отрезке [11, 81] и кратных 13 чисел на отрезке [100, 200].

  10. С помощью подпрограммы преобразовать десятичные числа 121 и 17

в двоичные.

  1. С помощью подпрограммы преобразовать двоичные числа 111100101 и 1011 в десятичные.

  2. С помощью подпрограммы установить количество цифр в числах 549 и 675412.

  3. С помощью подпрограммы, определяющей, является ли число простым, установить принадлежность чисел 29 и 121 к простым числам.

  4. С помощью подпрограммы вывести состав чисел 1407 и 123, начиная со старшего разряда .

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