34646

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

Реферат

Информатика, кибернетика и программирование

Пользовательские функции. В Паскале имеется два вида подпрограмм: процедуры PROCEDURE и функции FUNCTION. В программе процедуры и функции описываются после раздела описания переменных программы но до начала ее основной части то есть до оператора Begin начинающего эту часть.

Русский

2013-09-08

85.5 KB

0 чел.

исциплина «Основы алгоритмизации и программирование»   Процедуры и функции

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

[1] 1. Подпрограммы.

[2] 2. Глобальные и локальные переменные.

[3] 3. Пользовательские процедуры.

[4] 4. Пользовательские функции.

1. Подпрограммы.

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

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

Более того, рекомендуется большую задачу разбивать на отдельные смысловые части (подпрограммы), программировать их отдельно, а затем объединять в единую программу. Использование подпрограмм считается хорошим стилем программирования. При этом уменьшается в целом объём программы и сокращается время на отладку.

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

Подпрограммы располагаются в разделе описаний основной программы. Структура программы с двумя подпрограммами Р1 и Р2 может иметь, например, такой вид:

program имя;  {раздел описаний основной программы}

label — раздел меток;

const — раздел констант;

type — раздел типов;

var — раздел переменных;

подпрограмма р1

подпрограмма р2

begin  {раздел операторов основной программы}

 операторы;

 вызов подпрограммы р1;

 операторы;

 вызов подпрограммы р1;

 операторы;

 вызов подпрограммы р2;

 операторы;

 вызов подпрограммы р2;

 операторы;

 вызов подпрограммы р1;

 операторы;

end.

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

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

В Паскале имеется два вида подпрограмм: процедуры (PROCEDURE) и функции (FUNCTION). 

2. Глобальные и локальные переменные.

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

program pr1;  {заголовок основной программы}

var    {раздел описания переменных основной программы}

 a, b:integer;

c: real;

заголовок подпрограммы

var    {раздел описания переменных подпрограммы}

 k, i: integer; {}

  m: real;  {}

begin    {начало подпрограммы}

…    {раздел операторов — тело подпрограммы}

end;    {конец подпрограммы}

begin   {начало основной программы}

…    {раздел операторов — тело программы}

end.    {конец программы}

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

В нашем примере глобальные переменные: А, В (тип — INTEGER), С (тип — REAL).

Для переменных, которые объявляются в разделе описания переменных подпрограммы, память отводится лишь только на период выполнения подпрограммы., поэтому они называются локальными (местными). Основная программа их «не замечает».

В нашем примере локальные переменные: K, I (тип — INTEGER), М (тип — REAL).

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


Рассмотрим ещё один пример.

program pr2;  {заголовок основной программы}

var    {раздел описания переменных основной программы}

a, b:integer; {}

заголовок подпрограммы

var    {раздел описания переменных подпрограммы}

 a, b:integer; {}

begin   {начало подпрограммы}

…    {раздел операторов — тело подпрограммы}

end;    {конец подпрограммы}

begin   {начало основной программы}

…    {раздел операторов — тело программы}

end.    {конец программы}

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

3. Пользовательские процедуры.

Повторение

1. Из каких разделов состоит программа?

2. Является ли заголовок программы обязательным?

3. Какие разделы описаний вы уже знаете?

4. Каким служебным словом начинается раздел описания констант? Приведите пример описания константы.

5. Каким служебным словом начинается раздел описания типов? Приведите пример описания типа.

6. Каким служебным словом начинается раздел описания переменных? Приведите пример описания переменных.

7. Как оформляется тело основной программы?

8. Какие операторы вы знаете?

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

Описание процедуры начинается с заголовка, который является обязательным (в отличие от заголовка программы). Заголовок состоит из служебного слова Procedure, за которым следуют имя процедуры, образованное по правилам языка Паскаль. Например:

Procedure PRIM (<Служебная информация — параметры>);

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

Begin

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

End;

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

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

Раздел операторов заключается в операторные скобки BEGIN и END, причём после END в отличие от основной программы ставится точка с запятой.

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

PRIM(Список_параметров);

Параметры.

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

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

Чтобы лучше разобраться, что же такое формальные параметры, рассмотрим такой пример. В некотором цехе производится сборка автомобилей. Рядом с цехом находится мастерская, в которой изготавливаются болты, необходимые для сборки. Цех и мастерская соединены окнами, через которые в мастерскую поступают заготовки и возвращаются готовые болты. Так вот, формальные параметры можно сравнить с этими окнами. Те из них, через которые данные только поступают в подпрограмму, называют параметры-значения. Те, через которые данные возвращаются в основную программу из процедуры, называют параметры-переменные.

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

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

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

Фактические параметры — это параметры (данные), которые передаются процедуре при ее вызове.

Количество, порядок и тип формальных и фактических параметров должны в точности совпадать.

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

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

