Автор: Пользователь скрыл имя, 07 Марта 2013 в 02:12, курс лекций
Лекция 1. Представление алгоритмов на языке Программирования ПаскальАВС.
Лекция 2. Построение линейных алгоритмов
Лекция 3. Алгоритмы, содержащие структуру ветвления.
Лекция 4. Алгоритмы, содержащие структурные операторы циклов.
...
Лекция 9. Файловый тип данных
3.Из функции пользователя можно передать в основную программу только одно значение – это значение самой функции.
Функция пользователя, как и процедура пользователя, записывается в разделе объявлений основной программы.
Формат объявления функции пользователя следующий:
Function имя_функции (Список получаемых параметров: их_типы) : Тип_функции;
Begin
Тело_функции (т.е. любые операторы языка Паскаль)
End;
Обращение к функции
пользователя происходит по имени функции
и в круглых скобках
7.Пример использования
функции пользователя
Пример. Найти количество размещений из n элементов по m элементов.
Решение. В математике известна формула, по которой вычисляется количество размещений: a=n!/(n-m)! Таким образом, видно, что для вычисления количества размещений необходимо дважды вычислять факториал некоторых выражений: сначала n!, а затем (n-m)! Поэтому вычисление факториала проведем с помощью функции пользователя.
Program a1;
Var n,m : Integer; a : Real;
{Функция пользователя}
Function Fact(k : Integer) : Longint;
Var i : Integer; p : Real;
Begin
p := 1;
For i := 1 to k do p := p*i;
Fact := p;
End;
{Основная программа}
Begin
Writeln(‘ Ввести значения чисел n и m’);
Readln(n, m);
A := Fact( n ) / Fact(n – m);
Writeln(‘Число размещений из n элементов по m =’, a : 7 : 0);
End.
Замечание. Любую функцию пользователя можно записать в виде процедуры пользователя, а наоборот не всегда, так как из процедуры пользователя в основную программу можно передать несколько значений, а в функции пользователя – только одно (само значение функции).
8.Пример использования
функции пользователя
Пример. Даны три целых положительных числа a, b, c. Вывести на экран сначала все три целых числа с заголовком: исходные числа; затем вывести простые числа из данных, если они есть, с заголовком: простые числа; если среди данных чисел нет простых, то вывести сообщение об этом.
Решение. Создадим функцию пользователя, которая будет принимать значение true, если число простое, значение false , если число составное. Кроме этого введем дополнительную переменную n, которая будет считать, сколько простых чисел среди данных. Она нужна для того, чтобы вывести сообщение «простых чисел нет», если среди данных простых чисел не будет.
Program a2;
Var a, b, c : Integer;
{Логическая функции пользователя}
Function Chislo ( w : integer) : Boolean;
Var k, x : integer;
Begin
k :=0;
{k – счетчик количества делителей числа w}
{ x – числа, претенденты на делители числа w}
For x := 1 to w do If w mod x=0 Then k := k + 1;
If k>2 Then Chislo := False Else Chislo := True;
End;
{Основная программа}
Begin
Writeln(‘ Ввести три целых числа a, b, c’);
Readln(a, b, c);
Writeln(‘ Исходные числа: ‘);
Writeln(a :7, b:7, c:7);
{Сначала определим, сколько будет простых чисел среди данных}
n := 0;
If Chislo( a )=True Then n := n + 1;
If Chislo( b )=True Then n := n + 1;
If Chislo( c )=True Then n:= n + 1;
{Выводим ответ}
If n=0
Then Writeln (‘ Простых чисел нет ‘)
Else Begin
Writeln(‘Простые числа: ‘);
If Chislo( a ) = True Then Write ( a : 7);
If Chislo( b ) = True Then Write ( b : 7);
If Chislo( c ) = True Then Write ( c : 7);
End;
End.
9.Пример использования в программе и функций и процедур пользователя.
Что раньше писать в разделе объявлений основной программы, процедуру пользователя или функцию пользователя, если их в программе несколько, не имеет значения, так как обращение к подпрограмме совершается по имени подпрограммы.
Пример. Даны координаты вершин четырехугольника ABCD: A(xa,ya), B(xb, yb), C(xc,yc), D(xd, yd).Найти периметр четырехугольника.
Решение. Нахождение длины стороны оформим в виде функции пользователя. Ввод координат вершин оформим в виде процедуры пользователя.
Program a3;
Var xa, ya, xb, yb, xc, yc, xd, yd : Real;
ab, bc, cd, ad, p : real;
{Процедура ввода координат одной точки}
Procedure Wwod( Var x, y : Real);
Begin
Writeln(‘Ввести абсциссу точки’);
Readln(x);
Writeln(‘Ввести ординату точки’);
Readln(y);
End;
{Функция нахождения расстояния между двумя точками}
Function Dlin(x1, y1, x2, y2 : Real) : Real;
Begin
Dlin := Sqrt( sqr(x1-x2) + sqr(y1 – y2));
End;
{Основная программа}
{Для ввода координат четырех точек обратимся к процедуре ввода координат четыре раза}
Wwod(xa, ya); Wwod(xb, yb); Wwod(xc, yc); Wwod(xd, yd);
{Для нахождения расстояний между точками обратимся к функции Dlin}
ab := Dlin(xa, ya, xb, yb);
bc := Dlin(xb, yb, xc, yc);
cd := Dlin(xc, yc, xd, yd);
ad := Dlin(xd, yd, xa, ya);
{Находим периметр}
p := ab + bc + cd + ad;
{Вывод на экран длин сторон и периметра четырехугольника}
Writeln( ‘ab=’,ab:6:1,’ bc=’,bc:6:1,’ cd=’,cd:6:1, ‘ ad=’,ad:6:1,’ p=’,p:6:1);
End.
10.Рекурсия: прямая и косвенная.
В языке Pascal при помощи процедур и функций пользователя может быть организован процесс рекурсии, при котором процедуры и функции будут сами себя вызывать. Такие процедуры и функции называются рекурсивными. Рекурсии бывают двух видов: прямая и косвенная. При прямой рекурсии осуществляется обращение к этой же самой подпрограмме. При косвенной рекурсии внутри одной подпрограммы идет обращение к другой подпрограмме.
Пример. Вычислить значение n!=1*2*3*…*n при помощи рекурсии.
Решение. Вычисление n! можно записать и в обратном порядке, т.е.
n!=n*n-1*…*2*1=n*(n-1)! Запишем программу с помощью рекурсивной функции.
Program a22;
Var n:Integer; b:LongInt;
Function Fact(a:Integer):LongInt;
Begin
If a=0 Then Fact:=1
Else Fact:=a*Fact(a-1);
{Здесь для вычисления значения Fact используется функция Fact. Это и есть рекурсия.}
End;
{Основная программа}
Begin
Writeln(‘Ввести значение n ‘); Readln(n);
B:=Fact(n);
{Обращение к рекурсивной функции Fact. Здесь n является фактическим параметром, значение которого передается в функцию.}
Writeln(n,’!=’,b);
{Вывод полученного результата}
End.
Пусть по данной программе необходимо вычислить 4! Представим процесс рекурсии в виде таблицы.
Рекурсивный спуск (погружение) |
N:=4 |
Fact(4) |
A:=4 |
Fact:=4*Fact(3) | |
A:=3 |
Fact:=3*Fact(2) | |
A:=2 |
Fact:=2*Fact(1) | |
A:=1 |
Fact:=1*Fact(0) | |
A:=0 |
Fact:=1 | |
Рекурсивное возвращение (всплывание) |
A:=1 |
Fact:=1*1=1 |
A:=2 |
Fact:=2*1 | |
A:=3 |
Fact:=3*2*1 | |
A:=4 |
Fact:=4*3*2*1 |
Делая анализ процесса рекурсии при помощи таблицы, мы видим, что в параметре Fact постепенно накапливается факториал числа. В этом случае параметр Fact называют накапливающим параметром, а такой процесс рекурсии – методом накапливающего параметра.
Решим ту же задачу с помощью рекурсивной процедуры.
Program a22а;
Var n:Integer; b:LongInt;
Procedure Fact(a:Integer; P:LongInt);
Var m:Longint;
Begin
If a=0 Then p:=1
Else Begin
Fact(a-1,m);
P:=m*a;
End;
{Здесь для вычисления значения P используется процедура Fact. Это и есть рекурсия.}
End;
{Основная программа}
Begin
Writeln(‘Ввести значение n ‘);
Readln(n);
Fact(n, b);
{Обращение к рекурсивной процедуре Fact. Здесь n является фактическим параметром, значение которого передается в функцию. Параметр b тоже фактический параметр, который свое значение получает из процедуры.}
Writeln(n,’!=’,b);
{Вывод полученного результата}
End.
Информация о работе Лекции по "Языкам и методам программирования" (PascalABC)