- •Программирование на языке высокого уровня
- •1 Часть Учебное пособие Москва 2007
- •Оглавление
- •1. Основы алгоритмизации
- •1.1. Алгоритмизация и требования к алгоритму
- •1.2. Блок-схемы алгоритмов
- •1.2.1. Способы записи алгоритма
- •1.2.2. Блок-схемы
- •1.2.3. Следование, ветвление, цикл
- •1.3. Этапы разработки программы
- •1.3.1. Язык программирования. Программа
- •1.3.2. Этапы разработки
- •1.4. Ошибки
- •1.4.1. Компилятор. Синтаксис и семантика
- •1.4.2. Типы ошибок
- •2. Алфавит языка Турбо Паскаль. Программа
- •2.1. Идентификаторы
- •2.2. Разделители
- •2.3. Специальные символы
- •2.4. Структура Pascal-программы
- •Пример простейшей программы на языке Pascal
- •3. Типы данных
- •3.1. Структура типов данных
- •3.2. Простые типы
- •3.2.1. Порядковые типы
- •3.2.1.1 Целые типы.
- •3.2.1.1.1. Встроенные процедуры и функции, применимые к целым типам
- •3.2.1.2. Логический тип.
- •3.2.1.3. Символьный тип.
- •3.2.1.4. Перечисляемый тип.
- •3.2.2. Вещественные типы
- •3.3. Константы и переменные
- •3.4. Преобразование типов
- •4. Операторы
- •4.1. Ввод данных
- •4.2. Вывод данных
- •4.3. Составной оператор
- •4.4. Условный оператор
- •4.5. Операторы циклов
- •4.5.1. Оператор for
- •4.5.2. Оператор while
- •4.5.3. Оператор repeat
- •4.5.4. Стандартные функции для циклов
- •4.6. Оператор выбора case
- •5. Массивы
- •5.1 Определение массива
- •5.2. Ввод/вывод одномерного массива (вектора).
- •5.3 Типизированные константы – массивы
- •5.4. Сортировка массивов (ранжирование)
- •6. Процедуры и функции
- •6.1. Подпрограммы
- •6.2. Параметры. Глобальные и локальные описания
- •6.3. Процедуры
- •6.4. Функции
- •6.5. Процедура exit
- •6.6. Рекурсия
- •6.7. Директивы подпрограмм
- •6.8. Открытые массивы
- •7. Записи
- •7.1.Определение и правила записи
- •7.2. Оператор присоединения
- •7.3. Записи с вариантами (экономия пространства)
- •8. Множества
- •8.1. Понятие множества
- •8.2. Конструктор множества
- •8.3. Операции над множествами
- •8.4. Примеры программ, использующих множества.
- •Литература
6. Процедуры и функции
6.1. Подпрограммы
Процедуры и функции аналогичны программам в миниатюре и имеют общее название – подпрограммы (п/п). Применение п/п дает возможность:
-
уменьшить число повторений одной и той же последовательности операторов;
-
конструировать программу как совокупность отдельных блоков.
Пример структурированный программы
Блок А
Блок А1
Блок А2
Блок В
Блок В1
Блок В2
Блок В21
Программа
Блок С
Блок В22
Достоинством нисходящего программирования (разбивка программ на блоки) является повышение надежности программы, т.к. отдельный блок можно программировать и тестировать отдельно от других блоков.
В программе описание процедур и функций должно располагаться в разделе объявлений программы. Каждая подпрограмма определяется один раз, но может быть использована многократно. Структура подпрограммы аналогична структуре полной программы на языке Т-П, но заканчивается END;.
Описать блок значит указать его заголовок и тело:
PROCEDURE A;
В заголовке указываются имя блока и формальные параметры, если таковые есть. Тело блока подобно телу любой программы.
6.2. Параметры. Глобальные и локальные описания
При введении в программу подпрограммы возникает разделение данных и их типов на глобальные и локальные.
Глобальными по отношению к данному блоку являются объекты верхнего уровня, описанные до появления данного блока.
Локальные объекты – объекты, существующие внутри данного блока. Объявлены либо в списке параметров (только переменные), либо в разделах CONST, VAR, TYPE, внутри подпрограммы.
Для программистов, использующих обращение к блоку, блок представляется как «черный ящик», в котором реализуется тот или иной алгоритм. В примере, рассмотренном нами, из основной программы можно обратиться к процедурам А, В, С, но нельзя вызвать А1, А2, В1, В2. Образно говоря, блок как бы окружен полупрозрачными стенками, снаружи не видно, что делается внутри, но попав в блок можно увидеть, что делается вне его, но только «сверху», а не «снизу». Так, из блока В21 можно обратиться к В2 , В1, В, а, к основной программе.
При совпадении глобальных и локальных имен сильнее оказывается локальное имя, и именно оно используется внутри подпрограммы. Существует неписанное правило: если блок содержит цикл FOR, то параметры должны быть описаны как локальные переменные. Это предотвратит неразбериху при циклическом вызове процедур.
6.3. Процедуры
Процедура состоит из заголовка и тела.
Заголовок: PROCEDURE (ИМЯ) [(список формальных параметров)]
(имя – имя процедуры (правильный идентификатор)
(список формальных параметров) - список формальных параметров (может отсутствовать)
Затем идут те же разделы, что и в основной программе. Завершается «;».
Пример. Процедура ввода N целых чисел.
Пусть в основной программе определен TYPE и VAR
TYPE
arr:=array[1…10]of integer;
VAR
m:arr;
k:integer;
Процедура может иметь вид:
{заголовок}
PROCEDURE INPINT (var mas :arr; n: integer);
Var
i:integer; (локальный параметр процедуры)
Begin
Writeln (‘Введите’, n:3,‘целых чисел’);
For i:=1 to n do
read (mas[i])
End;
Синтаксис вызова процедур прост: выполнение активизируется указанием ее имени и списком var или значений, подставляемых на место формальных параметров (фактические параметры):
<имя процедуры> (параметр 1, параметр 2,…….);
K:=40;
Inpint (m,k); или inpint (m,40);
Вызывается процедура input для ввода 40 целых чисел в массив М.
Параметры, описываемые в заголовке подпрограммы, являются по сути локальными переменными. Но, кроме того, они обеспечивают обмен значениями между вызывающими и вызываемыми программами. Описываемые в заголовке параметры называются формальными, а те которые подставляются на их место при вызове – фактическими, т.к. замещают все вхождения в подпрограмму своих формальных «двойников». Между формальными и фактическими параметрами должно быть полное соответствие:
- одинаковое количество;
- один и тот же порядок следования;
- тип фактических параметров должен совпадать с типом формальных параметров.
Пример. Программа подсчитывает количество точек (.) в первой вводимой с терминала строке, а во второй строке – количество букв «А».
Program A;
Const
Point=‘.’;
Var
S:=integer;
Procedure P (simb:char; var kol:integer);
Var
C:char;
begin
Kol:=0;
Writeln (‘Введите строку’);
Repeat
Read (c);
If c=simb then inc(kol);
Until eoln
end;
Begin
P(point,s);
Writeln (‘Количество точек=’,s:3);
P(‘A’,s);
Writeln (‘Количество букв «А»=’,s:3);
end.
Процедура имеет два формальных параметра:
-
simb - входной параметр (параметр-значение), определяет символ, который подсчитывается в строке;
-
kol – выходной параметр (параметр-переменная), через который передается в программу количество подсчитанных символов.
Таким образом мы столкнулись с двумя видами параметров:
-
параметр-переменная;
-
параметр-значение.
Параметры-значения – локальные переменные подпрограммы, стартовые значения которых задаются при вызове подпрограммы из внешних блоков. Параметры значения могут изменять свои значения, как и другие переменные, но эти изменения никак не передаются в вызывающую программу. Для того, чтобы подпрограмма изменяла значение переданной переменной, нужно объявлять соответствующие параметры, как параметры-переменные, вставляя слово var перед описанием в заголовке.
Рассмотрим внутренний механизм передачи параметров в подпрограмму.
При вызове процедуры или функции каждой локальной переменной, описанной внутри подпрограммы, и каждому параметру значения отводится место для хранения данных в специальной области памяти, именуемой стеком. Эти места принадлежат переменным ровно столько времени, сколько выполняется подпрограмма. Ячейки для переменных-значений заполняются сразу содержимым.
По-другому организуются параметры-переменные. Вместо копий значения подпрограмма получает разрешение работать с тем местом, где постоянно (т.е. во время работы самого вызывающего блока ) хранится значение переменной, указанной в вызове. Все действия с параметром-переменной в подпрограмме на самом деле являются действиями над поставленной в вызове переменной. В этом заключается причина того, что на место параметров-значений можно подставлять непосредственно значения, а на местах параметров переменных могут быть только идентификаторы переменных.
Процедура Р может передавать результат своей работы через глобальную переменную S:
Procedure P(simb:char);
If c=simb then s:=s+1;
S:=0; P(point);
……………………………….
S:=0; P(‘A’);
Однако, в сложных программных комплексах не рекомендуется использование глобальных переменных.