1 Подпрограммы - это группа операторов, оформленная в виде самостоятельного программного блока, к которому можно обратиться по имени. Подпрограмма записывается однократно, а в соответствующих местах программы обеспечивается лишь обращение к ней по имени. Использование подпрограмм позволяет: Улучшить структуру программы с точки зрения ее читаемости и наглядности; Уменьшить вероятность ошибок и облегчить процесс отладки; Сократить объем программы. В языке Паскаль механизм подпрограмм реализован в виде ПРОЦЕДУР и ФУНКЦИЙ
2 Процедура Procedure [( )]; Begin End; Результат выполнения процедуры передается в основную программу через значение ее параметра. При вызове процедуры ее формальные параметры заменяются фактическими в порядке их следования. Фактические параметры – это параметры, которые передаются процедуре при обращении к ней. - это независимая именованная часть программы, которую после однократного описания можно многократно вызывать по имени из последующих частей программы для выполнения определенных действий.
3 Составить программу, которая будет находить a n. а и n – целые числа вводятся с клавиатуры, n>0. Составим процедуру, которая вычисляет степень целого числа: Procedure Degree(x,y : integer; Var st : longint); Var i : integer; Begin {вычисляем X Y, результат – в st} st :=1; For i :=1 to y do st :=st * x; End; ЗАДАЧА 1
4 Program Primer1; Var a,n : integer; s : longint; Procedure Degree(x,y : integer; Var st : longint); Var i : integer; Begin st :=1; For i :=1 to y do st :=st * x; End; Begin Writeln (Введите два числа ); Readln (a,n); Degree(a,n,s); Writeln ( Результат =,s); Readln; End.
5 Program Primer1; a3 n 4 s- i - st - y 4 x 3 Degree(a,n,s); Procedure Degree Begin … End. … 81 1,2,3,4 … Смоделируем выполнение данной программы
6 1.С помощью данной процедуры вычислите сколько байтов содержится в килобайте, мегабайте и гигабайте. 2.Вычислите сколько битов содержится с килобайте. 1 Кбайт = 2 10 байт, 1 Мбайт = 2 20 байт, 1 Гбайт = 2 30 байт, 1 байт = 2 3 бит. Задача для самостоятельного решения
7 Решение задач ЗАДАЧА 2: упорядочить значения трех переменных а, в и с в порядке их возрастания. Напишем процедуру: даны два целых числа. Поменять местами их значения. Чтобы поменять местами значения двух чисел, надо воспользоваться промежуточной переменной. Procedure Swep (Var x,y : integer); Var z : integer; Begin z :=x; x :=y; y :=z; End; АЛГОРИТМ
8 Алгоритм Сравниваем значения первых двух величин. Если 1-я больше 2-й – меняем местами. Сравниваем значения второй и третьей величин. Если 2-я больше 3-й – меняем местами. Теперь третья величина – на месте. Вновь сравниваем значения первых двух величин. Если 1-я больше 2-й – меняем местами. Теперь все величины на своих местах
9 Program Primer3; Var a,b,c : integer; Procedure Swep (Var x,y : integer); Var z : integer; Begin z :=x; x :=y; y :=z; End; Begin Writeln (Введите три числа ); Readln (a,b,с); If a>b then swep (a,b); If b>c then swep (b,c); If a>b then swep (a,b); Writeln ( Результат =, a,,, b,,, c); Readln; End.
Анализ результатов выполнения программы Чтобы проверить, верно ли работает программа, необходимо произвести проверку для чисел, например: a b c Во всех случаях должны получить: Результат = 1, 2, 3
11 Решение задач c использованием процедур 1.Вычислить значение выражения: y = a 1 *x 4 + a 2 *x 3 + a 3 *x 2 + a 4 *x + a 5, где a 1, a 2, a 3, a 4, a 5 и х - это числа, вводимые с клавиатуры. 2.Составить программу, подсчитывающую число сочетаний без повторения из N элементов по K элементов. (Напишите процедуру, вычисляющую факториал числа n (n! = 1*2*3*…*n)) C n k = n! k! (n- k)!
12 Функции Функции предназначены для того, чтобы вычислить только одно значение. В теле функции обязательно должен быть хотя бы один оператор присвоения, где в левой части стоит имя функции, а в правой – ее значение. Иначе значение не будет определено. Function [( )]: ; Begin End; := ;
13 Составим функцию, которая вычисляет степень целого числа: Function Stepen (x, y : integer): longint; Var i : integer; st : longint; Begin {вычисляем X Y, результат – в st} st :=1; For i :=1 to y do st :=st * x; Stepen:=st; End; Составить программу, которая будет находить a n. а,и n – целые числа ( n >0) – вводятся с клавиатуры. ПРИМЕР
14 Program Primer2; Var a,n : integer; s : longint; Function Stepen (x, y : integer): longint; Var i : integer; st : longint; Begin st :=1; For i :=1 to y do st :=st * x; Stepen:=st; End; Begin Writeln (Введите два числа ); Readln (a,n); s:= Stepen (a,n); Writeln (Результат =,s); Readln; End.
15 Program Primer2; Var a,n : integer; Function Stepen (x, y : integer): longint; Var i : integer; st : longint; Begin st :=1; For i :=1 to y do st :=st * x; Stepen:=st; End; Begin Writeln (Введите два числа ); Readln (a,n); Writeln (Результат =, Stepen (a,n) ); Readln; End. Или, что то же самое…
16 ЗАДАЧИ с использованием функций 1.Найти число сочетаний из n по k с использованием функции. 2. Вычислить значение выражения: y = a 1 *x 4 + a 2 *x 3 + a 3 *x 2 + a 4 *x + a 5, где a 1, a 2, a 3, a 4, a 5 и х - это числа, вводимые с клавиатуры. C n k = n! k! (n- k)!
17 4. Даны координаты трех вершин треугольника. Найти периметр треугольника. Написать процедуру (функцию) для определения длины стороны по формуле: L=(x2-x1) 2 + (y2-y1) 2 5.Составить программу нахождения наибольшего общего делителя нескольких чисел, используя функцию нахождения НОД двух чисел. 6. Среди чисел из интервала от А до В найти все простые. Написать подпрограмму, определяющую является ли натуральное число простым.
18 7. Даны вещественные числа a, b, c, d, e, f, g. Найти площадь пятиугольника. a b c e g f d Определить функцию для расчета площади треугольника по трем его сторонамплощади треугольника по трем его сторонам 8. Найти площадь пятиугольника (см. рис.), вершины которого имеют координаты (x 1,y 1 ), (x 2,y 2 ), …,(x 5,y 5 ). Определить функции для расчета расстояния между двумя точками и площади треугольника по координатам его вершин. x1,y1 x2,y2 x5,y5 x3,y3 x4,y4
19 Площадь треугольника по трем сторонам (формула Герона) Площадь треугольника: S = p (p-a) (p-b) (p-c), где p – полупериметр, p = (a + b + c) / 2 а b c
20 Задача 9. Напечатать все пары чисел-близнецов, не превышающих 200. Замечание. Два простых числа называются «близнецами», если они отличаются друг от друга на 2. Например, 41 и 43 – числа-близнецы.
21 Задача 10. Получить все шестизначные счастливые номера. Замечание. Счастливым называется такое шестизначное число, в котором сумма его первых трех цифр равна сумме его последних трех цифр. Рекомендация. Определить функцию для расчета суммы цифр трехзначного числа.
22 ЗАДАЧА. Дан прямоугольник с размерами a Х b. От него отрезают квадраты максимального размера, пока это возможно. Затем от оставшегося прямоугольника вновь отрезают квадраты максимально возможного размера и т.д. На какие квадраты и в каком их количестве будет разрезан исходный прямоугольник? Дано: a, b – целые числа, Получить: квадраты мах размера. Сколько их и какого размера. Например, 27 Х 8 3 квадрата 8х8; 2 квадрата 3х3; 1 квадрат 2х2; 2 квадрата 1х
a,b A 0 или B 0 A > B A:= A – B Fp:= Fp + 1 Fp:= 0 B, Fp да нет B > A B:= B – A Fl:= Fl + 1 Fl:= 0 A, Fl да нет A > B да нет ABFpFl Трассировочная таблица
24 Задание Написать функцию «вырезания» квадратов из прямоугольника. Написать программу решения данной задачи.
25 Механизм передачи параметров
26 Формальные параметры В заголовке процедуры или функции может быть задан список параметров, которые называются формальными. Так они названы потому, что в списке заданы только имена для обозначения исходных данных и результатов работы процедуры, а при вызове подпрограммы на их место будут поставлены конкретные значения – фактические параметры.
27 Соответствие между формальными и фактическими параметрами формальных и фактических параметров должно быть одинаковое количество; порядок следования формальных и фактических параметров должен быть один и тот же; тип фактического параметра должен совпадать с типом соответствующего ему формального параметра.
28 Параметры-значения Используются только для передачи исходных данных из основной программы в процедуру или функцию. При вызове п/п фактические параметры используются как начальные значения формальных параметров – выполняется подстановка значений. При этом п/п будет передана лишь копия параметра-значения. В процессе выполнения п/п формальные параметры могут изменяться, но соответствующие фактические параметры сохраняют те значения, которые имели до вызова п/п, т.к. меняются не они, а их копия. Поэтому параметры-значения нельзя использовать для передачи результатов из п/п в основную программу.
29 Иллюстрация использования параметров-значений var a,b: real; procedure square (x,y: real); begin { процедура вычисления и вывода } x:= x * x; y:= y * y; writeln (x:7:3,, y:7:3); end; begin a:= 1.0; b:= 3.0; square (a, b); writeln (a:7:3,, b:7:3); end.
30 При выполнении программа выведет на экран
31 Параметры-переменные Необходимо использовать для возврата результатов работы подпрограммы в основную программу. В списке формальных параметров они перечисляются после зарезервированного слова var с указанием типа. Каждому формальному параметру, объявленному как параметр-переменная должен соответствовать фактический параметр в виде переменной соответствующего типа. Если формальный параметр определен как параметр-переменная, то при вызове процедуры ей передается адрес переменной в памяти и изменение параметра-переменной приводит к изменению фактического параметра в вызывающей программе.
32 Следовательно, исходные данные в вызываемую подпрограмму из вызывающей ее программы могут передаваться как через параметры-значения, так и через параметры-переменные, а результаты работы подпрограммы возвращаются в программу только через параметры- переременные.
33 Иллюстрация использования параметров-значений var a,b: real; procedure square (var x,y: real); begin { процедура вычисления и вывода } x:= x * x; y:= y * y; writeln (x:7:3,, y:7:3); end; begin a:= 1.0; b:= 3.0; square (a, b); writeln (a:7:3,, b:7:3); end.
34 При выполнении программа выведет на экран
35 Область действия параметров Все объекты, которые описываются после заголовка подпрограммы (процедуры или функции), называются локальными объектами, доступны только в пределах этой п/п и недоступны вызывающей программе. Память под них выделяется при обращении к процедуре в специальной части памяти, которая называется программным стеком. По окончании п/п эта память освобождается и может быть занята под локальные переменные другой п/п, поэтому все локальные объекты создаются при входе в п/п и уничтожаются после нее. Если одно и то же имя определено в нескольких п/п, вызываемых одной и той же программой, то в каждой п/п этому имени соответствует свой локальный объект.
36 Все объекты, описанные в вызывающей программе, называются глобальными переменными. Память под глобальные переменные выделяется при компиляции программы. Эта часть памяти именуется сегментом данных. Глобальные переменные находятся в сегменте данных от начала до конца выполнения программы, поэтому ими можно пользоваться и в программе, и во всех п/п к которым обращается программа.
37 Следует знать: обмен данными между программой и вызываемой ею п/п может производиться и через глобальные переменные; если одно и то же имя определено и в программе, и вызываемой ею п/п, то в программе ему соответствует глобальный объект, но внутри п/п глобальный объект недоступен, он как бы экранируется (маскируется) локальным объектом с тем же именем, над которым и выполняются необходимые действия.
38 Например: var a,b,c,d: integer; procedure primer(x: integer; var y: integer); var c: integer; begin { процедура вычисления и вывода } c:=1; d:=1; x:=1; y:=1; writeln (x:3, y:3, c:3; d:3); end; begin a:=0; b:=0; c:=0; d:=0; primer (a, b); writeln (a:3, b:3, c:3; d:3); end.
39 При выполнении программа напечатает строки
40 Program Parametri; var a,b,c,d: integer; c 1 y = 1 x 1 primer(a,b); Begin c:=1; d:=1; x:=1; y:=1; writeln (x:3, y:3, c:3; d:3); End. begin a:=0; b:=0; c:=0; d:=0; writeln (a:3, b:3, c:3; d:3); end. Смоделируем выполнение данной программы c y = 0 x 0 procedure primer(x:integer; var y:integer); var c:integer; a0 c0 d1 b1 a0 c0 d0 b0 a c d b procedure primer(x: integer; var y: integer); var c: integer; begin c:=1; d:=1; x:=1; y:=1; writeln (x:3, y:3, c:3; d:3); end;
41 Локальные переменные позволяют : оптимизировать программу; делают ее более наглядной; уменьшают вероятность появления ошибок. Процедура, не использующая глобальные переменные называется автономной. С ней можно производить все необходимые действия независимо от главной программы. Ее гораздо легче использовать в другой программе. Ее легче тестировать и отлаживать, т.к. в ней НЕТ связей с остальной программой через глобальные переменные.
42 В Pascal допускается любой уровень вложенности процедур и функций. Процедура, описанная в основной программе, в свою очередь, может иметь описания внутренних процедур и функций и т.д. При этом объекты, описанные в вызывающей процедуре, являются глобальными по отношению к вызываемой процедуре.
43 Блок А – основная программа Блок В – подпрограммаБлок С – подпрограмма Блок D – подпрограмма Объекты, описанные в блоке В видимы, кроме самого В еще и в С и D, но невидимы в блоке А. Объекты, описанные в блоке F, известны только в пределах этого блока. Блок E – подпрограммаБлок F – подпрограмма
44 «Побочные эффекты» при вызове подпрограммы var a,b: integer; function d (x: integer): integer; begin d:=a + x; a:= a + 1; end; begin a:=1; b:= d(1) + d(a); writeln (b); a:=1; b:= d(a) + d(1); writeln (b); end Причина – а – глобальная переменная изменяется в теле функции d(x) Что будет напечатано?
45 Локализация переменных дает программисту большую свободу при выборе идентификаторов. Так если две процедуры полностью отделены друг от друга, то идентификаторы в них могут быть выбраны совершенно произвольно, в частности могут повторяться. В этом случае совпадающим идентификаторам соответствуют разные области памяти совершенно не связанные друг с другом.
46 Задача 1. Определить количество сверхпростых чисел на промежутке от А до В. Замечание. Сверхпростым называется число, если оно простое и число «прервертыш», полученное из него, также является простым. Например, 13 и 31 – сверхпростые числа. Рекомендация. Написать функции: 1.определения простого числа; 2.«прервертыш» простого числа.
47 Задача 2. Дано натуральное число n. Найти все числа Мерсена, меньшие n. Замечание. Простое число называется числом Мерсена, если оно может быть представлено в виде 2 p – 1, где p – тоже простое число. Например, 31 = 2 5 – 1 – число Мерсена.
48 Задача 3. Дано четное число n > 2. Проверить для него гипотезу Гольдбаха. Замечание. Гипотеза Гольдбаха – каждое четное n представляется в виде суммы двух простых чисел.