
- •7. Процедуры и функции в языке Паскаль
- •7.1. Подпрограммы. Параметры. Обмен данными подпрограмм с вызывающими блоками
- •7.2. Описание и вызов процедур и функций
- •7.3. Область видимости данных. Локальные и глобальные величины
- •7.4. Примеры применения подпрограмм
- •7.5. Рекурсия и рекурсивные вычисления
- •7.6. Передача имен процедур и функций в качестве параметров в подпрограммы
- •7.7. Процедуры управления Exit и Halt для выхода из подпрограмм
- •4. Опережающие описания и подключение подпрограмм. Директива
- •Лекция № 4. Подпрограммы
- •1. Параметры подпрограмм
- •2. Типы параметров подпрограмм Параметры-значения
- •Параметры-константы
- •Параметры-переменные
- •Нетипизированные параметры
- •Процедурные переменные
- •Параметры процедурного типа
- •Заголовок
- •Параметры
- •Параметры-массивы и параметры-строки
- •Процедурные типы. Параметры-функции и параметры-процедуры
- •Нетипизированные
7.3. Область видимости данных. Локальные и глобальные величины
Применение модульного принципа построения программ в алгоритмических языках за счет использования отдельных модулей-подпрограмм задает иерархическую (с учетом вхождения) структуру не только программного кода, но и доступа к данным. Часть кода программы, где некоторая величина доступна пользователю и он может оперировать с ней, называется ее областью видимости.
Рассмотрим некоторую программу, включающую в себя описания подпрограмм в виде процедур и функций. Имена, описанные в разделе описаний программы, называют глобальными. Это означает, что они доступны для использования не только в теле программы, но и в любой ее подпрограмме. Областью видимости глобальных переменных составляет весь код программы.
Все имена, описанные в заголовках или разделах описаний подпрограмм (процедур и функций) называют локальными, т.е. они доступны для пользователя исключительно в своем блоке. Таким образом, областью видимости локальных переменных является только тот блок, в котором они описаны. За его границами их значение не определено. В том числе, локальными являются формальные параметры подпрограмм.
Практически все глобальные имена хранятся в области памяти, которая называется сегментом данных (статическим сегментом) программы. Эта область создается на этапе компиляции программы и действительна в течение всего времени ее работы. В Паскале размер сегмента данных программы составляет 65520 байт.
В отличие от глобальных, локальные переменные хранятся в специальной области памяти, которая называется стек. Она создается каждый раз при входе в подпрограмму и уничтожается при выходе из нее. Максимальный объем стековой памяти в Паскале также составляет 65520 байт.
В программе из примера 1 п.7.2 величины x,y,z,c,ord_value, описанные в разделе описаний внешней программы, являются глобальными. Формальные параметры процедуры x,y,ord_val, заданные в ее заголовке, являются локальными, их область видимости составляет только процедура order. Сходство наименований глобальных и локальных переменных x,y не вызывает ошибок при выполнении программы. Единственное неудобство заключается в том, что при расчетах в процедуре order глобальные переменные x,y “не видны” за соответствующими локальными.
Вопросы для проверки знаний.
1. Что называют областью видимости данных ?
2. Какие имена в программе называют глобальными, где помещают их описание, какова их область видимости ?
3. Какие величины программы называют локальными, где они описаны и какова их область видимости ?
4. Как на практике организовано хранение глобальных и локальных данных при работе программы ?
Практическое задание.
1. Исправить код программы из примера 1 п.7.2 таким образом, чтобы локальные переменные процедуры order не перекрывали глобальные переменные.
7.4. Примеры применения подпрограмм
Рассмотрим примеры использования подпрограмм для решения задач.
Пример 1. Разработать программу, в которой осуществляется:
a) ввод основания степени а (положительное вещественное число) и показателя степени х (вещественное число),
б) расчет значения степени аx и вывод его на экран.
В программе должна быть функция degree, обеспечивающая возведение в вещественную степень x положительного вещественного числа a путем применения формулы аx = exр(xlna).
Решение. В основной программе вводим глобальные переменные osn (основание) и pok (показатель) . Код программы с подробными комментариями:
var osn, pok: real; { глобальные параметры программы}
function degree (a, x : real) : real;
begin {начало описания функции }
degree := exp (x * ln ( a));{присвоение имени функции результата вычислений}
end; { завершение описания функции }
begin {начало основной программы }
writeln(’Vvedite osnovanie stepeni (>0)’);read(osn);{запрос на ввод, ввод основания}
writeln (’Vvedite pokazatel stepeni’); read (pok);{запрос на ввод, ввод показателя}
writeln (’Znachenie stepeni = ’, degree (osn, pok)); {вывод результата}
end.
Пример 2. Разработать программу, в которой осуществляется:
a) неограниченный по количеству итераций циклический ввод целых чисел,
б) среди них определяется минимальное (min) и максимальное (max) значения,
в) после каждого ввода числа на экран выводится сводка о текущих значениях min и max,
г) после окончания работы программы на экран выводится итоговый результат.
В начале каждой итерации цикла необходимо выдать запрос на ввод:
a) символа “s”, по которому производится окончание работы программы,
б) целого числа, которое используется в расчетах программы.
В программе предусмотреть использование процедуры minmax (a,b,c,min,max), которая выбирает минимальное и максимальное значения из входных параметров a,b,c и присваивает их выходным параметрам min,max. Если в программе не было введено ни одного числа, в результирующем выводе указать: “min,max is not defined” (не определены).
Решение. Введем в основной программе глобальные параметры:number – вводимое число, min_t, max_t - текущие значения min и max, символьную переменную stop для запроса об окончании работы программы, дополнительный логический признак pr, который равен True, если хотя бы одно число введено в программу, False - если числа не вводились. Для обеспечения “бесконечного” цикла используем конструкцию while True do. Код программы с подробными комментариями:
var number,min_t,max_t:integer; stop:char; pr:boolean; { глобальные параметры}
procedure minmax(a,b,c:integer; var min,max:integer);
begin {начало описания процедуры }
if a<=b then begin min:=a; max:=b end else begin min:=b; max:=a end;
if min>c then min:=c; if max<c then max:=c;
end; { завершение описания процедуры }
begin {начало основной программы }
pr:=false;
while True do {оглавление бесконечного цикла}
begin {открытие тела бесконечного цикла}
Write(’Enter request to cycle stop(s-yes, others-no)’);{запрос окончания цикла}
Readln(stop); {получение ответа от пользователя}
if(stop='s')then{ действия при выходе из цикла}
begin
Writeln(’LOOP EXIT!’);
If pr then Writeln(’Rezult: min=’, min_t, ’ max=’, max_t)
else Writeln(’Rezult: min, max is not defined!’);
break
end;
Write(’Enter integer:’);Readln(number);{Ввод запроса и получение целого числа}
if pr then { Действия при получении второго и всех следующих чисел}
minmax(min_t,max_t,number,min_t,max_t)
else {Действия при получении первого числа}
begin pr:=true; min_t:= number; max_t:= number end;
Writeln(’Current: min=’, min_t, ’ max=’, max_t);
end; { выход из бесконечного цикла}
end. {выход из основной программы }
Практическое задание.
1.
Разработать программу, в которой
производится расчет произведения
причем
сos(x)
рассчитывается в отдельной функции
сosx
по приближенной формуле: сos(x)1-0,5x2.
Результат вывести с точностью до 20
десятичных знаков.