Процедуры и функции
Оценка 4.7

Процедуры и функции

Оценка 4.7
Рабочие тетради
doc
информатика +2
10 кл—11 кл +1
25.04.2017
Процедуры  и  функции
Занятие строится таким образом, что после прослушивания теоретического материала (10 –15 мин.), учащимся предлагается практическое задание, которое выполняется ими за 20 - 30 мин. и корректируется в процессе изучения материала в более сложную задачу по изучаемой теме. Автор сознательно избегал сложных примеров, будучи убежденными, в том, что гораздо важнее для учащихся понимание алгоритмов предлагаемых задач, приобретение навыков разработки алгоритмов, их программирования и выполнения на компьютере в течение одного занятия. Такой подход к изучению языка программирования позволяет сосредоточить внимание на самом процессе программирования, который в данном случае более важен для изучения языка, чем решение сложной задачи, наверняка трудной большинству учащихся. Такие задачи, по мнению авторов, неоправданно занимают большое количество учебного времени, превращая учителя из инициатора процесса обучения в диктатора.
Занятие 14ч1.doc
Процедуры  и  функции        Занятие 14 Понятие подпрограмм.  Процедуры.  Функции. Понятие рекурсии   1. Урок 1.  Понятие подпрограмм. Процедуры. 2. Урок 2.  Функции.  3. Урок 3.  Понятие рекурсии. 4. Контрольные вопросы и упражнения. Понятие подпрограммы впервые было описано Маврисом Уилксом и связано с использованием ЭВМ  EDSAC, созданной   в   Кембриджском   университете,   которая   считается   первой   в   мире     ЭВМ   работающей   по   программе, хранящейся в памяти машины. Введение   подпрограмм   было   необходимым   шагом   на   пути   развития   программирования,   т.к.   давало возможность,   во­первых,   повторять   действия,   описанные   в   подпрограмме,   вызывая   ее   каждый   раз,   когда   это требовалось, со старыми или новыми данными, не описывая эти действия многократно.   Во­вторых, конструировать большие программы из подпрограмм, т.е. по частям, что давало возможность их коллективной разработки. До   сих   пор   были   написаны   программы,   которые   состоят   из   некоторого   числа   инструкций,   выполняемых машиной в некоторой последовательности. Такая программа называется монолитной. Программу же, состоящую из подпрограмм называют модульной. Часто модули такой программы сами состоят из модулей более низкого уровня и т.д. до самого элементарного уровня, т.е. модульная программа имеет иерархическую структуру. В языке Паскаль существует  два типа подпрограмм  или модулей ­ процедуры и функции.  Урок 1.  Понятие  подпрограмм.  Процедуры 1.1. Понятие подпрограмм. 1.2. Процедуры.   1.1.  Понятие подпрограмм Исходя из вышеизложенного, определим подпрограмму как часть программы, которая выполняет, какие либо необходимые действия многократно по мере обращения к ней. Покажем это на примере простой задачи. Задача.  Вывести на экран сообщение, выделив его сверху и снизу строками, состоящими из   нескольких символов  "=". Program V1L15P1; {Печать сообщения, заключенного в стоки символов '='} Uses Crt; Var i:byte; {} begin ClrScr; for i:=1 to 22 do Write('='); WriteLn; {} WriteLn('Печатаем 23 символа "="'); for i:=1 to 23 do Write('='); WriteLn; {} ReadKey end. В данном варианте решения циклическая операция по выводу символов использовалась дважды и, каждый раз повторяясь, писалась заново в необходимом месте программы.  Рассмотрим   второй   вариант   решения,   который   сложнее   чем   первый,   где   показан   пример   использования подпрограммы средствами, которые нам известны. Жирным курсивом в обоих вариантах выделена циклическая операция печати символов. Program V1L15P2; {Печать сообщения. Программа с использованием безусловных переходов} Uses Crt; Label metka1,metka2; Var i:byte; k:boolean; {} begin ClrScr; k:=True; {k ­ присвоить значение "Истина"} 84 Понятие подпрограмм.  Процедуры.  Функции. Понятие рекурсии   GoTo metka1; metka2: WriteLn('Печатаем 23 символа "="'); k:=False; {} metka1: for i:=1 to 23 do Write('='); WriteLn; {} if k then GoTo metka2; ReadKey end. Результат работы прогрымм {k ­ присвоить значение "Ложь"} {Логическое условие, если k ­истина, то иди на metka2} ======================= Печатаем 23 символа "=" ======================= Проанализируем  первый и второй варианты решения задачи. 1. Количество переменных равно 1 и 2 соответственно. 2. Количество меток  0 и 2. 3. Количество операторов 14 и 19. 4. Использование циклической операции печати символов 2 и 1 раз. Из чего следует, что второй вариант хуже для решения данной задачи, несмотря на то, что циклическая операция печати символов используется во втором варианте один раз. Если бы в условии задачи был задан вывод двойных строк символов,   и   мы   знали   бы   средства   работы   с   подпрограммами,   то   единственным   грамотным   решением   было   бы использование этих средств.    1.2.  Процедуры Процедурой называется часть программы, имеющая имя и предназначенная для решения определенной задачи. Каждая процедура определяется в программе только один раз и может быть использована многократно. Процедуру можно вызвать из различных мест основного блока программы. Процедура может возвращать вычисленные результаты в основную программу и ей можно передавать информацию, которую она использует для выполнения вычислений. Процедуры   состоят   из   локальных   данных,     внутренних   процедур,   внутренних   функций     и   операторов. Структура описания процедуры имеет следующий вид. {Описание   локальных    меток,}   констант, типов и переменных} Procedure  Имя (Список формальных параметров); {} Label Const Type Var {} Procedure Function {} begin Оператор_1; Оператор_2; {Описание внутренних процедур    и функций} {Операторная часть процедуры} . . . Оператор_n end; Описание  процедуры  начинается   с  заголовка,  который  является  обязательным  (в  отличии  от  заголовка программы). Заголовок состоит из служебного слова Procedure, за которым следует имя. Имя процедуры обязательно и назначается по правилам,  аналогичным указанию имени программы. За именем процедуры в круглых скобках может следовать список  формальных параметров, в виде каких либо переменных, которые могут быть заданы явно (т.е. значениями) в основном блоке программы. Если в заголовке отсутствует список формальных параметров, то процедура выполняет действия, которые описаны внутри ее  с собственными заданными переменными. Такая конструкция называется процедурой без параметров, пример которой приведен ниже. 85 Вызов процедуры в основном блоке программы осуществляется ее именем, за которым может следовать через запятую   список   формальных   параметров,   заключенных   в   круглые   скобки.   Рассмотрим   это   в   нижеприведенных примерах.  Program V1L15P3; {Пример процедуры без параметров} Uses Crt; Procedure PrintSymbols;  Var i:byte; begin {Имя процедуры} {Описание локальной переменной} for i:=1 to 23 do Write('='); WriteLn; end; {Основной блок программы} begin ClrScr; {} PrintSymbols; WriteLn('Печатаем 23 символа "="'); PrintSymbols; {Вызов процедуры без параметров} {Вызов процедуры без параметров} {} ReadKey end. Результат работы программы ======================= Печатаем 23 символа "=" ======================= Следующий   вариант   решения   задачи   более   универсален,   т.к.   позволяет   использовать   параметры,   которые могут   задаваться   непосредственно   при   вызове   процедуры.   Эти   параметры   называются  формальными  и указываются в скобках после имени процедуры. Формальные параметры одного типа пишутся  через запятую, затем  ставится двоеточие и указывается  тип переменных (переменной). Если параметров несколько и разного типа, то они указываются через точку с запятой. Такая форма называется процедурой с параметрами.  Порядок следования параметров при вызове процедуры должен быть строго таким, каким он указан в скобках после имени процедуры. В противном случае последует сообщение об ошибке.  Если в процедуре используются переменные, которые не являются формальными, то они описываются в блоке описания переменных процедуры и называются  локальными переменными. Локальные переменные используются только в процедуре (см. программу V1L15P3). Program V1L15P4; {Пример процедуры с параметнрами} Uses Crt; Procedure PrintSymbols(number:integer; s:char); Var i:byte; begin {Локальная переменная} for i:=1 to number do Write(s); WriteLn; end; {Основной блок программы} begin ClrScr; {} PrintSymbols(25,'*'); {Параметры в скобках передаются в процедуру, которая  осуществит печать 25 символов '*'} WriteLn('Печатаем   22   символа'); PrintSymbols(22,'='); {Параметры в скобках передаются в процедуру, которая  осуществит печать 22 символов '='} {} ReadKey end. Результат работы  программы ************************* 86 Понятие подпрограмм.  Процедуры.  Функции. Понятие рекурсии   Печатаем  22   символа  ====================== Здесь,     при   вызове   процедуры,   формальным   параметрам    namber    и    s   в   основном   блоке   программы указываются   количество   символов   и   сам   символ,   которые   передаются   в   процедуру   для   выполнения   действия, описанного в ней. Возможен обратный процесс, когда результат вычислений производимых в процедуре, передается какой либо переменной   (переменным)   в   основном   блоке   программы.   В   этом   случае   в   списке   формальных   параметров   эта переменная  пишется после ключевого слова  Var  с указанием типа. Покажем это на следующем примере. Задача. Найти сумму чисел от 1 до n. Постановка задачи. 1. Количество чисел n вводить с клавиатуры, отвечая на сообщение "Введи количество чисел". 2. Результат вычислений выводить на экран дисплея с сообщением "Сумма чисел от 1 до  n  = ". Количество чисел n печатать введенным с клавиатуры значением. Program V1L15P5; {Сумма целых чисел от 1 до n} Uses Crt; Var k,s:integer; {Описание процедуры} Procedure Summa(n:integer; Var sm:integer); Var i:byte; begin sm:=0; for i:=1 to n do sm:=sm+i; end; {Основной блок программы} begin ClrScr; Write('Введи количество чисел '); ReadLn(k); Summa(k,s); {Значение k передается в процедуру. Переменная s  принимает значение sm,  вычисленное в процедуре} WriteLn('Сумма чисел от 1 до ',k,' = ',s:4); {} ReadKey end. Результат работы программы Введи количество чисел 3 Сумма чисел от 1 до 3 =  6 Здесь формальный параметр n получает значение k из основного блока программы, а формальный параметр sm вычисляется в процедуре и его значение передается в основной блок программы переменной s. Урок 2.  Функции Выше   было   сказано,   что  функция,   аналогично  процедуре,     является   подпрограммой   (ее   еще   называют процедурой­функцией).   Однако   результатом   выполнения   функции   всегда   будет   определенное   значение,   которое должно быть присвоено имени функции. Структура описания функции имеет следующий вид. {Описание   локальных    меток,} {констант, типов и переменных} Function  Имя (Список формальных параметров) : Тип результата; {} Label Const Type Var {} Procedure Function {} begin {Описание внутренних процедур}   {и функций} 87 {Операторная  часть,   среди    которой   должен    быть} {хотя бы один оператор для  присвоения  имени  функции} {результата вычислений} Оператор_1; Оператор_2; . . . Оператор_n end; Таким образом, описание функции имеет три отличия от описания процедуры. 1. Описание начинается служебным словом Function. 2. В заголовке функции указывается имя и тип результата вычислений функции. 3. В теле функции должен присутствовать хотя бы один оператор присваивания вида: <Имя функции> := <Выражение вычисляемой функции>;   или <Имя функции> := <Переменная, принимающая результат вычислений>;. Операторов   присваивания   указанного   типа   может   быть   несколько.   Результат   последнего   по   времени выполнения оператора присваивания указанного вида принимается в качестве окончательного значения функции. Функция  в основном блоке программы вызывается точно так же, как и процедура, т.е. своим именем, за которым   в   круглых   скобках   следует   список   формальных   параметров,   передаваемых   в   тело   функции.   Как   и   в процедуре, формальные параметры функции могут отсутствовать.  Рассмотрим в качестве примера предыдущую задачу нахождения суммы чисел   от 1 до  n. Программу этой задачи напишем с использованием подпрограммы в виде функции. Program V1L15P6; {Пример программы с использованием функции} Uses Crt; Var s,k :integer; {Описание глобальных переменных} {Описание функции} Function Summa(n:integer):integer; Var i:byte;sm:integer; begin {Указание типа имени функции} {Описание локальных переменных} sm:=0; for i:=1 to n do sm:=sm+i; Summa:=sm; {Начальное значение суммы} {Вычисление суммы чисел} {Присвоение имени функции значения суммы чисел} end; {Основной блок программы} begin ClrScr; Write('Введи количество чисел '); ReadLn(k); s:=Summa(k); {Вызов функции. Присвоение переменной значения функции} WriteLn('Сумма чисел от 1 до ',k,' = ',s:5); {} ReadKey end. В нижеприведенном варианте в списке локальных параметров отсутствует локальная переменная sm, функцию которой выполняет глобальная переменная s, которая "работает" в подпрограмме и в основном блоке  программы. Program V1L15P7; {Пример, где применяется глобальная переменная в качестве локальной} Uses Crt; Var n,s:integer; {Описание глобальных переменных} {Описание функции} Function Summa(n:integer) :integer; Var i :byte; begin {Указание типа имени функции} {Описание локальных переменных} s:=0; for i:=1 to n do s:=s+i; Summa:=s; {Начальное значение суммы} {Вычисление суммы чисел} {Присвоение имени функции значения суммы чисел} end; {Основной блок программы} begin ClrScr; Write('Введи количество чисел '); 88 Понятие подпрограмм.  Процедуры.  Функции. Понятие рекурсии   ReadLn(n); s:=Summa(n); {Присвоение переменной значения функции} WriteLn('Сумма чисел от 1 до ',n,' = ',s:5); {} ReadKey end. А в этом варианте глобальная переменная n может быть не описана как локальная переменная в теле функции. В результате чего получим функцию без параметров. Program V1L15P8; {Функция без параметров} Uses Crt; Var s,n:integer; {Описание глобальных переменных} {Описание функции} Function Summa:integer; Var i:byte; begin s:=0; for i:=1 to n do s:=s+i; Summa:=s; end; {Локальная переменная} {Начальное значение суммы} {Цикл накопления суммы} {Присвоение имени функции значения суммы} {Основной блок программы} begin ClrScr; Write('Введи количество чисел '); ReadLn(n); WriteLn('Сумма чисел от 1 до ',n,' = ',Summa:5); {} ReadKey end. Результат работы программ Введи количество чисел 3 Сумма чисел от 1 до 3 =    6 Урок 3.  Понятие рекурсии Рекурсия  (recurrence) в переводе с английского языка означает   возвращение, повторение. В живой природе рекурсия   организована   в   виде   воспроизведения   себе   подобных.   Рекурсия   в   программировании   ­   это   организация вычислительного  процесса, при котором подпрограмма в ходе выполнения ее операторов, обращается сама к себе. Рассмотрим   несколько   примеров   решения   задачи   получения   некоего   ряда   чисел,   имеющего   определенную закономерность. Задача. Вычислить значения функции   1    2 5 x     y  1  5 2 x          5 для целых   x  (1 <= x <= 10). Постановка задачи 1. Количество, задаваемых значений аргумента, определить в тексте программы. 2. Результат вычислений выводить на экран в столбик в формате "Значение аргумента  ­ Значение функции". Program V1L15P9; {Вычисление значений ряда Фибоначчи, заданной в виде функции} Uses Crt; Var a,b,y,q :real; x :byte; {} begin ClrScr; WriteLn('    x    y'); 89 WriteLn('   ­­­­­­­­'); {} a:=1;b:=1;  q:=Sqrt(5);      {Цикл вычисления функции} for x:=1 to 10 do begin a:=a*(1+q)/2; b:=b*(1­q)/2; y:=(a­b)/q; WriteLn(x:5,y:5:0); end;     {Конец цикла} ReadKey end. {Начальные значения уменьшаемого и вычитаемого числителя} {Вычисление квадратного корня} {Накопление значения уменьшаемого} {Накопление значения вычитаемого} {Вычисление функции при заданном аргументе 'x'} Результат работы программы          x    y    ­­­­­­­­     1    1     2    1     3    2     4    3     5    5     6    8     7   13   8   21   9   34  10   55 Анализируя  результат  вычислений  можно  определить  закономерность,  а  именно,  последующее  число  ряда вычисленных значений равно сумме двух предыдущих. Эту закономерность впервые получил в 1202 году Леонардо да Пиза, известный нам под именем Фибоначчи, решая задачу о кроликах. Задача формулировалась следующим образом. Сколько пар кроликов рождается за год, если через месяц одна пара кроликов производит на свет другую. Кролики начинают производить себе подобных через два месяца после своего рождения. Итак, полученную числовую закономерность можно записать следующим образом: F(n) = F(n ­ 1) + F(n ­ 2),   (**) с условием, что F(1) = 1 и   F(2) = 1. Составим программу для вычисления ряда Фибоначчи, используя формулу (**). Для чего необходимо организовать одномерный массив f. Программа будет выглядеть следующим образом. Program V1L15P10; {Вычисление ряда Фибоначчи с использованием массива} Uses Crt; Var f :array [1..20] of integer; i,n :integer; {} begin ClrScr; WriteLn('Ряд Фибоначчи'); Write('Введи количество чисел ряда '); ReadLn(n); for i:=1 to n do begin {Цикл вычислений значений ряда} if (i=1) or (i=2) then f[i]:=1 else f[i]:=f[i­1]+f[i­2]; WriteLn(i:3,f[i]:5); end;  {} ReadKey end. {Конец цикла вычислений значений ряда} В этой программе есть один существенный недостаток, а именно, одномерный массив f, который  не оправдано, занимает оперативную память компьютера.  Следующая версия программы лишена этого недостатка. Алгоритм решения задачи. 1. Обозначить в формуле (**) первое слагаемое через  ' a ',  второе через ' b '. 2. Присвоить  начальные  значения    переменным   a = 1,  b = 0. 3. Организовать циклическую операцию со счетчиком по переменной ' i ' до n, которое определяет количество выводимых элементов ряда Фибоначчи.  90 Понятие подпрограмм.  Процедуры.  Функции. Понятие рекурсии   4. Поменять  местами  значения  переменных,   т. е.  a = 0,   b = 1. 5. Сложить значения переменных и записать результат в переменную  ' b '. 6. Вывести на экран дисплея  значения  переменной  цикла ' i '  и ' b '. Program V1L15P11; {Вычисление ряда Фибоначчи без использования массива} Uses Crt; Var i,n: byte; a,b,k :longint; {} begin ClrScr; WriteLn('Ряд Фибоначчи'); Write('Введи количество чисел ряда '); ReadLn(n); a:=1;b:=0; for i:=1 to n do begin {Начальные значения переменных} {Цикл расчета значений ряда} k:=a;a:=b;b:=k; b:=a+b;          WriteLn(i:3,b:5) end; {} ReadKey end. {Обмен значениями переменных} {Присвоение переменной 'b' значения суммы переменных} И, наконец, программа с использованием подпрограммы в виде функции и рекурсии. Program V1L15P12; {Использование рекурсии в вычислении ряда Фибоначчи} Uses Crt; Var x,m :byte; {Рекурсивная функция вычислений чисел ряда Фибоначчи} Function Fib(n:byte):longint; begin if (n=1) or (n=2) then Fib:=1 else Fib:=Fib(n­1)+Fib(n­2); end; {Рекурсия} {Основная программа} begin ClrScr; WriteLn('Ряд Фибоначчи'); Write('Введи количество чисел ряда '); ReadLn(m); {} for x:=1 to m do WriteLn(x:3,Fib(x):7); {Вызов функции и печать результатов вычислений} {} ReadKey end. Результат работы программ Ряд Фибоначчи Введи количество чисел ряда 8   1    1   2    1   3    2   4    3   5    5   6    8   7   13   8   21 Следует отметить, что последний вариант решения задачи проще и нагляднее предыдущих примеров. Контрольные вопросы и упражнения 1. Что называется подпрограммой, какой цели они служат? 2. Какие виды подпрограмм существуют,  в чем их сходство и различие? 3. Как  передать параметры  процедуры и функции в основную программу? 4. Как  передать параметры для вычислений из основной программы в процедуру или функцию? 91 5. Что называется рекурсией, в каких вычислениях ее выгодно использовать? Для заметок, вопросов и ответов ______________________________________________________________________________________________________ ______________________________________________________________________________________________________ ______________________________________________________________________________________________________ ______________________________________________________________________________________________________ ______________________________________________________________________________________________________ _____________________________________________________________________________________________________ ______________________________________________________________________________________________________ ______________________________________________________________________________________________________ ______________________________________________________________________________________________________ ______________________________________________________________________________________________________ ______________________________________________________________________________________________________ ______________________________________________________________________________________________________ ______________________________________________________________________________________________________ ______________________________________________________________________________________________________ ______________________________________________________________________________________________________ ______________________________________________________________________________________________________ ______________________________________________________________________________________________________ ______________________________________________________________________________________________________ ______________________________________________________________________________________________________ ______________________________________________________________________________________________________ ______________________________________________________________________________________________________ ______________________________________________________________________________________________________ ______________________________________________________________________________________________________ ______________________________________________________________________________________________________ ______________________________________________________________________________________________________ ______________________________________________________________________________________________________ ______________________________________________________________________________________________________ ______________________________________________________________________________________________________ 92

Процедуры и функции

Процедуры  и  функции

Процедуры и функции

Процедуры  и  функции

Процедуры и функции

Процедуры  и  функции

Процедуры и функции

Процедуры  и  функции

Процедуры и функции

Процедуры  и  функции

Процедуры и функции

Процедуры  и  функции

Процедуры и функции

Процедуры  и  функции

Процедуры и функции

Процедуры  и  функции

Процедуры и функции

Процедуры  и  функции
Материалы на данной страницы взяты из открытых истончиков либо размещены пользователем в соответствии с договором-офертой сайта. Вы можете сообщить о нарушении.
25.04.2017