Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Блочная организация программ




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

Использование подпрограмм позволяет реализовать один из самых прогрессивных методов программирования - структурное программирование. В языке Паскаль выделяют два вида подпрограмм - процедуру (procedure) и функцию (function). Любая программа может содержать несколько процедур и функций.

 

7.1. Общие понятия о процедурах и функциях

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

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

 
 

 

 


Рис. 7.1 Диаграмма процедуры или функции.

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

Приведем пример функции. Следующая функция GetNumber получает число от пользователя:

 

function GetNumber: Real;

var

Responce: Real;

begin

Write('Введите число: ');

Readln(Response);

GetNumber:= Response;

end;

 

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

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

1. Получение числа от пользователя.

2. Выполнение с этим числом необходимых вычислений.

3. Печать отчета.

Основная логика программы заключена в последнем блоке begin..end.

Пример:

Program Report;

var A: Real;

{ другие описания }

.....

function GetNumber: Real;

var Responce: Real;

begin

Write('Введите число: ');

Readln(Response); GetNumber:= Response;

end;

procedure Calculate(X: Real);

...

procedure PrintReport;

...

begin

A: = GetNumber;

Calculate(A);

PrintReport;

end.

 

Основная логика программы достаточно проста для понимания.

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

 

7.2. Пользовательские процедуры. Формальные и фактические параметры

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

Пример:

Составим процедуру SQ решения квадратного уравнения ax2 + bx + c = 0 в предположении, что дискриминант неотрицателен. И с помощью этой процедуры решим квадратное уравнение

5,7y2 - 1,2y -8,3 = 0

Program Ex14;

Var y1,y2:real;

Procedure SQ(a,b,c:real; var x1,x2:real);

Var d:real;

Begin

d:=sqr(b)-4*a*c;

x1:=(-b-sqrt(d))/2/a;

x2:=(-b+sqrt(d))/2/a;

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

Begin

SQ(5.7,-1.2,-8.3,y1,y2);

Writeln('y1= ',y1,' y2= ',y2)

End.

 

В заголовке процедуры описываются формальные параметры a, b, c, x1, x2, через которые передается информация из программы в процедуру либо из процедуры в программу.

Параметры, указанные в строке вызова процедуры - это фактические параметры, с которыми программа вызывает процедуру.

Здесь первые три фактических параметра 5.7, -1.2, -8.3 соответствуют формальным a, b, c; а последние два фактических параметра y1, y2 соответствуют формальным x1, x2. Между формальными и фактическими параметрами должно быть соответствие по количеству параметров, порядку их следования и типу данных.

Параметры процедур могут быть четырех видов:

- параметры-значения;

- параметры-переменные;

- параметры-процедуры;

- параметры-функции.

 

Параметры-значения. По сути, это входные значения в процедуру. Если в качестве формального параметра указана переменная, то такой параметр и есть параметр-значение (a,b,c в процедуре SQ). В этом случае фактическим параметрам, соответствующим либо a, либо b, либо c может быть любое выражение соответственного типа, в частности, константа; или имя переменной.

Например, обратиться к SQ можно так

SQ((25./3+2)*2, -1.5, (8.2-3.1)/3, x1, x2);

 

Параметры-переменные. Это выходные переменные. Если перед именем формального параметра стоит ключевое слово Var, то такой параметр - есть параметр-переменная (x1 и x2 в процедуре SQ). Фактический параметр, соответствующий параметру-переменной, может быть только переменной (не константой и не выражением).

Var пишут перед теми параметрами, значения которых должны быть изменены процедурой.

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

Имена, объявленные в подпрограмме, действуют только в этой подпрограмме. Такие имена называются локальными. Они недоступны для операторов основной программы.

Составим простейшую программу, из выполнения которой видно, как работает механизм локальных и глобальных переменных, параметров-значений и параметров-переменных в программе.

Пример:

Program PrEx15;

Var a,b,c,d:integer;

Procedure P(x:integer; var y:integer);

Var c:integer;

Begin

c:=1; d:=1; x:=1; y:=1;

Writeln(x,y,c,d);

End; {P}

Begin

a:=0; b:=0; c:=0; d:=0;

P(a,b); Writeln(a,b,c,d);

End.

 

Будет напечатано

1 1 1 1

0 1 0 1

В этом примере:

X - параметр-значение, поэтому ему будет присвоено значение фактического параметра a=0, в процедуре это значение станет равным 1, и результат будет напечатан. На переменной a это никак не отразится, и после выполнения процедуры a по-прежнему будет равным 0.

Y - параметр-переменная, поэтому при выполнении процедуры вместо y действия будут производиться с переменной b, которая получит значение 1. Это значение сохраняется после выхода из процедуры.

C - локальная для данной процедуры переменная, значение которой никак не связано с глобальной переменной c в основной программе.

D - глобальная переменная, имеющая одинаковый смысл как в основной программе, так и в процедуре.

 

7.3. Пользовательские функции. Стандартные процедуры и функции

Другой вид паскалевской подпрограммы - функция оформляется аналогично процедуре. Отличительные особенности функции: она имеет только один результат выполнения (но может иметь несколько входных параметров) и этот результат обозначается именем функции.

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

