Подпрограммы

Download Report

Transcript Подпрограммы

Подпрограммы
- это группа операторов, оформленная в виде
самостоятельного программного блока, к которому
можно обратиться по имени.
Подпрограмма записывается однократно, а в
соответствующих местах программы обеспечивается лишь
обращение к ней по имени.
Использование подпрограмм позволяет:
Улучшить структуру программы с точки зрения ее
читаемости и наглядности;
Уменьшить вероятность ошибок и облегчить процесс
отладки;
Сократить объем программы.
В языке Паскаль механизм подпрограмм
реализован в виде ПРОЦЕДУР и ФУНКЦИЙ
1
Процедура
Procedure <имя> [(<список формальных параметров>)];
- это независимая именованная часть
<описательная
часть>
программы,
которую после однократного
описания можно многократно вызывать по
Begin
имени
из последующих частей программы
<тело
процедуры>
для выполнения определенных действий.
End;
Результат выполнения процедуры передается в основную
программу через значение ее параметра. При вызове
процедуры ее формальные параметры заменяются
фактическими в порядке их следования.
Фактические параметры – это параметры, которые
передаются процедуре при обращении к ней.
2
Составить программу, которая будет находить an.
а и n – целые числа вводятся с клавиатуры, n>0 .
Составим процедуру, которая вычисляет степень целого числа:
Procedure Degree(x,y : integer; Var st : longint);
Var i : integer;
Begin {вычисляем XY, результат – в st}
st :=1;
For i :=1 to y do st :=st * x;
End;
3
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;
4
End.
Program Primer1;
Смоделируем выполнение данной программы
a
n
s
3
4
-
…
x
y
st
3
4
-
i
-
Begin
…
End.
Degree(a,n,s);
…
5
Задача для самостоятельного решения
1. С помощью данной процедуры вычислите
сколько байтов содержится в килобайте,
мегабайте и гигабайте.
2. Вычислите сколько битов содержится с
килобайте.
1 Кбайт = 210 байт,
1 Мбайт = 220 байт,
1 Гбайт = 230 байт,
1 байт = 23 бит.
6
ЗАДАЧА 2: упорядочить значения трех
переменных а, в и с в порядке их возрастания.
АЛГОРИТМ
Напишем процедуру:
даны два целых
числа. Поменять
местами их значения.
Чтобы поменять местами
значения двух чисел, надо
воспользоваться
промежуточной переменной.
Решение задач
Procedure Swep (Var x,y : integer);
Var z : integer;
Begin
z :=x; x :=y; y :=z;
End;
7
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.
9
Анализ результатов выполнения программы
Чтобы проверить, верно ли работает программа,
необходимо произвести проверку для чисел, например:
a
b
c
1
2
3
1
3
2
2
1
3
2
3
1
3
1
2
3
2
1
Во всех случаях должны получить: Результат = 1, 2, 3
1. Вычислить значение выражения:
y = a1*x4 + a2*x3 + a3*x2 + a4*x + a5,
где a1 , a2 , a3 , a4 , a5 и х - это числа,
вводимые с клавиатуры.
Решение задач c
2. Составить
программу, подсчитывающую
использованием
процедур
число сочетаний без повторения из N
элементов по K элементов.
Cn k =
n!
k! (n- k)!
(Напишите процедуру, вычисляющую
факториал числа n (n! = 1*2*3*…*n))
11
Функции
Функции предназначены для того, чтобы вычислить только
одно значение.
Function <имя> [(<список формальных параметров>)]:<тип рез-та>;
<описательная часть>
Begin
<тело функции>
<имя>:=<значение>;
End;
В теле функции обязательно должен быть хотя бы один
оператор присвоения, где в левой части стоит имя
функции, а в правой – ее значение. Иначе значение не
будет определено.
12
Составить программу, которая будет находить an.
n – целые числа (n>0) – вводятся с клавиатуры.
а,и
Составим функцию, которая вычисляет степень целого числа:
Function Stepen (x, y : integer): longint;
Var i : integer; st : longint;
Begin {вычисляем XY, результат – в st}
st :=1;
For i :=1 to y do st :=st * x;
Stepen:=st;
End;
13
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.
14
Или, что то же самое…
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.
15
1. Найти число сочетаний из n по k
с использованием функции.
Cn k =
n!
k! (n- k)!
ЗАДАЧИ
с использованием
функций
2. Вычислить
значение выражения:
y = a1*x4 + a2*x3 + a3*x2 + a4*x + a5,
где a1 , a2 , a3 , a4 , a5 и х - это числа,
вводимые с клавиатуры.
16
4. Даны координаты трех вершин треугольника.
Найти периметр треугольника.
Написать процедуру (функцию) для определения
длины стороны по формуле:
L=√(x2-x1)2 + (y2-y1)2
5. Составить программу нахождения наибольшего
общего делителя нескольких чисел, используя
функцию нахождения НОД двух чисел.
6. Среди чисел из интервала от А до В найти все
простые. Написать подпрограмму, определяющую
является ли натуральное число простым.
17
7. Даны вещественные числа a, b, c, d, e, f, g.
Найти площадь пятиугольника.
x3,y3
e
d
x2,y2
g
x4,y4
a
f
c
x1,y1
x5,y5
b
Определить функцию для расчета площади
треугольника по трем его сторонам
8. Найти площадь пятиугольника (см. рис.), вершины
которого имеют координаты (x1,y1), (x2,y2),
…,(x5,y5). Определить функции для расчета
расстояния между двумя точками и площади 18
треугольника по координатам его вершин.
Задача 9.
Напечатать все пары чисел-близнецов, не
превышающих 200.
Замечание. Два простых числа называются
«близнецами», если они отличаются друг
от друга на 2.
Например, 41 и 43 – числа-близнецы.
20
Задача 10.
Получить все шестизначные счастливые
номера.
Замечание. Счастливым называется такое
шестизначное число, в котором сумма его
первых трех цифр равна сумме его
последних трех цифр.
Рекомендация. Определить функцию для
расчета суммы цифр трехзначного числа.
21
ЗАДАЧА. Дан прямоугольник с размерами a Х b. От него
отрезают квадраты максимального размера, пока это
возможно. Затем от оставшегося прямоугольника вновь
отрезают квадраты максимально возможного размера и т.д.
На какие квадраты и в каком их количестве будет разрезан
исходный прямоугольник?
Дано: a, b – целые числа,
Получить: квадраты мах размера. Сколько их и
какого размера. Например, 27 Х 8
3 квадрата 8х8;
27
2 квадрата 3х3;
3
1 квадрат 2х2;
8
2 квадрата 1х1.
22
Трассировочная
таблица
a,b
да
Fp:= 0
A>B
да
A:= A – B
Fp:= Fp + 1
A≠0
или
B≠ 0
да
A>B
A
нет
0
нет
B>A
нет
19
1
11
2
3
3
0
да
B:= B – A
Fl:= Fl + 1
5
1
2
2
0
1
B, Fp
Fp Fl
27 8
Fl:= 0
нет
B
1
0
A, Fl
1
1
0
2
Задание
Написать функцию «вырезания»
квадратов из прямоугольника.
Написать программу решения данной
задачи.
24
Механизм передачи параметров
25
Формальные параметры
В заголовке процедуры или функции может
быть задан список параметров, которые
называются формальными. Так они
названы потому, что в списке заданы только
имена для обозначения исходных данных и
результатов работы процедуры, а при
вызове подпрограммы на их место будут
поставлены конкретные значения –
фактические параметры.
26
Соответствие между формальными и
фактическими параметрами
• формальных и фактических параметров
должно быть одинаковое количество;
• порядок следования формальных и
фактических параметров должен быть один
и тот же;
• тип фактического параметра должен
совпадать с типом соответствующего ему
формального параметра.
27
Параметры-значения
Используются только для передачи исходных
данных из основной программы в процедуру или
функцию. При вызове п/п фактические параметры
используются как начальные значения
формальных параметров – выполняется
подстановка значений. При этом п/п будет
передана лишь копия параметра-значения. В
процессе выполнения п/п формальные параметры
могут изменяться, но соответствующие
фактические параметры сохраняют те значения,
которые имели до вызова п/п, т.к. меняются не
они, а их копия. Поэтому параметры-значения
нельзя использовать для передачи
результатов из п/п в основную программу. 28
Иллюстрация использования параметров-значений
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.
29
Параметры-переменные
Необходимо использовать для возврата
результатов работы подпрограммы в основную
программу.
В списке формальных параметров они
перечисляются после зарезервированного слова
var с указанием типа.
Каждому формальному параметру, объявленному
как параметр-переменная должен соответствовать
фактический параметр в виде переменной
соответствующего типа.
Если формальный параметр определен как
параметр-переменная, то при вызове процедуры
ей передается адрес переменной в памяти и
изменение параметра-переменной приводит
к изменению фактического параметра в
вызывающей программе.
31
Следовательно,
исходные данные в вызываемую
подпрограмму из вызывающей ее
программы могут передаваться как через
параметры-значения, так и через
параметры-переменные, а результаты
работы подпрограммы возвращаются в
программу только через параметрыпереременные.
32
Иллюстрация использования параметров-значений
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.
33
Область действия параметров
Все объекты, которые описываются после заголовка
подпрограммы (процедуры или функции),
называются локальными объектами, доступны
только в пределах этой п/п и недоступны
вызывающей программе. Память под них
выделяется при обращении к процедуре в
специальной части памяти, которая называется
программным стеком. По окончании п/п эта
память освобождается и может быть занята под
локальные переменные другой п/п, поэтому все
локальные объекты создаются при входе в
п/п и уничтожаются после нее. Если одно и то
же имя определено в нескольких п/п, вызываемых
одной и той же программой, то в каждой п/п этому
имени соответствует свой локальный объект. 35
Все объекты, описанные в вызывающей
программе, называются глобальными
переменными. Память под глобальные
переменные выделяется при компиляции
программы. Эта часть памяти именуется
сегментом данных. Глобальные
переменные находятся в сегменте данных
от начала до конца выполнения программы,
поэтому ими можно пользоваться и в
программе, и во всех п/п к которым
обращается программа.
36
Следует знать:
обмен данными между программой и
вызываемой ею п/п может производиться и
через глобальные переменные;
если одно и то же имя определено и в
программе, и вызываемой ею п/п, то в
программе ему соответствует глобальный
объект, но внутри п/п глобальный объект
недоступен, он как бы экранируется
(маскируется) локальным объектом с тем
же именем, над которым и выполняются
необходимые действия.
37
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);
38
end.
Program Parametri;
procedure primer(x:integer; var y:integer);
var c:integer;
var a,b,c,d: integer;
procedure
primer(x:
integer; var y: integer);
Смоделируем выполнение
данной
программы
x
0
a
b
c
d
0
0
0
0
a
b
c
d
0
1
0
1
begin
a:=0; b:=0; c:=0; d:=0;
primer(a,b);
writeln (a:3, b:3, c:3; d:3);
end.
var c: integer;
y
= 0
begin
c
c:=1; d:=1; x:=1; y:=1;
x d:3); 1
writeln (x:3, y:3, c:3;
y
=1
end;
c
1
Begin
c:=1;
d:=1;
x:=1;
1 y:=1;
1 1 1
writeln (x:3, y:3, c:3; d:3);
0 1 0 1
End.
40
Локальные переменные позволяют :
• оптимизировать программу;
• делают ее более наглядной;
• уменьшают вероятность появления ошибок.
Процедура, не использующая глобальные
переменные называется автономной.
 С ней можно производить все необходимые
действия независимо от главной программы.
 Ее гораздо легче использовать в другой
программе.
 Ее легче тестировать и отлаживать, т.к. в ней
НЕТ связей с остальной программой через
41
глобальные переменные.
В Pascal допускается любой уровень
вложенности процедур и функций.
Процедура, описанная в основной
программе, в свою очередь, может иметь
описания внутренних процедур и функций и
т.д. При этом объекты, описанные в
вызывающей процедуре, являются
глобальными по отношению к
вызываемой процедуре.
42
Блок А – основная программа
Блок В – подпрограмма
Блок С – подпрограмма
Блок D – подпрограмма
Блок E – подпрограмма
Блок F – подпрограмма
Объекты,
описанные в блоке
В видимы, кроме
самого В еще и в
С и D, но невидимы
в блоке А.
Объекты,
описанные в блоке
F, известны
только в пределах
этого блока. 43
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);
а – глобальная
6
writeln (b);
переменная
изменяется в
a:=1; b:= d(a) + d(1);
теле функции
5
d(x)
writeln (b);
44
end.
Локализация переменных дает программисту
большую свободу при выборе
идентификаторов.
Так если две процедуры полностью отделены
друг от друга, то идентификаторы в них
могут быть выбраны совершенно
произвольно, в частности могут повторяться.
В этом случае совпадающим
идентификаторам соответствуют разные
области памяти совершенно не связанные
друг с другом.
45
Задача 1.
Определить количество сверхпростых
чисел на промежутке от А до В.
Замечание. Сверхпростым называется
число, если оно простое и число
«прервертыш», полученное из него,
также является простым.
Например, 13 и 31 – сверхпростые числа.
Рекомендация. Написать функции:
1. определения простого числа;
2. «прервертыш» простого числа.
46
Задача 2.
Дано натуральное число n. Найти все
числа Мерсена, меньшие n.
Замечание. Простое число называется
числом Мерсена, если оно может быть
представлено в виде 2p – 1, где p – тоже
простое число.
Например, 31 = 25 – 1 – число Мерсена.
47
Задача 3.
Дано четное число n > 2. Проверить для
него гипотезу Гольдбаха.
Замечание. Гипотеза Гольдбаха – каждое
четное n представляется в виде суммы
двух простых чисел.
48