Страницы

Уроки 29, 30 Процедуры в Паскале

Подпрограмма

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


Конструирование алгоритма «сверху вниз»


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

Вспомогательный алгоритм (подпрограмма)  должен:
- иметь имя, по которому его можно вызвать из других алгоритмов;
- возвращать управление тому алгоритму, из которого он был вызван. После того как завершится выполнение вспомогательного алгоритма, вызвавший его алгоритм должен продолжить работу с той точки, в которой он был прерван;
- иметь возможность вызывать другие алгоритмы;
- иметь достаточно малые размеры.


В языке Паскаль существует два вида подпрограмм:  Процедуры и функции в Паскале объявляются в разделе описания за разделом переменных: 
процедура (PROCEDURE ) и функция ( FUNCTION ). 
Параметры, записываемые в обращении к подпрограммам, называются фактическими; параметры, указанные в описании подпрограмм - формальными. Фактические параметры должны соответствовать формальным по количеству, порядку следования и типу. Параметры, объявленные в основной (главной) программе, действуют в любой подпрограмме и называются глобальными. Параметры, объявленные в подпрограмме, действуют только в этой подпрограмме и называются локальными.



Процедуры 

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

Формат описания процедуры имеет вид:

procedure имя процедуры (формальные параметры);
раздел описаний процедуры
begin
исполняемая часть процедуры
end;

Например: 

procedure korni (f: real; b,c:integer; var x1, x2:real; var k:integer);

Формальные параметры отделяются точкой запятой (однотипные параметры пишутся через запятую). 

Вызов процедуры:
Обращение к процедуре осуществляется по имени процедуры, за которым могут быть указаны фактические параметры. 
имя процедуры (фактические параметры);

Фактические параметры отделяются друг от друга запятой.

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

Например: 
korni (i,c,d,x,y,n);


Задача 1. Написать процедуру, которая печатает строку из N звездочек и переводит курсор на новую строку.

procedure pr (n:integer);
var i : integer ;
begin
for i :=1 to n do write ('*'); writeln;
end;



Задача 2. Составьте программу, получения изображения в котором в первой строке 1 звездочка, во второй - 2, в третьей -3, ..., в строке с номером m - m звездочек.

program z2;

var m, i,k :integer;



procedure pr (n:integer);
var i : integer ;
begin
for i :=1 to n do write ('*'); writeln;
end;

begin
readln(m);
for i:=1 to m do
pr(i);
end.

       Тесты         Посмотреть решение       


Экспериментальная часть


1.         Измените программу, чтобы в первой строке было m звездочек, во второй на 1 меньше и т.д..

2. Измените программу, чтобы в первой строке выводилась 1, во второй - две двойки, в третьей - три тройки и т.д.


Задача 3.  Даны 3 различных массива целых чисел (размер каждого не превышает 15). В каждом массиве найти сумму элементов и среднее арифметическое значение элементов.

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


program z2;

type mas=array[1..15] of integer;

var i,n,s :integer; sr:real;

a:mas;

procedure zap(var n:integer; var a:mas);
var i:integer;
begin
readln(n); randomize;
for i:=1 to n do
a[i]:=random(100)-50;
end;

procedure sum (n:integer; a:mas; var s:integer; var sr:real);
var i : integer ;
begin
s:=0;
for i :=1 to n do
s:=s+a[i];
sr:= s/n;
end;

begin
for i:=1 to 3 do
begin
zap(n,a); sum(n,a,s,sr); writeln(s,' ',sr:6:2);
end;
end.

       Тесты         Посмотреть решение       

В основной программе трижды вызываются процедуры zap и sum. 


Экспериментальная часть


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

2. Изменить программу, чтобы сортировались элементы пяти массивов.

Задача 4. В языке программирования Паскаль нет функции возведения в степень. Написать процедуру для нахождения степени числа и вычислить значение выражения: 
х5 + х4 8.


program z4;

var x,s,sum:real; n:integer;



procedure st(x:real; n:integer; var s:real);
var i:integer;
begin
s:=1;
for i:=1 to n do
s:=s*x;
end;

begin
readln(x);
st(x,5,s); sum:=s;
st(x,4,s); sum:=sum+s;
st(x,8,s); sum:=sum+s;
writeln(sum:15:2);
end.

       Тесты         Посмотреть решение       


Экспериментальная часть


1. Внесите изменение в программу для вычисления   хk + хm n.
2. Вычислите х1 + х2 3+…+xn.

Задания для самостоятельного решения

1. Описать процедуру PS(a, PS), вычисляющую по стороне a равностороннего треугольника его периметр P = 3·a и площадь S = a2·sqrt(3)/4 (a — входной, P и S — выходные параметры; все параметры являются вещественными). С помощью этой процедуры найти периметры и площади трех равносторонних треугольников с данными сторонами.

2. 
Описать процедуру Sum(K, CS), находящую количество C цифр целого положительного числа K, а также их сумму S (K — входной, C и S — выходные параметры целого типа). С помощью этой процедуры найти количество и сумму цифр для каждого из пяти данных целых чисел.

3. Описать процедуру Por(K), меняющую порядок следования цифр целого положительного числа K на обратный (K — параметр целого типа, являющийся одновременно входным и выходным). С помощью этой процедуры поменять порядок следования цифр на обратный для каждого из пяти данных целых чисел.