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

Лабораторная работа №5

Разработка Паскаль-программ с использованием

Процедур и функций пользователя

 

Цель работы

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

 

Задание на лабораторную работу

5.2.1 Разработать программу для вычисления значений функции в соответствии с вариантом задания (табл. 5.1) при значении аргументов х и y.

5.2.2 Программа должна выводить сообщения - подсказки перед вводом дан­ных сообщение о выводе результатов.

5.2.3 Программа должна состоять из подпрограмм и основной программы.

5.2.4 Ввод значении параметров x, y реализовать при помощи процедуры.

5.2.5 Вычисление значений функции при конкретном значении аргумента реа­лизовать при помощи функции.

5.2.6 Основная программа должна осуществлять:

- ввод начальных и конечных значений аргумента;

- вычисление заданной функции;

- вывод результата на экран.

5.2.7 Ответить на контрольные вопросы.

5.2.8 Оформить отчет.

 

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

5.3.1 Процедуры и функции.

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

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

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

Структура Паскаль-программы с процедурами и/или функциями:

Program Name_Prog;

{———Разделы основной (головной) программы—}

uses...

const...

type...

var...

{—————Описание процедуры 1—————}

Procedure Proc1 (...);

Const...;

Type...;

Var...;

Begin

End;

{—————Описание процедуры 2——————}

Procedure Proc2 (...);

Const...;

Type ...;

Var...;

Begin

End;

{—————Описание функции 1——————}

Function Func1 (... ):Real;

Const ...;

Type...;

Var...;

Begin

End;

{————Начало блока головной программы————}

Begin

....... {Блок содержит вызовы процедур и функций)

End.

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

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

 

5.3.2 Описание процедуры. Оператор процедуры.

Процедура представляет собой программу, которая может вызы­ваться другой программой, и служит для выполнения любого рода действий (т.е. диапазон возможностей процедуры - такой же, как у любой программы).

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

Структура описания процедуры:

Procedure <имя> (<список формальных параметров>) <директива>;

Const...;

Type...;

Var...;

{————————Блок процедуры———————}

Begin <операторы>

End;

<имя> - любой допустимый идентификатор, напр., Proc1.

Список формальных параметров - последовательность идентификаторов (имен) формальных параметров и их типов, напр., Step:real,

Mas: Туре_mas,..., разделенных запятой.

Список формальных параметров может включать в себя параметры-значения, параметры-переменные (перед ними должно стоять ключевое слово Var), параметры процедуры (перед ними должно стоять ключевое слово Procedure) и параметры-функции (перед ними должно стоять ключевое слово Function), нетипизированные параметры, перед которыми должно стоять служеб­ное слово Var и отсутствует указание типа.

<директива> - одна из директив: Interrupt, External, Assanbler, Inline, Forward.

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

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

<имя процедуры>{<список фактических параметров>);

Между формальными и фактическими параметрами должно быть полное соответствие, т.е. формальных и фактических параметров должно быть одинако­вое количество; порядок следования фактических и формальных параметров должен быть один и тот же; тип каждого фактического параметра должен совпа­дать с типом соответствующего ему формального параметра.

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

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

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

 

Вызов процедуры осуществляется отдельным оператором.На блок-схемах вызов процедуры обозначается прямоугольником с двойными вертикальными стенками. Блок-схема же самой процеду­ры отличается от обычной программы тем, что вместо слова "Нача­ло" в стартовый овал вписывается список входных параметров, а вме­сто слова "Конец" - список выходных параметров процедуры.

 
 

 
 

Рис. 5.1. Алгоритм процедуры вывода Рис. 5.2. Блок-схема процедуры ввода двумерного массива.

Например, если программа оперирует с несколькими двумерны­ми массивами, то для вывода этих массивов на экран требуется каж­дый раз записывать двойной цикл, что достаточно громоздко. В этом случае удобно создать подпрограмму вывода двумерного массива на экран. Исходными данными для подпрограммы являются сам массив, а также число строк и столбцов в нем. Блок-схема представлена на рис. 5.1.

 

procedure Outp(a: massiv; N,M: integer);

var i,j:integer;

begin

for i:=1 to N do

begin

for j :=1 to M do

write (a[i,j]);

writeln;

end;

end;

 

Как видно, у этой процедуры выход­ных параметров вообще нет. При на­писании текста процедуры предпола­галось, что в основной программе, из которой будет вызываться процедура, описан тип-массив massiv. Теперь для того, чтобы вывести на экран массив С (5x3) нужно использовать оператор Outp(C,5,3).

Если процедура должна вводить данные в массив, то ей нужно сооб­щить его размеры, а она запросит ввод с клавиатуры нужного количества дан­ных, запишет их в массив, и вернет этот массив в основную программу. Таким образом, массив для этой про­цедуры является выходным парамет­ром, а значит, должен быть описан как параметр-переменная. Блок-схема данной процедуры отличается от пре­дыдущей только изменением роли па­раметра-массива (см. рис. 5.2).

