- •ВВЕДЕНИЕ
- •1. ЭЛЕМЕНТЫ ЯЗЫКА ПАСКАЛЬ. ЛИНЕЙНЫЕ ПРОГРАММЫ
- •Стандартные функции
- •Функции преобразования типов
- •Порядок вычислений
- •Заданиe 1. Вычислить арифметические выражения
- •2. СТРУКТУРИРОВАННЫЕ ОПЕРАТОРЫ
- •2.1. Составной оператор
- •2.2. Условные операторы
- •2.3. Селективный оператор
- •2.4 Операторы цикла
- •Задание 2.1
- •Задание 2.2
- •Задание 3*
- •4. ПОДПРОГРАММЫ В ПАСКАЛЕ
- •4.1. Процедуры
- •4.2. Функции
- •Задание 4
- •5. МАССИВЫ
- •5.1. Одномерные масивы
- •5.2. Двумерные массивы
- •Задания 5.1
- •Задания 5.2
- •ГЛАВА 7. СОРТИРОВКА МАССИВОВ
- •Сортировка посредством простого выбора
- •Сортировка обменом (метод «пузырька»)
- •Сортировка включением
- •Быстрая сортировка
- •Задание 7.
4.2. Функции
Функция предназначена для того, чтобы вычислить только одно значение.
Отличия функций от процедур:
1)результатом функции является только одно значение, тогда как процедура присваивает новые значения нескольким параметрам.
2)в синтаксисе заголовка и тела функции.
Заголовок функции:
Function Имя(Список формальных параметров) :Тип.
эта часть заголовка может отсутствовать.
Пример заголовка Function S(x,y:Integer):Longint.
В теле функции обязательно должен быть хотя бы один оператор присваивания, где в левой части стоит имя функции, а в правой – ее значение. Иначе значение не будет определено.
Пример. Составить программу, подсчитывающую число сочетаний без повторений из N элементов по k элементов.
Число сочетаний без повторений считают по формуле:
Сnk = |
n! |
|
|
k!(n − k)! |
|||
|
n, k – переменные для хранения введенных чисел, С – переменная для хранения результата.
Для вычисления n! , (n−k)! , k! применим функцию факториала.
Function Factorial(n:integer):longint; { заголовок функции } var i : integer; { описательная часть }
rez : longint; |
|
begin |
{ тело функции } |
rez:=1; |
|
for i:=1 to n do rez:=rez*i; |
|
Factorial:=rez; |
{ присваивание значения имени функции } |
end; |
|
39
В тексте программы описание функции всегда следует за описанием переменных и до описания основной части, как и описание процедур. После того, как функция описана, ее можно использовать в программе.
Составим программу:
Program PR2; var n,k : integer;
a1,a2,a3,c : longint;
Function Factorial(n : integer) : longint; var i : integer;
rez : longint; begin
rez:=1;
for i:=1 to n do rez:=rez*i; Factorial:=rez;
end; begin
writeln(‘Введите n и k’); { ввод значений } readln(n,k);
a1:=Factorial(n); { вычисление n! } a2:=Factorial(k); { вычисление k! } a3:=Factorial(n-k); { вычисление (n−k)!} c:=a1*div(a2*a3); { результат } writeln(‘Результат’,c); { вывод значения Ckn } readln;
end.
Фактическими параметрами могут быть не только константы или переменные, но и выражения.
Пусть n=5, k=3. Когда в программе встретится оператор a1:=Factorial(n), выполняются следующие действия:
1) Выделяется память для переменных, описанных в функции
Factorial.
40
2)Формальным параметрам присваиваются значения фактических параметров n:=n (n=5).
3)Выполняется программа функции, то есть будет найден 5!
4)Полученное значение факториала передается в место обращения функции, т.е. присваивается значение переменной a1 и осуществляется переход к следующим операторам.
На рис. 3 показано распределение памяти между переменными, используемыми в функции и в основной программе. Прямоугольники соответствуют ячейкам памяти, стрелками показаны направления пересылок значений между ячейками. Для переменных функции выделена автономная часть памяти, не принадлежащая области памяти основной программы, например, переменной n (в функции) отведена отдельная ячейка памяти, отличная от переменной n из основной части программы.
При выполнении оператора a1:=Factorial(n) в ячейку n функции заносится n=5. Вычисляется значение переменной rez, его присваиваем имени функции и передаем (по последнему End) в точку вызова.
При этом переменная a1 получает значение, равное n!, то есть − 120, а программа переходит к следующему оператору.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Рис. 3 |
|
||||
Аналогично выполняются операторы a2:=Factorial(k) |
и |
||||||
a3:=Factorial(n-k). |
|
41
Пример.
Найти корень уравнения F(x) = 0 с точностью ε = 10-6 .
Будем решать данное уравнение итерационным методом Ньютона с использованием рекуррентного соотношения:
|
|
|
|
|
xi |
= xi−1 − |
F(xi−1 ) |
, xo = 0 . |
||||||
|
|
|
|
|
′ |
|
||||||||
|
|
|
|
|
|
|
F (xi−1 ) |
|
|
|
|
|
||
Условием |
окончания итерационного процесса является |
|
xi − xi−1 |
|
< ε |
|||||||||
|
|
|||||||||||||
или |
|
F(xi−1 ) |
|
< ε . Пусть |
F (x) = e−0.3 x |
− 0.7 x = 0. |
||||||||
|
|
|||||||||||||
|
||||||||||||||
|
|
F(x |
)' |
|
|
|
|
|
|
|
|
|
|
|
|
|
i−1 |
|
|
|
|
|
|
|
|
|
|
|
Ниже приведена программа, реализующая численное решение нелинейного уравнения, с использованием функций F и F1.
program Mn1; {решение нелинейного уравнения методом Ньютона} const eps=1e-6;
var x,x0 : real;
function f(x : real) : real; begin
f:=exp(-0.3*x)-0.7*x
end;
function f1(x : real):real; begin
f1:=-0.3*exp(-0.3*x)-0.7
end; begin
writeln;
writeln(‘решение нелинейного уравнения f(x) = 0’); writeln;
write(’x0=’);
read(x0); { ввод начальной точки } writeln;
x:=x0; repeat
x:=x-f(x)/f1(x);
42