![]() Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву ![]() Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Механизм передачи параметровСодержание книги
Поиск на нашем сайте
Как было показано в приведенных выше примерах программ с использованием процедур и функций, в заголовке процедуры или функции может быть задан список параметров, которые называются формальными. Название "формальные" эти параметры получили в связи с тем, что в этом списке заданы только имена для обозначения исходных данных и результатов работы процедуры, а при вызове подпрограммы на их место будут подставлены конкретные значения (выражений) и имен. Этот список указывается после имени подпрограммы и заключается в круглые скобки. В списке формальных параметров должны быть перечислены имена формальных параметров и их типы. Имя параметра отделяется от типа двоеточием, а параметры друг от друга - точкой с запятой. Имена параметров одного типа можно объединять в подсписки, в которых имена отделяются друг от друга запятой. Между формальными и фактическими параметрами должно быть полное соответствие: • формальных и фактических параметров должно быть одинаковое количество • порядок следования фактических и формальных параметров должен быть один и тот же; • тип каждого фактического параметра должен совпадать с типом соответствующего формального параметра. Параметры-значения. Параметры-значения используются только для передачи исходных данных из основной программы в подпрограмму (процедуру или функцию), в списке формальных параметров они перечисляются через запятую с обязательным указанием их типов, как было, например, в выше приведенных примерах: procedure Abort(Msg: string); function Step(N: integer; X: real): real; Если формальный параметр объявлен как параметр-значение, то фактическим параметром может быть произвольное выражение. При вызове подпрограммы фактические параметры вычисляются и используются как начальные значения формальных параметров, т. е. осуществляется подстановка значений. Если формальный параметр определен как параметр-значение, то перед вызовом процедуры это значение вычисляется, полученный результат помещается во временную память и передается процедуре. Даже если фактический параметр - простейшее выражение в виде константы или переменной, все равно процедуре будет передана лишь копия этой константы (переменной). В процессе выполнения подпрограммы формальные параметры могут изменяться, но это никак не отразится на соответствующих фактических параметрах-переменных, которые сохранят те значения, которые имели до вызова подпрограммы, так как меняются не они, а их копия. Поэтому параметры-значения нельзя использовать для передачи результатов из подпрограммы в основную программу.
Пример программы с использованием передачи параметров по значению: program Pr1; var А,В: real; {Процедура вычисления квадратов двух чисел и вывода на экран их суммы} procedure Sum_Square(X, Y: real); {X,Y - формальные параметры} begin Х:=Х*Х; Y:=Y*Y; Writeln('Cyммa квадратов = ',X+Y); end; {Конец процедуры} begin {Начало основной программы} А:=1.5; В:=3.4; Sum_Square (А,В); {Вызов процедуры Sum_Square с передачей ей значений фактических параметров А и В} end. При вызове процедуры Sum_Square с фактическими параметрами А, В значения этих параметров (один раз) копируются в соответствующие формальные параметры X, Y, и дальнейшие преобразования формальных параметров X,Y внутри процедуры Sum_Square уже никак не влияют на значения переменных А, В. Параметры-переменные. Параметры-переменные используются для определения результатов выполнения процедуры и в списке формальных параметров перечисляются после зарезервированного слова Var с обязательным указанием типа. Каждому формальному параметру, объявленному как параметр-переменная, должен соответствовать фактический параметр в виде переменной соответствующего типа, например: procedure Example(var M,N: integer; var Y: real); Если формальный параметр определен как параметр-переменная, то при вызове процедуры ей передается сама переменная, а не ее копия, и изменение параметра-переменной приводит к изменению фактического параметра в вызывающей программе. Следовательно, исходные данные в процедуру из программы могут передаваться как через параметры-значения, так и через параметры-переменные, а результаты работы процедуры возвращаются в вызывающую программу только через параметры-переменные. Пример программы, использующей параметры-переменные: program Sum_Sub_Square; var A,В: real; SumAB, SubAB: real; {Процедура с параметрами-переменными Sum, Sub} procedure Sum_Sub(X,Y: real; var Sum, Sub: real); begin Sum:=X*X+Y*Y; Sub:=X*X-Y*Y; end; {Конец процедуры} begin {Начало основной программы} А:=1.5; В:=3.4; Sum_Sub(A,B, SumAB,SubAB); {Вызов процедуры с передачей ей фактических параметров-значений А, В и параметров-переменных SumAB, SubAB}
Writeln('Сумма квадратов чисел',А,' и ',В,'= ', SumAB); Writeln("Разность квадратов чисел',А,’и',В,'=', SubAB); end. Порядок выполнения работы 1. Изучить теоретические сведения по теме: “Написание программы на Паскале с использованием процедур, определенных пользователем”. 2. Получить индивидуальное задание у преподавателя и разработать программу в соответствии с поставленной задачей. 3. Показать работающую программу преподавателю. 4. Ответить на контрольные вопросы. Контрольные вопросы 1. Описание процедуры. Общая структура. 2. Формальные, фактические параметры. 3. Параметры – значения, параметры – переменные. 4. Примеры программ с использованием процедур, определенных пользователем.
Лабораторная работа № 16 Написание программы на Паскале с использованием рекурсии
Цель работы: формирование знаний и умений по работе с подпрограммами. Приобретение навыков написания программ с использованием рекурсивных процедур и функций. Краткие теоретические сведения Рекурсии Рекурсия — это такой способ организации вычислительного процесса, при котором процедура или функция в ходе выполнения составляющих ее операторов обращается сама к себе. Примером программы с использованием рекурсии может быть программа вычисления факториала числа. (Факториалом натурального числа n называют произведение чисел 1*2*...*n.) {Вычисление факториала числа п с использованием рекурсивной функции} program Demo_Rekurs; var N: integer; F: longint; {Описание функции, N — формальный параметр-значение типа integer, результат выполнения функции типа longint}. function Fakt(N: integer): longint; begin {Начало вычисления функции} if N=1 then Fakt:=1 {Проверка условия завершения рекурсии} else Fakt:=N*Fakt(N-1); {Рекурсивное вычисление N!} end; begin {Начало главной программы} Writeln('Введите число N: '); Read(N); F:=Fakt(N); {Вызов функции для фактического параметра N} Writeln('Для числа',N,'значение факториала= ', F); end. После запуска программы на экран выводится запрос: "Введите число N: ", затем с клавиатуры считывается значение целого числа N и в выражении F:=Fakt(N) вызывается функция Fakt с параметром-значением N. В подпрограмме-функции вычисления факториала проверяется условие N=1. Если оно выполняется, то функции Fakt присваивается значение 1, на этом выполнение подпрограммы-функции завершается. Если условие N=1 не соблюдается, то выполняется вычисление произведения N*Fakt(N-1). Вычисление произведения носит рекурсивный характер, так как при этом осуществляется вызов функции Fakt(N-1), значение которой вычисляется, в свою очередь, через вызов функции Fakt, параметром которой также будет функция Fakt, и т. д., до тех пор, пока значение формального параметра N=1. Так как базовая часть описания рекурсивной функции Fakt определяет значение Fakt для N=1, равным единице, то рекурсивные вызовы функции Fakt больше не выполняются, а наоборот, выполняется вычисление функции Fakt для чисел, возрастающих от 1 до N, причем функция Fakt всякий раз возвращает значение, равное произведению очередного k-гo числа на факториал от k-1-го числа. Последнее возвращение результата вычисления функции Fakt присвоит переменной F значение произведения всех чисел от 1 до N, т. е. факториал числа N. Вывод. При выполнении рекурсивной подпрограммы осуществляется многократный переход от некоторого текущего уровня организации алгоритма к нижнему уровню последовательно до тех пор, пока, наконец, не будет получено тривиальное решение поставленной задачи. В рассмотренном выше примере решение при N=1 тривиально, т.е. Fakt=l. Затем осуществляется возврат на верхний уровень с последовательным вычислением значения функции Fakt.
Следует учитывать, что использование рекурсивной формы организации алгоритма обычно выглядит изящнее итерационной и дает более компактный текст программы, но при выполнении, как правило, медленнее и может вызвать переполнение стека. Это объясняется тем, что при каждом входе в подпрограмму ее локальные переменные размещаются в особым образом организованной области памяти, называемой программным стеком.
|
|||||||
Последнее изменение этой страницы: 2016-08-12; просмотров: 280; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.19.238.155 (0.01 с.) |