ПОДПРОГРАММЫ.ppt
- Количество слайдов: 38
Программирование на языке Паскаль Тема: Подпрограммы
План лекции 1. Назначение подпрограмм в языках программирования, общая характеристика функций и процедур. 2. Программирование процедур и функций. 3. Формальные и фактические параметры. 4. Локальные и глобальные переменные, их области видимости.
Подпрограмма – это вспомогательный алгоритм, который предназначен для выполнения некоторых действий. Применение: • выполнение одинаковых действий в разных местах программы • разбивка программы (или другой подпрограммы) на подзадачи для лучшего восприятия Задача Подзадача 1 1. 2 1. 3 Подзадача 2 2. 1 2. 2 Подзадача 3 2. 3 3. 1 3. 2 3. 3
Подпрограммы Концепция подпрограмм впервые была описана английским исследователем Морисом Уилксом в 1957 году
Преимущества использования подпрограмм • сокращение записи программы (компактность); • разделение работы между программистами, тем самым ускоряется ее завершение; • упрощение внесений изменений в программу, так как исправление ошибки в одном блоке не вызывает корректировку других блоков; • средство экономии памяти, так как память для хранения переменных, используемых в подпрограммах, выделяется только на время ее работы, и высвобождается после ее выполнения; • использование подпрограмм позволяет реализовать один из самых прогрессивных методов программирования структурное программирование.
Способы использования и размещения подпрограмм § основная программа, процедуры и функции расположены в одном файле (процедуры и функции описаны в разделе описания основной программы); § подпрограммы расположены в отдельных файлах и включаются в раздел описаний основной программы после описания переменных с помощью директивы компилятора {$I имя файла}, где имя файла – файл в котором содержится подпрограмма; § подпрограммы пишутся на машинном коде и включаются в программу одним из вышеуказанных способов; § подпрограммы оформляются как "внешние" и вызываются из основной программы.
Структура основной программы с описанием подпрограмм в разделе описания данных program имя; {**** раздел описаний основной программы ****} подпрограмма P 1; подпрограмма P 2; {**** раздел операторов основной программы ****} begin операторы основной программы; вызов подпрограммы P 1; операторы основной программы; вызов подпрограммы P 2; операторы основной программы; end.
Подпрограммы Паскаля В языке Паскаль выделяют два вида подпрограмм: • процедура (procedure); • функция (function
Программирование процедур Формат: procedure <имя> [ (<спис. форм. пар. >) ] ; где procedure – зарезервированное слово процедура; <имя> - имя процедуры (правильный идентификатор); <спис. форм. пар. > - список формальных параметров.
Программирование процедур Пример • procedure sort (a, d : integer; b : real); • procedure kvadr (alpha, beta : integer; gamma : boolean); • procedure sumwed; {алгоритм, реализованный процедурой, не требует формальных параметров}
Описание процедуры Procedure <имя> [ (<спис. форм. пар. >) ]; {***заголовок***} {**** раздел описаний подпрограммы ****} begin {**** раздел операторов подпрограммы ****} end;
Обращения к процедуре Формат: имя процедуры (фактические параметры); • sort (a 1, d 1, b 1); {параметры - значения переменных} • kvadr (14, 25, True); {параметры - непосредственно значения} • sumwed; {фактические параметры не указаны, так кик и вызываемой процедуре нет формальных параметров}
Формальные и фактические параметры соответствие: • по количеству параметров; • по типу параметров; • по порядку следования параметров.
Формальные и фактические параметры • procedure sort (a, d : integer; b : real); • procedure kvadr (alpha, beta : integer; gamma : boolean); • procedure sumwed; Ø sort (a 1, d 1, b 1); Ø kvadr (14, 25, true); Ø sumwed;
Процедуры Особенности: • все процедуры расположены выше основной программы • в заголовке процедуры перечисляются формальные параметры, они обозначаются именами, поскольку могут меняться procedure Tr( x, y, r, g, b: integer); • при вызове процедуры в скобках указывают фактические параметры (числа или арифметические выражения) в том же порядке Tr (200, 100, 0, 255, 0); x y r g b
Процедуры Особенности: • для каждого формального параметра после двоеточия указывают его тип procedure A (x: real; y: integer; z: real); • если однотипные параметры стоят рядом, их перечисляют через запятую procedure A (x, z: real; y, k, l: integer); • внутри процедуры параметры используются так же, как и переменные
Процедуры Особенности: • в процедуре можно объявлять дополнительные локальные переменные, остальные процедуры не имеют к ним доступа program qq; procedure A(x, y: integer); var a, b: real; begin a a: = (x + +y)/6; : = (x y)/6; . . . end; begin. . . end. локальные переменные
Параметры-переменные Задача: составить процедуру, которая меняет местами значения двух переменных. Особенности: надо, чтобы изменения, сделанные в процедуре, стали известны вызывающей программе program qq; var x, y: integer; procedure Exchange ( a, b: integer ); var c: integer; begin c : = a; a : = b; b : = c; end; begin x : = 1; y : = 2; Exchange ( x, y ); writeln ( ’x = ’, x, ’ y = ’, y ); end; эта процедура работает с копиями параметров x = 1 y = 2
Параметры-переменные параметры могут изменяться procedure Exchange ( var c: integer; begin c : = a; a : = b; b : = c; end; a, b: integer ); Применение: таким образом процедура (и функция) может возвращать несколько значений, Запрещенные варианты вызова Exchange ( 2, 3 ); { числа } Exchange ( x+z, y+2 ); { выражения }
program prim; сonst a : integer = 5; b : integer = 7; рrocedure Inc 2 ( b : integer; var c : integer ); begin c : = c + c; b : = b + b; writeln ( ‘ удвоенные : ’, b : 5, c : 5) end; begin {main} writeln ( ‘ исходные : ’, a : 5, b : 5); Inc 2 ( a, b ); writeln ( ‘ результат : ’, a : 5, b : 5) end. исходные : удвоенные : результат : 5 10 5 7 14 14
Порядок разработки: • выделить одинаковые или похожие действия • найти в них общее и отличия • отличия записать в виде неизвестных переменных, они будут параметрами процедуры
Функции Функция – это вспомогательный алгоритм (подпрограмма), результатом работы которого является некоторое значение. Примеры: • вычисление , , • расчет значений по сложным формулам • ответ на вопрос (простое число или нет? ) Зачем? • для выполнения одинаковых расчетов в различных местах программы • для создания общедоступных библиотек функций ? В чем отличие от процедур?
Программирование функций Формат: function <имя> [ (<спис. форм. пар. >) ] : <тип>; где function – зарезервированное слово функция; <имя> - имя функции (правильный идентификатор); <спис. форм. пар. > - список формальных параметров. <тип> - тип возвращаемого функцией результата. function prov ( x, y, z : integer) : real; function zx : boolean;
Функция, определенная пользователем function <имя> [ (<сп. форм. пар. >) ] : <тип результата>; {**** раздел описаний подпрограммы ****} begin {**** раздел операторов подпрограммы ****} end;
Функции Задача: составить функцию, которая вычисляет наибольшее из двух значений, и привести пример ее использования Функция: формальные параметры function Max (a, b: integer): integer; begin if a > b then Max : = a else Max : = b; еnd; это результат функции
Функции Особенности: • заголовок начинается словом function Max (a, b: integer): integer; • формальные параметры описываются так же, как и для процедур function qq( a, b: integer; x: real ): real; • можно использовать параметры-переменные function Max ( var a, b: integer): integer; • в конце заголовка через двоеточие указывается тип результата function Max (a, b: integer): integer ; • функции может входить в выражение как операнд.
Функции Особенности: • можно объявлять и использовать локальные переменные function qq (a, b: integer): float; var x, y: float; begin. . . end; • значение, которое является результатом, записывается в переменную, имя которой совпадает с названием функции; объявлять ее НЕ НАДО: function Max (a, b: integer): integer; begin. . . Max : = a; В Delphi: Result end; ! : = a;
Программа program qq; c var a, b, max: integer; function Max (a, b: integer): integer; begin. . . end; begin фактические параметры writeln('Введите два числа'); read(a, b); вызов функции c max : = Max ( a, b ); c writeln('Наибольшее число ', max ); end. ! Имена переменных, функций и процедур не должны совпадать!
Найти разность факториалов f = m! - k! function Fact (n : integer) : integer; var p, i : integer; begin p : = 1; for i : = 1 to n do p : = p * i; Fact : = p end;
program Prim_1; var m, k, f : integer; function Fact (n : integer) : integer; var p, i : integer; begin { fact } p : = 1; for i : = 1 to n do p : = p * i; Fact : = p end; { fact } begin { main } writeln (‘Введите m, k’); read (m, k); f : = Fact (m) – Fact (k); writeln (‘f = ‘, f) end. { main }
Передача массивов в качестве параметров procedure s ( a : array [ 1. . 10 ] of real); type mastype = array [ 1. . 10 ] of real; procedure s (a : mastype); type input = string [ 15 ]; output = string [ 30 ]; function st ( s : input ) : output;
Дан массив действительных чисел A [ i ], где i = 1, 2, . . , n. Найти значение минимального элемента и его порядковый номер. Поиск минимума и его порядкового номера выполнить в виде процедуры. program prim_1; type massiv = array [ 1. . 50 ] of real; var a : massiv; min : real; k, n, j : integer;
procedure minim (n : integer; A: massiv; var min : real; var k : integer); var i : integer; begin min : = A[1]; k : = 1; for i : = 2 to n do if A [ i ] < min then begin min : = A [ i ]; k : = i end;
begin writeln ( 'введите размерность массива А: ' ); readln ( n ); writeln ( 'введите значения массива A: ' ); for j : = 1 to n do read ( A[ j ] ); Minim (n, A min, k ); writeln ( 'минимальный элемент = ', min : 5: 1 ); writeln ('порядковый номер = ', k : 4 ); end.
Решить пример № 1 с описанием подпрограмм, ввод массива и поиск минимального элемента и его номера, в отдельном файле podprog. pas. program prim_1; { Основная программа} type massiv = array [ 1. . 50 ] of real; var A : massiv; min : real; k, n : integer; {$I} podprog. pas { включение файла podprog. pas в основную программу } begin vvod ( n, A ); {обращение к процедуре ввода массива } minim ( n, A min, k ); writeln ( 'минимальный элемент = ', min : 5: 1 ); writeln ('порядковый номер = ', k : 4 ); end.
Файл podprog. pas с описанием процедур vvod и minim procedure vvod ( var kon: integer; var x : massiv ); var i: integer; begin writeln ( 'введите размерность массива: ' ); readln ( kon ); writeln ('введите значения массива: '); for i : = 1 to kon do read ( x [ i ] ); end;
Процедура поиска минимума procedure minim (n: integer; a: massiv; var min: real; var k: integer); var i : integer; begin min : = a [1]; k : = 1; for i : = 2 to n do if a [ i ] < min then begin min : = a [ i ]; k : = i end;


