Программирование с использованием подпрограмм. Что такое подпрограмма Понятие подпрограммы процедуры и функции

На занятии будет объяснен алгоритм работы с процедурами на Паскале. Будут разобраны примеры использования процедуры с параметрами и без параметров. Познакомитесь с понятиями: формальные и фактические параметры, параметр-переменная и параметр-значение


Подпрограмма — это фрагмент кода, который имеет свое имя и создается в случае необходимости выполнять этот код несколько (много) раз. Подпрограмма описывается единожды перед началом основной программы (до begin). Компилятор пропускает данный фрагмент кода, пока в основной программе не встретит «вызов» подпрограммы, который выглядит как обращение к ней по имени (возможно, имени с аргументами, указанными в скобках).

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

Итак, рассмотрим синтаксис объявления и описания процедуры в Паскале

var …;{область объявления глобальных переменных} procedure название (параметры); {начало процедуры} var …;{объявление локальных переменных} begin … {тело процедуры} end;{конец процедуры} begin … {основная программа} end.

Пример: Процедура без параметров, которая печатает 60 звездочек, каждую с новой строки

procedure pr; var i:integer; begin for i:=1 to 60 do begin {тело подпрограммы} write("*"); writeln; end; end; {конец подпрограммы} begin pr; {вызов процедуры} end.

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

Процедуры с параметрами. Фактические и формальные параметры

Рассмотрим пример необходимости использования процедуры.

Пример:
Построить фигуру

