Каждый современный человек владеет ноутбуком, но как самому убрать возникающие...
![Пропал звук на ноутбуке — что делать?](https://i0.wp.com/sovets.net/photos/uploads/120/8110495-2razrabotanyi-spetsialnyie-programmyi-kotoryie-testiruyut-audio-drayveryi-soundcheck.jpg)
Чтобы пользоваться предварительным просмотром презентаций создайте себе аккаунт (учетную запись) Google и войдите в него: https://accounts.google.com
Процедуры и функции в Паскале. Рекурсия Выполнил учитель информатики ГБОУ школа 1362 Санина Марина Сергеевна
Подпрограмма - автономная часть программы, выполняющая определенный алгоритм и допускающая обращение к ней из различных частей общей программы. Использование подпрограмм позволяет реализовать один из самых современных методов программирования - структурное программирование.
Подпрограммы процедура функция PROCEDURE FUNCTION
Процедуры и функции в Паскале объявляются в разделе описания за разделом переменных.
У функций и процедур существуют параметры (переменные, которые передают какое - либо значение). Они бывают двух видов: 1) Формальные - те, которые находятся в описании подпрограммы 2) Фактические - те, которые передаются из основной программы в функцию или процедуру. Фактические параметры должны соответствовать формальным по количеству, порядку следования и типу.
Также у подпрограммы существую переменные. с которыми она в дальнейшем работает. Они делятся опять же на два типа: 1) Глобальные переменные, то есть действующие во всей программе 2) Локальные - те, которые действуют только в процедуре или функции
Процедуры Используются в случаях, когда в подпрогра м ме необходимо получить несколько результатов. Существует два вида процедур: с параметром; б ез параметра.
Структура процедуры аналогична структуре программы и состоит из заголовка и блока (тела процедуры). procedure ИмяПроцедуры; var … begin …//Тело процедуры end ; begin //тело главной программы end .
Процедуры без параметров procedure pr; var i: integer ; begin for i:=1 to 60 do write (‘ * "); writeln ; end . begin pr ; end. Данная программа выводит строку из 60 звездочек.
Процедура с параметром. Составить программу обмена местами двух чисел с=5 и d=7 program obmenDan ; var c,d:integer ; procedure obmen (a,b:integer); var m:integer; begin m:=a; a:=b; b:=m; writeln (a,b); end; begin writeln (" Введите 2 числа: "); readln (c,d); obmen (c,d) ; writeln (c," ",d); End.
Разбор задачи 1) при вызове процедуры obmen с двумя параметрами 5 и 7, в переменные a и b помещаются тоже числа 5 и 7 соответственно: с 5 d 7 a 5 b 7
Для того чтобы переменные c и d , a и b ссылались на одни и те же ячейки памяти (если изменятся значения a и b , то изменятся значения и c , d) необходимо при описании формальных параметров, перед нужными переменными добавить слово VAR: procedure obmen (var a,b:integer); с 5 d 7 a b
Функции Набор встроенных функций в языке Паскаль достаточно широк (ABS, SQR, TRUNC и т.д.). Если в программу включается новая, нестандартная функция, то ее необходимо описать в тексте программы, после чего можно обращаться к ней из программы. Обращение к функции осуществляется в правой части оператора присваивания, с указанием имени функции и фактических параметров. Функция может иметь собственные локальные константы, типы, переменные, процедуры и функции. Описание функций в Паскале аналогично описанию процедур.
Отличительные особенности функций: - результат выполнения - одно значение, которое присваивается имени функции и передается в основную программу; - имя функции может входить в выражение как операнд.
Описание функции: function () : тип; { раздел описания локальных имён } Begin { раздел выполняемых операторов } :=; { обязательный параметр } End;
Вызов функции: := (); 1 . В правой части оператора присваивания. 2. В выражении, стоящем в условии оператора разветвления. 3. В процедуре вывода, как результат работы функции.
Рекурсия Процедуры и функции в Паскале могут вызывать сами себя, т.е. обладать свойством рекурсивности. Рекурсивная функция обязательно должна содержать в себе условие окончания рекурсивности, чтобы не вызвать зацикливания программы. При каждом рекурсивном вызове создается новое множество локальных переменных. То есть переменные, расположенные вне вызываемой функции, не изменяются.
Составить рекурсивную функцию, вычисляющую факториал числа n следующим образом: n ! = 1 , если n= 1 n!= (n -1)! · n , если n > 1
function f (n: integer): integer ; begin if n = 1 then f:= 1 else f:= n * f (n -1); {функция f вызывает саму себя} end ;
Задания Поменять значения переменных a, b, c так, чтобы они были расположены в порядке неубывания (a ≤ b ≤ c). Дано n целых чисел. Найти среди них число, у которого сумма цифр имеет максимальное значение.
Рекурсия в Паскале Учитель: Тлехурай Ю.В. МОУ «Лицей №8» Что вы видите на картинах? Это явление в искусстве называется рекурсией «Чтобы понять рекурсию, нужно сначала понять рекурсию.» рекурсия - частичное определение объекта через себя, определение объекта с использованием ранее определённых. Научно выражаясь: Рекурсия - метод определения класса объектов или методов предварительным заданием одного или нескольких (обычно простых) его базовых случаев или методов, а затем заданием на их основе правила построения определяемого класса. Питер Дойч Питер Дойч
Итерация от человека.
Рекурсия – от Бога.
Рекурсия в физике Рекурсия в языке и литературе Классическим примером бесконечной рекурсии являются два поставленные друг напротив друга зеркала : в них образуются два коридора из затухающих отражений зеркал. Другим примером бесконечной рекурсии является эффект самовозбуждения (положительной обратной связи) у электронных схем усиления , когда сигнал с выхода попадает на вход, усиливается, снова попадает на вход схемы и снова усиливается. Усилители, для которых такой режим работы является штатным, называются автогенераторы. Пример рекурсивной словарной статьи: «У попа была собака…» - типичная рекурсия Несколько рассказов Станислава Лема посвящены казусам при бесконечной рекурсии: Рассказ о сепульках («Звёздные дневники Йона Тихого»), в котором герой последовательно переходит от статьи о сепульках к статье о сепуляции, оттуда к статье о сепулькариях, в которой снова стоит отсылка к статье «сепульки». Рассказ о разумной машине, которая обладала достаточным умом и ленью, чтобы для решения поставленной задачи построить себе подобную, и поручить решение ей (итогом стала бесконечная рекурсия, когда каждая новая машина строила себе подобную и передавала задание ей). Рекурсия в программировании - это такой способ организации вычислительного процесса, при котором процедура или функция в ходе выполнения составляющих ее операторов обращается сама к себе. Для того, чтобы такое обращение не было бесконечным, в тексте подпрограммы должно быть условие, по достижению которого дальнейшего обращения не происходит. таким образом, рекурсивное обращение может включаться только в одну из ветвей подпрограммы. Пример. Вычисление факториала натурального числа Составить рекурсивную функцию, вычисляющую факториал числа n следующим образом: function f (n: integer): longint; begin if n = 1 then f:= 1 else f:= n * f(n -1); { функция fвызывает саму себя} end Программа на Паскале используя рекурсию: Var n: integer; a: longint; function factorial (n: integer): longint; begin if n = 1 then factorial:= 1 else factorial:= n * factorial (n -1); End; Begin Write(‘n=’); Readln(n); A:= factorial (n); Write (‘n!=’,a); Readln; end. Леонардо Пиза́нский ФибоначчиЧисла Фибоначчи – это элементы числовой последовательности
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, …, в которой каждое последующее число равно сумме двух предыдущих.
Задача: Вывести на экран ряд чисел Фибоначчи, состоящий из n элементов. Описание переменных: n – количество элементов ряда; a, b – значения двух последних элементов ряда; c – буферная («запасная») переменная; i – счетчик. Алгоритм решения задачи: 1. Получить значение n. 2. Присвоить a и b значения 0 и 1 соответственно (это первые числа ряда Фибоначчи). Вывести их на экран. 3. Начиная с 3-го элемента по n: a) выводить на экран сумму a и b, b) сохранить значение переменной b в c, c) записать в b сумму a и b, d) присвоить a значение с. Программа на языке Паскаль используя итерацию: program Fibonacci; var a,b,c,i,n: integer; begin write("n = "); readln(n); a:= 0; write(a," "); b:= 1; write(b," "); for i:=3 to n do begin write(a+b," "); c:= b; b:= a + b; a:= c; end; readln; end. Программа на языке Паскаль используя рекурсию: Рекурсивное определение для вычисления чисел Фибоначчи выглядит следующим образом: Это определение чисел Фибоначчи легко преобразовать в рекурсивную функцию: function f(n: Integer) : longint; begin If n <= 1 Then f:= n else f:= f(n– 1) + f(n - 2); end; Program chislaFibonacci; var n,i: integer; a: longint; function fib (n: integer): longint; begin If n <= 1 Then fib:= n else fib:= fib(n– 1) + fib(n - 2); End; begin write(‘n=’); readln(n); for i:=0 to n do begin A:= fib (n); write (‘ ’,a); end; readln; end. Домашнее задание Написать программу нахождения НОД двух натуральных чисел, используя алгоритм Евклида и рекурсию Даны два натуральных числа а и b. Если а = b, то нод (а ,b)=а. Если а >b, то нод (а ,b)= нод (а -b ,b). Если а < b, то нод (а ,b)= нод (а ,b-а). Program noddvyxchisel; var a,b: longint; function nod(a,b:longint): longint; begin If a = b Then nod:= a else if a>b then nod:= nod(a-b,b) else nod:= nod(a,b-a) End; begin write(‘a=’); readln(a); write(‘b=’); readln(b); A:= nod(a,b); write(‘nod=’,a); readln; end. Задача о Ханойских башнях. При этом неукоснительно должны соблюдаться следующие правила:
На одном из трех алмазных шпилей надето 64 круглых золотых диска. Диски имеют разные радиусы и расположены на шпиле в порядке убывания радиусов от основания к вершине. Требуется перенести диски с первого шпиля на второй, используя при необходимости и третий шпиль.
Задача. Составить рекурсивную программу, которая бы решала поставленную выше задачу о Ханойских башнях при количестве дисков, равном n (n = 1, 2, …). Решение. Введем имена для шпилей: a, b, c . Пусть hanoi(n,a,b,c) - искомая функция, возвращающая последовательность перемещений дисков с a на b c использованием c по вышеописанным правилам. При n=1 решать задачу мы умеем. Необходимо просто произвести операцию “переместить a на b ”. Предположим, что мы умеем решать эту задачу для n – 1 диска. Переместим n–1 диск с a на с . Далее, переместим один оставшийся диск с a на b и, наконец, переместим n–1 диск с c на b . Входные данные : количество дисков, находящихся на колышке a; Выходные данные : последовательность действий; Шаг0:{определение типа переменных}; Шаг1:{описание процедуры hanoi, которая выводит последовательность действий}; Шаг1.1:{переместить (n-1) дисков с колышка a на колышек b}; Шаг1.2:{переместить n-ый диск с a на c}; Шаг1.3:{переместить (n-1) диск с b на c}; (шаги 1.2-1.3 выполняются рекурсивно); Шаг2:{основная программа}; Шаг2.1:{ввод количества дисков}; Шаг2.2:{вызов процедуры hanoi}. Решение задачи в Паскале Program bahnya; var n: integer; a,b,c: char; procedure hanoi(n: integer;a,b,c: char); begin if n>0 then begin hanoi(n-1,a,c,b); writeln ("Peremestit disk so sterzhnya ",a," na sterzhen" ",b); hanoi(n-1,c,b,a); end; end; Begin write ("Vvedite naturalnoe chislo n"); readln (n); a:="a"; b:="b"; c:="c"; hanoi (n,a,c,b); readln; end. Домашнее задание Написать программу вычисления степени с натуральным показателем Дано: основание степени х Показатель степени к Если к=0, тогда степень(к,х)=1, Иначе степень (к,х)= х· степень (к-1,х) Program stepen; var y: real; n: integer; function step(k:integer, x:real): real; begin If k = 0 Then step:= 1 else step:= x * step(k-1,x) End; begin write(‘vvedite osnovanie stepeni x=’); readln(y); write(‘vvedite pokazatel stepeni k=’); Readln(n); write(‘x v stepeni k=’,step(n,y)); readln; end. Самостоятельная работа
program perevod;
procedure dvd(n:longint);
If n >1 Then dvd (n div 2);
write (n mod 2);
Подпрограммы Часто в задаче требуется повторить определенную последовательность операторов в разных частях программы. Для того, чтобы описывать эту последовательность один раз, а применять многократно, в языках программирования применяются подпрограммы. Подпрограмма - специальным образом оформленный блок программы, для дальнейшего его многократного использования в основной программе Использование подпрограмм позволяет реализовать один из самых современных методов программирования - структурное программирование
Подпрограммы решают три важные задачи, значительно облегчающие программирование: 1.избавляют от необходимости многократно повторять в тексте программы аналогичные фрагменты, т.е. сократить объём программы; 2.улучшат структуру программы, облегчая понимание при разборе; 3.уменьшают вероятность появления ошибок, повышают устойчивость к ошибкам программирования и непредвиденным последствиям при модификации.
Процедуры и функции В языке Паскаль существует два вида подпрограмм: процедура (PROCEDURE) и функция (FUNCTION). Процедуры и функции в Паскале объявляются в разделе описания за разделом переменных. Program ИмяПрограммы; VAR … // раздел описания переменных главной программы; procedure ИмяПроцедуры; var … begin …//Тело процедуры end; begin //тело главной программы end.
У функций и процедур существуют параметры (переменные, которые передают какое - либо значение). Они бывают двух видов: 1) Формальные - те, которые находятся в описании подпрограммы 2) Фактические - те, которые передаются из основной программы в функцию или процедуру. Фактические параметры должны соответствовать формальным по количеству, порядку следования и типу.
Процедуры Процедуры используются в случаях, когда в подпрограмме необходимо получить несколько результатов. В языке Паскаль существует два вида процедур: процедуры с параметрами и без параметров. Обращение к процедуре осуществляется по имени процедуры, за которым могут быть указаны фактические параметры. При вызове процедуры устанавливается взаимно однозначное соответствие между фактическими и формальными параметрами, затем управление передается процедуре. После выполнения процедуры управление передается следующему, после вызова процедуры, оператору вызывающей программы.
Пример 1. Процедура без параметров, которая печатает строку из 60 звездочек. procedure pr; var i: integer ; begin for i:=1 to 60 do write (* "); writeln; end; begin pr; end.
Пример 2. Составить программу обмена местами двух чисел с=5 и d=7 program obmenDan; var c,d:integer; procedure obmen (a,b:integer); var m:integer; begin m:=a; a:=b; b:=m; writeln(a,b); end; begin writeln ("Введите 2 числа: "); readln(c,d); obmen(c,d); writeln(c," ",d); end. с5 d 7 a 5 b 7 1) при вызове процедуры obmen с двумя параметрами 5 и 7, в переменные a и b помещаются тоже числа 5 и 7 соответственно: 2) далее в процедуре осуществляется перестановка значений ячеек памяти a и b: с5 d 7 a 7 b 5 3) но в переменных c и d данные не поменялись, т.к. они находятся в других ячейках памяти
Для того чтобы переменные c и d, a и b ссылались на одни и те же ячейки памяти (если изменятся значения a и b, то изменятся значения и c, d) необходимо при описании формальных параметров, перед нужными переменными добавить слово VAR: procedure obmen (var a,b:integer); с5 d 7 a b
Пример 3. Даны 3 различных массива целых чисел (размер каждого не превышает 15). В каждом массиве найти сумму элементов и среднеарифметическое значение. program proc; var i, n, sum: integer; sr: real; procedure work (r:integer; var s:integer; var s1:real); var mas: array of integer ; j: integer; begin s:=0; for j:=1 to r do begin read (mas[j]); s:=s+mas [j]; end; s1:=s/r; end;
{ главная программа} begin for i:=1 to 3 do begin write ("Vvedite razmer ",i, " masiva: "); readln(n); work (n, sum, sr); {вызов процедуры work} writeln ("Summa elementov = ",sum); writeln ("Srednearifmeticheskoe = ",sr:4:1); end; end.
Результат работы программы: В программе трижды вызывается процедура work, в которой формальные переменные r, s, s1 заменяются фактическими n, sum, sr. Процедура выполняет ввод элементов массива, вычисляет сумму и среднее значение. Переменные s и s1 возвращаются в главную программу, поэтому перед их описанием ставится служебное слово var. Локальные параметры mas, j действуют только в процедуре. Глобальные - i, n, sum, sr доступны во всей программе.
Функции в Паскале Набор встроенных функций в языке Паскаль достаточно широк (ABS, SQR, TRUNC и т.д.). Если в программу включается новая, нестандартная функция, то ее необходимо описать в тексте программы, после чего можно обращаться к ней из программы. Обращение к функции осуществляется в правой части оператора присваивания, с указанием имени функции и фактических параметров. Функция может иметь собственные локальные константы, типы, переменные, процедуры и функции. Описание функций в Паскале аналогично описанию процедур.
Пример 4. Написать подпрограмму-функцию степени а x, где a, х – любые числа. Воспользуемся формулой: а x = e x ln a program p2; var f, b, s, t, c, d: real; { глобальные переменные} function stp (a, x: real) : real; var y: real; { локальные переменные} begin y:= exp (x * ln (a)) ; stp:= y;{присвоение имени функции результата вычислений подпрограммы} end; { описание функции закончено } begin d:= stp (2.4, 5); {вычисление степеней разных чисел и переменных} writeln (d, stp (5,3.5)); read (f, b, s, t); c:= stp (f, s)+stp (b, t); writeln (c); end.
Функции Подпрограмма часть программы, оформленная в виде отдельной синтаксической конструкции и снабжённая именем (самостоятельный программный блок), для решения отдельных задач. Описание процедуры: procedure () {раздел выполнения локальных имён} Begin {раздел выполнения операторов} End; Описание функции: function (): тип; {раздел описания локальных имён} Begin {раздел выполняемых операторов} := ; {обязательный параметр} End; Вызов процедуры: (); Вызов функции: := (); 1. В правой части оператора присваивания. 2. В выражении, стоящем в условии оператора разветвления. 3. В процедуре вывода, как результат работы функции. Описание подпрограмм Процедуры
Рекурсия Процедуры и функции в Паскале могут вызывать сами себя, т.е. обладать свойством рекурсивности. Рекурсивная функция обязательно должна содержать в себе условие окончания рекурсивности, чтобы не вызвать зацикливания программы. При каждом рекурсивном вызове создается новое множество локальных переменных. То есть переменные, расположенные вне вызываемой функции, не изменяются.
1 function f (n: integer): integer; begin if n = 1 then f:= 1 else f:= n * f (n -1); {функция f вызывает сам" title="Пример 5. Составить рекурсивную функцию, вычисляющую факториал числа n следующим образом: n! = 1, если n= 1 n!= (n -1)! · n, если n > 1 function f (n: integer): integer; begin if n = 1 then f:= 1 else f:= n * f (n -1); {функция f вызывает сам" class="link_thumb"> 19 Пример 5. Составить рекурсивную функцию, вычисляющую факториал числа n следующим образом: n! = 1, если n= 1 n!= (n -1)! · n, если n > 1 function f (n: integer): integer; begin if n = 1 then f:= 1 else f:= n * f (n -1); {функция f вызывает саму себя} end; 1 function f (n: integer): integer; begin if n = 1 then f:= 1 else f:= n * f (n -1); {функция f вызывает сам"> 1 function f (n: integer): integer; begin if n = 1 then f:= 1 else f:= n * f (n -1); {функция f вызывает саму себя} end;"> 1 function f (n: integer): integer; begin if n = 1 then f:= 1 else f:= n * f (n -1); {функция f вызывает сам" title="Пример 5. Составить рекурсивную функцию, вычисляющую факториал числа n следующим образом: n! = 1, если n= 1 n!= (n -1)! · n, если n > 1 function f (n: integer): integer; begin if n = 1 then f:= 1 else f:= n * f (n -1); {функция f вызывает сам"> title="Пример 5. Составить рекурсивную функцию, вычисляющую факториал числа n следующим образом: n! = 1, если n= 1 n!= (n -1)! · n, если n > 1 function f (n: integer): integer; begin if n = 1 then f:= 1 else f:= n * f (n -1); {функция f вызывает сам">
Подпрограммы в Turbo Pascal
Причины использования подпрограмм
Виды подпрограмм
процедуры
функции
Процедуры без параметров
procedure ;
end ;
Пример . Составить программу нахождения объёма цилиндра.
Program cylinder;
Var R, H, V: real;
Procedure Input ; { процедура ввода данных }
Writeln (’введите значение радиуса’);
writeln (’введите значение высоты’);
Procedure formula; { процедура вычисления объёма }
V: =PI*sqr(R)*H;
Procedure Output ; { процедура вывода результатов }
writeln (’V=’,V);
Процедуры c параметрами
Процедуры c параметрами
Пример .
Program zadacha;
Var a, b: integer;
Procedure lokal;
Var a, x: char; Для процедуры lokal:
begin переменная x – локальная переменная
a:=’! ’; (программа не может изменить её значение)
b:= b +1; переменная b – глобальная переменная
end ; (все изменения значения этой переменной в процедуре
BEGIN сохраняются и после выхода из процедуры)
b:=100; переменная a в основной программе – целого типа,
lokal ; а в процедуре – символьного типа. Переменная а
writeln (’ a =’, a); целого типа недоступна в процедуре lokal .
writeln (’b=’,b);
Результат выполнения программы: а=0; b =101.
Передача параметров в Turbo Pascal
procedure (:
переменной);
end ;
Пример .
Program parametr;
Var m, n: integer;
Procedure summa (a, b: integer);
writeln (’S=’,S);
summa (m,n); или summa (100,10);
Переменные a и b являются формальными параметрами, а переменные m и n - фактическими. Значения фактических параметров m =100 и n =10 передаются формальным параметрам a и b .
Изменения фактических параметров происходит только внутри процедуры и не влияют на них вне данной процедуры.
Передача параметров в Turbo Pascal
procedure (:
переменной; Var
переменной:);
end ;
Var a1,b1,c1,a2,b2,c2, min1, min2, S: real;
Procedure minimum (a,b,c: real; Var min: real);
if min b then min:= b;
if min c then min:= c;
writeln (’введите три числа’);
readln (a1, b1, c1);
writeln (’ введите три числа ’);
readln (a2,b2,c2);
minimum (a1,b1,c1, min1);
minimum (a2,b2,c2, min2);
S:= min1 + min 2;
writeln (’S=’, S);
Пример . Даны две тройки чисел: a 1, b 1, c 1 и a 2, b 2, c 2. Найти значение суммы: S=min (a1, b1, c1) + min (a2, b2, c2)
Функция – это подпрограмма, результатом работы которой является некоторое значение.
function (:
end ;
Program vyrazenie;
function modul (a: real) : real;
writeln (’введите значение переменной’);
y:= modul (x-3) + modul (x+6);
writeln (’y=’, y);
Пример . Вычислить значение выражения: y = | x -3 | + | x +6 |
Cлайд 1
Cлайд 3
Cлайд 4
Cлайд 5
Cлайд 6
Cлайд 7
Cлайд 8
Cлайд 9
Cлайд 10
Cлайд 11
Cлайд 12
Cлайд 13
Cлайд 14
Cлайд 15
Cлайд 16
Cлайд 17
Cлайд 18
Cлайд 19