Пример.

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

Procedure Stepen(x,у: Integer; Var st: Longint); {Заголовок процедуры}

Var i:Integer;    {В разделе описатний описан параметр цикла i)

Begin          {тело процедуры)

st:=l;   {st — результат, присвоим ему начальное значение равное 1}

For i:=l To у Do st:=st*x;

  {Последовательно умножая st на х, получаем

  значение n-й степени числа х}

End;   {Конец процедуры}

Первая строчка описания — это заголовок процедуры, который начинается со слова Procedure. Процедура названа именем Stepen. В скобках записан список формальных параметров, то есть перечислены переменные с указанием их типа. Мы используем три параметра: первый (х) — основание степени, то есть число, которое надо возвести в степень; второй (у) — показатель степени, третий (st) — результат. Первые два формальных параметра — параметры-значения (аргументы), третий — параметр-переменная (результат), и перед ним указано слово Var. Все они описаны как целые (х и у — переменные типа Integer, a st — типа Longint, так как значение степени числа может получиться достаточно большим).

После заголовка процедуры идёт раздел описаний. В нашем примере имеется только  описание одной переменной i (параметр цикла).

Далее идет раздел операторов (тело процедуры). Оно начинается служебным словом Begin и заканчивается служебным словом End, после которого стоит точка с запятой (в конце программы после последнего End ставится точка). В теле процедуры вычисляется степень числа х при помощи цикла For.

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

Вся программа для решения нашей задачи может иметь следующий вид;

Program primer;

Var a, n: Integer;

   s: Longint;

Procedure Stepen (х,у: Integer; Var st: Longint) ;

Var i:Integer;

Begin

 st:=l;

 For i:=l To у Do st:=st*x;

End;

Begin

 Write('Введите основание степени = ');

 readln(a);

 Write('Введите показатель степени = ');

 readln(n);

 Stepen(а,n,s);  {обращение к процедуре}

 Writeln(a,' в степени ',n,' = ', s);  {выводим в значение степени}

End.

Процедура вызывается как оператор, состоящий из имени процедуры (Stepen) и фактических параметров (а, n, s), которые записаны в скобках. В нашем примере формальные параметры х, у и st принимают значения фактических параметров а, n и s соответственно. После завершения работы процедуры переменные а и n сохранят те же значения, что и при вызове процедуры, а s получит новое значение.

Пример.

Даны две целые переменные. Поменять местами их значения.

Поменять местами значения двух переменных можно несколькими способами. Один из них — используя промежуточную переменную. Напишем процедуру, соответствующую этому способу.

Procedure Swap (Var x,y: integer);

Var z: Integer;

Begin

 z:=x;

 x:=y;

 y:=z;

End;

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

В процедуре описана переменная z, которая используется как промежуточная.

Пример.

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

Надо выделять последнюю цифру числа до тех пор, пока число не станет равным нулю. При этом каждый раз суммируя цифры (начальное значение суммы — 0).

Procedure Sum(x: Longint; Var S: Byte);

Begin

 S:=0;  {Начальное значение суммы цифр}

 While x > 0 Do {Пока в числе есть цифры}

 Begin 

   S:=s+x mod 10; {Прибавляем последнюю цифру к сумме}

   x:=x div 10;  {И удаляем её из числа}

 End;

4. Пользовательские функции.

Повторение.

1. Что такое подпрограмма? Для чего используются подпрограммы? Перечислите преимущества использования подпрограмм.

2. Запишите структуру процедуры.

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

4. Как записывается вызов процедуры?

Описание функции.

Если подпрограмма имеет только один выводимый параметр (результат), то её можно оформить в виде функции.

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

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

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

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

Function Имя[(Список формальных параметров)]: Тип результата;

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

Begin

 Раздел операторов — тело функции, в котором обязательно должен быть оператор присваивания: Имя_функции:=значение

End;

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


Пример.

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

Решение. Для сравнения запишем функцию и процедуру рядом.

Procedure Sum(x: Longint; Var S: Byte);

Begin

 S:=0;

 While x > 0 Do

 Begin

   S:=s+x mod 10;

   x:=x div 10;

 End;

End;    

Function Sum(x: Longint): Byte;

Var S: Byte;

Begin

 S:=0;

 While x > 0 Do

 Begin

   S:=s+x mod 10;

   x:=x div 10;

 End;

 Sum:=S;

End;

Первая строка — это заголовок процедуры (Procedure) и функции (Function). В заголовке процедуры описаны два формальных параметра х — число, у которого нужно определить сумму цифр, и S — результат работы процедуры — сумма цифр. В заголовке функции только один формальный параметр х — число, у которого нужно определить сумму цифр. Но зато указывается тип функции — ведь она и будет возвращать результат работы. Далее в функции описывается промежуточная переменная S — сумма цифр. Алгоритм нахождения суммы цифр и в функции и в процедуре один и тот же. В конце функции идёт обязательная команда присваивания полученного значения имени функции.

