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




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

При разработке программы иногда появляются повторяемые группы действий или возникает необходимость разделить программу на функциональные модули, сделать её структуру иерархической. Для этого во всех языках программирования существуют средства организации подпрограмм. При решении сложной задачи рекомендуется программу разрабатывать «сверху вниз» -- от более общего плана к детальному. В таком виде главная программа отвечает укрупненному плану решения задачи, а ее команды – вызову соответствующей подзадачи, реализованной в виде подпрограммы. Подпрограммы сокращают текст программы, существенно уменьшают время их исполнения, облегчают жизнь программистам, которые могут создавать программы модульно, т. е. собирая сложную программу из законченных кусочков более простых составляющих.

В Паскале подпрограмма является частью основной программы, ее описание дается между разделом var главной программы и ее программным блоком (первым begin).Подпрограмм может быть несколько, их описания размещаются в произвольном порядке одно за другим. Описание подпрограммы можно сравнить с записываемой в математике формулой «в общем виде», в которую при расчетах подставляются конкретные значения. Поэтому параметры, используемые в описании подпрограммы, называют формальными, а параметры над значениями которых выполняются операции, указанные в подпрограмме, называют фактическими. Иначе говоря, формальные параметры — это идентификаторы входных данных для подпрограммы. Если формальные параметры получают конкретные значения, то они называются фактическими. Формальные параметры могут получить конкретные значения только в той программе, где производится обращение к данному модулю-подпрограмме. Тип и порядок записи фактических параметров должны быть такими же, как и формальных параметров. В противном случае результат работы программы будет непредсказуемым. Из этого следует, что фактические параметры используются при обращении к подпрограмме из основной, а формальные параметры — только в самом модуле(т.е.в подпрограмме). Подпрограмма – это специально оформленный алгоритм, который можно неоднократно использовать при решении задач. Обращение к подпрограмме может быть организовано из любого места основной программы или другой подпрограммы сколько угодно раз. В Паскале различают два вида подпрограмм: процедуры и функции. Встроенные (стандартные) процедуры и функции являются частью языка и могут вызываться по имени без предварительного описания. Например, abs, sqrt, ln, sin…- функции (возвращают результат), readln, write… – процедуры (не возвращают результат). Их наличие существенно облегчает разработку прикладных программ. Однако в большинстве случаев некоторые специфичные для данной программы действия не находят прямых аналогов в библиотеках Turbo Pascal, и тогда программисту приходится разрабатывать свои нестандартные процедуры и функции. Основное различие между ними состоит в том, что процедура может иметь любое количество входных и выходных данных (параметров), а функция – произвольное количество входных и только одно выходное значение. Подпрограммы имеют структуру аналогичную структуре главной программы. Они начинаются с заголовка со специальным словом – признаком подпрограммы, далее указывается имя подпрограммы и, при необходимости, список формальных параметров. Потом размещаются все разделы описаний, которые имеются в главной программе: метки, константы, типы и переменные. В этих разделах описываются данные, используемые только внутри подпрограммы. Такие данные называются локальными. В подпрограмме могут использоваться также переменные, описанные в вызывающей программе. Такие переменные называются глобальными. Они могут использоваться не только вызывающими программами, но и подпрограммами. В связи с этим подпрограммы могут быть двух видов: подпрограмма без параметров и подпрограмма с параметрами. В подпрограмме-процедуре без параметров используются глобальные параметры. При работе с подпрограммой всегда выделяются два этапа: описание подпрограммы, т.е. запись алгоритма решения задачи в специальной форме, и вызов подпрограммы -- передача ей данных для обработки из вызывающей программы и получение результатов.

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

Общий вид заголовка процедуры:

Procedure Имя (параметр1: тип1, параметр2: тип2,...);

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

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

Имя_процедуры (параметр1, параметр2,...);

Описание процедуры и обращение к ней:
Var <глобальные переменные>;
Procedure <имя>(<формальные параметры>);
Var <локальные переменные>;
Begin
<тело процедуры>
end;
Begin
<тело основной программы>
End.

Задача1

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

Program PP;

Procedure srznach(a,b:real; var sa,sg:real); { sa, sg – параметры переменные }

Begin

sa:=(a+b)/2;

sg:=sqrt(a*b);

end;

var x,y,s1,s2:real; { фактические параметры }

Begin

srznach (8,2,s1,s2); { Вызов процедуры }

