Write(K:6);

end;

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

S:=0; S:=0;

for I:=1 to M do for J:=1 to N do

for J:=1 to N do for I:=1 to M do

S:=S+A[I, J]; S:=S+A[I, J];

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

Вариант 1 (правильный) Вариант 2 (неправильный)

for I:=1 to M do for J:=1 to N do

begin begin

S:=0; S:=0;

for J:=1 to N do for I:=1 to M do

S:=S+A[I, J]; S:=S+A[I, J];

WriteLn(S:7:2); WriteLn(S:7:2);

end; end;

Лабораторная работа 6

НЕ нашли? Не то? Что вы ищете?

Программирование с использованием подпрограмм.

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

например, у стандартных подпрограмм Sin(X) или Abs(X)). Преимущества использования подпрограмм проявляются также при разработке больших программ, так как становится возможным распараллелить процесс создания программного продукта, поручив разработку отдельных подпрограмм разным исполнителям, и, что более важно, упростить процесс написания и отладки. Разбиение программы на подпрограммы производится прежде всего по функциональному признаку: подпрограмма должна реализовывать одну, но законченную функцию. При этом надо стремиться к сокращению количества межпрограммных связей (количеству передаваемых параметров). Рекомендуемый размер подпрограммы составляет 10-60 строк текста. В языке Object Pascal используются два вида подпрограмм функции и процедуры. При общих принципах оформления функции обладают дополнительными возможностями. Поэтому сначала рассмотрим объявление и использование процедур, а затем особенности функций.  Процедуры. При работе с подпрограммами следует различать термины объявление подпрограммы (описание подпрограммы) и обращение к подпрограмме (вызов подпрограммы). Объявление подпрограммы содержит ее имя и описывает процесс обработки данных, представленных параметрами (пока будем считать так, следуя рекомендациям структурного программирования). В объявлении подпрограммы параметры называют формальными. Имя подпрограммы задает ее разработчик, и оно должно быть уникальным в своем блоке. Обращение к подпрограмме выполняется по ее имени и описывает данные (фактические параметры), обработку которых она должна выполнить. Выполнение обращения приводит к передаче управления подпрограмме. Вызовов одной подпрограммы может быть несколько, а фактические параметры в них разными. Объявления подпрограмм и их вызовы должны оформляться в соответствии с правилами, которые будут представлены в виде синтаксических диаграмм. Имя процедуры строится так же, как и прочие имена в языке Object Pascal. Блок процедуры, как и блок основной программы, может содержать объявления меток, констант, типов, переменных, подпрограмм и обязательно составной оператор (begin.... end), представляющий алгоритм. Список формальных параметров содержит имена, используемые в теле подпрограммы для описания процесса обработки данных.

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

Пример объявления и вызова процедуры, выводящей на экран первое из двух значений, представленных параметрами, кратное 5, или сообщение, что кратных нет:

//Объявление процедуры

procedure PutMod5(I, J:Integer);

// I и J. формальные параметры

begin

if I mod 5 = 0 then

WriteLn(I)

else if J mod 5 = 0 then

WriteLn(J)

else

WriteLn('Нет параметров, кратных 5');

end;

. . . . .

begin // РАЗДЕЛ ОПЕРАТОРОВ ПРОГРАММЫ

. . . . .

//Вызов процедуры

PutMod5(A+3, B);//A+3 и B. фактические параметры

. . . . .

end.

Рассмотрим на конкретных значениях переменных A и B, что

будет выведено подпрограммой:

при A = 2 и B = 10 будет выведено значение 5;

при A = 3 и B = 10 будет выведено значение 10;

при A = 3 и B = 11 будет выведен текст «Нет параметров, кратных 5».