Теперь посмотрим, какие отличия появятся в командах вызова в основной программе:

Sum(а, s1);     

Sum(b, s2);     

s1:=Sum(а);

s2:=Sum(b);

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

If  Sum(а) > Sum(b)

then

 Writeln(F2, а, ' имеет большую сумму цифр, чем ', b)

Else

 If  Sum(а) < Sum(b)

 then

   Writeln(F2, b, ' имеет большую сумму цифр, чем ', a)

 Else Writeln(F2, а, ' имеет такую же сумму цифр, что и ', b);  

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


Пример.

Найти разность двух факториалов F=m!-k! Напомним, что n! представляет собой произведение n чисел натурального ряда 123n. Вычисление n! оформим в виде функции FACT, а затем будем обращаться к ней последовательно передавая значения m и k.

Опишем функцию для вычисления факториала числа п.

Function fact (n:Integer):Longint;

  {заголовок функции}

Var i: Integer;  {раздел описаний: I — параметр цикла}

   rez: Longint; {rez — промежуточная переменная для получения факториала}

Begin            {тело функции}

rez:=l;    {начальное значение факториала}

For i:=l To n Do rez:=rez*i; {вычисление факториала}

fact:=rez;       {присваивание значения имени функции}

End;

Первая строчка в описании функции — это ее заголовок. Служебное слово Function (функция) указывает на то, что именем fact названа функция. В скобках записан список формальных параметров функции, состоящий из одной переменной целого типа. Далее в заголовке указан тип значения функции. В данном примере результат функции fact — длинное целое число.

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

Далее идет раздел операторов (тело функции). Результат присваивается имени функции, таким образом, функция получает свое значение.

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

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

Написать текст программы!

При вычислении значения F программа дважды обращается к функции: FACT(m) и  FACT(k).


 

А также другие работы, которые могут Вас заинтересовать

18967. Сущность и классификация имиджа 79 KB
  Сущность и классификация имиджа Имидж – внешний образ создаваемый субъектом с целью вызвать определенное впечатление мнение отношение у других. Имидж – эмоционально окрашенный образ кого – либо/ чеголибо сложившейся в массовом сознании и способный оказать влия
18968. Понятие общественности в паблик рилейшнз 61 KB
  Понятие общественности в паблик рилейшнз Усилия специалистов PR должны быть направлены на установление двусторонних контактов с общественностью. Общественность группа людей оказавшихся в различных ситуациях осознающих неопределенность и проблемность ситуаци...
18969. Интернет-технологии, применяемые в связях с общественностью 166 KB
  Интернеттехнологии применяемые в связях с общественностью Internet представляет из себя динамично развивающееся средство представления информации и следовательно публикация сайта это сильная рекламная акция которая привлекает внимание к деятельности вашей компан...
18970. Нарушение правовых и этических норм в ходе избирательной кампании 40.5 KB
  Нарушение правовых и этических норм в ходе избирательной кампании К технологиям такого рода относятся как нарушающие букву закона так и формально не вступающие в противоречие с действующим законодательством. Объектом так называемых грязных технологий служат избира
18971. Кодексы профессионального поведения и этики ПР-специалиста 55.5 KB
  Кодексы профессионального поведения и этики ПРспециалиста Для такой специфической доверительной основанной на межличностных отношениях сферы как ПР законодательных норм бывает недостаточно. В практике ПР нередко возникают немалые противоречия между целью и эт
18972. Эффективность рекламы и связей с общественностью 101.5 KB
  Эффективность рекламы и связей с общественностью Реклама – распространяемая в любой форме с помощью любых средств информация о физическом или юридическом лице товарах идеях и начинаниях рекламная информация которая предназначена для неопределённого круга лиц и ...
18973. Создание и управление комплексом интегрированных маркетинговых коммуникаций 60.5 KB
  Создание и управление комплексом интегрированных маркетинговых коммуникаций ИМК комплекс объединяющий средства коммуникации от рекламы до упаковки позволяющее с согласованными и убедительными сообщениями обратиться к целевой аудитории. Цель: объединить разрозн...
18974. Принципы формирования, цели и задачи бренда 53 KB
  Принципы формирования цели и задачи бренда Брэнд это название термин символ или дизайн либо комбинация всех этих понятий обозначающие определенный вид товара или услуги отдельно взятого производителя либо группы производителей и выделяющие его среди товаров
18975. Фирменный стиль: понятие и содержание 40 KB
  Фирменный стиль: понятие и содержание Фирменный стиль это совокупность устойчиво воспроизводимых отличительных характеристик общения манер поведения традиций свойственных фирме позиционирующих ее в коммуникационном пространстве современной экономики. Фирменны...