writeln(' sr.arifm= ',s1:6:3,’ sr.geom= ',s2:6:3); { Вывод результатов }

write('введите два числа ');read(x,y);

srznach (x,y,s1,s2); {Вызов процедуры}

writeln(' sr.arifm= ',s1:6:3,' sr.geom= ',s2:6:3); {Вывод результатов}

End.

 

Задача 2. Вывести все четырехзначные числа вида abcd, для которых выполняются условия:
1) a, b, c, d - разные цифры;
2) a * b - c * d = a + b + c + d.
Решение:
Переберем все четырехзначные числа и с помощью процедуры проверим каждое число на выполнение предложенного условия.
Var i: integer;
Procedure thislo(k: integer);
Var a, b, c, d: integer;
Begin
a:= k div 1000;
b:= (k div 100) mod 10;
c:= (k div 10) mod 10;
d:= k mod 10;
if (a <> b) and (a <> c) and (a <> d) and (b <> c) and (b <> d) and (c <> d) and (a * b - c * d = a + b + c + d) then writeln (k);
end;
Begin
For i:= 1000 to 9999 do thislo(i);
End.
В предложенном варианте решения, процедура не содержит переменной-результата. Она является процессом проверки числа, которое, в случае выполнения условия,выводится самой процедурой.

Подпрограммы-функции

Описание функции и обращение к ней:
Var
<глобальные переменные>;
Function <имя>(<формальные параметры>):<тип результата>;
Var <локальные переменные>;
Begin <тело функции> end;
Begin
<тело основной программы>
End.

Пояснения:
1) Имя функции строится по тем же правилам, что и идентификатор переменной.
2) Формальные параметры - это локальные переменные, предназначенные для хранения данных, принятых из основной программы на обработку. Формальные параметры перечисляются в соответствии с типами и называются параметрами-аргументами.
3) В теле подпрограммы-функции имени функции обязательно должно быть присвоено значение по типу совпадающее с типом результата. Именно это значение будет передано в программу после выполнения функции.
4) Глобальные переменные могут быть использованы в теле функции, но в том же качестве, что и в основной программе.
5) Локальные переменные (их может и не быть) сосредоточены только в своей конкретной функции, и вне тела этой функции теряют смысл.
6) В теле основной программы, в необходимый момент (или моменты) происходит обращение к функции по ее имени, т.е.:
<имя переменной-результата>:=<имя функции>(<фактические параметры>);
Переменная-результат и фактические параметры – это глобальные переменные. Между формальными и фактическими параметрами должно быть четкое соответствие по количеству, по типу и порядку перечисления. При обращении к функции происходит передача фактических значений в формальные параметры, вычисляется значение функции и передается в программу.

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

 

Задача 1. Найти сумму факториалов четных чисел на промежутке от 1 до n.

Решение:

Var i, n: integer; x: longint;
Function factor(k: integer): longint;
Var j: integer; f: longint;
Begin
F:= 1;
For j:= 1 to k do f:= f * j; {вычисление факториала числа k}
factor:= f; {имени функции присвоено значение}
End;
Begin
Read (n);
For i:= 1 to n do if i mod 2 = 0 then x:= x + factor(i);
write (x);
End.

Пример подпрограммы-процедуры и функции (сравнение)

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

Program Prim_PFun; function Skorost(v0,a,t:real):real; begin Skorost:=v0+a*t; end; var v01,a1,t1,v1,v02,a2,t2,v2:real; begin read(v01,a1,t1); read(v02,a2,t2); v1:=Skorost(v01,a1,t1); v2:=Skorost(v02,a2,t2); writeln('v1=',v1,' v2=',v2); end. Program Prim_PProc; procedure Skorost(v0,a,t:real; var v:real); begin v:=v0+a*t; end; var v01,a1,t1,v1,v02,a2,t2,v2:real; begin read(v01,a1,t1); read(v02,a2,t2); Skorost(v01,a1,t1,v1); Skorost(v02,a2,t2,v2); writeln('v1=',v1:0:2,' v2=',v2:0:2); end.

Контрольные вопросы (ответить письменно)

1. Какие алгоритмы называют вспомогательными?

2. Какое количество вспомогательных алгоритмов может присутствовать в основном алгоритме?

3. Можно ли вспомогательные алгоритмы, написанные для решения данной задачи, использовать при решении других задач, где их применение было бы целесообразно?

4. Какие параметры называют формальными? фактическими?

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

6. Может ли фактических параметров процедуры (функции) быть больше, чем формальных? А меньше?

7. Существуют ли подпрограммы без параметров?

8. Существуют ли ограничения на число параметров подпрограмм? Если нет, то чем же всё-таки ограничивается это количество в Turbo Pascal?

9. В каком разделе объявляются и реализуются подпрограммы в Turbo Pascal?

10. Какие виды формальных параметров существуют? Чем они отличаются друг от друга?

11. В чём состоит отличие процедур и функций?

12. В каких случаях целесообразно использовать функции?




Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2016-02-16 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: