22 ПиОА Сем 2 Лекция 1 процедуры и функции.pptx
- Количество слайдов: 36
Процедуры и функции 1. Понятие подпрограммы; 2. Стандартные функции и процедуры; 3. Пользовательские функции и процедуры; 4. Область видимости; 5. Параметр-значение, параметр-переменная; 6. Реентерабельность; 7. Рекурсия. 8. Пример 1
1. Понятие подпрограммы Подпрограмма – это именованная часть программы, представляющая собой некоторое собрание операторов, структурированных аналогично основной программе. Подпрограммы не необходимы, но их наличие заметно облегчает работу программиста и увеличивает «ценность» кода. Описываются подпрограммы между разделом описания переменных и началом тела основной программы Процедуры и функции 2
1. Понятие подпрограммы Так выглядит структура всей программы в Pascal: Program <имя программы>; { Заголовок программы } Uses <имя 1, имя 2, … >; { Раздел описания модулей } Label <метка 1, метка 2, …>; { Раздел описания меток } Const <имя 1, имя 2, …>; { Раздел описания констант } Type { Раздел описания типов } <имя типа 1> = <определение типа 1>; <имя типа 2> = <определение типа 2>; … Var <имя 1, имя 2, …>: <тип>; { Раздел описания переменных } Procedure; {Раздел описания процедур} Function; {Раздел описания функций} Begin { Тело программы } <операторы> End. Процедуры и функции 3
Процедуры и функции 1. Понятие подпрограммы; 2. Стандартные функции и процедуры; 3. Пользовательские функции и процедуры; 4. Область видимости; 5. Параметр-значение, параметр-переменная; 6. Реентерабельность. 7. Рекурсия 8. Пример 4
2. Стандартные функции и процедуры PASCAL: ₋ процедуры управления программой; ₋ функции преобразования; ₋ арифметические функции; ₋ порядковые процедуры и функции; ₋ строковые процедуры и функции; ₋ процедуры и функции динамического распределения памяти; ₋ прочие процедуры и функции. Процедуры и функции 5
2. Стандартные функции и процедуры Процедуры управления программой: Procedure Break; Процедура осуществляет досрочный выход из циклов For, While или Repeat. Процедура должна находиться внутри этих циклов, иначе транслятор сообщит об ошибке. Procedure Continue; Процедура досрочно начинает следующую итерацию циклов For, While или Repeat. Процедура должна находиться внутри этих циклов, иначе транслятор сообщит об ошибке. Procedure Exit; Осуществляет немедленный выход из текущей подпрограммы. Если текущей подпрограммой является главная программа, она завершает работу. Procedure Halt[(Exitcode: Integer)]; Процедура выполняет аварийное завершение программы. Чтобы нормально завершить. Процедуры и функции 6
2. Стандартные функции и процедуры Функции преобразования : function Chr(a: byte): char; Преобразует код в символ в кодировке Windows function Ord(a: char): byte; Преобразует символ в кодировке Windows function Ord(a: integer): integer; Возвращает порядковый номер значения a function Trunc(x: real): integer; Возвращает целую часть числа x function Round(x: real): integer; Возвращает x, округленное до ближайшего целого 2. Стандартные функции и процедуры 7
Процедуры и функции 1. Понятие подпрограммы; 2. Стандартные функции и процедуры; 3. Пользовательские функции и процедуры; 4. Область видимости; 5. Параметр-значение, параметр-переменная; 6. Реентерабельность; 7. Рекурсия. 8. Пример 8
3. Пользовательские функции и процедуры Процедурой называется особым образом оформленный фрагмент программы, имеющий собственное имя. Упоминание этого имени в тексте программы приводит к активизации процедуры и называется её вызовом. Процедуры и функции 9
3. Пользовательские функции и процедуры Функция отличается от процедуры тем, что результат её работы возвращается в виде значения этой функции, поэтому вызов функции может использоваться наряду с другими операндами в выражениях. Заголовок процедуры имеет вид: PROCEDURE <имя> [(<сп. ф. п. >)]; заголовок функции: FUNCTION <имя> [(<сп. ф. п. >)]: <тип>; Здесь <имя> – имя подпрограммы; <сп. ф. п. > – список формальных параметров; <тип> – тип возвращаемого функцией результата. . procedure SB (a: real; b: integer; c: char); function F (a: real; b: real): real; function F (a, b: real): real; Процедуры и функции 10
3. Пользовательские функции и процедуры При описании подпрограммы указывается её заголовок и тело. Тело подпрограммы, подобно программе, состоит из раздела описаний и раздела исполняемых операторов. В разделе описаний подпрограммы могут встретиться описания подпрограмм низшего уровня, т. е. вложенных подпрограмм. Процедуры и функции 11
3. Пользовательские функции и процедуры Пример. Разработать функцию возведение числа в степень. var x, y: real; function power( a, b: real): real; begin if a>0 then power : = exp(b*ln(a)) else power : = 0; end; {function power} begin repeat readln(x, y); writeln( power(x, y) ); until false; end. Процедуры и функции 12
3. Пользовательские функции и процедуры Пример. Разработать процедуру, которая выводит на экран прямоугольник из заданных символов определенного размера. procedure box (s: char; w, h: integer); var i, j: integer; begin for i : = 1 to h do begin for j : = 1 to w do write (s); writeln end; writeln end; begin box ('+', 10, 5); box ('r', 20, 3); box ('|', 50, 10); box ('$', 12, 4); end. Процедуры и функции 13
Процедуры и функции 1. Понятие подпрограммы; 2. Стандартные функции и процедуры; 3. Пользовательские функции и процедуры; 4. Область видимости; 5. Параметр-значение, параметр-переменная; 6. Реентерабельность; 7. Рекурсия. 8. Пример 14
4. Область видимости Подпрограмме доступны только те объекты верхнего уровня, которые описаны до описания данной подпрограммы. Эти объекты называются глобальными по отношению к подпрограмме. Имена, локализованные в подпрограмме, могут совпадать с ранее объявленными глобальными именами. В этом случае считается, что локальное имя «закрывает» глобальное и делает его недоступным. Одноименные глобальные и локальные переменные – это разные переменные Процедуры и функции 15
4. Область видимости var k: integer; procedure a; var x, z: real; begin { через x, z обозначены две величины – локальные переменные для a; k – глобальная переменная для a } end; procedure b; var x, y: integer; begin { через x, y обозначены две другие величины – локальные переменные для b; k – глобальная переменная для b } end; begin { k – единственная переменная, которую можно использовать в основной ветке программы } ………………… end. Процедуры и функции 16
4. Область видимости var i: integer; a: real; function p(d: real): real; var i: integer; begin i : = 3; p : = i + 10 * d; end; begin a : = 2. 0; i : = 15; p(a); writeln(' i = ', i, ' a = ', a); readln end. Процедуры и функции Две совершенно разные переменные: первая i – глобальная для всей программы, вторая i – локальная для функции p Результат: i = 15 a = 2 17
Процедуры и функции 1. Понятие подпрограммы; 2. Стандартные функции и процедуры; 3. Пользовательские функции и процедуры; 4. Область видимости; 5. Параметр-значение, параметр-переменная; 6. Реентерабельность; 7. Рекурсия. 8. Пример 18
5. Параметр-значение, параметр-переменная Любой из формальных параметров подпрограммы может быть либо параметром-значением, либо параметром-переменной. В предыдущем примере параметры a и b определены как параметры-значения. Чтобы определить параметры как параметры-переменные, перед ними необходимо поставить зарезервированное слово var, например function power( var a: real, b: real): real; При вызове подпрограммы, в качестве параметра-переменной должна указываться переменная соответствующего типа, в качестве параметразначения может быть указано любое выражение соответствующего типа. power(x, 3*sin(x)); или power(x, 3. 17); Процедуры и функции 19
5. Параметр-значение, параметр-переменная var a, b: integer; procedure inc 2( var c: integer; b: integer ); begin c : = c + c; b : = b+b; writeln(‘удвоенные : ’, c: 5, b: 5); end; begin a : = 5; b : = 7; writeln(‘исходные : ’, a: 5, b: 5); inc 2(a, b); writeln(‘результат : ’, a: 5, b: 5); end. Результат выполнения программы: исходные : 5 7 удвоенные : 10 14 результат : 10 7 Процедуры и функции 20
Процедуры и функции 1. Понятие подпрограммы; 2. Стандартные функции и процедуры; 3. Пользовательские функции и процедуры; 4. Область видимости; 5. Параметр-значение, параметр-переменная; 6. Реентерабельность; 7. Рекурсия. 8. Пример 21
6. Реентерабельность Реентерабельная, или повторно входимая функция - это функция, которая может быть использована более чем одной задачей без риска потери данных. Реентерабельная функция может быть в любое время прервана и продолжена позже без потерь данных. Реентерабельные функции либо используют локальные переменные, либо защищают свои данные, размещённые в глобальных переменных. Функция fn не является реентерабельной: var temp : integer; function fn (x, y : integer): integer; begin temp : = x; x : = y; y : = temp; fn : = x + y; end; Процедуры и функции 22
Процедуры и функции 1. Понятие подпрограммы; 2. Стандартные функции и процедуры; 3. Пользовательские функции и процедуры; 4. Область видимости; 5. Параметр-значение, параметр-переменная; 6. Реентерабельность; 7. Рекурсия. 8. Пример 23
7. Рекурсия Реку рсия — в определении, описании, изображении какого-либо объекта или процесса внутри самого этого объекта или процесса, то есть ситуация, когда объект является частью самого себя Процедуры и функции 24
7. Рекурсия – это такой способ организации вычислительного процесса, при котором подпрограмма в ходе выполнения составляющих её операторов обращается сама к себе Пример. Рекурсия. Вычисление факториала var n: integer; function fact(n: integer): integer; begin if n=0 then fact : = 1 else fact : = n * fact(n-1); end; begin readln(n); writeln(‘n!=’, fact(n)); end. Процедуры и функции 25
7. Рекурсия Пример: Реализовать метод половинного деления на основе рекурсии const Eps = 0. 01; var a, b: real; function y(x: real): real; begin y : = x + 5; end; Процедуры и функции //точность вычисления корня // границы отрезка // задание функции, корни которой отделяются 26
7. Рекурсия //продолжение function Find. Root(a, b: real): real; var m: real; Result: real; begin m : = (a+b) / 2; if abs(m-a)>Eps then if y(a)*y(m)>0 then Result: = Find. Root(m, b) else Result: = Find. Root(a, m) else Result : = m; Find. Root : = Result; end; {function Find. Root} begin writeln('Введите левую и правую границы области поиска, a и b'); readln(a, b); if y(a)*y(b)>0 then writeln('Нет корней или более одного корня') else writeln(Корень уравнения: ', Find. Root(a, b)); end. Процедуры и функции 27
7. Рекурсия – красивая реализация, но лучшей ей не пользоваться Процедуры и функции 28
Процедуры и функции 1. Понятие подпрограммы; 2. Стандартные функции и процедуры; 3. Пользовательские функции и процедуры; 4. Область видимости; 5. Параметр-значение, параметр-переменная; 6. Реентерабельность; 7. Рекурсия. 8. Пример 29
8. Пример Разработать продпрогрммы - вставка элемента в динамический массив - удаление элемента из массива - вывода на экран элементов массива. Порядок: 1) Вывод на экран содержимого массива 2) Чтение действия: вставка элемента, удаление элемента или выход 3) Если не выход, то выполнение действия и возврат к п 1. Процедуры и функции 30
8. Пример Процедуры и функции 31
8. Пример Добавьте проверку на адекватность операция вставки и удаления Процедуры и функции 32
8. Пример var stop : boolean; ch, val, pos : integer; m : array of integer; //---------------------------procedure print (m : array of integer); var i, N : integer; begin N : = Length(m); if N=0 then writeln('Массив пуст') else for i : = 0 to N-1 do write('m[', i, ']=', m[i], '; '); writeln; end; //print Процедуры и функции 33
8. Пример procedure delete (var m : array of integer; pos : integer); var i, N : integer; begin N : = length(m); for i : = pos to N-2 do m[i] : = m[i+1]; Set. Length(m, N-1); end; //delete //---------------------------procedure insert (var m : array of integer; pos, val : integer); var i, N : integer; begin N : = length(m); Set. Length(m, N+1); N : = N + 1; for i : = N-1 downto pos+1 do m[i] : = m[i-1]; m[pos] : = val; end; //insert //--------------------------- Процедуры и функции 34
8. Пример begin repeat print(m); writeln('Выберите действие(1 - вставка, 2 - удаление, 3 - выход)'); read(ch); case ch of 1: begin writeln('Введите номер элемента для вставки и значение'); readln(pos, val); insert(m, pos, val); end; 2: begin writeln('Введите номер элемента для удаления'); readln(pos); delete(m, pos); end; 3: stop : = true; end; until stop; end. Процедуры и функции 35
8. Пример Массив пуст Выберите действие(1 - вставка, 2 1 Введите номер элемента для вставки 0 1 m[0]=1; Выберите действие(1 - вставка, 2 1 Введите номер элемента для вставки 0 2 m[0]=2; m[1]=1; Выберите действие(1 - вставка, 2 1 Введите номер элемента для вставки 0 3 m[0]=3; m[1]=2; m[2]=1; Выберите действие(1 - вставка, 2 1 Введите номер элемента для вставки 1 4 m[0]=3; m[1]=4; m[2]=2; m[3]=1; Выберите действие(1 - вставка, 2 - удаление, 3 - выход) и значение удаление, 3 - выход) Всегда программа будет работать верно? Процедуры и функции и значение удаление, 3 - выход) 36