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

Процедуры и функции в паскале

Что такое подпрограмма?

Процедуры и функции аналогичны программам в миниатюре и имеют общее название - подпрограммы.

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

Зачем нужны подпрограммы?

Применение подпрограмм дает возможность уменьшать число повторений одной и той же последовательности операторов, а также конструировать программу как набор отдельных подпрограмм. Это позволяет получить более логичный процесс программирования.

Где располагаются подпрограммы в программе?

В программе описание процедур и функций должно располагаться между разделами переменных и операторов.

Как работает компьютер по программе, имеющую подпрограммы?

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

Как оформляется подпрограмма?

Подпрограмма оформляется подобно основной программе, т.е. состоит из заголовка, раздела описаний, раздела операторов.

Различие глобальных и локальных переменных?

Все имена, представленные в разделе описаний основной программы, называются глобальными. Они действуют как во всей основной программе, так и в любой подпрограмме. Имена, представленные в разделе описаний подпрограммы, называют локальными. Они действуют только в рамках подпрограммы и недоступны операторам основной программы.

Два вида подпрограмм в Паскале?

В языке Паскаль имеется два вида подпрограмм:

процедура (PROCEDURE), функция (FUNCTION)

Чем процедура похожа на функцию?

И процедура и функция – отдельные программные блоки.

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

В процедуру или функцию можно передавать фактические параметры (числа, слова и т.п.) для их работы (если они нужны)

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

Чем процедура отличается от функции?

После выполнения процедура не возвращает никакого результата в основную программу. Она не может быть вставлена внутрь арифметического выражения. Самый простой пример процедуры – СходитьВМузей(). Назад домой вы ничего не принесли .

Функция после выполнения возвращает результат (единственное значение!) в основную программу. Поэтому функцию можно использовать в арифметических выражениях. Самый простой пример функции – КупитьХлеб(деньги). Домой принесли хлеб.

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

Оформление процедуры.

PROCEDURE имя (формальные параметры);

раздел описаний

BEGIN

раздел операторов

END;

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

имя (фактические параметры);

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

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

Как это делается:

Допустим, фактические параметры – это числа, с которыми должна работать процедура или функция. При вызове процедуры (функции) эти числа указываются в скобках. Тем самым они передаются телу функции для обработки. Однако процедура напрямую не работает с этими числами (или переменными, содержащими числа – можно их и так передать в функцию). Процедура присваивает их (значения переменных или числа) своим формальным параметрам – внутренним (локальным) переменным. Функция (процедура) начинает работать со своими локальными переменными.

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

Ещё раз о параметрах процедуры

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

Пример. Допустим, вызывается процедура нахождения площади прямоугольника: PLOSH(A,B,S) или PLOSH(3,2.5,S). Переменные А и В содержат значения сторон, которые передаются в процедуру для решения. После решения ответ передается в переменную S. Эту S можно использовать в основной программе, так как она объявлена как глобальная переменная. Это был вызов процедуры.

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

PROCEDURE PLOSH(dlina, shirina:integer; VAR otvet: integer);

Переменные dlina, shirina, otvet – формальные переменные (внутренние переменные процедуры). Им в соответствие ставятся фактические переменные А, В, S при вызове процедуры. Далее при вызове происходит следующее: значение переменной А присваивается переменной dlina, значение переменной В присваивается переменной shirina, а после всех вычислений значение переменной otvet присваивается переменной S. Таким образом результат из процедуры выходит «наружу», в основную программу.

Параметры процедуры делятся на отдельные виды, но в простых програм­мах чаще всего используются параметры-значения (у нас А, В) и параметры-переменные (у нас S). В формальных параметрах процедуры перед параметрами-переменными ста­вится слово VAR. Данные этих параметров передаются в обоих направлениях: из программы в процедуру и, наоборот, из процедуры в программу. В случае переопределения этих данных в процедуре, они все равно доступны програм­ме. Если в процедуре перед формальными параметрами не стоит слово VAR, то такие параметры называются параметрами-значениями. Их можно пере­давать только в одном направлении: из программы в процедуру. Эти пара­метры не могут быть результатом выполнения процедуры. Таким образом, параметры-значения могут быть только входными для процедуры, а парамет­ры-переменные как входными, так и выходными.