procedure Inp(var A:massiv; N,M:integer);

var i,j:integer;

begin

for i:=1 to N do begin

for j:=1 to M do read(a[i,j]); readln;

end; end;

 

Пример 1. Ввод исходных значений с использованием процедуры. В данном случае t – это текст, выводимый на экран, а x – вводимая переменная.

{Процедура ввода исходных значений}

Program primer1;

var

y: real;

procedure Vvod(t:string; var x:real);

begin

Writeln(t);

Readln(x);

end;

Begin

Vvod(‘Введите A‘,A); {Вызов процедуры Vvod}

Vvod(‘Введите B‘,B); {Вызов процедуры Vvod}

y:=a*b;

Writeln(‘y=‘, y:5:3);

End.

 

5.3.3 Описание функции. Указатель функции.

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

Функция, определенная пользователем, состоит из заголовка и тела функ­ции. Заголовок содержит зарезервированное слово function, идентификатор (имя) функции, необязательный список формальных параметров, заключенный в круг­лые скобки, и тип возвращаемого функцией значения. Тело функции представля­ет собой локальный блок, по структуре аналогичный программе:

Function <имя>[(<список формальных параметров>)]:<тип результа­та>

Const...;

Type...;

Var...;

Begin

<операторы>

End;

<имя> - любой допустимый идентификатор, напр., Fun1;

<список формальных параметров> - последовательность идентификаторов (имен) формальных параметров и их типов, напр., Step:real, Mas: Type_mas, .... разделенных запятой;

<тип результата > - тип возвращаемого функцией результата, напр. Integer, Real, и др.

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

Обращение к функции осуществляется по имени с указанием списка аргу­ментов. Каждый аргумент должен соответствовать формальным параметрам, ука­занным в заголовке и иметь тот же тип.

Пример2. Вычисление факториала числа (n+1)

Program Primer2;

var y:real; n:integer;

Function Factorial (n:integer): Real;

Var

i, f: integer;

Begin

i:=1;

f:=1;

while i<=n do

begin

f:=f*i;

i:=i+1;

end;

Factorial:=f;

End;

Begin

writeln(’введите n’);

readln(n);

y:=Factorial(n+1);

writeln(’значение факториала равно=’,y:3:2);

End.

 

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

 

5.3.4 Локализация имен в Турбо-Паскале.

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

Любое имя (константы, типа, переменной, процедуры или функции) опре­делено только в пределах той процедуры или функции, в которой оно описано. Область действия распространяется на все внутренние процедуры или функции.

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

Методические рекомендации

Пример 3. Вычислить значение выражения:

РЕШЕНИЕ.

В выражении несколько раз встречаются функции тангенса и де­сятичного логарифма, которых в Паскале нет. Несомненно, удобно создать такие функции и использовать их в программе. Блок-схема программы и подпрограмм-функций показана на рис. 5.6.

 
 


 

Рис. 5.6. Блок-схемы программ и подпрограмм к примеру 3.

 

program Expression;

var x,у:real;

procedure Vvod(t:string; var x:real);

begin

Writeln(t);

Readln(x);

end;

function lg(x:real) :real; {Функция вычисления десятичного логарифма}

begin

lg:=ln(x)/ln(10)

end;

function tg (x: real) : real; {Функция вычисления тангенса}

begin

tg:=sin(x)/cos(x)

end;

BEGIN

vvod('Введите х',x);

y:=lg(sqr(tg(x))+sqr(cos(x)))/sqr(tg(x+sqr(lg(x)))+sqr(sin(x));

writeln('y=',y:10:4);

END.

 

Протокол работы программы:

Введите х

3.4
у= 0.0045

 

Примеры функции


1. возведение в степень

function step(x,a:real):real;

begin

step:=exp(a*ln(x));

end;

 

2. нахождение arccos (x)

function arccos(x:real):real;

begin

arccos:=1/cos(x);

end;

 


Контрольные вопросы

5.5.1. Что называется подпрограммой?

5.5.2. Какова структура программы с подпрограммами?

5.5.3. Какова структура процедур?

5.5.4. Какова структура подпрограммы-функции?

5.5.5. В чем состоит различие и сходство подпрограмм-процедур и подпро­грамм-функций в Турбо Паскале?

5.5.6. Как обратиться к процедурам и функциям?

5.5.7. Что называется параметром и каково его назначение?

5.5.8. Назначение формальных и фактических параметров и их взаимосвязь.

5.5.9. Опишите последовательность событий при вызове процедур или функций.

5.5.10. Для чего используется пошаговый режим с заходом в процедуры и как его осуществить?

5.5.11. Каковы отличия параметров-значений от параметров-переменных, осо­бенности их описания и применения?

5.5.12 Чем отличаются локальные и глобальные параметры? Какова область их действия?

 

 


Приложение 1.

Варианты заданий

1. 2.
3. 4.
5. 6.
7. 8.
9. 10.
11. 12.
13. 14.
15. 16.
17. 18.
19. 20.