Процедуры и функции
При решении сложных объемных задач часто целесообразно разбивать их на более простые. В этом случае говорят о подпрограммах. Использование подпрограмм позволяет сделать основную программу более наглядной, понятной, а в случае, когда одна и та же последовательность команд встречается в программе несколько раз, даже более короткой и эффективной.
В языке Паскаль существует два вида подпрограмм: процедуры и функции.
Процедуры и функции, используемые в программе, должны быть соответствующим образом описаны до первого их упоминания. Вызов процедуры или функции производится по их имени.
Подпрограммы в языке Паскаль могут иметь параметры (значения, передаваемые в процедуру или функцию в качестве аргументов). При описании указываются так называемые формальные параметры (имена, под которыми будут фигурировать передаваемые данные внутри подпрограммы) и их типы.
При вызове подпрограммы вместе с ее именем должны быть заданы все необходимые параметры в том порядке, в котором они находятся в описании. Значения, указываемые при вызове подпрограммы, называются фактическими параметрами.
Формат описания процедуры:
Procedure <Имя процедуры> (<Имя форм. параметра 1>:<Тип>;
< Имя форм. параметра 2>:<Тип>);
<Раздел описаний>
Begin
<Тело процедуры>
End;
Раздел описаний может иметь такие же подразделы, как и раздел описаний основной программы (описание процедур и функций – в том числе). Однако все описанные здесь объекты «видимы» лишь в этой процедуре. Они здесь локальны так же, как и имена формальных параметров. Объекты, описанные ранее в разделе описаний основной программы и не переопределенные в процедуре, называются глобальными для этой подпрограммы и доступны для
использования.
Легко заметить схожесть структуры программы целиком и любой из ее процедур. Действительно, ведь и процедура, и основная программа реализуют некий алгоритм, просто процедура не дает решения всей задачи. Отличие в заголовке и в знаке после End.
Формат описания функции:
Function <Имя функции> (<Имя форм. параметра 1>:<Тип>;
< Имя форм. параметра 2>:<Тип>) : <Тип результата>;
<Раздел описаний>
Begin
<Тело функции>
End;
В теле функции обязательно должна быть хотя бы команда присвоения такого вида: <Имя функции>:=<Выражение>;
Указанное выражение должно приводить к значению того же типа, что и тип результата функции, описанный выше.
Вызов процедуры представляет в программе самостоятельный оператор:
<Имя процедуры>(<Фактический параметр 1>, < Фактический параметр 2>);
Типы фактических параметров должны быть такими же, что и у соответствующих им формальных.
Вызов функции должен входить в выражение. При вычислении значения такого выражения функция будет вызвана, действия, находящиеся в ее теле, будут выполнены, в выражение будет подставлено значение результата
функции.
Отличие функции от процедуры:
1. Заголовок функции начинается со служебного слова Function и заканчивается указанием типа значения функции;
2. Раздел операторов функции должен содержать хотя бы один оператор присваивания имени функции;
3. Обращение к функции – не оператор, а выражение.
Приведем простейший пример использования подпрограммы.
Задача: «Найти максимальное из трех введенных чисел». Для решения воспользуемся описанием функции, принимающей значение максимального из двух чисел, которые передаются в нее в виде параметров.
Program Fn;
Uses Crt;
Var
A,B,C :Real; {глобальные переменные}
Function Max(x,y:Real):Real; {Описываем функцию Max с формальными параметрами x и y}
Begin
If x>y Then Max:=x Else Max:=y;
End;
Begin {начало основной программы}
Clrscr;
Writeln('Введите три числа');
Readln(A,B,C);
Writeln('Максимальным из всех является ', Max(Max(A,B),C));
End.
Обратите внимание на краткость тела основной программы и на прозрачность действий внутри функции. Формальным параметрам x и y при первом вызове передаются значения переменных А и В, а затем полученное и С.
Существует два способа передачи фактических параметров в подпрограмму: по значению и по ссылке. В первом случае значение фактического параметра при вызове подпрограммы присваивается локальной переменной, являющейся формальным параметром подпрограммы. Что бы потом ни происходило с локальной переменной, это никак не отразится на соответствующей глобальной. Для одних задач это благо, но иногда требуется произвести в подпрограмме действия над самими переменными, указанными в качестве фактических параметров. На помощь приходит второй способ. Происходит следующее: при обращении к подпрограмме не происходит формирования локальной переменной – формального параметра. Просто на время выполнения подпрограммы имя этой локальной переменной будет указывать на ту же область памяти, что и имя соответствующей глобальной переменной. Если в этом случае изменить локальную переменную, изменятся данные и в глобальной.
Передача параметров по ссылке отличается тем, что при описании подпрограммы перед именем переменной – формального параметра ставится служебное слово Var.
Еще один классический пример. Задача: «Расположить в порядке возрастания три целых числа».
Program Pr;
Uses Crt;
Var
S1,S2,S3 :Integer; {глобальные переменные}
Procedure Swap(Var A,B: Integer);
Var
C : Integer; {локальная переменная}
Begin
C:=A; A:=B; B:=C {меняем местами содержимое A и B}
End;
Begin {начало основной программы}
Clrscr;
Writeln('Введите три числа');
Readln(S1,S2,S3);
If S1>S2 Then Swap(S1,S2);
If S2>S3 Then Swap(S2,S3);
If S1>S2 Then Swap(S1,S2);
Writeln('Числа в порядке неубывания: ',S1,S2:4,S3:4)
End.
Контрольные вопросы
1. Приведите структуру программы на языке Паскаль.
2. Отличие константы от переменной в языке Паскаль.
3. Перечислите базовые типы данных в языке Паскаль.
4. Перечислите арифметические операции и стандартные функции над данными целого типа.
5. Перечислите арифметические операции и стандартные функции над данными вещественного типа.
6. Какие арифметические операции невозможны над данными вещественного типа.
7. Сколько памяти занимают данные целого, вещественного и символьного типа?
8. Какие значения принимают данные логического типа, и сколько места в памяти они занимают.
9. Привести таблицу истинности логических операций Not, And, Or.
10. Приведите формат оператора ввода. Приведите примеры оператора ввода.
11. Приведите формат оператора присваивания. Приведите примеры оператора присваивания.
12. Приведите формат оператора вывода. Приведите примеры оператора.
13. Для чего нужно указание формата числа в операторе вывода? Приведите примеры.
14. Приведите формат условного оператора. Приведите примеры.
15. Какие операторы цикла вы знаете?
16. Чем отличается цикл While от цикла Repeat?
17. Приведите формат оператора цикла While. Приведите пример оператора.
18. Приведите формат оператора цикла Repeat. Приведите пример оператора.
19. Приведите форматы оператора цикла For. Приведите пример оператора.
20. Чему равен шаг изменения параметра цикла (счетчика) в цикле For?
21. Что называется массивом?
22. Отличие одномерного массива от двумерного.
23. Как объявить одномерный массив?
24. Как объявить двумерный массив? Пример.
25. Приведите фрагмент ввода одномерного массива с клавиатуры.
26. Приведите фрагмент ввода двумерного массива с клавиатуры.
27. Приведите фрагмент формирования одномерного массива случайными числами и укажите, какой диапазон чисел будет использован.
28. Приведите фрагмент формирования двумерного массива случайными числами и укажите, какой диапазон чисел будет использован.
29. Приведите фрагмент вывода одномерного массива в строку.
30. Приведите фрагмент вывода двумерного массива в виде матрицы.
31. Какие виды подпрограмм вы знаете?
32. Когда используются подпрограммы?
33. Что должна иметь в своем составе любая подпрограмма?
34. Приведите формат процедуры.
35. Приведите формат функции.
36. Где объявляются локальные переменные, а где глобальные?
37. Что такое формальные и фактические параметры подпрограмм?
38. Что означает модификатор Var, стоящий перед формальным параметром?
39. Отличие процедуры от функции.
Дата добавления: 2015-08-08; просмотров: 1092;