Пусть имеется процедура:

Procedure summa(a:integer; var b:integer);

Begin

A:=A+3;

B:=B+3

End;

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

A:=5; B:=5;

SUMMA(A,B);

WRITE(A,B);

Здесь значения А = 5 и В = 5 передаются в процедуру, где вычисляются новые значения А=5+3=8 и В=5+3=8. Новое значение В передается в программу, а значение А – нет. Поэтому в основной программе будем иметь А=5, В=8.

Примеры программ с процедурами.

Пример 1. Вычислить:

Степень находить так: XN = X  X  X ... X

program pr1;

var d,z,m,,a,b,c:integer;

y,y1,y2,y3: real;

procedure step(x,n:integer; var w:real); {здесь после var объявляются переменные для ответов}

var i:integer;

begin

w:=1;

for i:=1 to n do

w:=w*x;

end;

begin

read (d,a,z,b,m,c); {исходные данные}

{начинаем вызывать процедуры}

step (d,a,y1); {вычисляется степень первого числа, результат – в y1}

step (z,b,y2);

step (m,c,y3);

y:=(y1+y2)/y3; {ответ}

writeln ('y=',y);

end.

Пример 2. Среди трехзначных чисел найти такие, в которых сумма факториалов цифр равнялась бы самому числу. (факториал числа – это последовательное произведение чисел, начиная с 1 и до этого числа: 4! = 1*2*3*4)

program pr2;

var a,b,c,i,s1,s2,s3:integer;

procedure faktor(x:integer; var s:integer);

var i:integer;

begin

s:=1;

for i:=1 to x do

s:=s*i;

end;

begin

for i:=100 to 999 do

begin

a:=i div 100; {получаем цифру сотней}

b:=(i-a*100) div 10; {получаем цифру десятков}

c:=i - a*100 - b*10; {получаем цифру единиц}

faktor (a,s1); {посылаем цифру сотней, получаем ее факториал в s1}

faktor (b,s2); {аналогично}

faktor (c,s3); {аналогично}

if s1+s2+s3=i then writeln (i);

end;

end.

Оформление функций.

Функция, как и процедура, может содержать несколько операторов, несколько входных параметров, но результат ее выполнения только один. Этот единственный результат обозначается именем функции и передается в основную программу. Если нам нужно возвратить больше одного результата, то придется иметь дело с процедурой.

В общем виде функция записывается так:

FUNCTION ИМЯ(список формальных параметров: тип): тип;

раздел описаний

BEGIN

раздел операторов;

END;

Вызывается функция по ее имени с указанием фактических параметров. При этом вызов функции можно делать непосредственно внутри выражения, подобно тому, как используются стандартные встроенные функции, например SIN(X).

Примеры программ с функциями:

Тот же самый пример , но с использованием функции:

program pr1;

var d,z,m,a,b,c:integer;

y: real;

function step(x,n:integer):real;

var i,w:integer;

begin

w:=1;

for i:=1 to n do

w:=w*x;

step:=w;

end;

begin

read (d,a,z,b,m,c);

y:=(step (d,a)+step (z,b))/step (m,c); {вызов функции из ариф. выражения}

writeln ('y=',y);

end.

Пример.

Даны действительные числа S и T. Получить: F(T,-2*S,1.17) + F(2.2,T,S-T),

где

program pr3;

var y,t,s:real;

function form(a,b,c:real):real;

begin

form:=(2*a-sin(c))/(5+abs(c));

end;

begin

read (t,s);

y:=form(t,-2*s,1.17)+form(2.2,t,s-t);

writeln (y:8:2);

end.

