Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование_ответы.docx
Скачиваний:
14
Добавлен:
22.09.2019
Размер:
138.16 Кб
Скачать

9. Параметры – переменные. Механизм работы.

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

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

Описание всех формальных параметров как параметров-переменных нежелательно по двум причинам.

  1. Это исключает возможность вызова подпрограммы с фактическими параметрами в виде выражений, что делает программу менее компактной.

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

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

10. Параметры – константы. Механизм работы.

Параметр-константа схож с параметром-переменной: в подпрограмму передается сама константа, но изменение её невозможно. Назначение такого параметра совпадает с назначением параметра-значения. Формальные параметры-константы указываются в заголовке программы после служебного слова const. Его действие распространяется до ближайшей точки с запятой. Оно защищает параметр от изменения и позволяет компилятору создать более оптимальный код для переданных строк и записей. Преимущество – эффективность передачи фактических аргументов, т.к. на вход подпрограммы передаётся только адрес фактической переменной или значения, а не копия. Компилятор не допускает использование в теле подпрограммы операторов, предназначенных для изменения их значения.

11. Рекурсия. Понятия, пример.

Рекурсия— вызов функции (процедуры) из неё же самой, непосредственно или через другие функции. Различают 2 формы рекурсии: прямую и косвенную. При прямой рекурсии процедура содержит оператор обращения к самой себе. При косвенной рекурсии одна процедура вызывает другую, которая сама либо посредством других процедур вызывает исходную процедуру. Количество вложенных вызовов функции или процедуры называется глубиной рекурсии.

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

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

Пример:

var

Form1: TForm1;

A:array[1..10] of integer;

Implementation

Procedure nomer(i:integer; var max,imax:integer);

begin

if i<=10 then

begin

if a[i]>max then

begin

max:=a[i];

imax:=i;

end;

nomer(i+1,max,imax);

end;

end;

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);

var n,i,imax,max:integer;

begin

n:=strtoint(edit1.Text);

for i:=1 to n do

begin

a[i]:=strtoint(memo1.Lines[i-1]);

end;

imax:=1;

max:=a[1];

nomer(2,max,imax);

showmessage(inttostr(imax));

end;

end.