Особенность: Три похожие фигуры.

  • общее: размеры, угол поворота
  • отличия: координаты, цвет
  • Алгоритм решения:

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

    Решение на паскале:
    Процедура:

    Программа:

    15 uses GraphABC; procedure Tr( x, y: integer ; color: system. Drawing . Color ) ; begin MoveTo(x, y) ; LineTo(x, y- 60 ) ; LineTo(x+ 100 , y) ; LineTo(x, y) ; FloodFill(x+ 20 , y- 20 , color) ; end ; begin SetPenColor(clBlack) ; Tr(100 , 100 , clBlue) ; Tr(200 , 100 , clGreen) ; Tr(200 , 160 , clRed) ; end .

    uses GraphABC; procedure Tr(x, y: integer; color:system.Drawing.Color); begin MoveTo(x, y); LineTo(x, y-60); LineTo(x+100, y); LineTo(x, y); FloodFill(x+20, y-20,color); end; begin SetPenColor(clBlack); Tr(100, 100, clBlue); Tr(200, 100, clGreen); Tr(200, 160, clRed); end.

    Рассмотрим синтаксис объявления и описания процедуры с параметрами в Паскале.

    var …;{область объявления глобальных переменных} procedure pr(параметр1, параметр2: integer; параметр3:char); {начало процедуры} var …;{объявление локальных переменных} begin … {тело процедуры} end;{конец процедуры} begin … {основная программа} pr (параметр1, параметр2, параметр3); {вызов процедуры} end.

    Задание procedure 1: N вертикальных линий. N задается параметром процедуры.


    Задание procedure 2: Написать процедуру рисования N окружностей, сдвинутых по горизонтали. N , радиус R и отступ O задаются параметрами процедуры (всего 3 параметра).

    Пример: Написать процедуру, которая печатает 60 раз указанный символ (введенный с клавиатуры), каждый с новой строки

    Параметры процедуры (в некоторых языках они называются аргументами) указываются в скобках после ее имени (в объявлении).

    В данном примере в качестве введенного символа будем использовать параметр процедуры. Формальный параметр процедуры указывается в скобках при ее описании. Обязательно необходимо указать тип формального параметра через двоеточие.

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

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 var s: char ; procedure pr(a: char ) ; {a - формальный параметр} var i: integer ; begin for i: = 1 to 60 do begin write (a) ; writeln ; end ; end ; begin writeln ("simvol" ) ; readln (s) ; pr(s) ; {s - фактический параметр} end .

    var s:char; procedure pr(a:char); {a - формальный параметр} var i:integer; begin for i:=1 to 60 do begin write(a); writeln; end; end; begin writeln("simvol"); readln(s); pr(s); {s - фактический параметр} end.

    В данном примере при вызове процедуры компилятор заменит формальный параметр a фактическим параметром s , т.е. тем символом, который будет введен с клавиатуры. Оба параметра имеют тип данных char .

    Задача procedure 3. Написать процедуру, которая складывает два любых числа (два параметра).

    Процедуры с параметрами. Параметр-переменная

    1. способ:
    2. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 var x, y, m, n: integer ; procedure MaxNumber(a, b: integer ; var max: integer ) ; {a и b - параметры значения, max - параметр-переменная} begin if a>b then max: = a else max: = b; end ; begin write ("vvedite x,y" ) ; readln (x, y) ; MaxNumber(x, y, m) ; {фактические параметры} writeln ("max=" , m) end .

      var x,y,m,n:integer; procedure MaxNumber(a,b:integer;var max:integer); {a и b - параметры значения, max - параметр-переменная} begin if a>b then max:=a else max:=b; end; begin write("vvedite x,y"); readln(x,y); MaxNumber(x,y,m); {фактические параметры} writeln("max=",m) end.

      В примере формальные параметры a и b служат для помещения в них сравниваемых чисел, а параметр-переменная max — для сохранения в ней максимального из двух чисел. Параметр-переменная или выходной параметр передает свое значение в основную программу (фактическому параметру m), т.е. возвращает значение, тогда как формальные параметры-значения (входной параметр), наоборот, принимают значения из основной программы (из фактических параметров x и y). Для параметра-переменной (max) используются те ячейки памяти, которые отведены под соответствующий параметр при вызове процедуры (ячейка m).

      Таким образом, сформулируем понятия:

      Если в качестве формального параметра указана обычная переменная с указанием ее типа, то такой параметр есть параметр-значение или входной параметр (a и b в примере). Тип данных формального параметра-значения должен соответствовать типу данных его фактического параметра (a и b должны попарно соответствовать типу данных x и y).

      Если перед именем формального параметра в объявлении процедуры стоит служебное слово var , то такой параметр называется параметром-переменной или выходным параметром (max в примере). Для него используются те ячейки памяти, которые отведены под соответствующий параметр при вызове процедуры (m). Фактический параметр, соответствующий параметру-переменной, может быть только переменной (не константой, не литералом и не выражением).

    3. способ:
    4. Использование параметров-переменных позволяет тратить меньше памяти

      1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 var x, y: integer ; procedure exchange(a: integer ; var b: integer ) ; {b - параметр-переменная или выходной параметр} var c: integer ; begin if a>b then begin c: = a; a: = b; b: = c; {второй параметр процедуры - b - всегда будет максимальным} end ; end ; begin writeln ("введите два числа" ) ; readln (x, y) ; exchange (x, y) ; writeln ("max=" , y) end .

      var x,y:integer; procedure exchange(a: integer;var b:integer); {b - параметр-переменная или выходной параметр} var c:integer; begin if a>b then begin c:=a; a:=b; b:=c; {второй параметр процедуры - b - всегда будет максимальным} end; end; begin writeln("введите два числа"); readln(x,y); exchange (x,y); writeln("max=",y) end.

      Используя данный способ решения задачи, мы обошлись без третьего параметра. Для этого в процедуре мы использовали еще одну локальную переменную c . Процедура меняет значения переменных a и b таким образом, чтобы b всегда была максимальной. Поэтому в 15 строке программы в качестве максимальной выводится второй параметр (y), соответствующий формальному параметру b .

    Задача procedure 4.

    1. Необходимо определить наибольший общий делитель двух введенных чисел, используя цикл.
    2. Необходимо определить наибольший общий делитель двух введенных чисел, используя процедуру (два параметра-значения, один параметр-переменная).


    Словесный алгоритм:

    • Вводятся a и b (например, 18 и 24 )
    • В цикле повторяем действия:
    • Если а < b , то меняем переменные местами (1 шаг: a=24 , b=18 ; 2 шаг: a=18 , b=6 )
    • Переменной a присваиваем остаток от деления a на b (1 шаг: a=6 , b=18 ; 2 шаг: a=0 , b=6 )
    • Когда остаток равен 0 , выводится результат (значения переменной b ) (b=6 )

    Алгоритм решения поиска НОД:

    Задача procedure 5. Используя процедуры, построить фигуру:


    Задача procedure 6. Даны 3 различных массива целых чисел (размер каждого 15 элементов). В каждом массиве найти и среднее арифметическое значение.
    Для формирования элементов массива и подсчета суммы и среднего арифметического использовать одну процедуру (среднее арифметическое и сумму оформить как параметры-переменные).

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

    Пример: Создать процедуру для вывода десяти элементов массива (два параметра: количество элементов, массив)

    Показать решение:

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 const n = 10 ; var i: integer ; a, b: array [ 1 .. n ] of integer ; procedure arr_out (k: integer ; arr: array [ 1 .. n ] of integer ) ; var i: byte ; begin write ("вывод массива: " ) ; for i : = 1 to k do write (arr[ i] : 4 ) ; writeln ; end ; begin for i: = 1 to n do a[ i] : = random(10 ) ; arr_out (n, a) ; end .

    const n = 10; var i:integer; a, b: array of integer; procedure arr_out (k:integer; arr: array of integer); var i: byte; begin write ("вывод массива: "); for i:= 1 to k do write (arr[i]:4); writeln; end; begin for i:=1 to n do a[i]:=random(10); arr_out (n, a); end. integer ; procedure arr_rand (k: integer ; var arr: array [ 1 .. n ] of integer ) ; var i: byte ; begin write ("Заполнение массива случайными числами " ) ; randomize; for i : = 1 to k do arr[ i] : = random(100 ) ; end ; begin arr_rand (n, a) ; end .

    const n = 10; var a, b: array of integer; procedure arr_rand (k:integer; var arr: array of integer); var i: byte; begin write ("Заполнение массива случайными числами "); randomize; for i:= 1 to k do arr[i]:=random(100); end; begin arr_rand (n, a); end.

    Задача procedure 7. Объедините обе решенные задачи (для заполнения и вывода массива).


    Задача procedure 8. Добавьте в задачу процедуру для заполнения значений массива пользователем (ввод значений с клавиатуры). Оформите вывод двух разных массивов: один — со значениями, сформированными случайным образом, другой — со значениями, введенными пользователем.


    Задача procedure 9. Составить программу с процедурой для вычисления (входные параметры: число и степень). Для вывода результата использовать параметр-переменную.

    Самостоятельная работа

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

    2 вариант: для 5 одномерных массивов определять минимальный элемент каждого массива, используя процедуру с двумя параметрами - число элементов массива и параметр-переменная для вывода минимального элемента.

    * сложное С помощью процедуры формировать случайным образом одномерные массивы из 10 элементов (значения от -20 до +20). Вызывать процедуру до тех пор, пока среди значений не появится ноль.

    | Подпрограммы. Практикум. Практическая работа № 3.5 "Программирование с использованием подпрограмм"

    Уроки 45 - 47
    Подпрограммы
    Практикум
    Практическая работа № 3.5
    "Программирование с использованием подпрограмм"







    Вспомогательные алгоритмы и подпрограммы

    Еще одним важнейшим методологическим приемом структурного программирования является декомпозиция решаемой задачи на подзадачи - более простые, с точки зрения программирования, части исходной задачи. Алгоритмы решения таких подзадач называются вспомогательными алгоритмами .

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

    Запишем это так: НОД(а + b, а 2 + b 2 , а b).

    Идея решения состоит в следующем математическом факте: если х, у, z - три натуральных числа, то НОД(х, y, z ) = НОД(НОД(х, у ), z ). Иначе говоря, нужно найти НОД двух величин, а затем НОД полученного значения и третьего числа (попробуйте это доказать).

    Очевидно, что вспомогательным алгоритмом для решения поставленной задачи является алгоритм получения наибольшего общего делителя двух чисел. Эта задача решается с помощью алгоритма Евклида, который подробно обсуждался в 9 классе. Напомним, что идея алгоритма Евклида основана на следующей формуле:

    Приведем алгоритм решения поставленной задачи на учебном Алгоритмическом языке. Алгоритм состоит из процедуры «Евклид» и основного алгоритма «Задача», в котором присутствуют два обращения к процедуре:

    Здесь М, N и К являются формальными параметрами процедуры. М и N - параметры-аргументы, К - параметр-результат.

    Процедуры в Паскале. Основное отличие процедур в Паскале от процедур в Алгоритмическом языке (АЯ) состоит в том, что процедуры в Паскале описываются в разделе описания подпрограмм, а в АЯ процедура является внешней по отношению к вызывающей программе. Теперь посмотрим, как решение поставленной задачи программируется на Паскале.

    В данном примере обмен аргументами и результатами между основной программой и процедурой производится через параметры . Описание процедуры на Паскале имеет следующий формат:

    Procedure <имя процедуры> [(список формальных параметров)]; <блок>

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

    Var <список переменных>: <тип>

    Параметры-значения указываются так:

    <список переменных>: <тип>

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

    <имя процедуры>[(список фактических параметров)]

    Если описана процедура с формальными параметрами, то обращение к ней производится оператором процедуры с фактическими параметрами. Правила соответствия между формальными и фактическими параметрами: соответствие по количеству , соответствие по последовательности и соответствие по типам .

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

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

    В рассмотренном нами примере формальные параметры М и N являются параметрами-значениями. Это аргументы процедуры. При обращении к ней первый раз им соответствуют значения выражений А + В и abs(A - В) ; второй раз - С и А*В . Параметр К является параметром-переменной. В ней получается результат работы процедуры. В обоих обращениях к процедуре соответствующим фактическим параметром является переменная С . Через эту переменную основная программа получает результат.

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

    Чтобы разобраться в этом примере, требуется объяснить новое для нас понятие: область действия описания .

    Областью действия описания любого программного объекта (переменной, типа, константы и т. д.) является тот блок, на который это описание распространяется. Если данный блок вложен в другой (подпрограмма), то присутствующие во вложенном блоке описания являются локальными . Они действуют только в пределах внутреннего блока. Описания же, расположенные во внешнем блоке, называются глобальными по отношению к внутреннему блоку. Если глобально описанный объект используется во внутреннем блоке, то на него распространяется внешнее (глобальное) описание.

    В программе NOD1 переменные М, N, К являются локальными внутри процедуры; переменные А, В, С - глобальные. Однако внутри процедуры переменные А, В, С не используются. Связь между внешним блоком и процедурой осуществляется через параметры.

    В программе N0D2 все переменные являются глобальными. В процедуре Evklid нет ни одной локальной переменной (нет и параметров). Переменные М и N , используемые в процедуре, получают свои значения через оператор присваивания в основном блоке программы и изменяют значения в подпрограмме. Результат получается в глобальной переменной К , значение которой выводится на экран. Здесь обмен значениями между основной программой и процедурой производится через глобальные переменные .

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

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

    Как и у процедуры, у функции в списке формальных параметров могут присутствовать параметры-переменные и параметры-значения. Всё это - аргументы функции . Параметры вообще могут отсутствовать, если аргументы передаются глобально.

    Программа решения рассмотренной выше задачи с использованием функции будет выглядеть следующим образом:

    Из примера видно, что тело функции отличается от тела процедуры только тем, что в функции результат присваивается идентификатору функции : Evklid:=M .

    Обращение к функции является операндом в выражении. Оно записывается в следующей форме:

    <имя функции> (<список фактических лараметров>)

    Правила соответствия между формальными и фактическими параметрами все те же. Сравнивая приведенные выше программы, можно сделать вывод, что программа N0D3 имеет определенные преимущества перед другими. Функция позволяет получить результат путем выполнения одного оператора присваивания. Здесь также иллюстрируется возможность того, что фактическим аргументом при обращении к функции может быть эта же функция.

    По правилам стандарта Паскаля, возврат в вызывающую программу из подпрограммы происходит, когда выполнение подпрограммы доходит до ее конца (последний End ). Однако в современных версиях Паскаля есть средство, позволяющее выйти из подпрограммы в любом ее месте. Это оператор-процедура Exit . Например, функцию определения большего из двух данных вещественных чисел можно описать так:

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

    В таком случае функцию Evklid можно переписать так:


    Вопросы и задания

    1. Для чего используются подпрограммы?

    2. В чем различие между процедурами и функциями?

    3. Какие существуют способы передачи данных между подпрограммой и вызывающей ее программой?

    4. Составьте программу вычисления площади кольца по значениям внутреннего и внешнего радиусов, используя подпрограмму вычисления площади круга (два варианта: с процедурой и с функцией).

    5. Составьте программу сложения двух простых дробей. Результат должен быть несократимой дробью. Используйте подпрограмму вычисления НОД по алгоритму Евклида. Простая дробь задается двумя целыми числами: числителем и знаменателем.

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

    7. Даны три целых числа. Определите, у которого из них больше сумма цифр. Подсчет суммы цифр организуйте через подпрограмму.

    Практикум

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

    Задание 1

    Для решения всех задач сделать два варианта программы: с реализацией указанной подпрограммы в виде функции и в виде процедуры.

    Уровень 1

    1. Составить программу нахождения наибольшего общего делителя (НОД) и наименьшего общего кратного (НОК) двух натуральных чисел

    .

    Использовать подпрограмму алгоритма Евклида для определения НОД.

    2. Вычислить площадь правильного шестиугольника со стороной а , используя подпрограмму вычисления площади треугольника.

    3. Даны две дроби - (А, В, С, D - натуральные числа).

    Составить программу деления дроби на дробь. Ответ должен быть несократимой дробью. Использовать подпрограмму алгоритма Евклида для определения НОД.

    4. Даны две дроби - (А, В, С, D - натуральные числа).

    Составить программу умножения дроби на дробь. Ответ должен быть несократимой дробью. Использовать подпрограмму алгоритма Евклида для определения НОД.

    5. Даны две дроби - (А, В, С, D - натуральные числа).

    Составить программу вычитания из первой дроби второй. Ответ должен быть несократимой дробью. Использовать подпрограмму алгоритма Евклида для определения НОД.

    6. Написать программу вычисления суммы - для заданного числа n . Результат представить в виде несократимой дроби (р, q - натуральные). Использовать подпрограммы алгоритма Евклида для определения НОД и сложения двух простых дробей.

    7. Даны числа X, Y, Z, Т - длины сторон четырехугольника. Вычислить его площадь, если угол между сторонами длиной X и Y - прямой. Использовать две подпрограммы для вычисления площадей: прямоугольного треугольника и прямоугольника.

    Задание 2

    Для всех задач выделить подзадачи, решения которых могут быть реализованы через подпрограммы. Выбрать наиболее удобный вариант подпрограммы: функцию или процедуру. Составить программу решения задачи.

    Уровень 2

    1. Дано простое число. Найти следующее за ним простое число.

    2. Для заданного натурального числа п найти наименьший нечетный натуральный делитель k (k ≠ 1) .

    3. Заменить данное натуральное число на число, которое получается из исходного записью его цифр в обратном порядке (например, дано число 156, нужно получить 651).

    4. Найти все натуральные числа, не превосходящие заданного п, которые делятся на каждую из своих цифр.

    5. Имеется часть катушки с автобусными билетами. Номер билета шестизначный. Составить программу, определяющую количество счастливых билетов на катушке, если меньший номер билета - N , больший - М (билет является счастливым, если сумма первых трех его цифр равна сумме последних трех).

    6. Из заданного числа вычли сумму его цифр. Из результата вновь вычли сумму его цифр и т. д. Через сколько таких действий получится нуль?

    7. На отрезке (2 10 < N < 2 31 ) найти количество чисел, составленных из цифр а, b, с .

    8. Найти все натуральные n-значные числа, цифры в которых образуют строго возрастающую последовательность (например, 1234,5789).

    Уровень 3

    9. Два простых числа называются «близнецами», если они отличаются друг от друга на 2 (например, 41 и 43). Напечатать все пары «близнецов» из отрезка , где n - заданное натуральное число, большее 2.

    10. Дано четное число n > 2. Проверить для него гипотезу Гольдбаха: каждое четное п представляется в виде суммы двух простых чисел.

    11. Составить программу разложения данного натурального числа на простые множители. Например, 200 = 2 3 . 5 2 .

    12. Дано натуральное число n. Найти все меньшие п числа Мерсенна. (Простое число называется числом Мерсенна, если оно может быть представлено в виде 2 p - 1, где р - тоже простое число. Например, 31 = 2 5 - 1 - число Мерсенна.)

    13. Два натуральных числа называются «дружественными», если каждое из них равно сумме всех делителей (кроме его самого) другого (например, числа 220 и 284). Найти все пары «дружественных» чисел, которые не больше данного числа N .

    14. Натуральное число, в записи которого n цифр, называется числом Армстронга, если сумма его цифр, возведенная в степень n , равна самому числу. Найти все числа Армстронга от 1 до k .

    15. Найти все простые натуральные числа, не превосходящие n , двоичная запись которых представляет собой палиндром, т. е. читается одинаково слева направо и справа налево.

    16. Составить программу для нахождения чисел из интервала [М, N] , имеющих наибольшее количество делителей.

    17 Дано натуральное число n > 1. Определить длину периода десятичной записи дроби 1/n.

    Определение . Подпрограмма – это отдельная функционально независимая часть программы. Любая подпрограмма обладает той же структурой, которой обладает и вся программа.

    Подпрограммы решают три важные задачи:

    Избавляют от необходимости многократно повторять в тексте программы аналогичные фрагменты;

    Улучшают структуру программы, облегчая ее понимание;

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

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

    1. Когда Вы несколько раз перепишите в программе одни и те же последовательности команд, необходимость введения подпрограммы приобретает характер острой внутренней потребности.

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

    3. Полезно разбить длинную программу на составные части – просто как книгу разбивают на главы. При этом основная программа становится похожей на оглавление.

    4. Бывают сложные частные алгоритмы. Полезно отладить их отдельно в небольших тестирующих программах. Включение программ с отлаженными алгоритмами в основную программу будет легким, если они оформлены как подпрограммы.

    5. Все, что Вы сделали хорошо в одной программе, Вам захочется перенести в новые. Для повторного использования таких частей лучше сразу выделять в программе полезные алгоритмы в отдельные подпрограммы.

    Подпрограммы могут быть стандартными, т.е. определенными системой, и собственными, т.е. определенными программистом.

    Стандартная подпрограмма (процедура или функция) - подпрограмма, включенная в библиотеку программ ЭВМ, доступ к которой обеспечивается средствами языка программирования. Вызывается она по имени с заданием фактических параметров с типом описанным при описании данной процедуры в библиотечке процедур и функций.

    Из набора стандартных процедур и функций по обработке одного типа информации составляются модули. Каждый модуль имеет своё имя (мы уже хорошо знакомы с модулями Crt, Graph). Доступ к процедурам и функциям модуля осуществляется при подключении этого модуля (Uses Crt, Graph).

    Help содержит подробные описания предусмотренных средой программирования процедур и функций. Для вызова помощи при работе со стандартнымипроцедурами и функциями нужно поставить на имя подпрограммы курсор и нажать клавиши . Описание процедур и функций в Help строится по стандартному принципу.

    Задание . Вызовите помощь по функции Cos и рассмотрите предоставленную информацию.


    Сначала идет краткое описание подпрограммы (в одну фразу). Далее под словом Declaration (Объявление) следует интерфейсная часть процедуры или функции, которая особенно часто необходима для определения типа переменных при обращении к ним. Далее под словом Target приводятся платформы, на которых может использоваться подпрограмма: Windows, real (реальный режим DOS), protected (защищенный режим DOS). После слова Remarks следуют заметки, содержащие необходимые детали использования. В разделе See Also приведены имена подпрограмм, связанных с данной по смыслу или по совместному применению. Если перемещать курсор по этим именам (они выделяются курсорной рамкой), то выбрав одно из них (нажать клавишу ), можно получить справку по следующей функции. Каждая процедура и функция сопровождается примером применения, переключение к которому дает последняя строка программы. Любой текст из Help может быть скопирован в редактируемый файл обычными приемами копирования через буфер. Копирование примеров или заголовков функций облегчает работу.

    Существует другой способ получения помощи по процедурам и функциям. Для этого нужно использовать пункт меню Help/Reserved words (зарезервированные слова) или Help/Standard units (стандартные модули).

    Задание . Рассмотрите список процедур и функций, выберите какие-либо и просмотрите предлагаемую информацию.

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

    Существует два способа объединения программ и подпрограмм:

    1. Текст подпрограмм может быть приведен в разделе описания использующей их программы.

    2. Подпрограммы группируются в отдельных файлах, имеющих специальную структуру – модулях. Для того чтобы основная программа могла использовать модуль, он должен быть подключен к основной программе.

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

    Структура текста подпрограммы соответствует структуре текста основной программы за двумя исключениями:

    Подпрограмма начинается с заголовка, содержащего имя подпрограммы, передаваемые в нее и возвращаемые от нее периметры, запись заголовка подпрограммы отличается от заголовка программы;

    Подпрограмма кончается не точкой, а точкой с запятой.

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

    В языке Pascal определяются два типа подпрограмм – процедуры и функции. Основное различие между процедурой и функцией состоит в том, что процедура только выполняет какую-либо законченную последовательность действий, не возвращая результата работы в основную программу, а функция и выполняет действия, и возвращает результат.

    Например, вызов функции

    вернет в основную программу значение наименьшего из двух чисел и это значение будет присвоено переменной M.

    Любая подпрограмма должна быть описана до того, как она будет вызвана в программе или в другой подпрограмме. Все переменные, которые использует подпрограмма, могут быть либо глобальные либо локальные.

    Определение . Глобальными называются переменные, объявленные в основной программе и доступные как программе, так и всем ее подпрограммам.

    Определение . Локальными называются переменные, объявленные внутри подпрограммы и доступные только ей самой.

    Обмен информацией между основной программой и подпрограммой может осуществляться только с помощью глобальных переменных.

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

    Если говорить о плюсах использования в программировании подпрограмм, то можно назвать следующие:

    Программы с использованием подпрограмм позволяют реализовать один из самых прогрессивных методов программирования – структурное программирование.

    Программа становится более читаемой.

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

    В языке Паскаль выделяют два вида подпрограмм: процедуры (Procedure) и функции (Function). Любая программа может содержать несколько процедур и функций. Структура любой подпрограммы аналогична структуре всей программы. Подпрограмма должна быть описана до того, как будет использована в программе или другой подпрограмме.

    Процедуры и функции объявляются в разделе описания вслед за разделом переменных.

    Тогда общая структура программы выглядит так:

    Label; {описание меток}

    Const; {описание констант}

    Type; {описание типов}

    Var; {описание переменных}

    Procedure; {описание процедур}

    Function; {описание функций}

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

    Обращение к подпрограмме - переход к выполнению подпрограммы с заданием информации, необходимой для ее выполнения и возврата.

    Подпрограмма вызывается по своему имени с указанием необходимых параметров .

    На этом занятии рассмотрим примеры организации наиболее простого вызова подпрограмм.

    Задание . Рассмотрите решение предложенных задач, наберите на компьютере, проверьте работоспособность, внесите свои изменения и дополните своими комментариями.

    Задача 1 . Написать программу, состоящую из трех подпрограмм и основной программы. Подпрограммы должны организовывать ввод чисел, вычисление их суммы и вывод результата.

    Program AkulovE;

    Procedure Input ;

    writeln("По вызову активизировалась процедура "Input"",#10);

    writeln("Введите два числа через пробел - ");

    Procedure Summa ;

    writeln("Для сложения подключилась процедура "Summa"",#10);

    {- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -}

    Procedure Output ;

    writeln("Заключительная часть. Процедура "Output"",#10,#13);

    writeln("Их сумма - ",x);

    {- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -}

    Задача 2 . Найти среднее арифметическое двух чисел.

    {- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -}

    Function SredArif (A, B:integer):real;

    SredArif :=(A+B)/2;

    {- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -}

    write("Введите два числа ");

    Rez:=SredArif (A,B);

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

    Существуют два вида подпрограмм – внутренние и внешние. Внутренние подпрограммы вызываются при помощи кода М97 и содержатся внутри главной программы. То есть они находятся в одном файле. Внешние подпрограммы вызываются кодом М98 и не содержатся в теле главной программы. В этом случае главная программа и подпрограмма находятся в разных файлах.

    Рис. 10.1. Схема внутренней подпрограммы

    Внутренняя подпрограмма выполняется, когда СЧПУ встречает код М97. При этом адрес Р указывает на номер кадра, к которому нужно перейти, то есть туда, где начинается внутренняя подпрограмма. Когда СЧПУ находит кадр с кодом окончания подпрограммы М99, то выполнение внутренней подпрограммызавершается и управление передается кадру главной программы, следующему за кадром, вызвавшим завершенную подпрограмму.


    Рис. 10.2. Схема внешней подпрограммы

    Внешние подпрограммы работают похожим образом. Когда в главной программе встречается кадр с кодом М98, то вызывается подпрограмма с номером, установленным при помощи Р-адреса. При нахождении кода М99 управление возвращается главной программе, то есть выполняется кадр главной программы, следующий за кадром с М98. Учтите, что внешняя подпрограмма находится в отдельном файле. По сути, внешняя подпрограмма – это отдельная программа с индивидуальным номером, которая при желании может быть выполнена независимо от главной программы. Для вызова подпрограммы необходимо, чтобы она находилась в памяти СЧПУ.

    Пример УП с внутренней подпрограммой:

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

    М98 Р1000 L4 – подпрограмма будет вызвана 4 раза.

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

    Итак, на рис. 10.3 изображена деталь с 4 группами отверстий диаметром 3 мм. Нулевой точкой является верхний левый угол детали. Сначала создадим главную программу, которая будет позиционировать инструмент к каждой группе отверстий. Затем напишем подпрограмму, необходимую для сверления 4 отверстий в одной группе. Учтите, что в подпрограмме используются относительные координаты, а смена инструмента и основные команды находятся в главной программе.

    Рис. 10.3. Использование подпрограмм при обработке повторяющихся элементов позволяет уменьшить размер программы


    Обе эти программы необходимо передать в СЧПУ, оператор станка должен вызвать программу О0001 и запустить ее. Главная программа работает с абсолютными координатами и перемещает инструмент последовательно в центр каждой из четырех групп отверстий. Когда СЧПУ встречает кадр с М98 Р1000, то происходит передача управления подпрограмме с номером 01000. В этот момент инструмент уже находится в центре группы отверстий. Переключаемся в режим относительного (инкрементального) программирования и используем постоянный цикл сверления. После завершения сверления четырех отверстий одной группы выключаем цикл сверления командой G80 и переходим в режим абсолютных координат G90, для того чтобы правильно выполнить позиционирование в главной программе. Код М99 передает управление кадру главной программы, который следует за кадром, вызвавшим эту подпрограмму. Затем инструмент перемещается в центр следующей группы отверстий, и снова вызывается подпрограмма 01000. И так далее, пока не просверлим все отверстия и СЧПУ не прочтет код завершения программы М30.

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

    Из главной программы можно вызвать несколько различных подпрограмм. Более того, из каждой подпрограммы можно вызвать несколько других подпрограмм. Системы ЧПУ могут накладывать ограничения на вложенность и количество выполняемых подпрограмм, поэтому внимательно прочитайте документацию станка и стойки, прежде чем начнете работать с подпрограммами.

    Цель урока:

    • дать учащимся представление о подпрограммах и возможностях их использования;
    • показать на примерах механизм реализации подпрограмм с помощью процедур.

    Задачи:

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

    План

    I. Повторение материала.
    II. Изучение нового материала.
    III. Итог урока.
    IV. Домашнее задание.

    ХОД УРОКА

    I. Повторение материала

    1. Какова структура программы?
    2. Обязателен ли заголовок программы?
    3. Перечислите разделы описаний
    4. Какие служебные слова служат для описания переменных?
    5. Какое служебное слово является началом основной части программы?
    6. Как заканчивается программа?

    PROGRAM ИМЯ; (можно не писать)
    1. CONST
    2. TYPE
    3. VAR
    4. PROCEDURE, FUNCTION
    BEGIN
    Тело программы
    END.

    А сейчас будем разгадывать КЛЮЧВОД, заполняя его – повторим операторы, служебные слова языка Паскаль (Приложение 1 ).
    (Заполненный КЛЮЧВОРД – Приложение 2 )

    II. Изучение нового материала

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

    • избавляют от необходимости многократно повторять в тексте программы аналогичные фрагменты, т. е. сократить объем про­граммы;
    • улучшают структуру программы, облегчая понимание при разборе;
    • уменьшают вероятность появления ошибок, повышают устойчивость к ошибкам программирования и непредвиденным по­ следствиям при модификации.

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

    – если в программе необходимо переписывать одни и те же последовательности команд, то стоит эту последовательность ко­манд оформить в виде подпрограммы;
    – слишком длинную программу полезно разбить на составные части – подобно тому, как книгу разбивают на главы. При этом ос­новная программа становится похожей на оглавление;
    – при решении задачи могут возникать слишком сложные под­ задачи. Целесообразней отладить их отдельно в небольших про­граммах. Добавление этих программ в основную задачу будет лег­ким, если они оформлены как подпрограммы;
    – все, что вы сделали хорошо в одной программе, вам захочет­ся перенести в новые программы.

    В языке Pascal механизм подпрограмм реали­зуется в виде ПРОЦЕДУР (PROCEDURE) и ФУНКЦИЙ (FUNCTION), которые вводятся в про­грамму с помощью своего описания, но их структура такая же, как иструктура программы. Они различаются назначением и способом их использования.

    Процедуры предназначены для выполнения некоторой после­довательности действий.
    Чтобы использовать подпрограмму – процедуру её надо описать и к ней надо уметь обращаться.

    Описание:

    1. Выбрать для неё имя.
    2. Определить параметры.
    3. Составить последовательность действий, которые надо выполнять, для получения результата.

    Обращение: вызов выполнения указанных действий, для конкретных значений параметров.

    Параметры бывают следующих видов:

    I. Глобальные – параметры описываются в головном модуле, доступны любой подпрограмме.
    I. Локальные – используются только в процедуре, они могут быть или не быть, описываются после слова VAR, с указанием типа.

    II. Формальные – описываются в заголовке процедуры, к ним относятся входные и выходные параметры.
    III. Входные – это и IV. Параметры – значений описываются через запятую с указанием типа. При выходе из процедуры не сохраняются.
    III. Выходные – это и IV. Параметры – переменные описываются после слова VAR через запятую, с указанием типа, при выходе из процедуры сохраняются.
    Эти параметры описываются в круглых скобках после имени процедуры

    II. Фактические – в головном модуле при вызове процедуры.
    При вызове (обращении) формальные параметры заменяются на фактические.

    Формальные и фактические должны совпадать по 3-м признакам:

    • по количеству
    • по типу
    • по порядку следования.

    Описание процедуры

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

    Рrосеdиге <имя> (формальные параметры);
    VAR (описание локальных параметров, они могут быть или не быть)
    begin
    тело процедуры
    end; (конец процедуры)
    BEGIN (головного модуля)
    Фактические параметры
    END.
    Используя подпрограмму – процедуру рассмотрим несколько задач

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

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

    uses art;
    var a,b,s,c,d:real;
    procedure maxim (x,y: real; var s:real);
    begin
    if x
    end;

    begin
    clrscr;
    writeln("bbedite 4 chisla ");readln(a,b,c,d);

    В переменную S заносим большее из двух чисел А и В.

    maxim(a,b,s);

    В переменную S заносим большее из двух чисел С и S.

    maxim(c,s,s);

    В переменную S заносим большее из двух чисел D и S.

    maxim(d,s,s);}
    writeln("max=",s:3:I);
    readkey;
    end.

    Произвести отладку на компьютере.

    III. Итак, мы познакомились с новым понятиям: подпрограмма, процедура. Узнали, какие параметры необходимо для работы с процедурами. Структуру процедуры. Описание.

    IV. Домашнее задание

    Треугольник задан координатами вершин, вычислить периметр, площадь. Вычисление длин сторон оформить с помощью процедуры.

    – формула для подсчёта длины: A =

    Какая функция в Паскале означает корень квадратный? – SQRT означает возведение в квадрат – SQR

    – периметр находим по формуле Р = A + B + C
    – формула для нахождения площади: S =
    – сколько раз будем обращаться к процедуре? – 3 раза