Пример:

Задача: известен периметр треугольника и его углы. Определить радиус вписанной окружности.

Математическое соотношение

r = p tg(a) tg(b) tg(с)

При решении данной задачи разумно определить функцию тангенса

 

Program Ex16;

Var r,p,a,b,c:real;

Function TAN(x:real):real;

Begin

TAN:=sin(x)/cos(x);

End;{TAN}

Begin

Read(p,a,b,c);

r:=p/2*tan(a)*tan(b)*tan(c);

Write(r);

End.

Здесь

TAN - имя функции;

x:real - формальный параметр и его тип;

real - тип результата.

 

Вычисление большего из двух данных чисел можно оформить таким образом:

Function max(x,y:real):real;

Begin

If x>y then max:=x else max:=y

End;

После работы функции результат присваивается имени функции, поэтому в блоке функции обязательно должен присутствовать оператор присваивания вида

<имя функции>:=<результат>;

 

Стандартные процедуры и функции.

Стандартные функции. (На самом деле их больше).

Символ i означает выражение, которое приводится к целому значению; символ r - выражение, которое приводится к вещественному значению; символ m означает параметр, имеющий порядковое значение: например, целое, литеру или элемент перечисляемого типа.

ABS(i) ABS(r) - абсолютная величина;

ARCTAN(r) - арктангенс;

CHR(i) - литера;

COS(r) - косинус;

EOF(имя файла) - TRUE, если конец файла;

EOLN(имя файла) - TRUE, если конец строки;

EXP(r) - экспонента;

LN(r) - натуральный логарифм;

ODD(i) - нечетность;

ORD(m) - порядковое значение;

PRED(m) – предшествующее значение;

ROUND(r) - округление до ближайшего целого;

SIN(r) - синус;

SQR(i) SQR(r) - квадрат;

SQRT(r) - квадратный корень;

SUCC(m) – последующее значение;

TRUNC(r) - отбрасывает дробную часть.

Стандартные процедуры будем рассматривать по мере изучения.

7.4. Параметры-процедуры. Параметры-функции.Рекурсивные процедуры и функции

Пример 1. Procedure P (Procedure A);

Процедура P имеет один параметр-процедуру A.

Пример 2. Procedure Q (Function S:real; B;real);

Процедура Q имеет два параметра: параметр-функцию S и параметр-значение B.

Пример 3. Procedure Q (Function F (i:integer):real);

Здесь формальный параметр F - функция от одного целого аргумента, результат F- вещественный.

 

Слово " рекурсия " - производное от термина reccurence, что в переводе с английского означает возвращение, повторение. Проблема курицы и яйца - классический пример рекурсии.

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

Рекурсию довольно часто демонстрируют на примере функции вычисления факториала. Согласно математическому определению факториал числа n, обозначаемый как n!, есть произведение целых чисел от 1 до n или, в символической записи, n!=1*2*3*...*n.

Однако, на то же определение можно взглянуть и несколько иначе. Заметим, что произведение чисел от 1 до n, составляющее n!, равно n, помноженному на произведение чисел от 1 до n-1, то есть на (n-1)! Таким образом, приходим к новому определению, в котором определяемое понятие n! описывается через очень похожее, но в чем-то слегка упрощенное (n-1)!. Чтобы найти n! нужно применить функцию факториала к n-1, затем к n-2 и так далее, вплоть до 1. Это и означает, что наше определение факториала рекурсивно.

Обязательным элементом в описании всякого рекурсивного процесса является некоторое утверждение, определяющее условие завершения рекурсии; иногда его называют опорным условием рекурсии (или якорем). В опорном условии может быть задано какое-то фиксированное значение, заведомо достигаемое в ходе рекурсивного вычисления и позволяющее организовать своевременную остановку процесса; применительно к вычислению факториала им будет равенство 1!=1. Таким образом, любое рекурсивное определение всегда содержит два элемента: условие завершения и способ выражения одного шага решения посредством другого, более простого шага.

Напишем соответствующую подпрограмму.

 

Program Ex17;

Var z:real;

Function F(n:integer):real;

Begin

If n=1 then f:=1 {завеpшение pекуpсии, }

else f:=f(n-1)*n {иначе - pекуpсивный вызов}

End;

Begin

z:=f(10);

writeln(z);

End.

Обратите внимание на тип возвращаемого функцией f значения - real (а не integer). Почему при целочисленном аргументе результат должен быть вещественным? Чтобы ответить на этот вопрос, попытайтесь вручную вычислить факториал для сравнительно, небольшого числа, например 9! или 10!, и поразмышляйте над тем, сколь большим получится число в ответе.

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

 

Вопросы для самоконтроля:

1. Что такое "структурированная программа"?

2. Что такое подпрограмма?

3. Чем отличаются глобальные переменные от локальных переменных.

4. Виды параметров процедур и функций. Механизм их действия.

5. Понятия формального и фактического параметра.

6. Как производится обращение к функции в PASCAL-программе.

7. Может ли функция входить в процедуру?


ГЛАВА 8




Поделиться с друзьями:


Дата добавления: 2014-12-27; Просмотров: 546; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.007 сек.