Пример 4. Даны действительные числа a,b,c. Получить:

program pr4;

var a,b,c,z:real;

function max(x,y:real):real;

var m:real;

begin

if x>y then m:=x else m:=y;

end;

begin

read (a,b,c);

z:=(max(a,a+b)+max(a,b+c))/(1+max(a+b*c,1.5));

writeln (z:8:2);

end.

Ещё различие процедур и функций.

Функции являются частным случаем процедур и принципиально отличаются от них тем, что:

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

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

ЗАДАНИЯ на использование процедур:

Задача 1.

Даны координаты вершин треугольника и точки внутри него. Найти расстояние от данной точки до ближайшей стороны треугольника.

Алгоритм:

1. Нахождение длин сторон (OB, OC,OA,BA,CA,BC). (Процедура dlin)

2. Нахождение площади трех треугольников S1(ABO), S2 (OBC), S3 (OCA). (Процедура pl)

3. Нахождение высот треугольников. (Процедура vis)

4. Сравнение высот (нахождение до ближайшей стороны). (Процедура min)

Проверить результаты выполнения программы по таблице:

п/п

X

Y

X1

Y1

X2

Y2

X3

Y3

Ответ

1.

21

7

10

11

20

3

30

16

1.65

2.

187

93

162

102

213

76

296

157

3.34

3.

200

100

10

170

160

10

300

190

23.68


З адача 2.

Дана окружность радиусом R. Внутри этой окружности находится еще 3 непересекающихся друг с другом окружности радиусов R1, R2, R3. Написать программу, вычисляющую площадь заштрихованной поверхности:

Задача 3

Напишите программу с использованием процедуры calendar()(ее нужно создать). Программа будет запрашивать номер дня недели для первого числа и выводить календарь на месяц из расчета 31 день примерно так:

Введите номер дня недели для первого числа: 4

Пн Вт Ср Чт Пт Сб Вс

1 2 3 4

5 6 7 8 9 10 11

  1. 13 14 15 16 17 18

  1. 20 21 22 23 24 25

26 27 28 29 30 31

Еще (y/n)? _

ЗАДАНИЯ на использование функций

Задача 1.

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

Задача 2.

Вычислить:

Где

Проверить результаты выполнения программы по таблице:

п/п

A

B

Ответ

1.

2.3

21.3

45.46

2.

-0.6

31.2

1033.02

3.

0.15

-2.1

-0.13

Задача 3

Написать функцию, которая возводит некоторое число х в степень n.

Задача 4

Расстояние (функция Distance()) до точки падения тела, брошенного под углом «альфа» к горизонту с начальной скоростью V0 м/с вычисляется по формуле:

, где g – ускорение свободного падения и = 9,8 м/с2

Напишите программу, реализующую игру, в которой пользователь сначала вводит расстояние до цели, затем вводится угол и скорость броска тела. Если тело падает рядом с целью в пределах одной десятой процента всего расстояния до цели, то пользователь выигрывает игру. Если тело упало далеко от цели, то выводится расстояние – насколько далеко и дается еще одна попытка (при том же расстоянии до цели – опять его вводить не нужно). После пятой попытки игра считается проигранной. Угол вводится в градусах, затем переводится в радианы по формуле: Радианы = градусы * 3,14 / 180

Дополните программу, чтобы она сообщала – недолет или перелет.

Теоретический зачет по процедурам и функциям:

  1. Что такое подпрограмма?

  2. Зачем нужны подпрограммы?

  3. Где располагаются подпрограммы в программе?

  4. Как работает компьютер по программе, имеющую подпрограммы?

  5. Как оформляется подпрограмма?

  6. Различие глобальных и локальных переменных?

  7. Два вида подпрограмм в Паскале?

  8. Чем процедура похожа на функцию?

  9. Чем процедура отличается от функции?

  10. Оформление процедуры.

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

  12. Чем отличаются параметры-значения от параметров-переменных? Как они оформляются в вызовах?