Тип в объявлении формального параметра пока будем считать обязательным и задавать только именем ранее объявленного или стандартного типа (другие возможности будут рассмотре-

ны позже). Прежде чем перейти к пояснению правил объявления формальных параметров, введем в рассмотрение два термина: входной параметр и выходной параметр. Параметр считается входным, если он представляет исходные данные для счета по алгоритму подпрограммы (в рассмотренном примере оба параметра являяются входными). Параметр считается выходным, если он представляет результаты счета по подпрограмме. Допускается, что один и тот же параметр может одновременно представлять и исходные данные, и результат, т. е. быть одновременно и входным, и  выходным. В языке Object Pascal рассмотренное функциональное деление параметров (на входные, выходные, входные-выходные) дополнено механизмами реализации их функций, отраженными в правилах объявления формальных параметров. Сначала рассмотрим два вида объявлений параметров: параметры-значения и параметры-переменные. Параметры-значения всегда являются только входными параметрами. Соответствующими фактическими параметрами могут быть выражения (в частности, константы и переменные). При вызове подпрограммы выражения вычисляются и полученные значения заносятся (а значения констант и переменных просто копируются) в ячейки памяти, представленные соответствующими формальными параметрами, значения которых внутри подпрограммы можно изменять. Механизм параметров-значений таков, что эти изменения никак не отразятся на значениях фактических параметров, т. е. после выхода из подпрограммы они останутся неизменными. Таким образом, формальный параметр-значение можно рассматривать как переменную, известную внутри подпрограммы, а механизм таких параметров. как защиту фактических параметров, если они переменные, от непреднамеренного изменения.

Объявление параметров-значений дается просто их именем (списком имен через запятую) и типом (без предшествующих слов var, const, out). В рассмотренной процедуре PutMod5 оба па-

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

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

Объявление параметров-переменных дается с предшествующим их имени (списку имен) словом var и типом. Пример процедуры, умножающей данные в первых n ячейках массива Mas на дробную часть числа R (все участвующие в обработке данные должны передаваться через параметры):

type tMas=array[1..8] of Real;

. . . . .

//Объявление процедуры

procedure MasMulR(R:Real; N:Integer; var Mas:tMas);

var

i:Integer;

begin

R:=Frac(R);//Получить дробную часть R

for i:=1 to N do

Mas[i]:=Mas[i]*R;

end;//MasMulR. конец текста процедуры

. . . . .

var

X:tMas=(1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0);

Z:Real=3.4;

. . . . .

begin // РАЗДЕЛ ОПЕРАТОРОВ ПРОГРАММЫ

. . . . .

MasMulR(Z,5,X);//Вызов процедуры

. . . . .

end.

В этом примере Mas является и входным, и выходным, поэтому он объявлен как параметр-переменная (с предшествующим словом var). Параметр R. только входной. Так как он объявлен

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

менится значение соответствующего фактического параметра. При указанных в примере начальных значениях переменных после выполнения процедуры переменная Z сохранит свое значение 3.4, а в массиве будут следующие данные: 0.4, 0.8, 1.2, 1.6, 2.0, 6.0, 7.0, 8.0.

Параметры-значения обладают одним недостатком, который может оказаться очень существенным, если параметром является структурная переменная, занимающая большой объем памяти, например, массив. В этом случае подпрограмма, получив управление, должна выделить такой же объем памяти, как фактический параметр, и скопировать в нее данные из фактического параметра. Таким образом, недостаток заключается в том, что нерационально используется память и происходит потеря времени на копирование данных перед началом их обработки по алгоритму подпрограммы. Указанных недостатков лишен другой вид входного параметра, получивший название «параметр-константа». Параметр-константа, как и параметр-значение, служит для представления только входных данных. При его использовании в подпрограмму передается ссылка на фактический параметр (как и для параметра-переменной), но для исключения непреднамеренного изменения во время работы программы уже на этапе компиляции выполняют соответствующие проверки. Исполняемая программа не создается, если подпрограмма содержит операторы, которые могут изменить данные фактического параметра. Объявление параметров-констант дается с предшествующим их имени (списку имен) словом const и типом. Последний вид параметра следует использовать для парамет-

Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 9